Use regular expression tokenizer. WIP
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / Heading.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 java.util.ArrayList;
9 import java.util.List;
10
11 import static eu.svjatoslav.sixth.core.document.Helper.TG_DOCUMENT_PROPERTY;
12 import static eu.svjatoslav.sixth.core.document.Helper.TG_LIST;
13 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
14
15 public class Heading {
16     public final FormattedText name;
17     public final int level;
18     public final Heading parent;
19     private final List<Heading> children = new ArrayList<>();
20
21     public final ListElement rootListElement = new ListElement(null, 0, null);
22     private ListElement currentListElement = rootListElement;
23
24     public Heading(FormattedText name, int level, Heading parent){
25         this.level = level;
26         this.name = name;
27         this.parent = parent;
28     }
29
30     public void addChild(Heading heading){
31         children.add(heading);
32     }
33
34     public List<Heading> getChildren(){
35         return children;
36     }
37
38     public String toMD () {
39         StringBuilder sb = new StringBuilder();
40
41         if (level > 0) sb.append(enlistTitleInMD());
42
43        // sb.append(unparsedContent);
44
45
46         children.stream().map(Heading::toMD).forEach(sb::append);
47
48         return sb.toString();
49     }
50
51     private String enlistTitleInMD() {
52         StringBuilder sb = new StringBuilder();
53         for (int i = 0; i < level; i++)
54             sb.append("#");
55
56         sb.append(" ").append(name.compileMd()).append("\n");
57         return sb.toString();
58     }
59
60     public ListElement createListElement(FormattedText name, int targetLevel){
61         if (currentListElement.level == (targetLevel - 1)){
62             ListElement newListElement = new ListElement(name, targetLevel, currentListElement);
63             currentListElement.addChild(newListElement);
64             currentListElement = newListElement;
65             return newListElement;
66         }
67
68         if (currentListElement.level > (targetLevel - 1)){
69             currentListElement = currentListElement.parent;
70             return createListElement(name, targetLevel);
71         }
72
73         try {
74             ListElement missingIntermediate = new ListElement(
75                     fromOrg("<noname>"), currentListElement.level + 1, currentListElement);
76             currentListElement.addChild(missingIntermediate);
77             currentListElement = missingIntermediate;
78             return createListElement(name, targetLevel);
79         } catch (InvalidSyntaxException e) {
80             throw new IllegalStateException("impossible situation");
81         }
82     }
83
84     public ListElement getCurrentHeading(){
85         return currentListElement;
86     }
87
88     public void parse(Tokenizer tokenizer){
89         while (tokenizer.hasMoreContent()) {
90             final TokenizerMatch tm = tokenizer.getNextToken();
91
92             if (tm.isGroup(TG_LIST)){
93                 System.out.println("LIST!: " + tm.token);
94                 continue;
95             }
96
97             if (tm.isGroup(TG_DOCUMENT_PROPERTY)){
98 //                System.out.println("DOCUMENT PROPERTY!!!: " + tm.token);
99                 continue;
100             }
101
102             if (tm.isGroup(null)){
103 //                System.out.println("    HC: " + tm.token);
104                 continue;
105             }
106
107             tokenizer.unreadToken();
108             break;
109         }
110     }
111 }