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