SampleCode.java revision 815f9342d2b82cf61e56e64cbea46079215041be
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.*;
22e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Doughertyimport java.util.regex.Pattern;
23e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Doughertyimport java.util.regex.Matcher;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class SampleCode {
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mSource;
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mDest;
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mTitle;
29c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  String mProjectDir;
3025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  String mTags;
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public SampleCode(String source, String dest, String title) {
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mSource = source;
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mTitle = title;
3525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    mTags = null;
361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
37815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    if (dest != null) {
38815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      int len = dest.length();
39815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      if (len > 1 && dest.charAt(len - 1) != '/') {
40815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        mDest = dest + '/';
41815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      } else {
42815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        mDest = dest;
43815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      }
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: source: " + mSource);
461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: dest: " + mDest);
471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: title: " + mTitle);
481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public Node write(boolean offlineMode) {
521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    List<Node> filelist = new ArrayList<Node>();
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    File f = new File(mSource);
54c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    mProjectDir = f.getName();
55c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String name = mProjectDir;
561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String startname = name;
571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = mDest;
581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mOut = subdir + name;
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!f.isDirectory()) {
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.out.println("-samplecode not a directory: " + mSource);
611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return null;
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (offlineMode)
651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeIndexOnly(f, mDest, offlineMode);
661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    else {
671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      Data hdf = Doclava.makeHDF();
681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("samples", "true");
69c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeProjectDirectory(filelist, f, mDest, false, hdf, "Files.");
71c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      writeProjectStructure(name, hdf);
721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.removeTree("parentdirs");
731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("parentdirs.0.Name", name);
74e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //Write root _index.jd to out and add metadata to Node.
75e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      Node rootNode = writeProjectIndexCs(hdf, f, null, new Node(mProjectDir,
76e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          "samples/" + startname + "/index.html", null, null, filelist, null));
771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // return a root SC node for the sample with children appended
78e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      return rootNode;
791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    return null;
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String convertExtension(String s, String ext) {
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s.substring(0, s.lastIndexOf('.')) + ext;
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String[] IMAGES = {".png", ".jpg", ".gif"};
881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String[] TEMPLATED = {".java", ".xml", ".aidl", ".rs",".txt", ".TXT"};
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean inList(String s, String[] list) {
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String t : list) {
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (s.endsWith(t)) {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String mapTypes(String name) {
1001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = name.substring(name.lastIndexOf('.') + 1, name.length());
1011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (type.equals("xml") || type.equals("java")) {
1021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.equals("AndroidManifest.xml")) type = "manifest";
1031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type;
1041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type = "file";
1061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
1081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public void writeProjectDirectory(List<Node> parent, File dir, String relative, Boolean recursed, Data hdf, String newkey) {
1101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>(); //dirs for project structure and breadcrumb
1111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> files = new TreeSet<String>(); //files for project structure and breadcrumb
1121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = relative;
1141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String name = "";
1151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String label = "";
1161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String link = "";
1171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = "";
1181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    int i = 0;
1191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String expansion = ".Sub.";
1201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String key = newkey;
1211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (recursed) {
1231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      key = (key + expansion);
1241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      expansion = "";
1261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
128c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    File[] dirContents = dir.listFiles();
129c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Arrays.sort(dirContents, byTypeAndName);
130c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f: dirContents) {
1311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      name = f.getName();
1321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // don't process certain types of files
1331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.startsWith(".") ||
1341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.startsWith("_") ||
1351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("default.properties") ||
1361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("build.properties") ||
1371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.endsWith(".ttf") ||
138e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".gradle") ||
139e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".bat") ||
1401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("Android.mk")) {
1411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Invalid File Type, bypassing: " + name);
1421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         continue;
1431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
1441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       if (f.isFile() && name.contains(".")){
1451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String path = relative + name;
1461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = mapTypes(name);
1471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = convertExtension(path, ".html");
1481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue("samples", "true");//dd needed?
1491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, IMAGES)) {
1501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copy these files to output directly
1511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           type = "img";
1521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writeImagePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", "img");
1561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
15825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, TEMPLATED)) {
1611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copied and goes through the template
1621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", type);
1661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
16825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         // add file to the navtree
171e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty         parent.add(new Node(name, link, null, null, null, type));
1721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
1731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       } else if (f.isDirectory()) {
1741b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         List<Node> mchildren = new ArrayList<Node>();
1751b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = "dir";
1761b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String dirpath = relative + name;
1771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = dirpath + "/index.html";
1781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyName = (key + i + ".Name");
1791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyType = (key + i + ".Type");
1801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyHref = (key + i + ".Href");
1811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyName, name);
1821b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyType, type);
1831b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyHref, relative + name + "/" + "index.html");
1841b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Found directory, recursing. Current key: " + hdfkeyName);
1851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         writeProjectDirectory(mchildren, f, relative + name + "/", true, hdf, (key + i));
1861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (mchildren.size() > 0) {
1871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           //dir is processed, now add it to the navtree
188c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty           //don't link sidenav subdirs at this point (but can use "link" to do so)
189e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          parent.add(new Node(name, null, null, null, mchildren, type));
1901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
191c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty         dirs.add(name);
1921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
1931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
19425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
1951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //dd not working yet
197c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //Get summary from any _index files in any project dirs (currently disabled)
198c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    //  getSummaryFromDir(hdf, dir, newkey);
1991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //If this is an index for the project root (assumed root if split length is 3 (development/samples/nn)),
2001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //then remove the root dir so that it won't appear in the breadcrumb. Else just pass it through to
2011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //setParentDirs as usual.
2021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mpath = dir + "";
2031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String sdir[] = mpath.split("/");
2041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (sdir.length == 3 ) {
2051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      System.out.println("-----------------> this must be the root: [sdir len]" + sdir.length + "[dir]" + dir);
206c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("showProjectPaths","true");//dd remove here?
2071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
2081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, relative, name, false);
209e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //Generate an index.html page for each dir being processed
210e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "/index" + Doclava.htmlExtension);
211e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //concatenate dirs in the navtree. Comment out or remove to restore normal navtree
21225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    squashNodes(parent);
213e27c950134c99151d1d9914eaaf28848327e4f63Scott Main  }
214e27c950134c99151d1d9914eaaf28848327e4f63Scott Main
215c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeProjectStructure(String dir, Data hdf) {
216c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println(">>-- writing project structure for " + dir );
217c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "true");
218c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
219c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("page.title", mProjectDir + " Structure");
220c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectTitle", mTitle);
221e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //write the project.html file
222e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "project" + Doclava.htmlExtension);
223c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "");
224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
226c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
227e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Processes a templated project index page from _index.jd in a project root.
228e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Each sample project must have an index, and each index locally defines it's own
229e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * page.tags and sample.group cs vars. This method takes a SC node on input, reads
230e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * any local vars from the _index.jd, generates an html file to out, then updates
231e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * the SC node with the page vars and returns it to the caller.
232e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
233c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
234e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public Node writeProjectIndexCs(Data hdf, File dir, String key, Node tnode) {
235e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summary", "");
236e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summaryFlag", "");
237e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getAbsolutePath() + "/_index.jd";
238e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    File f = new File(filename);
239e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String rel = dir.getPath();
240e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String mGroup = "";
241e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("samples", "true");
242e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set any default page variables for root index
243e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir);
24425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
24525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
2461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
247e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (!f.isFile()) {
248e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //The sample didn't have any _index.jd, so create a stub.
249e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
250e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
251e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + ": Root _index.jd must be present and must define sample.group"
252e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + " tag. Please see ... for details.");
253e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    } else {
254e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      DocFile.writePage(filename, rel, mDest + "index" + Doclava.htmlExtension, hdf);
255e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setTags(hdf.getValue("page.tags", ""));
256e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mGroup = hdf.getValue("sample.group", "");
257e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (mGroup.equals("")) {
258e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
259e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + ": Root _index.jd must be present and must define sample.group"
260e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + " tag. Please see ... for details.");
261e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
262e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setGroup(hdf.getValue("sample.group", ""));
263e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
264e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
265e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    return tnode;
266c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
268c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
269c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Keep track of file parents
270c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
271c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Data setParentDirs(Data hdf, String subdir, String name, Boolean isFile) {
272e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set whether to linkify the crumb dirs on each sample code page
273e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("pathCrumbLinks", "");
274e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //isFile = false;
275c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int iter;
276c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.removeTree("parentdirs");
277c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String s = subdir;
278c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String urlParts[] = s.split("/");
279e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //int n, l = (isFile)?1:0;
280e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    int n, l = 1;
281e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("setParentDirs for " + subdir + name);
282e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    for (iter=1; iter < urlParts.length; iter++) {
283e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      n = iter-1;
284c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println("parentdirs." + n + ".Name == " + urlParts[iter]);
285c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("parentdirs." + n + ".Name", urlParts[iter]);
286e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("parentdirs." + n + ".Link", subdir + "index" + Doclava.htmlExtension);
287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return hdf;
289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
291c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
292c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated source code file to out.
293c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writePage(File f, String out, String subdir) {
295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
2961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String path = f.getPath();
297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data =
2981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(path, -1, -1), path, "sample code",
2991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            true, true, true, true);
300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data = Doclava.escape(data);
301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
30325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
30425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    String relative = subdir.replaceFirst("samples/", "");
3051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
3061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
3071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
308c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
31125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("relative", relative);
312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
3141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
3151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
316920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
320c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
321c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated image file to out.
322c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writeImagePage(File f, String out, String subdir) {
324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data = "<img src=\"" + name + "\" title=\"" + name + "\" />";
327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
3291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
3301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
3321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
333c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
3371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
3381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
3411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
3431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * Render a SC node to a navtree js file.
3441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
345815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static void writeSamplesNavTree(List<Node> tnode, List<Node> groupnodes) {
346815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
347e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    Node node = new Node("Reference", "packages.html", null, null, tnode, null);
3481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
349815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    if (groupnodes != null) {
350815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      for (int i = 0; i < tnode.size(); i++) {
351815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        groupnodes = appendNodeGroups(tnode.get(i), groupnodes);
352815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      }
353815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      node.setChildren(groupnodes);
354815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
355815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
3561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    StringBuilder buf = new StringBuilder();
3571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (false) {
3581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    // if you want a root node
3591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[");
3601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.render(buf);
3611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("]");
3621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
3631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // if you don't want a root node
3641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.renderChildren(buf);
3651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Data data = Doclava.makeHDF();
3681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    data.setValue("reference_tree", buf.toString());
3691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    ClearPage.write(data, "samples_navtree_data.cs", "samples_navtree_data.js");
3701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
3711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
37225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
373815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  * Iterate the list of projects and sort them by their groups. Samples the reference
374815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  * a valid sample group tag are added to a list for that group. Samples declare a
375815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  * sample.group tag in their _index.jd files.
376815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  */
377815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  private static List<Node> appendNodeGroups(Node gNode, List<Node> groupnodes) {
378815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    List<Node> mgrouplist = new ArrayList<Node>();
379815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    final int N = groupnodes.size();
380815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    for (int i = 0; i < N; i++) {
381815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      if (groupnodes.get(i).getLabel().equals(gNode.getGroup())) {
382815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        if (groupnodes.get(i).getChildren() == null) {
383815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty          groupnodes.get(i).setChildren(mgrouplist);
384815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        }
385815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        mgrouplist.add(gNode);
386815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        //System.out.println("Added " + gNode.getLabel() + " to group " + group);
387815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        break;
388815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      } //?? no match
389815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
390815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    return groupnodes;
391815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  }
392815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
393815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  /**
39425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Sort by type and name (alpha), with manifest and src always at top.
39525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
396c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Comparator<File> byTypeAndName = new Comparator<File>() {
397c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    public int compare (File one, File other) {
398c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (one.isDirectory() && !other.isDirectory()) {
399c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return 1;
400c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (!one.isDirectory() && other.isDirectory()) {
401c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return -1;
40225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else if (one.getName().equals("AndroidManifest.xml")) {
40325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return -1;
40425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else if (one.getName().equals("src")) {
40525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return -1;
406c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else {
407c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return one.compareTo(other);
408c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
409c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
410c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  };
411c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
4121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
41325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Concatenate dirs that only hold dirs to simplify nav tree
41425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
415815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static List<Node> squashNodes(List<Node> tnode) {
41625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    List<Node> list = tnode;
41725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
41825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    for(int i = 0; i < list.size(); ++i) {
41925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //only squash dirs that contain another dir whose list size is 1 and
42025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //that don't contain endpoints
42125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      if ((list.get(i).getType().equals("dir")) &&
42225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.size() == 1) &&
42325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.get(i).getChildren().get(0).getChildren() != null)) {
42425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String thisLabel = list.get(i).getLabel();
42525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String childLabel =  list.get(i).getChildren().get(0).getLabel();
42625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String newLabel = thisLabel + "/" + childLabel;
42725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //Set label of parent and mChildren to those of child-child, skipping
42825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //squashed dir
42925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setLabel(newLabel);
43025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setChildren(list.get(i).getChildren().get(0).getChildren());
43125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
43225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        continue;
43325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
43425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
43525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    return list;
43625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  }
43725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
43825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
4391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * SampleCode variant of NavTree node.
4401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
4411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static class Node {
4421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLabel;
4431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLink;
444e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private String mGroup; // from sample.group in _index.jd
445e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private List<String> mTags; // from page.tags in _index.jd
44625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private List<Node> mChildren;
44725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private String mType;
4481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
449e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    Node(String label, String link, String group, List<String> tags, List<Node> children, String type) {
4501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mLabel = label;
4511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mLink = link;
452e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mGroup = group;
45325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      mTags = tags;
4541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mChildren = children;
4551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      mType = type;
4561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
4571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
4581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    static void renderString(StringBuilder buf, String s) {
4591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (s == null) {
4601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
4611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
4621b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
4631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = s.length();
4641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
4651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          char c = s.charAt(i);
4661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
4671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(c);
4681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          } else {
4691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append("\\u");
4701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            for (int j = 0; i < 4; i++) {
4711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              char x = (char) (c & 0x000f);
4721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              if (x > 10) {
4731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x - 10 + 'a');
4741b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              } else {
4751b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x + '0');
4761b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              }
4771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              buf.append(x);
4781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              c >>= 4;
4791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            }
4801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
4811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
4821b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
4831b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
4841b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
4851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
4861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void renderChildren(StringBuilder buf) {
4871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      List<Node> list = mChildren;
4881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (list == null || list.size() == 0) {
4891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // We output null for no children. That way empty lists here can just
4901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // be a byproduct of how we generate the lists.
4911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
4921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
4931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("[ ");
4941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = list.size();
4951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
4961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          list.get(i).render(buf);
4971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (i != N - 1) {
4981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(", ");
4991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
5001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
5011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append(" ]\n");
5021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
5031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
5041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
505e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    void renderTags(StringBuilder buf) {
506e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> list = mTags;
507e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (list == null || list.size() == 0) {
508e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("null");
509e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
510e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("[ ");
511e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        final int N = list.size();
512e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        for (int i = 0; i < N; i++) {
513e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          String tagval = list.get(i).toString();
514e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
515e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          final int L = tagval.length();
516e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          for (int t = 0; t < L; t++) {
517e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            char c = tagval.charAt(t);
518e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
519e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append(c);
520e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            } else {
521e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append("\\u");
522e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              for (int m = 0; m < 4; m++) {
523e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                char x = (char) (c & 0x000f);
524e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                if (x > 10) {
525e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x - 10 + 'a');
526e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                } else {
527e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x + '0');
528e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                }
529e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                buf.append(x);
530e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                c >>= 4;
531e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              }
532e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            }
533e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
534e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
535e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          if (i != N - 1) {
536e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            buf.append(", ");
537e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
538e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        }
539e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append(" ]");
540e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
541e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
542e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
5431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void render(StringBuilder buf) {
5441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[ ");
5451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLabel);
5461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
5471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLink);
5481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
549e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderString(buf, mGroup);
550e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
551e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderTags(buf);
552e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
5531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderChildren(buf);
5541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
5551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mType);
5561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(" ]");
5571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
55825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
55925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public List<Node> getChildren() {
56025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      if (mChildren != null) {
56125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return mChildren;
56225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
56325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return null;
56425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
56525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
56625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
56725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setChildren(List<Node> node) {
56825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        mChildren = node;
56925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
57025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
57125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getLabel() {
57225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLabel;
57325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
57425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
57525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setLabel(String label) {
57625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty       mLabel = label;
57725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
57825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
57925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getType() {
58025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mType.toString();
58125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
58225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
58325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getHref() {
58425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLink;
58525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
58625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
58725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setHref(String link) {
58825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      mLink = link;
58925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
590e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
591815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public String getGroup() {
592815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      return mGroup;
593e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
594e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
595815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public void setGroup(String group) {
596815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      mGroup = group;
597e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
598e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
599e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    public void setTags(String tags) {
600e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> tagList = new ArrayList();
601e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      String[] tagParts = tags.split(",");
602e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
603e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      for (int iter = 0; iter < tagParts.length; iter++) {
604e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        String item = tagParts[iter].replaceAll("\"", "").trim();
605e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        tagList.add(item);
606e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
607e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mTags = tagList;
608e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
609e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
610e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
611e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
612e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Write the project's templated _index.html
613e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
614e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
615e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
616e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void writeProjectIndex(Data hdf) {
617e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println(">>-- writing project index for " + mDest );
618e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
619e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir + " Sample");
620e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
621e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
622e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
623e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
624e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
625e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Grab the contents of an _index.html summary from a dir.
626e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
627e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
628e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void getSummaryFromDir(Data hdf, File dir, String key) {
629e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("Getting summary for " + dir + "/_index.html");
630e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summary", "");
631e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summaryFlag", "");
632e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getPath() + "/_index.html";
633e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String summary = SampleTagInfo.readFile(new SourcePositionInfo(filename,
634e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                          -1,-1), filename, "sample code", true, false, false, true);
635e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (summary != null) {
636e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue(key + "SummaryFlag", "true");
637e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("summary", summary);
638e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //set the target for [info] link
639e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //hdf.setValue(key + "Href", dir + "/index.html");
640e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //return true;
641e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
6421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
6431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
644c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
645c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
646c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
647c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeDirectory(File dir, String relative, boolean offline) {
648c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>();
649c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> files = new TreeSet<String>();
650c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
651c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String subdir = relative; // .substring(mDest.length());
652c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
653c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f : dir.listFiles()) {
654c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      String name = f.getName();
655c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (name.startsWith(".") || name.startsWith("_")) {
656c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        continue;
657c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
658c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (f.isFile()) {
659c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        String out = relative + name;
660c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, IMAGES)) {
661c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied directly
662c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
663c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writeImagePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
664c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
665c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
666c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, TEMPLATED)) {
667c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied and goes through the template
668c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
669c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
670c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
671c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
672c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
673c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        // else ignored
674c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (f.isDirectory()) {
675c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        writeDirectory(f, relative + name + "/", offline);
676c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        dirs.add(name);
677c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
678c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
679c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
680c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    // write the index page
681c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int i;
682c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
683c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
684c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("subdir", subdir);
685c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
686c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String d : dirs) {
687c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("subdirs." + i + ".Name", d);
688c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(d, ".html"));
689c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
690c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
691c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
692c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String f : files) {
693c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Name", f);
694c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(f, ".html"));
695c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
696c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
697c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
698c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
699c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
700c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
701c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
702c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
703c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
704c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
705c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeIndexOnly(File dir, String relative, Boolean offline) {
706c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
707c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
708c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
709c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      System.out.println("writing indexonly at " + relative + "/index" + Doclava.htmlExtension);
710c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
711c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
712c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
713c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
714c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
715c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
716c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public Data writeIndex(File dir) {
717c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = Doclava.makeHDF();
718c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("page.title", dir.getName() + " - " + mTitle);
719c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectTitle", mTitle);
720c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
721c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String filename = dir.getPath() + "/_index.html";
722c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String summary =
723c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
724c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty            true, false, false, true);
725c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
726c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (summary == null) {
727c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      summary = "";
728c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
729c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summary", summary);
730c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
731c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    return hdf;
732c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
733c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
734920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
735