]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / markdown / html / HierarchicalDocumentationRef.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/markdown/html/HierarchicalDocumentationRef.java
new file mode 100644 (file)
index 0000000..f39901c
--- /dev/null
@@ -0,0 +1,94 @@
+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