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