1 package eu.svjatoslav.sixth.core.document;
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;
9 import java.io.IOException;
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;
16 public class OrgParser {
18 private Document document;
20 public Document parse(File file) throws IOException, InvalidSyntaxException {
21 document = new Document();
23 Tokenizer lineTokenizer = getFileToLineTokenizer(getFileContentsAsString(file));
26 final TokenizerMatch line = lineTokenizer.getNextToken();
30 parseLine(line.token);
36 private void parseLine(String line) throws InvalidSyntaxException {
37 Tokenizer lineTokenizer = getLineTokenizer(line + "\n");
39 TokenizerMatch token = lineTokenizer.getNextToken();
40 if (token == null) return;
42 if (token.terminator == null)
45 if (token.token.startsWith("*")){
51 private void parseHeading(TokenizerMatch token) {
52 int level = token.token.length()-1;
53 document.createHeading(fromOrg(token.reminder), level);
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);
65 private Tokenizer getFileToLineTokenizer(String contents) {
66 final Tokenizer tokenizer = new Tokenizer(contents);
69 // tokenizer.addTerminator(" ", DROP);
70 // tokenizer.addTerminator("\t", DROP);
71 // tokenizer.addTerminator("\n", DROP);
74 tokenizer.addTerminator("\n", DROP);
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);
89 // tokenizer.addTerminator("//", "\n", DROP);
90 // tokenizer.addTerminator("/*", "*/", DROP);
94 // private void parseImport(final Tokenizer tokenizer)
95 // throws InvalidSyntaxException {
97 // final Import imp = new Import();
99 // final TokenizerMatch match = tokenizer.getNextToken();
101 // if (match.token.equals("static")) {
102 // imp.isStatic = true;
103 // imp.path = tokenizer.getNextToken().token;
105 // imp.path = match.token;
109 // tokenizer.expectAndConsumeNextToken(";");
112 // private void parseInterface(final Tokenizer tokenizer)
113 // throws InvalidSyntaxException {
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);
121 // private void parsePackage(final Tokenizer tokenizer)
122 // throws InvalidSyntaxException {
124 // final TokenizerMatch match = tokenizer.getNextToken();
126 // packageName = match.token;
128 // tokenizer.expectAndConsumeNextToken(";");
131 public void skipUntilSemicolon(final Tokenizer tokenizer) throws InvalidSyntaxException {
133 final TokenizerMatch token = tokenizer.getNextToken();
138 if (token.token.equals(";"))