X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fcore%2Fdocument%2Fcontent%2FListElement.java;h=5cfc79118b54793229d1c683da3578b7d7251405;hp=e1cf33d36e595756d003e52b72969a2cb56f9d41;hb=168cf05300cec2bb4c0607711b752609976b2901;hpb=1f96525468e7f76c1ce817a8a7b22c93a39e40b4 diff --git a/src/main/java/eu/svjatoslav/sixth/core/document/content/ListElement.java b/src/main/java/eu/svjatoslav/sixth/core/document/content/ListElement.java index e1cf33d..5cfc791 100644 --- a/src/main/java/eu/svjatoslav/sixth/core/document/content/ListElement.java +++ b/src/main/java/eu/svjatoslav/sixth/core/document/content/ListElement.java @@ -8,41 +8,43 @@ import java.util.ArrayList; import java.util.List; import static eu.svjatoslav.sixth.core.document.Helper.*; +import static eu.svjatoslav.sixth.core.document.Utils.isBlank; +import static eu.svjatoslav.sixth.core.document.Utils.removePrefix; public class ListElement implements Content { - public final FormattedText name; + StringBuilder nameInOrg = new StringBuilder(); public final int indent; public final ListElement parent; private final String type; private final List content = new ArrayList<>(); - StringBuilder normalTextAccumulator = new StringBuilder(); - public ListElement(FormattedText name, int indent, ListElement parent, String type) { + public ListElement(String nameInOrg, int indent, ListElement parent, String type) { this.indent = indent; - this.name = name; + this.nameInOrg.append(nameInOrg); this.type = type; this.parent = parent; } - public void addContent(Content content) { - applyTextAccumulator(); - this.content.add(content); + private Content findCurrentContentElement(){ + if (content.isEmpty()) return null; + return content.get(content.size()-1); } - private void applyTextAccumulator(){ - if (normalTextAccumulator.length() == 0) - return; + private boolean isLastContentElement(Class aClass){ + Content contentElement = findCurrentContentElement(); + if (contentElement == null) return false; - content.add(new TextBlock(normalTextAccumulator.toString())); + return aClass.isInstance(contentElement); + } - normalTextAccumulator.setLength(0); + public void addContent(Content contentElement){ + content.add(contentElement); } public void parse(TokenizerMatch tm) { if (tm.isGroup(TG_DOCUMENT_PROPERTY)) { - // TODO - // System.out.println("DOCUMENT PROPERTY!!!: " + tm.token); + parseDocumentProperty(tm); return; } @@ -53,14 +55,19 @@ public class ListElement implements Content { } if (tm.isGroup(TG_NORMAL_TEXT)) { - normalTextAccumulator.append(tm.token); + if (isBlank(tm.token)){ + parseSeparator(); + return; + } + + parseTextBlock(tm); return; } if (tm.isGroup(TG_MULTILINE_CODE)){ // System.out.println(tm.toString()); String[] groups = tm.getRegExpGroups(); - addContent(new MultilineCode( + content.add(new MultilineCode( groups[3], // language groups[5] // code )); @@ -69,20 +76,59 @@ public class ListElement implements Content { if (tm.isGroup(TG_VERSE)){ String[] groups = tm.getRegExpGroups(); - addContent(new Verse(groups[5])); + content.add(new Verse(groups[5])); return; } System.out.println("ERROR!!!! Unable to handle: " + tm); } + private void parseTextBlock(TokenizerMatch tm) { + TextBlock textBlock; + if (isLastContentElement(TextBlock.class)) { + textBlock = ((TextBlock) findCurrentContentElement()); + } if (content.isEmpty()){ + // list title continuation + nameInOrg.append("\n").append(removePrefix(tm.token, indent + 2)); + return; + } else { + textBlock = new TextBlock(); + content.add(textBlock); + } + + textBlock.addContent(tm.token); + } + + private void parseDocumentProperty(TokenizerMatch tm) { + DocumentPropertyCollection documentPropertyCollection; + + if (isLastContentElement(DocumentPropertyCollection.class)){ + documentPropertyCollection = (DocumentPropertyCollection)findCurrentContentElement(); + } else { + documentPropertyCollection = new DocumentPropertyCollection(); + content.add(documentPropertyCollection); + } + + documentPropertyCollection.addProperty( + tm.getRegExpGroups()[0], + tm.getRegExpGroups()[1]); + } + + private void parseSeparator() { + if (isLastContentElement(Separator.class)){ + ((Separator)findCurrentContentElement()).addLine(); + } else { + content.add(new Separator()); + } + } + public void toMD(StringBuilder sb, int indent) { - applyTextAccumulator(); + disablePlantUmlExport(); if (this.indent >= 0) { String2 s = new String2(); - s.append(" ", indent).append(type).append(" ").append(name.toMD(indent + 2)).append("\n"); + s.append(" ", indent).append(type).append(" ").append(getName().toMD(indent + 2)).append("\n"); sb.append(s.toString()); } @@ -90,4 +136,28 @@ public class ListElement implements Content { c.toMD(sb, this.indent + 2); } } + + private FormattedText getName(){ + return FormattedText.fromOrg(nameInOrg.toString()); + } + + private void disablePlantUmlExport() { + + for (int i = 0; i< (content.size()-2); i++){ + if (!(content.get(i) instanceof MultilineCode)) continue; + + MultilineCode code = (MultilineCode) content.get(i); + if (!"plantuml".equalsIgnoreCase(code.language)) continue; + + if (!(content.get(i+1) instanceof DocumentPropertyCollection)) continue; + DocumentPropertyCollection property = (DocumentPropertyCollection) content.get(i+1); + + if (!property.hasProperty("results")) continue; + + if (!(content.get(i+2) instanceof TextBlock)) continue; + TextBlock textBlock = (TextBlock) content.get(i+2); + + textBlock.disableForExport(); + } + } }