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;
12 import static eu.svjatoslav.sixth.core.document.Utils.removePrefix;
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<>();
21 public ListElement(String nameInOrg, int indent, ListElement parent, String type) {
23 this.nameInOrg.append(nameInOrg);
28 private Content findCurrentContentElement(){
29 if (content.isEmpty()) return null;
30 return content.get(content.size()-1);
33 private boolean isLastContentElement(Class aClass){
34 Content contentElement = findCurrentContentElement();
35 if (contentElement == null) return false;
37 return aClass.isInstance(contentElement);
40 public void addContent(Content contentElement){
41 content.add(contentElement);
44 public void parse(TokenizerMatch tm) {
46 if (tm.isGroup(TG_DOCUMENT_PROPERTY)) {
47 parseDocumentProperty(tm);
51 if (tm.isGroup(TG_DRAWER_PROPERTY)) {
53 // System.out.println("DOCUMENT PROPERTY!!!: " + tm.token);
57 if (tm.isGroup(TG_NORMAL_TEXT)) {
58 if (isBlank(tm.token)){
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
77 if (tm.isGroup(TG_VERSE)){
78 String[] groups = tm.getRegExpGroups();
79 content.add(new Verse(groups[5]));
83 System.out.println("ERROR!!!! Unable to handle: " + tm);
86 private void parseTextBlock(TokenizerMatch tm) {
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));
95 textBlock = new TextBlock();
96 content.add(textBlock);
99 textBlock.addContent(tm.token);
102 private void parseDocumentProperty(TokenizerMatch tm) {
103 DocumentPropertyCollection documentPropertyCollection;
105 if (isLastContentElement(DocumentPropertyCollection.class)){
106 documentPropertyCollection = (DocumentPropertyCollection)findCurrentContentElement();
108 documentPropertyCollection = new DocumentPropertyCollection();
109 content.add(documentPropertyCollection);
112 documentPropertyCollection.addProperty(
113 tm.getRegExpGroups()[0],
114 tm.getRegExpGroups()[1]);
117 private void parseSeparator() {
118 if (isLastContentElement(Separator.class)){
119 ((Separator)findCurrentContentElement()).addLine();
121 content.add(new Separator());
126 public void toMD(StringBuilder sb, int indent) {
127 disablePlantUmlExport();
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());
135 for (Content c : content) {
136 c.toMD(sb, this.indent + 2);
140 private FormattedText getName(){
141 return FormattedText.fromOrg(nameInOrg.toString());
144 private void disablePlantUmlExport() {
146 for (int i = 0; i< (content.size()-2); i++){
147 if (!(content.get(i) instanceof MultilineCode)) continue;
149 MultilineCode code = (MultilineCode) content.get(i);
150 if (!"plantuml".equalsIgnoreCase(code.language)) continue;
152 if (!(content.get(i+1) instanceof DocumentPropertyCollection)) continue;
153 DocumentPropertyCollection property = (DocumentPropertyCollection) content.get(i+1);
155 if (!property.hasProperty("results")) continue;
157 if (!(content.get(i+2) instanceof TextBlock)) continue;
158 TextBlock textBlock = (TextBlock) content.get(i+2);
160 textBlock.disableForExport();