--- /dev/null
+package org.simantics.scl.compiler.markdown.html;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectProcedure;\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;\r
+\r
+public class HierarchicalDocumentationRef implements Comparable<HierarchicalDocumentationRef> {\r
+ final String name;\r
+ final ArrayList<HierarchicalDocumentationRef> children = new ArrayList<HierarchicalDocumentationRef>();\r
+ String documentationName;\r
+ \r
+ public HierarchicalDocumentationRef(String name) {\r
+ this.name = name;\r
+ }\r
+ \r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ public String getDocumentationName() {\r
+ return documentationName;\r
+ }\r
+ \r
+ public List<HierarchicalDocumentationRef> getChildren() {\r
+ return children;\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(HierarchicalDocumentationRef o) {\r
+ return name.compareTo(o.name);\r
+ }\r
+ \r
+ public static HierarchicalDocumentationRef generateTree(ModuleSourceRepository sourceRepository) {\r
+ final THashMap<String,HierarchicalDocumentationRef> refMap = new THashMap<String,HierarchicalDocumentationRef>();\r
+ HierarchicalDocumentationRef root = new HierarchicalDocumentationRef("");\r
+ refMap.put("", root);\r
+ final THashSet<String> documentationPaths = new THashSet<String>(); \r
+ TObjectProcedure<String> collector = new TObjectProcedure<String>() {\r
+ @Override\r
+ public boolean execute(String path) {\r
+ documentationPaths.add(path);\r
+ return true;\r
+ }\r
+ };\r
+ sourceRepository.forAllDocumentations(collector);\r
+ sourceRepository.forAllModules(collector);\r
+ documentationPaths.forEach(new TObjectProcedure<String>() {\r
+ HierarchicalDocumentationRef getRef(String path) {\r
+ HierarchicalDocumentationRef ref = refMap.get(path);\r
+ if(ref == null) {\r
+ String name;\r
+ String parentName;\r
+ int p = path.lastIndexOf('/');\r
+ if(p >= 0) {\r
+ name = path.substring(p+1);\r
+ parentName = path.substring(0, p);\r
+ }\r
+ else {\r
+ name = path;\r
+ parentName = "";\r
+ }\r
+ ref = new HierarchicalDocumentationRef(name);\r
+ refMap.put(path, ref);\r
+ getRef(parentName).children.add(ref);\r
+ }\r
+ return ref;\r
+ } \r
+ \r
+ @Override\r
+ public boolean execute(String documentationName) {\r
+ getRef(documentationName.contains("/")\r
+ ? documentationName : "StandardLibrary/" + documentationName)\r
+ .documentationName = documentationName;\r
+ return true;\r
+ }\r
+ });\r
+ \r
+ root.sort();\r
+ \r
+ return root;\r
+ }\r
+\r
+ private void sort() {\r
+ Collections.sort(children);\r
+ for(HierarchicalDocumentationRef child : children)\r
+ child.sort();\r
+ }\r
+}
\ No newline at end of file