SampleCode.java revision 3542770e7b9e121d1a3107300af1aac1b2555128
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.
75582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      Node rootNode = writeProjectIndexCs(hdf, f, null,
76582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty          new Node.Builder().setLabel(mProjectDir).setLink("samples/"
77582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty          + startname + "/index.html").setChildren(filelist).build());
781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // return a root SC node for the sample with children appended
79e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      return rootNode;
801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    return null;
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String convertExtension(String s, String ext) {
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s.substring(0, s.lastIndexOf('.')) + ext;
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String[] IMAGES = {".png", ".jpg", ".gif"};
893542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public static String[] VIDEOS = {".mp4", ".ogv", ".webm"};
901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String[] TEMPLATED = {".java", ".xml", ".aidl", ".rs",".txt", ".TXT"};
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean inList(String s, String[] list) {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String t : list) {
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (s.endsWith(t)) {
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String mapTypes(String name) {
1021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = name.substring(name.lastIndexOf('.') + 1, name.length());
1031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (type.equals("xml") || type.equals("java")) {
1041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.equals("AndroidManifest.xml")) type = "manifest";
1051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type;
1061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type = "file";
1081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
1101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public void writeProjectDirectory(List<Node> parent, File dir, String relative, Boolean recursed, Data hdf, String newkey) {
1121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>(); //dirs for project structure and breadcrumb
1131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> files = new TreeSet<String>(); //files for project structure and breadcrumb
1141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = relative;
1161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String name = "";
1171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String label = "";
1181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String link = "";
1191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = "";
1201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    int i = 0;
1211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String expansion = ".Sub.";
1221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String key = newkey;
1233542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    double maxFileSizeBytes = 2097152; //Max size for browseable images/video
1241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (recursed) {
1261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      key = (key + expansion);
1271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      expansion = "";
1291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
131c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    File[] dirContents = dir.listFiles();
132c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Arrays.sort(dirContents, byTypeAndName);
133c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f: dirContents) {
1341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      name = f.getName();
1351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // don't process certain types of files
1361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.startsWith(".") ||
1371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.startsWith("_") ||
1381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("default.properties") ||
1391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("build.properties") ||
1401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.endsWith(".ttf") ||
141e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".gradle") ||
142e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".bat") ||
1431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.equals("Android.mk")) {
1441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Invalid File Type, bypassing: " + name);
1451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         continue;
1461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
1471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       if (f.isFile() && name.contains(".")){
1481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String path = relative + name;
1491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = mapTypes(name);
1501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = convertExtension(path, ".html");
1511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue("samples", "true");//dd needed?
1521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, IMAGES)) {
1531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copy these files to output directly
1541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           type = "img";
1553542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           if (f.length() < maxFileSizeBytes) {
1563542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             ClearPage.copyFile(false, f, path);
1573542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1583542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, true);
1593542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           } else {
1603542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             //too large for browsing, skip copying and show generic icon
1613542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1623542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, false);
1633542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           }
1641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", "img");
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         }
1703542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty         if (inList(path, VIDEOS)) {
1713542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           // copy these files to output directly
1723542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           type = "video";
1733542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           if (f.length() < maxFileSizeBytes) {
1743542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             ClearPage.copyFile(false, f, path);
1753542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1763542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, true);
1773542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           } else {
1783542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             //too large for browsing, skip copying and show generic icon
1793542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1803542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, false);
1813542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           }
1823542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           files.add(name);
1833542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Type", "video");
1843542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Name", name);
1853542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Href", link);
1863542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1873542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty         }
1881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, TEMPLATED)) {
1891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copied and goes through the template
1901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", type);
1941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
19625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         // add file to the navtree
199582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty         parent.add(new Node.Builder().setLabel(name).setLink(link).setType(type).build());
2001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
2011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       } else if (f.isDirectory()) {
2021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         List<Node> mchildren = new ArrayList<Node>();
2031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = "dir";
2041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String dirpath = relative + name;
2051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = dirpath + "/index.html";
2061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyName = (key + i + ".Name");
2071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyType = (key + i + ".Type");
2081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyHref = (key + i + ".Href");
2091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyName, name);
2101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyType, type);
2111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyHref, relative + name + "/" + "index.html");
2121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Found directory, recursing. Current key: " + hdfkeyName);
2131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         writeProjectDirectory(mchildren, f, relative + name + "/", true, hdf, (key + i));
2141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (mchildren.size() > 0) {
2151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           //dir is processed, now add it to the navtree
216c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty           //don't link sidenav subdirs at this point (but can use "link" to do so)
217582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty          parent.add(new Node.Builder().setLabel(name).setChildren(mchildren).setType(type).build());
2181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
219c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty         dirs.add(name);
2201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
2211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
22225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
2231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
2241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //If this is an index for the project root (assumed root if split length is 3 (development/samples/nn)),
2251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //then remove the root dir so that it won't appear in the breadcrumb. Else just pass it through to
2261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //setParentDirs as usual.
2271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mpath = dir + "";
2281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String sdir[] = mpath.split("/");
2291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, relative, name, false);
230e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //Generate an index.html page for each dir being processed
231e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "/index" + Doclava.htmlExtension);
232e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //concatenate dirs in the navtree. Comment out or remove to restore normal navtree
23325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    squashNodes(parent);
234e27c950134c99151d1d9914eaaf28848327e4f63Scott Main  }
235e27c950134c99151d1d9914eaaf28848327e4f63Scott Main
236c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeProjectStructure(String dir, Data hdf) {
237c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println(">>-- writing project structure for " + dir );
238c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "true");
239c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
240c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("page.title", mProjectDir + " Structure");
241c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectTitle", mTitle);
242e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //write the project.html file
243e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "project" + Doclava.htmlExtension);
244c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "");
245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
247c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
248e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Processes a templated project index page from _index.jd in a project root.
249e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Each sample project must have an index, and each index locally defines it's own
250e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * page.tags and sample.group cs vars. This method takes a SC node on input, reads
251e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * any local vars from the _index.jd, generates an html file to out, then updates
252e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * the SC node with the page vars and returns it to the caller.
253e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
254c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
255e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public Node writeProjectIndexCs(Data hdf, File dir, String key, Node tnode) {
256e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summary", "");
257e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summaryFlag", "");
258e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getAbsolutePath() + "/_index.jd";
259e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    File f = new File(filename);
260e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String rel = dir.getPath();
261e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String mGroup = "";
262e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("samples", "true");
263e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set any default page variables for root index
264e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir);
26525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
26625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
2673542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    //add the download/project links to the landing pages.
2683542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samplesProjectIndex", "true");
2691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
270e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (!f.isFile()) {
271e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //The sample didn't have any _index.jd, so create a stub.
272e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
273e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
274e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + ": Root _index.jd must be present and must define sample.group"
275e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + " tag. Please see ... for details.");
276e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    } else {
277e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      DocFile.writePage(filename, rel, mDest + "index" + Doclava.htmlExtension, hdf);
278582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      PageMetadata.setPageMetadata(f, rel, mDest + "index" + Doclava.htmlExtension, hdf, Doclava.sTaglist);
279e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setTags(hdf.getValue("page.tags", ""));
280e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mGroup = hdf.getValue("sample.group", "");
281e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (mGroup.equals("")) {
282e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
283e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + ": Root _index.jd must be present and must define sample.group"
284e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + " tag. Please see ... for details.");
285e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
286e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setGroup(hdf.getValue("sample.group", ""));
287e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
288e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
289e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    return tnode;
290c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
292c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
293c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Keep track of file parents
294c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
295c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Data setParentDirs(Data hdf, String subdir, String name, Boolean isFile) {
296e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set whether to linkify the crumb dirs on each sample code page
297e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("pathCrumbLinks", "");
298e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //isFile = false;
299c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int iter;
300c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.removeTree("parentdirs");
301c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String s = subdir;
302c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String urlParts[] = s.split("/");
303e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //int n, l = (isFile)?1:0;
304e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    int n, l = 1;
305e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("setParentDirs for " + subdir + name);
306e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    for (iter=1; iter < urlParts.length; iter++) {
307e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      n = iter-1;
308c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println("parentdirs." + n + ".Name == " + urlParts[iter]);
309c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("parentdirs." + n + ".Name", urlParts[iter]);
310e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("parentdirs." + n + ".Link", subdir + "index" + Doclava.htmlExtension);
311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return hdf;
313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
315c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
316c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated source code file to out.
317c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writePage(File f, String out, String subdir) {
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
3201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String path = f.getPath();
321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data =
3221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(path, -1, -1), path, "sample code",
3231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            true, true, true, true);
324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data = Doclava.escape(data);
325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
32725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
32825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    String relative = subdir.replaceFirst("samples/", "");
3291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
3301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
3311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
332c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
33525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("relative", relative);
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
3381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
3391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
344c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
3453542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  * Write a templated image or video file to out.
346c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
3473542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public void writeImageVideoPage(File f, String out, String subdir,
3483542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty      String resourceType, boolean browsable) {
349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
3503542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    String name = f.getName();
3513542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    if (!browsable) {
3523542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty      hdf.setValue("noDisplay", "true");
3533542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    }
3541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
3553542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samples", "true");
356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
3571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
358c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
3603542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resType", resourceType);
361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
3641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
366582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty  * Render a SC node tree to a navtree js file.
3671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
368815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static void writeSamplesNavTree(List<Node> tnode, List<Node> groupnodes) {
369815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
370582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty    Node node = new
371582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty        Node.Builder().setLabel("Reference").setLink("packages.html").setChildren(tnode).build();
3721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
373815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    if (groupnodes != null) {
374815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      for (int i = 0; i < tnode.size(); i++) {
375815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        groupnodes = appendNodeGroups(tnode.get(i), groupnodes);
376815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      }
3771d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      for (int n = 0; n < groupnodes.size(); n++) {
3781d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        if (groupnodes.get(n).getChildren() == null) {
3791d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          groupnodes.remove(n);
3801d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          n--;
3811d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        }
3821d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      }
383815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      node.setChildren(groupnodes);
384815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
385815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
3861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    StringBuilder buf = new StringBuilder();
3871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (false) {
3881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    // if you want a root node
3891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[");
3901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.render(buf);
3911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("]");
3921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
3931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // if you don't want a root node
3941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.renderChildren(buf);
3951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Data data = Doclava.makeHDF();
3981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    data.setValue("reference_tree", buf.toString());
3991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    ClearPage.write(data, "samples_navtree_data.cs", "samples_navtree_data.js");
4001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
4011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
40225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
4031d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * For a given project root node, get the group and then iterate the list of valid
4041d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * groups looking for a match. If found, append the project to that group node.
405582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty  * Samples that reference a valid sample group tag are added to a list for that
4061d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * group. Samples declare a sample.group tag in their _index.jd files.
407815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  */
408815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  private static List<Node> appendNodeGroups(Node gNode, List<Node> groupnodes) {
409815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    List<Node> mgrouplist = new ArrayList<Node>();
4101d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty    for (int i = 0; i < groupnodes.size(); i++) {
411815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      if (groupnodes.get(i).getLabel().equals(gNode.getGroup())) {
412815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        if (groupnodes.get(i).getChildren() == null) {
4131d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          mgrouplist.add(gNode);
414815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty          groupnodes.get(i).setChildren(mgrouplist);
4151d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        } else {
4161d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          groupnodes.get(i).getChildren().add(gNode);
417815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        }
418815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        break;
4191d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      }
420815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
421815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    return groupnodes;
422815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  }
423815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
424815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  /**
42525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Sort by type and name (alpha), with manifest and src always at top.
42625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
427c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Comparator<File> byTypeAndName = new Comparator<File>() {
428c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    public int compare (File one, File other) {
429c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (one.isDirectory() && !other.isDirectory()) {
430c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return 1;
431c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (!one.isDirectory() && other.isDirectory()) {
432c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return -1;
43325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else if (one.getName().equals("AndroidManifest.xml")) {
43425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return -1;
435c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else {
436c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return one.compareTo(other);
437c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
438c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
439c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  };
440c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
4411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
44225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Concatenate dirs that only hold dirs to simplify nav tree
44325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
444815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static List<Node> squashNodes(List<Node> tnode) {
44525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    List<Node> list = tnode;
44625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
44725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    for(int i = 0; i < list.size(); ++i) {
44825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //only squash dirs that contain another dir whose list size is 1 and
44925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //that don't contain endpoints
45025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      if ((list.get(i).getType().equals("dir")) &&
45125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.size() == 1) &&
45225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.get(i).getChildren().get(0).getChildren() != null)) {
45325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String thisLabel = list.get(i).getLabel();
45425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String childLabel =  list.get(i).getChildren().get(0).getLabel();
45525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String newLabel = thisLabel + "/" + childLabel;
45625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //Set label of parent and mChildren to those of child-child, skipping
45725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //squashed dir
45825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setLabel(newLabel);
45925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setChildren(list.get(i).getChildren().get(0).getChildren());
46025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
46125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        continue;
46225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
46325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
46425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    return list;
46525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  }
46625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
46725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
4681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * SampleCode variant of NavTree node.
4691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
4701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static class Node {
4711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLabel;
4721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLink;
473e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private String mGroup; // from sample.group in _index.jd
474e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private List<String> mTags; // from page.tags in _index.jd
47525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private List<Node> mChildren;
47625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private String mType;
4771b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
478582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty    private Node(Builder builder) {
479582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mLabel = builder.mLabel;
480582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mLink = builder.mLink;
481582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mGroup = builder.mGroup;
482582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mTags = builder.mTags;
483582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mChildren = builder.mChildren;
484582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      mType = builder.mType;
4851b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
4861b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
487582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty    public static class Builder {
488582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      private String mLabel, mLink, mGroup, mType;
489582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      private List<String> mTags = null;
490582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      private List<Node> mChildren = null;
491582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setLabel(String mLabel) { this.mLabel = mLabel; return this;}
492582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setLink(String mLink) { this.mLink = mLink; return this;}
493582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setGroup(String mGroup) { this.mGroup = mGroup; return this;}
494582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setTags(List<String> mTags) { this.mTags = mTags; return this;}
495582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setChildren(List<Node> mChildren) { this.mChildren = mChildren; return this;}
496582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Builder setType(String mType) { this.mType = mType; return this;}
497582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      public Node build() {return new Node(this);}
498582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty    }
499582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty
500582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty    public Node(String mLabel,
501582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      String mLink,
502582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      String mGroup,
503582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      List<String> mTags,
504582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      List<Node> mChildren,
505582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      String mType) {
506582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mLabel = mLabel;
507582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mLink = mLink;
508582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mGroup = mGroup;
509582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mTags = mTags;
510582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mChildren = mChildren;
511582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty      this.mType = mType; }
512582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty
5131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    static void renderString(StringBuilder buf, String s) {
5141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (s == null) {
5151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
5161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
5171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
5181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = s.length();
5191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
5201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          char c = s.charAt(i);
5211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
5221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(c);
5231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          } else {
5241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append("\\u");
5251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            for (int j = 0; i < 4; i++) {
5261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              char x = (char) (c & 0x000f);
5271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              if (x > 10) {
5281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x - 10 + 'a');
5291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              } else {
5301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x + '0');
5311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              }
5321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              buf.append(x);
5331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              c >>= 4;
5341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            }
5351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
5361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
5371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
5381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
5391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
5401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
5411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void renderChildren(StringBuilder buf) {
5421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      List<Node> list = mChildren;
5431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (list == null || list.size() == 0) {
5441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // We output null for no children. That way empty lists here can just
5451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // be a byproduct of how we generate the lists.
5461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
5471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
5481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("[ ");
5491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = list.size();
5501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
5511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          list.get(i).render(buf);
5521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (i != N - 1) {
5531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(", ");
5541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
5551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
5561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append(" ]\n");
5571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
5581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
5591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
560e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    void renderTags(StringBuilder buf) {
561e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> list = mTags;
562e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (list == null || list.size() == 0) {
563e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("null");
564e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
565e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("[ ");
566e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        final int N = list.size();
567e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        for (int i = 0; i < N; i++) {
568e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          String tagval = list.get(i).toString();
569e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
570e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          final int L = tagval.length();
571e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          for (int t = 0; t < L; t++) {
572e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            char c = tagval.charAt(t);
573e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
574e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append(c);
575e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            } else {
576e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append("\\u");
577e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              for (int m = 0; m < 4; m++) {
578e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                char x = (char) (c & 0x000f);
579e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                if (x > 10) {
580e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x - 10 + 'a');
581e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                } else {
582e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x + '0');
583e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                }
584e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                buf.append(x);
585e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                c >>= 4;
586e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              }
587e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            }
588e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
589e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
590e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          if (i != N - 1) {
591e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            buf.append(", ");
592e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
593e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        }
594e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append(" ]");
595e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
596e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
597e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
5981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void render(StringBuilder buf) {
5991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[ ");
6001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLabel);
6011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
6021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLink);
6031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
604e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderString(buf, mGroup);
605e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
606e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderTags(buf);
607e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
6081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderChildren(buf);
6091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
6101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mType);
6111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(" ]");
6121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
61325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
61425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public List<Node> getChildren() {
61525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      if (mChildren != null) {
61625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return mChildren;
61725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
61825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return null;
61925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
62025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
62125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
62225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setChildren(List<Node> node) {
62325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        mChildren = node;
62425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
62525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
62625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getLabel() {
62725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLabel;
62825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
62925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
63025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setLabel(String label) {
63125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty       mLabel = label;
63225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
63325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
63425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getType() {
63525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mType.toString();
63625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
63725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
63825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getHref() {
63925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLink;
64025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
64125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
64225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setHref(String link) {
64325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      mLink = link;
64425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
645e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
646815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public String getGroup() {
647815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      return mGroup;
648e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
649e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
650815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public void setGroup(String group) {
651815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      mGroup = group;
652e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
653e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
654e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    public void setTags(String tags) {
655e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> tagList = new ArrayList();
656e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      String[] tagParts = tags.split(",");
657e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
658e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      for (int iter = 0; iter < tagParts.length; iter++) {
659e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        String item = tagParts[iter].replaceAll("\"", "").trim();
660e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        tagList.add(item);
661e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
662e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mTags = tagList;
663e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
664e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
665e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
666e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
667e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Write the project's templated _index.html
668e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
669e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
670e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
671e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void writeProjectIndex(Data hdf) {
672e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println(">>-- writing project index for " + mDest );
673e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
674e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir + " Sample");
675e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
676e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
677e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
678e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
679e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
680e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Grab the contents of an _index.html summary from a dir.
681e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
682e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
683e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void getSummaryFromDir(Data hdf, File dir, String key) {
684e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("Getting summary for " + dir + "/_index.html");
685e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summary", "");
686e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summaryFlag", "");
687e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getPath() + "/_index.html";
688e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String summary = SampleTagInfo.readFile(new SourcePositionInfo(filename,
689e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                          -1,-1), filename, "sample code", true, false, false, true);
690e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (summary != null) {
691e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue(key + "SummaryFlag", "true");
692e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("summary", summary);
693e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //set the target for [info] link
694e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //hdf.setValue(key + "Href", dir + "/index.html");
695e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //return true;
696e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
6971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
6981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
699c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
700c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
701c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
702c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeDirectory(File dir, String relative, boolean offline) {
703c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>();
704c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> files = new TreeSet<String>();
705c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
706c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String subdir = relative; // .substring(mDest.length());
707c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
708c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f : dir.listFiles()) {
709c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      String name = f.getName();
710c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (name.startsWith(".") || name.startsWith("_")) {
711c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        continue;
712c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
713c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (f.isFile()) {
714c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        String out = relative + name;
715c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, IMAGES)) {
716c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied directly
717c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
718c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writeImagePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
719c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
720c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
721c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, TEMPLATED)) {
722c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied and goes through the template
723c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
724c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
725c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
726c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
727c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
728c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        // else ignored
729c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (f.isDirectory()) {
730c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        writeDirectory(f, relative + name + "/", offline);
731c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        dirs.add(name);
732c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
733c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
734c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
735c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    // write the index page
736c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int i;
737c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
738c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
739c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("subdir", subdir);
740c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
741c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String d : dirs) {
742c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("subdirs." + i + ".Name", d);
743c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(d, ".html"));
744c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
745c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
746c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
747c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String f : files) {
748c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Name", f);
749c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(f, ".html"));
750c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
751c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
752c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
753c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
754c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
755c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
756c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
757c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
758c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
759c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
760c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeIndexOnly(File dir, String relative, Boolean offline) {
761c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
762c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
763c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
764c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      System.out.println("writing indexonly at " + relative + "/index" + Doclava.htmlExtension);
765c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
766c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
767c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
768c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
769c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
770c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
771c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public Data writeIndex(File dir) {
772c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = Doclava.makeHDF();
773c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("page.title", dir.getName() + " - " + mTitle);
774c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectTitle", mTitle);
775c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
776c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String filename = dir.getPath() + "/_index.html";
777c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String summary =
778c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
779c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty            true, false, false, true);
780c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
781c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (summary == null) {
782c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      summary = "";
783c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
784c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summary", summary);
785c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
786c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    return hdf;
787c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
788c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
7893542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  /**
7903542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  * @deprecated
7913542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  */
7923542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public void writeImagePage(File f, String out, String subdir) {
7933542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    Data hdf = Doclava.makeHDF();
7943542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    String name = f.getName();
7953542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty
7963542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samples", "true");
7973542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    setParentDirs(hdf, subdir, name, true);
7983542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("page.title", name);
7993542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
8003542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
8013542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("subdir", subdir);
8023542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("realFile", name);
8033542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resTag", "sample");
8043542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resType", "sampleImage");
8053542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    ClearPage.write(hdf, "sample.cs", out);
8063542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  }
807920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
808