Misc fixes:
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / content / ListElement.java
1 package eu.svjatoslav.sixth.core.document.content;
2
3 import eu.svjatoslav.commons.string.String2;
4 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
5 import eu.svjatoslav.sixth.core.document.text.FormattedText;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import static eu.svjatoslav.sixth.core.document.Helper.*;
11 import static eu.svjatoslav.sixth.core.document.Utils.isBlank;
12 import static eu.svjatoslav.sixth.core.document.Utils.removePrefix;
13
14 public class ListElement implements Content {
15     StringBuilder nameInOrg = new StringBuilder();
16     public final int indent;
17     public final ListElement parent;
18     private final String type;
19     private final List<Content> content = new ArrayList<>();
20
21     public ListElement(String nameInOrg, int indent, ListElement parent, String type) {
22         this.indent = indent;
23         this.nameInOrg.append(nameInOrg);
24         this.type = type;
25         this.parent = parent;
26     }
27
28     private Content findCurrentContentElement(){
29         if (content.isEmpty()) return null;
30         return content.get(content.size()-1);
31     }
32
33     private boolean isLastContentElement(Class aClass){
34         Content contentElement = findCurrentContentElement();
35         if (contentElement == null) return false;
36
37         return aClass.isInstance(contentElement);
38     }
39
40     public void addContent(Content contentElement){
41         content.add(contentElement);
42     }
43
44     public void parse(TokenizerMatch tm) {
45
46         if (tm.isGroup(TG_DOCUMENT_PROPERTY)) {
47             parseDocumentProperty(tm);
48             return;
49         }
50
51         if (tm.isGroup(TG_DRAWER_PROPERTY)) {
52             // TODO
53             // System.out.println("DOCUMENT PROPERTY!!!: " + tm.token);
54             return;
55         }
56
57         if (tm.isGroup(TG_NORMAL_TEXT)) {
58             if (isBlank(tm.token)){
59                 parseSeparator();
60                 return;
61             }
62
63             parseTextBlock(tm);
64             return;
65         }
66
67         if (tm.isGroup(TG_MULTILINE_CODE)){
68            // System.out.println(tm.toString());
69             String[] groups = tm.getRegExpGroups();
70             content.add(new MultilineCode(
71                     groups[3], // language
72                     groups[5]  // code
73             ));
74             return;
75         }
76
77         if (tm.isGroup(TG_VERSE)){
78             String[] groups = tm.getRegExpGroups();
79             content.add(new Verse(groups[5]));
80             return;
81         }
82
83         System.out.println("ERROR!!!! Unable to handle: " + tm);
84     }
85
86     private void parseTextBlock(TokenizerMatch tm) {
87         TextBlock textBlock;
88         if (isLastContentElement(TextBlock.class)) {
89             textBlock = ((TextBlock) findCurrentContentElement());
90         } if (content.isEmpty()){
91             // list title continuation
92             nameInOrg.append("\n").append(removePrefix(tm.token, indent + 2));
93             return;
94         } else {
95             textBlock = new TextBlock();
96             content.add(textBlock);
97         }
98
99         textBlock.addContent(tm.token);
100     }
101
102     private void parseDocumentProperty(TokenizerMatch tm) {
103         DocumentPropertyCollection documentPropertyCollection;
104
105         if (isLastContentElement(DocumentPropertyCollection.class)){
106             documentPropertyCollection = (DocumentPropertyCollection)findCurrentContentElement();
107         } else {
108             documentPropertyCollection = new DocumentPropertyCollection();
109             content.add(documentPropertyCollection);
110         }
111
112         documentPropertyCollection.addProperty(
113                 tm.getRegExpGroups()[0],
114                 tm.getRegExpGroups()[1]);
115     }
116
117     private void parseSeparator() {
118         if (isLastContentElement(Separator.class)){
119             ((Separator)findCurrentContentElement()).addLine();
120         } else {
121             content.add(new Separator()); 
122         }
123     }
124
125
126     public void toMD(StringBuilder sb, int indent) {
127         disablePlantUmlExport();
128
129         if (this.indent >= 0) {
130             String2 s = new String2();
131             s.append(" ", indent).append(type).append(" ").append(getName().toMD(indent + 2)).append("\n");
132             sb.append(s.toString());
133         }
134
135         for (Content c : content) {
136             c.toMD(sb, this.indent + 2);
137         }
138     }
139
140     private FormattedText getName(){
141         return FormattedText.fromOrg(nameInOrg.toString());
142     }
143
144     private void disablePlantUmlExport() {
145
146         for (int i = 0; i< (content.size()-2); i++){
147             if (!(content.get(i) instanceof MultilineCode)) continue;
148
149             MultilineCode code = (MultilineCode) content.get(i);
150             if (!"plantuml".equalsIgnoreCase(code.language)) continue;
151
152             if (!(content.get(i+1) instanceof DocumentPropertyCollection)) continue;
153             DocumentPropertyCollection property = (DocumentPropertyCollection) content.get(i+1);
154
155             if (!property.hasProperty("results")) continue;
156
157             if (!(content.get(i+2) instanceof TextBlock)) continue;
158             TextBlock textBlock = (TextBlock) content.get(i+2);
159
160             textBlock.disableForExport();
161         }
162     }
163 }