DocFile.java revision 3c925b473212325cbf5f734cb5d1d57588ea83e3
1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.io.*;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.regex.Pattern;
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.regex.Matcher;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class DocFile {
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final Pattern LINE = Pattern.compile("(.*)[\r]?\n", Pattern.MULTILINE);
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final Pattern PROP = Pattern.compile("([^=]+)=(.*)");
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String readFile(String filename) {
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    try {
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      File f = new File(filename);
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int length = (int) f.length();
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      FileInputStream is = new FileInputStream(f);
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      InputStreamReader reader = new InputStreamReader(is, "UTF-8");
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      char[] buf = new char[length];
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int index = 0;
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      int amt;
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      while (true) {
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        amt = reader.read(buf, index, length - index);
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (amt < 1) {
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        index += amt;
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return new String(buf, 0, index);
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } catch (IOException e) {
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return null;
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void writePage(String docfile, String relative, String outfile) {
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    /*
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     * System.out.println("docfile='" + docfile + "' relative='" + relative + "'" + "' outfile='" +
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     * outfile + "'");
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson     */
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String filedata = readFile(docfile);
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // The document is properties up until the line "@jd:body".
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Any blank lines are ignored.
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int start = -1;
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int lineno = 1;
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Matcher lines = LINE.matcher(filedata);
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String line = null;
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (lines.find()) {
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      line = lines.group(1);
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (line.length() > 0) {
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (line.equals("@jd:body")) {
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          start = lines.end();
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Matcher prop = PROP.matcher(line);
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (prop.matches()) {
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String key = prop.group(1);
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          String value = prop.group(2);
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          hdf.setValue(key, value);
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        } else {
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      lineno++;
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (start < 0) {
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.err.println(docfile + ":" + lineno + ": error parsing docfile");
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (line != null) {
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        System.err.println(docfile + ":" + lineno + ":" + line);
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.exit(1);
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // if they asked to only be for a certain template, maybe skip it
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String fromTemplate = hdf.getValue("template.which", "");
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String fromPage = hdf.getValue("page.onlyfortemplate", "");
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!"".equals(fromPage) && !fromTemplate.equals(fromPage)) {
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return;
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // and the actual text after that
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String commentText = filedata.substring(start);
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Comment comment = new Comment(commentText, null, new SourcePositionInfo(docfile, lineno, 1));
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo[] tags = comment.tags();
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(hdf, "root.descr", tags);
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("commentText", commentText);
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // write the page using the appropriate root template, based on the
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // whichdoc value supplied by build
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String fromWhichmodule = hdf.getValue("android.whichmodule", "");
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (fromWhichmodule.equals("online-pdk")) {
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // leaving this in just for temporary compatibility with pdk doc
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      hdf.setValue("online-pdk", "true");
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // add any conditional login for root template here (such as
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // for custom left nav based on tab etc.
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClearPage.write(hdf, "docpage.cs", outfile);
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
1233c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      String filename = outfile;
1243c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      // Check whether this is a localized page and remove the intl/*/ path from filename
1253c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      if (filename.indexOf("intl/") == 0) {
1263c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        filename = filename.substring(filename.indexOf("/", 5) + 1); // After intl/ to get 2nd /
1273c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      }
1283c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      if (filename.indexOf("design/") == 0) {
1293352706b85f0c1aa8a0391b26c08c8b6f9e5746fRoman Nurik        hdf.setValue("design", "true");
1303c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("develop/") == 0) {
1313c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("develop", "true");
1323c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("guide/") == 0) {
1333c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("guide", "true");
1343c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("training/") == 0) {
1353c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("training", "true");
1363c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("more/") == 0) {
1373c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("more", "true");
1383c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("google/") == 0) {
1393c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("google", "true");
1403c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("distribute/") == 0) {
1413c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("distribute", "true");
1423c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if (filename.indexOf("about/") == 0) {
1433c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("about", "true");
1443c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      } else if ((filename.indexOf("tools/") == 0) || (filename.indexOf("sdk/") == 0)) {
1453c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        hdf.setValue("tools", "true");
1463c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      }
1473c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main
1483c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main      if ((filename.indexOf("tools/sdk/preview/index.html") == 0) ||
1493c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main          (filename.indexOf("sdk/index.html") == 0) ||
1503c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main          (filename.indexOf("tools/sdk/ndk/index.html") == 0)) {
1513c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        ClearPage.write(hdf, "sdkpage.cs", outfile);
152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
1533c925b473212325cbf5f734cb5d1d57588ea83e3Scott Main        ClearPage.write(hdf, "docpage.cs", outfile);
154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  } // writePage
157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
158