c4e18cdd59805c570d821432c0b9aa75ada0df67
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / Document.java
1 package eu.svjatoslav.sixth.core.document;
2
3 import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
4 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
5 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
6 import eu.svjatoslav.sixth.core.document.text.FormattedText;
7
8 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP;
9 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE;
10 import static eu.svjatoslav.sixth.core.document.Helper.*;
11 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
12
13 public class Document {
14     public final Heading rootHeading = new Heading( null , 0, null);
15     private Heading currentHeading = rootHeading;
16
17     public Heading createHeading(FormattedText name, int targetLevel){
18         if (currentHeading.level == (targetLevel - 1)){
19             Heading newHeading = new Heading(name, targetLevel, currentHeading);
20             currentHeading.addChild(newHeading);
21             currentHeading = newHeading;
22             return newHeading;
23         }
24
25         if (currentHeading.level > (targetLevel - 1)){
26             currentHeading = currentHeading.parent;
27             return createHeading(name, targetLevel);
28         }
29
30         Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
31         currentHeading.addChild(missingIntermediate);
32         currentHeading = missingIntermediate;
33         return createHeading(name, targetLevel);
34     }
35
36     public Heading getCurrentHeading(){
37         return currentHeading;
38     }
39
40     private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException {
41         String[] headingSections = token.getRegExpGroups();
42         int level = headingSections[0].length();
43         String title = headingSections[1];
44         createHeading(fromOrg(title), level);
45     }
46
47     public void parse(String fileContentsAsString) throws InvalidSyntaxException {
48         final Tokenizer tokenizer = new Tokenizer(fileContentsAsString);
49
50         // Org heading:
51         // "*** Example Heading 1234"
52         tokenizer.addTerminator(PRESERVE, "(\\*+)[ \\t](.*)\\r?\\n", TG_HEADING);
53
54         // Org list. Examples:
55         // "   + my list title"
56         // "   - my list title"
57         tokenizer.addTerminator(PRESERVE, "([ \\t]*)(\\+|-)[ \\t]?(.*)?\\r?\\n", TG_LIST);
58
59         // "   * my list title"
60         tokenizer.addTerminator(PRESERVE, "([ \\t]+)(\\*)[ \\t]?(.*)?\\r?\\n", TG_LIST);
61
62         // DocumentProperty:
63         // "#+OPTIONS: H:20 num:20"
64         tokenizer.addTerminator(PRESERVE, "#\\+.+:.*\\r?\\n", TG_DOCUMENT_PROPERTY);
65
66         // newline
67         tokenizer.addTerminator(DROP,"\\r?\\n", TG_NEWLINE);
68
69
70         while (tokenizer.hasMoreContent()) {
71             final TokenizerMatch tm = tokenizer.getNextToken();
72
73             if (tm.isGroup(TG_HEADING)){
74                 parseHeading(tm);
75                 continue;
76             }
77
78             currentHeading.parse(tm);
79         }
80
81     }
82 }