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.util.*;
     22 import java.io.*;
     23 
     24 
     25 public class SampleCode {
     26   String mSource;
     27   String mDest;
     28   String mTitle;
     29 
     30   public SampleCode(String source, String dest, String title) {
     31     mSource = source;
     32     mTitle = title;
     33     int len = dest.length();
     34     if (len > 1 && dest.charAt(len - 1) != '/') {
     35       mDest = dest + '/';
     36     } else {
     37       mDest = dest;
     38     }
     39   }
     40 
     41   public void write(boolean offlineMode) {
     42     File f = new File(mSource);
     43     if (!f.isDirectory()) {
     44       System.out.println("-samplecode not a directory: " + mSource);
     45       return;
     46     }
     47 
     48     writeDirectory(f, mDest, offlineMode);
     49   }
     50 
     51   public static String convertExtension(String s, String ext) {
     52     return s.substring(0, s.lastIndexOf('.')) + ext;
     53   }
     54 
     55   public static String[] IMAGES = {".png", ".jpg", ".gif"};
     56   public static String[] TEMPLATED = {".java", ".xml", ".aidl", ".rs"};
     57 
     58   public static boolean inList(String s, String[] list) {
     59     for (String t : list) {
     60       if (s.endsWith(t)) {
     61         return true;
     62       }
     63     }
     64     return false;
     65   }
     66 
     67   public void writeDirectory(File dir, String relative) {
     68     writeDirectory(dir, relative, false);
     69   }
     70 
     71   public void writeDirectory(File dir, String relative, boolean offline) {
     72     TreeSet<String> dirs = new TreeSet<String>();
     73     TreeSet<String> files = new TreeSet<String>();
     74 
     75     String subdir = relative; // .substring(mDest.length());
     76 
     77     for (File f : dir.listFiles()) {
     78       String name = f.getName();
     79       if (name.startsWith(".") || name.startsWith("_")) {
     80         continue;
     81       }
     82       if (f.isFile()) {
     83         String out = relative + name;
     84 
     85         if (inList(out, IMAGES)) {
     86           // copied directly
     87           ClearPage.copyFile(false, f, out);
     88           writeImagePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
     89           files.add(name);
     90         }
     91         if (inList(out, TEMPLATED)) {
     92           // copied and goes through the template
     93           ClearPage.copyFile(false, f, out);
     94           writePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
     95           files.add(name);
     96         }
     97         // else ignored
     98       } else if (f.isDirectory()) {
     99         writeDirectory(f, relative + name + "/", offline);
    100         dirs.add(name);
    101       }
    102     }
    103 
    104     // write the index page
    105     int i;
    106 
    107     Data hdf = writeIndex(dir);
    108     hdf.setValue("subdir", subdir);
    109     i = 0;
    110     for (String d : dirs) {
    111       hdf.setValue("subdirs." + i + ".name", d);
    112       i++;
    113     }
    114     i = 0;
    115     for (String f : files) {
    116       hdf.setValue("files." + i + ".name", f);
    117       hdf.setValue("files." + i + ".href", convertExtension(f, ".html"));
    118       i++;
    119     }
    120 
    121     if (!offline) relative = "/" + relative;
    122     ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
    123   }
    124 
    125   public Data writeIndex(File dir) {
    126     Data hdf = Doclava.makeHDF();
    127 
    128     hdf.setValue("page.title", dir.getName() + " - " + mTitle);
    129     hdf.setValue("projectTitle", mTitle);
    130 
    131     String filename = dir.getPath() + "/_index.html";
    132     String summary =
    133         SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
    134             true, false, true);
    135 
    136     if (summary == null) {
    137       summary = "";
    138     }
    139     hdf.setValue("summary", summary);
    140 
    141     return hdf;
    142   }
    143 
    144   public void writePage(File f, String out, String subdir) {
    145     String name = f.getName();
    146 
    147     String filename = f.getPath();
    148     String data =
    149         SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
    150             true, true, true);
    151     data = Doclava.escape(data);
    152 
    153     Data hdf = Doclava.makeHDF();
    154 
    155     hdf.setValue("page.title", name);
    156     hdf.setValue("subdir", subdir);
    157     hdf.setValue("realFile", name);
    158     hdf.setValue("fileContents", data);
    159 
    160     ClearPage.write(hdf, "sample.cs", out);
    161   }
    162 
    163   public void writeImagePage(File f, String out, String subdir) {
    164     String name = f.getName();
    165 
    166     String data = "<img src=\"" + name + "\" title=\"" + name + "\" />";
    167 
    168     Data hdf = Doclava.makeHDF();
    169 
    170     hdf.setValue("page.title", name);
    171     hdf.setValue("subdir", subdir);
    172     hdf.setValue("realFile", name);
    173     hdf.setValue("fileContents", data);
    174 
    175     ClearPage.write(hdf, "sample.cs", out);
    176   }
    177 }
    178