]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.internal.parsing.declarations;\r
2 \r
3 \r
4 public class DDocumentationAst extends DeclarationAst {\r
5     public final String documentation;\r
6     \r
7     public DDocumentationAst(String documentation) {\r
8         this.documentation = cleanUp(documentation);\r
9     }\r
10 \r
11     @Override\r
12     public void toString(int indentation, StringBuilder b) {\r
13         for(int i=0;i<indentation;++i) b.append("    ");\r
14         b.append("\"\"\"\n");\r
15         b.append(documentation);\r
16         b.append("\"\"\"\n");\r
17         \r
18     }\r
19     \r
20     private static String cleanUp(String documentation) {\r
21         // Remove empty lines\r
22         int end = documentation.length();\r
23         while(end > 0) {\r
24             char c = documentation.charAt(end-1);\r
25             if(c != ' ' && c != '\n')\r
26                 break;\r
27             --end;\r
28         }\r
29         \r
30         int begin = 0;\r
31         for(int i=0;i<end;++i) {\r
32             char c = documentation.charAt(i);\r
33             if(c == '\n')\r
34                 begin = i+1;\r
35             else if(c != ' ')\r
36                 break;\r
37         }\r
38             \r
39         // Calculate common indentation\r
40         int lineStart = begin;\r
41         int commonIndentation = Integer.MAX_VALUE;\r
42         for(int i=begin;i<end;++i) {\r
43             char c = documentation.charAt(i);\r
44             if(c == '\n') {\r
45                 lineStart = i+1;\r
46             }\r
47             else if(lineStart >= 0 && c != ' ') {\r
48                 int indentation = i - lineStart;\r
49                 commonIndentation = Math.min(commonIndentation, indentation);\r
50                 if(commonIndentation == 0) {\r
51                     if(begin == 0 && end == documentation.length())\r
52                         return documentation;\r
53                     else\r
54                         return documentation.substring(begin, end);\r
55                 }\r
56                 lineStart = -1;\r
57             }\r
58         }\r
59         \r
60         // Remove common indentation\r
61         StringBuilder result = new StringBuilder();\r
62         int charsToSkip = commonIndentation;\r
63         for(int i=begin;i<end;++i) {\r
64             char c = documentation.charAt(i);\r
65             if(c == '\n') {\r
66                 result.append(c);\r
67                 charsToSkip = commonIndentation;\r
68                 continue;\r
69             }\r
70             if(charsToSkip > 0)\r
71                 --charsToSkip;\r
72             else\r
73                 result.append(c);\r
74         }\r
75         return result.toString();\r
76     }\r
77 }\r