]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DDocumentationAst.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / declarations / DDocumentationAst.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DDocumentationAst.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/declarations/DDocumentationAst.java
new file mode 100644 (file)
index 0000000..203ea5c
--- /dev/null
@@ -0,0 +1,77 @@
+package org.simantics.scl.compiler.internal.parsing.declarations;\r
+\r
+\r
+public class DDocumentationAst extends DeclarationAst {\r
+    public final String documentation;\r
+    \r
+    public DDocumentationAst(String documentation) {\r
+        this.documentation = cleanUp(documentation);\r
+    }\r
+\r
+    @Override\r
+    public void toString(int indentation, StringBuilder b) {\r
+        for(int i=0;i<indentation;++i) b.append("    ");\r
+        b.append("\"\"\"\n");\r
+        b.append(documentation);\r
+        b.append("\"\"\"\n");\r
+        \r
+    }\r
+    \r
+    private static String cleanUp(String documentation) {\r
+        // Remove empty lines\r
+        int end = documentation.length();\r
+        while(end > 0) {\r
+            char c = documentation.charAt(end-1);\r
+            if(c != ' ' && c != '\n')\r
+                break;\r
+            --end;\r
+        }\r
+        \r
+        int begin = 0;\r
+        for(int i=0;i<end;++i) {\r
+            char c = documentation.charAt(i);\r
+            if(c == '\n')\r
+                begin = i+1;\r
+            else if(c != ' ')\r
+                break;\r
+        }\r
+            \r
+        // Calculate common indentation\r
+        int lineStart = begin;\r
+        int commonIndentation = Integer.MAX_VALUE;\r
+        for(int i=begin;i<end;++i) {\r
+            char c = documentation.charAt(i);\r
+            if(c == '\n') {\r
+                lineStart = i+1;\r
+            }\r
+            else if(lineStart >= 0 && c != ' ') {\r
+                int indentation = i - lineStart;\r
+                commonIndentation = Math.min(commonIndentation, indentation);\r
+                if(commonIndentation == 0) {\r
+                    if(begin == 0 && end == documentation.length())\r
+                        return documentation;\r
+                    else\r
+                        return documentation.substring(begin, end);\r
+                }\r
+                lineStart = -1;\r
+            }\r
+        }\r
+        \r
+        // Remove common indentation\r
+        StringBuilder result = new StringBuilder();\r
+        int charsToSkip = commonIndentation;\r
+        for(int i=begin;i<end;++i) {\r
+            char c = documentation.charAt(i);\r
+            if(c == '\n') {\r
+                result.append(c);\r
+                charsToSkip = commonIndentation;\r
+                continue;\r
+            }\r
+            if(charsToSkip > 0)\r
+                --charsToSkip;\r
+            else\r
+                result.append(c);\r
+        }\r
+        return result.toString();\r
+    }\r
+}\r