Home | History | Annotate | Download | only in doclava
      1 /*
      2  * Copyright (C) 2010 Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.doclava;
     18 
     19 import com.google.clearsilver.jsilver.data.Data;
     20 
     21 import java.io.*;
     22 import java.util.regex.Pattern;
     23 import java.util.regex.Matcher;
     24 
     25 
     26 public class DocFile {
     27   public static final Pattern LINE = Pattern.compile("(.*)[\r]?\n", Pattern.MULTILINE);
     28   public static final Pattern PROP = Pattern.compile("([^=]+)=(.*)");
     29 
     30   public static String readFile(String filename) {
     31     try {
     32       File f = new File(filename);
     33       int length = (int) f.length();
     34       FileInputStream is = new FileInputStream(f);
     35       InputStreamReader reader = new InputStreamReader(is, "UTF-8");
     36       char[] buf = new char[length];
     37       int index = 0;
     38       int amt;
     39       while (true) {
     40         amt = reader.read(buf, index, length - index);
     41 
     42         if (amt < 1) {
     43           break;
     44         }
     45 
     46         index += amt;
     47       }
     48       return new String(buf, 0, index);
     49     } catch (IOException e) {
     50       return null;
     51     }
     52   }
     53 
     54   public static String[] DEVSITE_VALID_LANGS = {"en", "es","ja", "ko", "ru", "zh-cn"};
     55 
     56   public static String getPathRoot(String filename) {
     57     String[] stripStr = filename.split("\\/");
     58     String outFrag = stripStr[0];
     59     if (stripStr.length > 0) {
     60       for (String t : DEVSITE_VALID_LANGS) {
     61         if (stripStr[0].equals("intl")) {
     62           if (stripStr[1].equals(t)) {
     63             outFrag = stripStr[2];
     64             break;
     65           }
     66         } else if (stripStr[0].equals(t)) {
     67             outFrag = stripStr[1];
     68             break;
     69         }
     70       }
     71     }
     72     return outFrag;
     73   }
     74 
     75   public static void writePage(String docfile, String relative, String outfile) {
     76     Data hdf = Doclava.makeHDF();
     77 
     78     /*
     79      * System.out.println("docfile='" + docfile + "' relative='" + relative + "'" + "' outfile='" +
     80      * outfile + "'");
     81      */
     82 
     83     String filedata = readFile(docfile);
     84 
     85     // The document is properties up until the line "@jd:body".
     86     // Any blank lines are ignored.
     87     int start = -1;
     88     int lineno = 1;
     89     Matcher lines = LINE.matcher(filedata);
     90     String line = null;
     91     while (lines.find()) {
     92       line = lines.group(1);
     93       if (line.length() > 0) {
     94         if (line.equals("@jd:body")) {
     95           start = lines.end();
     96           break;
     97         }
     98         Matcher prop = PROP.matcher(line);
     99         if (prop.matches()) {
    100           String key = prop.group(1);
    101           String value = prop.group(2);
    102           hdf.setValue(key, value);
    103         } else {
    104           break;
    105         }
    106       }
    107       lineno++;
    108     }
    109     if (start < 0) {
    110       System.err.println(docfile + ":" + lineno + ": error parsing docfile");
    111       if (line != null) {
    112         System.err.println(docfile + ":" + lineno + ":" + line);
    113       }
    114       System.exit(1);
    115     }
    116 
    117     // if they asked to only be for a certain template, maybe skip it
    118     String fromTemplate = hdf.getValue("template.which", "");
    119     String fromPage = hdf.getValue("page.onlyfortemplate", "");
    120     if (!"".equals(fromPage) && !fromTemplate.equals(fromPage)) {
    121       return;
    122     }
    123 
    124     // and the actual text after that
    125     String commentText = filedata.substring(start);
    126 
    127     Comment comment = new Comment(commentText, null, new SourcePositionInfo(docfile, lineno, 1));
    128     TagInfo[] tags = comment.tags();
    129 
    130     TagInfo.makeHDF(hdf, "root.descr", tags);
    131 
    132     hdf.setValue("commentText", commentText);
    133 
    134     // write the page using the appropriate root template, based on the
    135     // whichdoc value supplied by build
    136     String fromWhichmodule = hdf.getValue("android.whichmodule", "");
    137     if (fromWhichmodule.equals("online-pdk")) {
    138       // leaving this in just for temporary compatibility with pdk doc
    139       hdf.setValue("online-pdk", "true");
    140       // add any conditional login for root template here (such as
    141       // for custom left nav based on tab etc.
    142       ClearPage.write(hdf, "docpage.cs", outfile);
    143     } else {
    144       String filename = outfile;
    145       // Strip out the intl and lang id substr and get back just the
    146       // guide, design, distribute, etc.
    147       filename = getPathRoot(filename);
    148       if (filename.indexOf("design") == 0) {
    149         hdf.setValue("design", "true");
    150       } else if (filename.indexOf("develop") == 0) {
    151         hdf.setValue("develop", "true");
    152       } else if (filename.indexOf("guide") == 0) {
    153         hdf.setValue("guide", "true");
    154       } else if (filename.indexOf("training") == 0) {
    155         hdf.setValue("training", "true");
    156       } else if (filename.indexOf("more") == 0) {
    157         hdf.setValue("more", "true");
    158       } else if (filename.indexOf("google") == 0) {
    159         hdf.setValue("google", "true");
    160       } else if (filename.indexOf("distribute") == 0) {
    161         hdf.setValue("distribute", "true");
    162       } else if (filename.indexOf("about") == 0) {
    163         hdf.setValue("about", "true");
    164       } else if ((filename.indexOf("tools") == 0) || (filename.indexOf("sdk") == 0)) {
    165         hdf.setValue("tools", "true");
    166         fromTemplate = hdf.getValue("page.template", "");
    167       } else if (filename.indexOf("devices") == 0) {
    168         hdf.setValue("devices", "true");
    169       } else if (filename.indexOf("source") == 0) {
    170         hdf.setValue("source", "true");
    171       } else if (filename.indexOf("accessories") == 0) {
    172         hdf.setValue("accessories", "true");
    173       } else if (filename.indexOf("compatibility") == 0) {
    174         hdf.setValue("compatibility", "true");
    175       }
    176       if (fromTemplate.equals("sdk")) {
    177         ClearPage.write(hdf, "sdkpage.cs", outfile);
    178       } else {
    179         ClearPage.write(hdf, "docpage.cs", outfile);
    180       }
    181     }
    182   } // writePage
    183 }
    184