1 package eu.svjatoslav.sixth.core.document.content;
3 import eu.svjatoslav.commons.string.String2;
4 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
5 import eu.svjatoslav.sixth.core.document.text.FormattedText;
7 import java.util.ArrayList;
10 import static eu.svjatoslav.sixth.core.document.Helper.*;
11 import static eu.svjatoslav.sixth.core.document.Utils.isBlank;
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<>();
20 public ListElement(FormattedText name, int indent, ListElement parent, String type) {
27 private Content findCurrentContentElement(){
28 if (content.isEmpty()) return null;
29 return content.get(content.size()-1);
32 private boolean isLastContentElement(Class aClass){
33 Content contentElement = findCurrentContentElement();
34 if (contentElement == null) return false;
36 return contentElement.getClass().isInstance(aClass);
39 public void addContent(Content contentElement){
40 content.add(contentElement);
43 public void parse(TokenizerMatch tm) {
45 if (tm.isGroup(TG_DOCUMENT_PROPERTY)) {
46 parseDocumentProperty(tm);
50 if (tm.isGroup(TG_DRAWER_PROPERTY)) {
52 // System.out.println("DOCUMENT PROPERTY!!!: " + tm.token);
56 if (tm.isGroup(TG_NORMAL_TEXT)) {
57 if (isBlank(tm.token)){
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
76 if (tm.isGroup(TG_VERSE)){
77 String[] groups = tm.getRegExpGroups();
78 content.add(new Verse(groups[5]));
82 System.out.println("ERROR!!!! Unable to handle: " + tm);
85 private void parseTextBlock(TokenizerMatch tm) {
87 if (isLastContentElement(TextBlock.class)) {
88 textBlock = ((TextBlock) findCurrentContentElement());
90 textBlock = new TextBlock();
91 content.add(textBlock);
94 textBlock.addContent(tm.token + "\n");
97 private void parseDocumentProperty(TokenizerMatch tm) {
98 DocumentPropertyCollection documentPropertyCollection;
100 if (isLastContentElement(DocumentPropertyCollection.class)){
101 documentPropertyCollection = (DocumentPropertyCollection)findCurrentContentElement();
103 documentPropertyCollection = new DocumentPropertyCollection();
104 content.add(documentPropertyCollection);
107 documentPropertyCollection.addProperty(
108 tm.getRegExpGroups()[0],
109 tm.getRegExpGroups()[1]);
112 private void parseSeparator() {
113 if (isLastContentElement(Separator.class)){
114 ((Separator)findCurrentContentElement()).addLine();
116 content.add(new Separator());
121 public void toMD(StringBuilder sb, int indent) {
122 disablePlantUmlExport();
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());
130 for (Content c : content) {
131 c.toMD(sb, this.indent + 2);
135 private void disablePlantUmlExport() {
137 for (int i = 0; i< (content.size()-2); i++){
138 if (!(content.get(i) instanceof MultilineCode)) continue;
140 MultilineCode code = (MultilineCode) content.get(i);
141 if (!"plantuml".equalsIgnoreCase(code.language)) continue;;
143 if (!(content.get(i+1) instanceof DocumentPropertyCollection)) continue;
144 DocumentPropertyCollection property = (DocumentPropertyCollection) content.get(i+1);
146 if (!property.hasProperty("results")) continue;;
148 if (!(content.get(i+2) instanceof TextBlock)) continue;
149 TextBlock textBlock = (TextBlock) content.get(i+2);
151 textBlock.disableForExport();