X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fcore%2Fdocument%2FHeading.java;h=23cc92f4e78d3c980c69c302cbd2372b35077bd0;hb=e6e265a23ae9e32b65ba6a70d302ae680e73138f;hp=f9c3e6d74a7effa9a443bdf7637e3810ceb5ba07;hpb=4d6637215622edcf65ed246e0a63c9e7191e3fc3;p=sixth.git diff --git a/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java b/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java index f9c3e6d..23cc92f 100644 --- a/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java +++ b/src/main/java/eu/svjatoslav/sixth/core/document/Heading.java @@ -1,14 +1,111 @@ package eu.svjatoslav.sixth.core.document; +import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException; +import eu.svjatoslav.commons.string.tokenizer.Tokenizer; +import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch; +import eu.svjatoslav.sixth.core.document.text.FormattedText; + +import java.util.ArrayList; +import java.util.List; + +import static eu.svjatoslav.sixth.core.document.Helper.TG_DOCUMENT_PROPERTY; +import static eu.svjatoslav.sixth.core.document.Helper.TG_LIST; +import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg; + public class Heading { - public final String name; + public final FormattedText name; public final int level; public final Heading parent; + private final List children = new ArrayList<>(); + + public final ListElement rootListElement = new ListElement(null, 0, null); + private ListElement currentListElement = rootListElement; - public Heading(String name, int level, Heading parent){ + public Heading(FormattedText name, int level, Heading parent){ this.level = level; this.name = name; this.parent = parent; } + public void addChild(Heading heading){ + children.add(heading); + } + + public List getChildren(){ + return children; + } + + public String toMD () { + StringBuilder sb = new StringBuilder(); + + if (level > 0) sb.append(enlistTitleInMD()); + + // sb.append(unparsedContent); + + + children.stream().map(Heading::toMD).forEach(sb::append); + + return sb.toString(); + } + + private String enlistTitleInMD() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < level; i++) + sb.append("#"); + + sb.append(" ").append(name.compileMd()).append("\n"); + return sb.toString(); + } + + public ListElement createListElement(FormattedText name, int targetLevel){ + if (currentListElement.level == (targetLevel - 1)){ + ListElement newListElement = new ListElement(name, targetLevel, currentListElement); + currentListElement.addChild(newListElement); + currentListElement = newListElement; + return newListElement; + } + + if (currentListElement.level > (targetLevel - 1)){ + currentListElement = currentListElement.parent; + return createListElement(name, targetLevel); + } + + try { + ListElement missingIntermediate = new ListElement( + fromOrg(""), currentListElement.level + 1, currentListElement); + currentListElement.addChild(missingIntermediate); + currentListElement = missingIntermediate; + return createListElement(name, targetLevel); + } catch (InvalidSyntaxException e) { + throw new IllegalStateException("impossible situation"); + } + } + + public ListElement getCurrentHeading(){ + return currentListElement; + } + + public void parse(Tokenizer tokenizer){ + while (tokenizer.hasMoreContent()) { + final TokenizerMatch tm = tokenizer.getNextToken(); + + if (tm.isGroup(TG_LIST)){ + System.out.println("LIST!: " + tm.token); + continue; + } + + if (tm.isGroup(TG_DOCUMENT_PROPERTY)){ +// System.out.println("DOCUMENT PROPERTY!!!: " + tm.token); + continue; + } + + if (tm.isGroup(null)){ + System.out.println("unhandled \"" + tm.token + "\""); + continue; + } + + tokenizer.unreadToken(); + break; + } + } }