From 43916d3c39527345b03e903038c0d29dddb555a6 Mon Sep 17 00:00:00 2001 From: Christian Meier Date: Sun, 28 Feb 2016 16:50:12 +0100 Subject: [PATCH] generate browsable site --- .../java/org/tipitaka/search/Builder.java | 177 ++++++++++++++++++ .../tipitaka/search/DirectoryStructure.java | 39 ++-- .../java/org/tipitaka/search/HtmlBuilder.java | 8 +- src/main/java/org/tipitaka/search/Main.java | 6 +- src/main/java/org/tipitaka/search/Script.java | 2 +- .../org/tipitaka/search/ScriptFactory.java | 2 +- .../tipitaka/search/TipitakaOrgVisitor.java | 72 ++++--- .../search/TipitakaOrgVisitorHtml.java | 93 ++++++++- .../search/TipitakaOrgVisitorIndexHtml.java | 70 +++++++ .../search/TipitakaOrgVisitorLegacyHtml.java | 65 +++++++ .../java/org/tipitaka/search/Visitor.java | 12 ++ 11 files changed, 492 insertions(+), 54 deletions(-) create mode 100644 src/main/java/org/tipitaka/search/Builder.java create mode 100644 src/main/java/org/tipitaka/search/TipitakaOrgVisitorIndexHtml.java create mode 100644 src/main/java/org/tipitaka/search/TipitakaOrgVisitorLegacyHtml.java create mode 100644 src/main/java/org/tipitaka/search/Visitor.java diff --git a/src/main/java/org/tipitaka/search/Builder.java b/src/main/java/org/tipitaka/search/Builder.java new file mode 100644 index 0000000..0119f2b --- /dev/null +++ b/src/main/java/org/tipitaka/search/Builder.java @@ -0,0 +1,177 @@ +package org.tipitaka.search; + +import java.io.IOException; +import java.io.Writer; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Created by cmeier on 2/28/16. + */ +class Builder +{ + + final DirectoryStructure directory; + + final Script script; + + final Writer writer; + + final Map breadCrumbs; + + final String path; + + final boolean isSubdir; + + final String url; + Builder(DirectoryStructure directory, Script script, Writer writer, String path) throws IOException { + this(directory, script, writer, path, null); + } + + Builder(DirectoryStructure directory, Script script, Writer writer, String path, String url) throws IOException { + this.url = url; + if (url == null) { + this.isSubdir = directory.fileOf(path) == null; + if (isSubdir) { + this.path = path.replaceFirst("/[^/]+$", ""); + ; + } + else { + this.path = path.replaceFirst("[^/]+$", ""); + } + this.breadCrumbs = directory.breadCrumbs(script, this.path); + } + else { + this.isSubdir = false; + this.path = path; + this.breadCrumbs = directory.breadCrumbs(script, this.path);//.replaceFirst("[^/]+$", "")); + } + this.directory = directory; + this.script = script; + this.writer = writer; + } + + public Builder buildDir() throws IOException { + if (isSubdir) { + return buildSubdir(); + } + return buildLeafdir(); + } + + public Builder buildSubdir() throws IOException { + startHtmlBody(); + appendNavigation("/index.html"); + endBodyHtml(); + return this; + } + + public Builder buildLeafdir() throws IOException { + startHtmlBody(); + appendNavigation(".html"); + endBodyHtml(); + return this; + } + + public Builder appendTitle() throws IOException { + writer.append(""); + boolean first = true; + List<String> parts = new LinkedList<String>(breadCrumbs.values()); + Collections.reverse(parts); + for (String part : parts) { + if (part != null) { + if (first) { + first = false; + } + else { + writer.append(" - "); + } + writer.append(part); + } + } + writer.append(""); + return this; + } + + public Builder startHtmlBody() throws IOException { + writer.append("\n" + + "\n" + + "\n" + + "\n" + + "\n"); + if (this.url != null) { + writer.append("\n"); + } + writer.append("\n"); + + appendTitle(); + + writer.append("\n\n"); + + return this; + } + + public Builder endBodyHtml() throws IOException { + writer.append("\n\n"); + return this; + } + + public Builder appendNavigation(String postfix) throws IOException { + writer.append("
\n" + + "
\n"); + writer.append(""); + if ("/".equals(path)) { + writer.append("ROOT"); + } + else { + writer.append("ROOT"); + } + writer.append(""); + List> crumbs = new LinkedList>(breadCrumbs.entrySet()); + for (Map.Entry part : crumbs) { + if (part.getValue() != null) { + boolean hilight = path.length() == part.getKey().length() || path.length() == part.getKey().length() +1; + if ((!hilight && url != null) || url == null) { + writer.append(" - \n"); + writer.append(""); + if (hilight) { + writer.append(part.getValue()); + } + else { + writer.append("") + .append(part.getValue()).append(""); + } + writer.append(""); + } + } + } + writer.append(" - \n"); + writer.append("\n"); + + for (Map.Entry entry : this.directory.list(this.script, this.path).entrySet()) { + + writer.append("
"); + if (path.equals(entry.getKey())) { + writer.append(entry.getValue()); + } + else { + writer.append("") + .append(entry.getValue()).append(""); + + } + writer.append("
\n"); + } + + writer.append("
\n"); + + + writer.append("\n
\n
\n"); + + return this; + } + + public void flush() throws IOException { + writer.flush(); + } +} diff --git a/src/main/java/org/tipitaka/search/DirectoryStructure.java b/src/main/java/org/tipitaka/search/DirectoryStructure.java index 8dbe351..89f3a58 100644 --- a/src/main/java/org/tipitaka/search/DirectoryStructure.java +++ b/src/main/java/org/tipitaka/search/DirectoryStructure.java @@ -12,6 +12,7 @@ import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -89,7 +90,11 @@ public static void main(String... args) throws Exception { System.err.println(System.currentTimeMillis() - start2); factory.newHtmlBuilder(new FileWriter("/home/kristian/deva-test-mini.html"), new TipitakaPath("", path)).buildMinimal(); } - + + public Collection allPaths() { + return map.keySet(); + } + public Map list(Script words, String path) { if(map.containsKey(path)){ return listFiles(words, path); @@ -128,7 +133,7 @@ public Map listFiles(Script words, String path) { public Map breadCrumbs(Script trans, String path) { Map result = new LinkedHashMap(); - if(path != null && !"/".equals(path)){ + if(path != null && !"/".equals(path)) { if (path.endsWith("/")) { path = path.substring(0, path.length() - 1); } @@ -136,11 +141,16 @@ public Map breadCrumbs(Script trans, String path) { int next = path.indexOf("/", from); while (next > -1) { result.put(path.substring(0, next), trans.get(path.substring( - from, next))); + from, next))); from = next + 1; next = path.indexOf("/", from); } - result.put(path, trans.get(path.substring(from))); + if (path.length() == 0) { + result.put(path, "ROOT"); + } + else { + result.put(path, trans.get(path.substring(from))); + } } return result; } @@ -165,13 +175,15 @@ void reload() throws XmlPullParserException, IOException{ parts.clear(); for(String part: entry.getValue()){ if(part != null){ - parts.add(RomanScriptHelper.removeDiacritcals(part.replaceFirst("[(][0-9]+[)]", "").replaceFirst("[0-9]+\\.\\ ", "") - .replaceFirst("(bhikkhunīvibhaṅgo)", "- bhikkhunīvibhaṅgo")//.replaceFirst("\\ [(].*[)]", "") - .replaceAll("[()]","").replace("’", " ")) - .toLowerCase().trim().replaceAll(" ", "_")); + parts.add(RomanScriptHelper.removeDiacritcals(part//.replaceFirst("[(][0-9]+[)]", "").replaceFirst("[0-9]+\\.\\ ", "") + //.replaceFirst("(bhikkhunīvibhaṅgo)", "- bhikkhunīvibhaṅgo")//.replaceFirst("\\ [(].*[)]", "") + //.replaceAll("[()]","").replace("’", " ")) + .replaceFirst("\\.$", "") + .toLowerCase().trim()));//.replaceAll(" ", "_")); } } String path = root.addLeaf(entry.getKey(), parts); + while (map.containsKey(path)) path += "_"; map.put(path, entry.getKey()); rmap.put(entry.getKey(), path); } @@ -195,11 +207,12 @@ Script transcribe(String script) throws XmlPullParserException, IOException{ if(rmap.containsKey(entry.getKey())){ String[] paths = rmap.get(entry.getKey()).substring(1).split("/"); for(int i = 0; i < paths.length; i++){ + System.err.println(paths[i] + " <> " + parts.get(i)); words.put(paths[i], parts.get(i)); } } else { - System.err.println("---" + entry.getKey()); + //System.err.println("---" + entry.getKey()); } } return words; @@ -240,7 +253,10 @@ public void load(Reader reader) throws IOException{ } } } - + + public String pathOfOrignalFile(String path) { + return rmap.get(path); + } public String fileOf(String path){ return map.get(path); } @@ -253,7 +269,6 @@ Set subdirs(String path){ return EMPTY; } path = path.replaceAll("^/|/$", ""); - System.err.println("--- " + path); return root.getNode(path.split("/")).children.keySet(); } @@ -316,4 +331,4 @@ Node getNode(String... parts){ return n; } } -} \ No newline at end of file +} diff --git a/src/main/java/org/tipitaka/search/HtmlBuilder.java b/src/main/java/org/tipitaka/search/HtmlBuilder.java index 7c67103..821cae3 100644 --- a/src/main/java/org/tipitaka/search/HtmlBuilder.java +++ b/src/main/java/org/tipitaka/search/HtmlBuilder.java @@ -30,7 +30,7 @@ public HtmlBuilder(Writer writer, String prefix, Script script, String path, this.factory = factory; try { this.tipitaka = new TipitakaOrgVisitorHtml(urlFactory); - } catch (XmlPullParserException e) { + } catch (Exception e) { throw new RuntimeException("error creating html visitor", e); } } @@ -58,11 +58,7 @@ public void buildPage() throws IOException { String file = structure.fileOf(path.replaceFirst("\\.[a-z]+$", "")); if(file != null){ writer.append("
\n"); - try { - tipitaka.accept(writer, script.tipitakaOrgName, file); - } catch (XmlPullParserException e) { - throw new RuntimeException("parse error", e); - } + tipitaka.accept(writer, script, file); writer.append("
\n"); } } diff --git a/src/main/java/org/tipitaka/search/Main.java b/src/main/java/org/tipitaka/search/Main.java index 180c8ce..b421001 100644 --- a/src/main/java/org/tipitaka/search/Main.java +++ b/src/main/java/org/tipitaka/search/Main.java @@ -9,7 +9,7 @@ public class Main { private static final int DONE = 1000; enum Command { - MIRROR, INDEX, DIRECTORY_STRUCTURE, DIRECTORY_TRANSLATION + MIRROR, INDEX, DIRECTORY_STRUCTURE, DIRECTORY_TRANSCRIBE } public static void main(String... args) throws Exception { if( args.length == 0){ @@ -52,7 +52,7 @@ public static int run(int offset, String... args) throws Exception { dir.reload(); dir.save(new File(basedir, "directory.map")); return 2; - case DIRECTORY_TRANSLATION : + case DIRECTORY_TRANSCRIBE: if (args.length == offset + 2) { throw new RuntimeException( "no