e626304ebb3a83871c91ffbe5c1019b9b7528234
[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         try {
31             Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
32             currentHeading.addChild(missingIntermediate);
33             currentHeading = missingIntermediate;
34             return createHeading(name, targetLevel);
35         } catch (InvalidSyntaxException e) {
36             throw new IllegalStateException("impossible situation");
37         }
38     }
39
40     public Heading getCurrentHeading(){
41         return currentHeading;
42     }
43
44     private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException {
45         System.out.println("HEADING!! " + token.token);
46         int level = token.token.length()-1;
47 //        createHeading(fromOrg(token.reminder), level);
48     }
49
50     public void parse(String fileContentsAsString) throws InvalidSyntaxException {
51         final Tokenizer tokenizer = new Tokenizer(fileContentsAsString);
52
53         // Org heading:
54         // "*** Example Heading 1234"
55         tokenizer.addTerminator(PRESERVE, "\\*+\\s.*\\r?\\n", TG_HEADING);
56
57         // Org list. Examples:
58         // "   + my list title"
59         // "+"
60         tokenizer.addTerminator(PRESERVE, "\\s*(\\+|-)(\\s.*)?\\r?\\n", TG_LIST);
61         tokenizer.addTerminator(PRESERVE, "\\s+\\*(\\s.*)?\\r?\\n", TG_LIST);
62
63         // DocumentProperty:
64         // "#+OPTIONS: H:20 num:20"
65         tokenizer.addTerminator(PRESERVE, "#\\+.+:.*\\r?\\n", TG_DOCUMENT_PROPERTY);
66
67         // newline
68         tokenizer.addTerminator(DROP,"\\r?\\n", TG_NEWLINE);
69
70
71         while (tokenizer.hasMoreContent()) {
72             final TokenizerMatch tm = tokenizer.getNextToken();
73
74             if (tm.isGroup(TG_HEADING)){
75                 parseHeading(tm);
76                 continue;
77             }
78
79             tokenizer.unreadToken();
80             currentHeading.parse(tokenizer);
81         }
82
83     }
84 }