DocFile.java revision e52f6d819e7d95e19e9b315f358bb7ac293413d8
17c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org/*
27c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * Copyright (C) 2010 Google Inc.
37c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org *
47c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * Licensed under the Apache License, Version 2.0 (the "License");
57c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * you may not use this file except in compliance with the License.
67c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * You may obtain a copy of the License at
77c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org *
87c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * http://www.apache.org/licenses/LICENSE-2.0
97c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org *
107c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * Unless required by applicable law or agreed to in writing, software
117c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * distributed under the License is distributed on an "AS IS" BASIS,
127c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * See the License for the specific language governing permissions and
147c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org * limitations under the License.
157c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org */
167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
177c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgpackage com.google.doclava;
187c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
197c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgimport com.google.clearsilver.jsilver.data.Data;
207c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
217c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgimport java.io.*;
227c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgimport java.util.regex.Pattern;
237c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgimport java.util.regex.Matcher;
247c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
257c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
267c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgpublic class DocFile {
277c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static final Pattern LINE = Pattern.compile("(.*)[\r]?\n", Pattern.MULTILINE);
287c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static final Pattern PROP = Pattern.compile("([^=]+)=(.*)");
297c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
307c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static String readFile(String filename) {
317c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    try {
327c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      File f = new File(filename);
337c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      int length = (int) f.length();
347c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      FileInputStream is = new FileInputStream(f);
357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      InputStreamReader reader = new InputStreamReader(is, "UTF-8");
367c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      char[] buf = new char[length];
377c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      int index = 0;
387c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      int amt;
397c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      while (true) {
407c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        amt = reader.read(buf, index, length - index);
417c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
427c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        if (amt < 1) {
437c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          break;
447c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        }
457c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
467c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        index += amt;
477c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
487c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      return new String(buf, 0, index);
497c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    } catch (IOException e) {
507c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      return null;
517c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
527c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  }
537c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
547c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static String[] DEVSITE_VALID_LANGS = {"en", "es","ja", "ko", "ru", "zh-cn"};
557c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
567c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static String getPathRoot(String filename) {
577c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String[] stripStr = filename.split("\\/");
587c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String outFrag = stripStr[0];
597c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    if (stripStr.length > 0) {
607c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      for (String t : DEVSITE_VALID_LANGS) {
617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        if (stripStr[0].equals("intl")) {
627c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          if (stripStr[1].equals(t)) {
637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org            outFrag = stripStr[2];
647c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org            break;
657c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          }
667c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        } else if (stripStr[0].equals(t)) {
677c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org            outFrag = stripStr[1];
687c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org            break;
697c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        }
707c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
717c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
727c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    return outFrag;
737c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  }
747c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
757c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  public static void writePage(String docfile, String relative, String outfile, Data hdf) {
767c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
777c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    /*
787c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org     * System.out.println("docfile='" + docfile + "' relative='" + relative + "'" + "' outfile='" +
797c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org     * outfile + "'");
807c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org     */
817c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    if (hdf == null) {
827c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      hdf = Doclava.makeHDF();
837c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
847c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String filedata = readFile(docfile);
857c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
867c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // The document is properties up until the line "@jd:body".
877c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // Any blank lines are ignored.
887c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    int start = -1;
897c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    int lineno = 1;
907c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    Matcher lines = LINE.matcher(filedata);
917c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String line = null;
927c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    while (lines.find()) {
937c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      line = lines.group(1);
947c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      if (line.length() > 0) {
957c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        if (line.equals("@jd:body")) {
967c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          start = lines.end();
977c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          break;
987c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        }
997c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        Matcher prop = PROP.matcher(line);
1007c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        if (prop.matches()) {
1017c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          String key = prop.group(1);
1027c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          String value = prop.group(2);
1037c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          hdf.setValue(key, value);
1047c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        } else {
1057c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org          break;
1067c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        }
1077c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
1087c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      lineno++;
1097c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
1107c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    if (start < 0) {
1117c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      System.err.println(docfile + ":" + lineno + ": error parsing docfile");
1127c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      if (line != null) {
1137c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        System.err.println(docfile + ":" + lineno + ":" + line);
1147c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
1157c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      System.exit(1);
1167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
1177c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1187c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // if they asked to only be for a certain template, maybe skip it
1197c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String fromTemplate = hdf.getValue("template.which", "");
1207c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String fromPage = hdf.getValue("page.onlyfortemplate", "");
1217c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    if (!"".equals(fromPage) && !fromTemplate.equals(fromPage)) {
1227c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      return;
1237c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
1247c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1257c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // and the actual text after that
1267c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String commentText = filedata.substring(start);
1277c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1287c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    Comment comment = new Comment(commentText, null, new SourcePositionInfo(docfile, lineno, 1));
1297c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    TagInfo[] tags = comment.tags();
1307c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1317c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    TagInfo.makeHDF(hdf, "root.descr", tags);
1327c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1337c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    hdf.setValue("commentText", commentText);
1347c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // write the page using the appropriate root template, based on the
1367c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    // whichdoc value supplied by build
1377c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    String fromWhichmodule = hdf.getValue("android.whichmodule", "");
1387c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    if (fromWhichmodule.equals("online-pdk")) {
1397c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      // leaving this in just for temporary compatibility with pdk doc
1407c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      hdf.setValue("online-pdk", "true");
1417c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      // add any conditional login for root template here (such as
1427c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      // for custom left nav based on tab etc.
1437c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      ClearPage.write(hdf, "docpage.cs", outfile);
1447c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    } else {
1457c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      String filename = outfile;
1467c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      // Strip out the intl and lang id substr and get back just the
1477c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      // guide, design, distribute, etc.
1487c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      filename = getPathRoot(filename);
1497c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      if (filename.indexOf("design") == 0) {
1507c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("design", "true");
1517c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("develop") == 0) {
1527c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("develop", "true");
1537c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("guide") == 0) {
1547c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("guide", "true");
1557c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("training") == 0) {
1567c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("training", "true");
1577c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("more") == 0) {
1587c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("more", "true");
1597c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("google") == 0) {
1607c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("google", "true");
1617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("samples") == 0) {
1627c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("samples", "true");
1637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("distribute") == 0) {
1647c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("distribute", "true");
1657c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("about") == 0) {
1667c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("about", "true");
1677c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if ((filename.indexOf("tools") == 0) || (filename.indexOf("sdk") == 0)) {
1687c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("tools", "true");
1697c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        fromTemplate = hdf.getValue("page.template", "");
1707c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("devices") == 0) {
1717c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("devices", "true");
1727c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("source") == 0) {
1737c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("source", "true");
1747c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("accessories") == 0) {
1757c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("accessories", "true");
1767c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else if (filename.indexOf("compatibility") == 0) {
1777c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        hdf.setValue("compatibility", "true");
1787c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
1797c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      if (fromTemplate.equals("sdk")) {
1807c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        ClearPage.write(hdf, "sdkpage.cs", outfile);
1817c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      } else {
1827c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org        ClearPage.write(hdf, "docpage.cs", outfile);
1837c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      }
1847c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    }
1857c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  } // writePage
1867c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
1877c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org