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 FormattedText name;
public final int level;
public final Heading parent;
private final List<Heading> children = new ArrayList<>();
+ public final ListElement rootListElement = new ListElement(null, 0, null);
+ private ListElement currentListElement = rootListElement;
+
public Heading(FormattedText name, int level, Heading parent){
this.level = level;
this.name = name;
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("<noname>"), 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(" HC: " + tm.token);
+ continue;
+ }
+
+ tokenizer.unreadToken();
+ break;
+ }
+ }
}