SampleCode.java revision c11a467135f9118604f31fadc99d2edd494edb0b
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 Dodsonimport com.google.clearsilver.jsilver.data.Data;
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.*;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.io.*;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class SampleCode {
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mSource;
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mDest;
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mTitle;
28c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  String mProjectDir;
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public SampleCode(String source, String dest, String title) {
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mSource = source;
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mTitle = title;
331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = dest.length();
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (len > 1 && dest.charAt(len - 1) != '/') {
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mDest = dest + '/';
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mDest = dest;
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
41c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: source: " + mSource);
431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: dest: " + mDest);
441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: title: " + mTitle);
451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public Node write(boolean offlineMode) {
491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    List<Node> filelist = new ArrayList<Node>();
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    File f = new File(mSource);
51c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    mProjectDir = f.getName();
52c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String name = mProjectDir;
531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String startname = name;
541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = mDest;
551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mOut = subdir + name;
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!f.isDirectory()) {
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.out.println("-samplecode not a directory: " + mSource);
581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return null;
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (offlineMode)
621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeIndexOnly(f, mDest, offlineMode);
631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    else {
641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      Data hdf = Doclava.makeHDF();
651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("samples", "true");
66c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeProjectDirectory(filelist, f, mDest, false, hdf, "Files.");
68c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      writeProjectStructure(name, hdf);
69c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      getSummaryFromDir(hdf, f, "Files.");
70c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      writeProjectIndex(hdf);
711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.removeTree("parentdirs");
721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("parentdirs.0.Name", name);
731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // return a root SC node for the sample with children appended
74c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      return new Node(mProjectDir, "samples/" + startname + "/index.html", filelist, null);
751b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
761b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    return null;
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String convertExtension(String s, String ext) {
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s.substring(0, s.lastIndexOf('.')) + ext;
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String[] IMAGES = {".png", ".jpg", ".gif"};
841b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String[] TEMPLATED = {".java", ".xml", ".aidl", ".rs",".txt", ".TXT"};
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean inList(String s, String[] list) {
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String t : list) {
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (s.endsWith(t)) {
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String mapTypes(String name) {
961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = name.substring(name.lastIndexOf('.') + 1, name.length());
971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (type.equals("xml") || type.equals("java")) {
981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.equals("AndroidManifest.xml")) type = "manifest";
991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type;
1001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type = "file";
1021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
1041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public void writeProjectDirectory(List<Node> parent, File dir, String relative, Boolean recursed, Data hdf, String newkey) {
1061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>(); //dirs for project structure and breadcrumb
1071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> files = new TreeSet<String>(); //files for project structure and breadcrumb
1081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = relative;
1101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String name = "";
1111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String label = "";
1121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String link = "";
1131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = "";
1141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    int i = 0;
1151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String expansion = ".Sub.";
1161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String key = newkey;
1171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (recursed) {
1191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      key = (key + expansion);
1201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      expansion = "";
1221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
124c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    File[] dirContents = dir.listFiles();
125c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Arrays.sort(dirContents, byTypeAndName);
126c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f: dirContents) {
1271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      name = f.getName();
1281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // don't process certain types of files
1291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.startsWith(".") ||
1301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.startsWith("_") ||
1311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("default.properties") ||
1321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("build.properties") ||
1331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.endsWith(".ttf") ||
1341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("Android.mk")) {
1351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Invalid File Type, bypassing: " + name);
1361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         continue;
1371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
1381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       if (f.isFile() && name.contains(".")){
1391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String path = relative + name;
1401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = mapTypes(name);
1411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = convertExtension(path, ".html");
1421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue("samples", "true");//dd needed?
1431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, IMAGES)) {
1441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copy these files to output directly
1451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           type = "img";
1461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writeImagePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", "img");
1501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
1521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, TEMPLATED)) {
1541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copied and goes through the template
1551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", type);
1591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
1611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         // add file to the navtree
1631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         parent.add(new Node(name, link , null, type));
1641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
1651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       } else if (f.isDirectory()) {
1661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         List<Node> mchildren = new ArrayList<Node>();
1671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = "dir";
1681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String dirpath = relative + name;
1691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = dirpath + "/index.html";
1701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyName = (key + i + ".Name");
1711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyType = (key + i + ".Type");
1721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyHref = (key + i + ".Href");
1731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyName, name);
1741b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyType, type);
1751b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyHref, relative + name + "/" + "index.html");
1761b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Found directory, recursing. Current key: " + hdfkeyName);
1771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         writeProjectDirectory(mchildren, f, relative + name + "/", true, hdf, (key + i));
1781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (mchildren.size() > 0) {
1791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           //dir is processed, now add it to the navtree
180c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty           //don't link sidenav subdirs at this point (but can use "link" to do so)
1811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          parent.add(new Node(name, null, mchildren, type));
1821b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
183c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty         dirs.add(name);
184c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
1851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
1861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
1871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //dd not working yet
189c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //Get summary from any _index files in any project dirs (currently disabled)
190c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //  getSummaryFromDir(hdf, dir, newkey);
1911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //If this is an index for the project root (assumed root if split length is 3 (development/samples/nn)),
1921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //then remove the root dir so that it won't appear in the breadcrumb. Else just pass it through to
1931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //setParentDirs as usual.
1941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mpath = dir + "";
1951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String sdir[] = mpath.split("/");
1961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (sdir.length == 3 ) {
1971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      System.out.println("-----------------> this must be the root: [sdir len]" + sdir.length + "[dir]" + dir);
198c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("showProjectPaths","true");//dd remove here?
1991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
2001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, relative, name, false);
201c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //System.out.println("writing  sample index -- " + relative + "index" + Doclava.htmlExtension);
202c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //hdf.setValue("projectTitle", mTitle);
203c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //ClearPage.write(hdf, "sampleindex.cs", relative + "/index" + Doclava.htmlExtension);
204e27c950134c99151d1d9914eaaf28848327e4f63Scott Main  }
205e27c950134c99151d1d9914eaaf28848327e4f63Scott Main
206c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeProjectStructure(String dir, Data hdf) {
207c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println(">>-- writing project structure for " + dir );
208c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "true");
209c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
210c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("page.title", mProjectDir + " Structure");
211c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectTitle", mTitle);
212c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "project" + Doclava.htmlExtension); //write the project.html file
213c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "");
214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
216c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
217c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write the project's templated _index.html
218c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
219c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeProjectIndex(Data hdf) {
220c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println(">>-- writing project index for " + mDest );
221c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
222c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("page.title", mProjectDir + " Sample");
223c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectTitle", mTitle);
224c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
2251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
2261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
227c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
228c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Grab the contents of an _index.html summary from a dir.
229c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
230c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void getSummaryFromDir(Data hdf, File dir, String key) {
231c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //System.out.println("Getting summary for " + dir + "/_index.html");
232c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summary", "");
233c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summaryFlag", "");
234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String filename = dir.getPath() + "/_index.html";
235c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String summary = SampleTagInfo.readFile(new SourcePositionInfo(filename,
236c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty                          -1,-1), filename, "sample code", true, false, false, true);
237c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (summary != null) {
238c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue(key + "SummaryFlag", "true");
239c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("summary", summary);
240c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //set the target for [info] link
241c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //hdf.setValue(key + "Href", dir + "/index.html");
242c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //return true;
243c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
244c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
246c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
247c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Keep track of file parents
248c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
249c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Data setParentDirs(Data hdf, String subdir, String name, Boolean isFile) {
250c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    isFile = false;
251c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int iter;
252c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.removeTree("parentdirs");
253c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //System.out.println("setParentDirs for " + subdir + name);
254c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String s = subdir;
255c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String urlParts[] = s.split("/");
256c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int n, l = (isFile)?1:0;
257c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (iter=2; iter < urlParts.length - l; iter++) {
258c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      n = iter-2;
259c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println("parentdirs." + n + ".Name == " + urlParts[iter]);
260c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("parentdirs." + n + ".Name", urlParts[iter]);
261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return hdf;
263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
265c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
266c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated source code file to out.
267c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writePage(File f, String out, String subdir) {
269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
2701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String path = f.getPath();
271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data =
2721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(path, -1, -1), path, "sample code",
2731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            true, true, true, true);
274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data = Doclava.escape(data);
275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
2771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
2781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
2791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
280c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
2851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
2861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
291c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
292c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated image file to out.
293c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writeImagePage(File f, String out, String subdir) {
295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data = "<img src=\"" + name + "\" title=\"" + name + "\" />";
298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
3001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
3011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
3031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
304c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
306920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
3081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
3091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
3121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
3141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * Render a SC node to a navtree js file.
3151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
3161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static void writeSamplesNavTree(List<Node> tnode) {
3171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Node node = new Node("Reference", "packages.html", tnode, null);
3181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    StringBuilder buf = new StringBuilder();
3201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (false) {
3211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    // if you want a root node
3221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[");
3231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.render(buf);
3241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("]");
3251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
3261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // if you don't want a root node
3271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.renderChildren(buf);
3281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Data data = Doclava.makeHDF();
3311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    data.setValue("reference_tree", buf.toString());
3321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    ClearPage.write(data, "samples_navtree_data.cs", "samples_navtree_data.js");
3331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
3341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
335c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Comparator<File> byTypeAndName = new Comparator<File>() {
336c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    public int compare (File one, File other) {
337c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (one.isDirectory() && !other.isDirectory()) {
338c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return 1;
339c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (!one.isDirectory() && other.isDirectory()) {
340c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return -1;
341c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else {
342c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return one.compareTo(other);
343c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
344c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
345c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  };
346c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
3471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
3481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * SampleCode variant of NavTree node.
3491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
3501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static class Node {
3511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLabel;
3521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLink;
3531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    List<Node> mChildren;
354c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    public String mType;
3551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Node(String label, String link, List<Node> children, String type) {
3571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mLabel = label;
3581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mLink = link;
3591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mChildren = children;
3601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mType = type;
3611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    static void renderString(StringBuilder buf, String s) {
3641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (s == null) {
3651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
3661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
3671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
3681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = s.length();
3691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
3701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          char c = s.charAt(i);
3711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
3721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(c);
3731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          } else {
3741b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append("\\u");
3751b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            for (int j = 0; i < 4; i++) {
3761b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              char x = (char) (c & 0x000f);
3771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              if (x > 10) {
3781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x - 10 + 'a');
3791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              } else {
3801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x + '0');
3811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              }
3821b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              buf.append(x);
3831b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              c >>= 4;
3841b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            }
3851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
3861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
3871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
3881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
3891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void renderChildren(StringBuilder buf) {
3921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      List<Node> list = mChildren;
3931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (list == null || list.size() == 0) {
3941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // We output null for no children. That way empty lists here can just
3951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // be a byproduct of how we generate the lists.
3961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
3971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
3981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("[ ");
3991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = list.size();
4001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
4011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          list.get(i).render(buf);
4021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (i != N - 1) {
4031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(", ");
4041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
4051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
4061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append(" ]\n");
4071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
4081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
4091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
4101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void render(StringBuilder buf) {
4111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[ ");
4121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLabel);
4131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
4141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLink);
4151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
4161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderChildren(buf);
4171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
4181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mType);
4191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(" ]");
4201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
4211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
4221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
423c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
424c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
425c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
426c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeDirectory(File dir, String relative, boolean offline) {
427c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>();
428c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> files = new TreeSet<String>();
429c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
430c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String subdir = relative; // .substring(mDest.length());
431c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
432c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f : dir.listFiles()) {
433c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      String name = f.getName();
434c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (name.startsWith(".") || name.startsWith("_")) {
435c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        continue;
436c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
437c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (f.isFile()) {
438c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        String out = relative + name;
439c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, IMAGES)) {
440c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied directly
441c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
442c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writeImagePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
443c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
444c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
445c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, TEMPLATED)) {
446c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied and goes through the template
447c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
448c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
449c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
450c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
451c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
452c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        // else ignored
453c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (f.isDirectory()) {
454c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        writeDirectory(f, relative + name + "/", offline);
455c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        dirs.add(name);
456c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
457c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
458c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
459c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    // write the index page
460c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int i;
461c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
462c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
463c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("subdir", subdir);
464c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
465c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String d : dirs) {
466c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("subdirs." + i + ".Name", d);
467c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(d, ".html"));
468c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
469c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
470c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
471c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String f : files) {
472c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Name", f);
473c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(f, ".html"));
474c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
475c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
476c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
477c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
478c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
479c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
480c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
481c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
482c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
483c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
484c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeIndexOnly(File dir, String relative, Boolean offline) {
485c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
486c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
487c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
488c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      System.out.println("writing indexonly at " + relative + "/index" + Doclava.htmlExtension);
489c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
490c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
491c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
492c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
493c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
494c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
495c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public Data writeIndex(File dir) {
496c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = Doclava.makeHDF();
497c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("page.title", dir.getName() + " - " + mTitle);
498c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectTitle", mTitle);
499c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
500c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String filename = dir.getPath() + "/_index.html";
501c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String summary =
502c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
503c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty            true, false, false, true);
504c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
505c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (summary == null) {
506c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      summary = "";
507c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
508c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summary", summary);
509c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
510c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    return hdf;
511c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
512c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
513920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
514