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