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