15bd8803eb33cce41e0372c2c28f71be238d96a1
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / OrgParser.java
1 package eu.svjatoslav.sixth.core.document;
2
3 import eu.svjatoslav.commons.string.String2;
4 import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
5 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
6 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
7
8 import java.io.File;
9 import java.io.IOException;
10
11 import static eu.svjatoslav.commons.file.IOHelper.getFileContentsAsString;
12 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP;
13 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE;
14
15 public class OrgParser {
16
17     private Document document;
18
19     public Document parse(File file) throws IOException, InvalidSyntaxException {
20         document = new Document();
21
22         Tokenizer lineTokenizer = getFileToLineTokenizer(getFileContentsAsString(file));
23
24         while (true) {
25             final TokenizerMatch line = lineTokenizer.getNextToken();
26             if (line == null)
27                 break; // EOF
28
29             parseLine(line.token);
30         }
31
32         return document;
33     }
34
35     private void parseLine(String line) throws InvalidSyntaxException {
36         Tokenizer lineTokenizer = getLineTokenizer(line + "\n");
37
38         TokenizerMatch token = lineTokenizer.getNextToken();
39         if (token == null) return;
40
41         if (token.terminator == null)
42             return;
43
44         if (token.token.startsWith("*")){
45             parseHeading(line, token);
46             return;
47         }
48     }
49
50     private void parseHeading(String line, TokenizerMatch token) {
51         int level = token.token.length()-1;
52         document.createHeading(token.reminder, level);
53    }
54
55     private Tokenizer getLineTokenizer(String contents) {
56         final Tokenizer tokenizer = new Tokenizer(contents);
57         for (int i = 1; i<50; i++){
58             String prefix = new String2("*").repeat(i).toString();
59             tokenizer.addTerminator(prefix +" ","\n", PRESERVE);
60         }
61         return tokenizer;
62     }
63
64     private Tokenizer getFileToLineTokenizer(String contents) {
65         final Tokenizer tokenizer = new Tokenizer(contents);
66
67         // empty space
68 //        tokenizer.addTerminator(" ", DROP);
69 //        tokenizer.addTerminator("\t", DROP);
70 //        tokenizer.addTerminator("\n", DROP);
71
72         // newline
73         tokenizer.addTerminator("\n", DROP);
74
75 //        tokenizer.addTerminator(";", PRESERVE);
76 //        tokenizer.addTerminator("{", PRESERVE);
77 //        tokenizer.addTerminator("}", PRESERVE);
78 //        tokenizer.addTerminator("(", PRESERVE);
79 //        tokenizer.addTerminator(")", PRESERVE);
80 //        tokenizer.addTerminator("[", PRESERVE);
81 //        tokenizer.addTerminator("]", PRESERVE);
82 //        tokenizer.addTerminator("<", PRESERVE);
83 //        tokenizer.addTerminator(">", PRESERVE);
84 //        tokenizer.addTerminator(",", PRESERVE);
85 //        tokenizer.addTerminator("@", PRESERVE);
86
87         // comments
88 //        tokenizer.addTerminator("//", "\n", DROP);
89 //        tokenizer.addTerminator("/*", "*/", DROP);
90         return tokenizer;
91     }
92 //
93 //    private void parseImport(final Tokenizer tokenizer)
94 //            throws InvalidSyntaxException {
95 //
96 //        final Import imp = new Import();
97 //
98 //        final TokenizerMatch match = tokenizer.getNextToken();
99 //
100 //        if (match.token.equals("static")) {
101 //            imp.isStatic = true;
102 //            imp.path = tokenizer.getNextToken().token;
103 //        } else
104 //            imp.path = match.token;
105 //
106 //        imports.add(imp);
107 //
108 //        tokenizer.expectAndConsumeNextToken(";");
109 //    }
110 //
111 //    private void parseInterface(final Tokenizer tokenizer)
112 //            throws InvalidSyntaxException {
113 //
114 //        final TokenizerMatch match = tokenizer.getNextToken();
115 //        final Clazz clazz = new Clazz(packageName, match.token, tokenizer, true);
116 //        // System.out.println(clazz.toString());
117 //        classes.add(clazz);
118 //    }
119 //
120 //    private void parsePackage(final Tokenizer tokenizer)
121 //            throws InvalidSyntaxException {
122 //
123 //        final TokenizerMatch match = tokenizer.getNextToken();
124 //
125 //        packageName = match.token;
126 //
127 //        tokenizer.expectAndConsumeNextToken(";");
128 //    }
129
130     public void skipUntilSemicolon(final Tokenizer tokenizer) throws InvalidSyntaxException {
131         while (true) {
132             final TokenizerMatch token = tokenizer.getNextToken();
133
134             if (token == null)
135                 return;
136
137             if (token.token.equals(";"))
138                 return;
139         }
140     }
141
142
143 }