1 package eu.svjatoslav.sixth.core.document;
3 import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
4 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
5 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
6 import eu.svjatoslav.sixth.core.document.text.FormattedText;
8 import java.util.ArrayList;
11 import static eu.svjatoslav.sixth.core.document.Helper.TG_DOCUMENT_PROPERTY;
12 import static eu.svjatoslav.sixth.core.document.Helper.TG_LIST;
13 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
15 public class Heading {
16 public final FormattedText name;
17 public final int level;
18 public final Heading parent;
19 private final List<Heading> children = new ArrayList<>();
21 public final ListElement rootListElement = new ListElement(null, 0, null);
22 private ListElement currentListElement = rootListElement;
24 public Heading(FormattedText name, int level, Heading parent){
30 public void addChild(Heading heading){
31 children.add(heading);
34 public List<Heading> getChildren(){
38 public String toMD () {
39 StringBuilder sb = new StringBuilder();
41 if (level > 0) sb.append(enlistTitleInMD());
43 // sb.append(unparsedContent);
46 children.stream().map(Heading::toMD).forEach(sb::append);
51 private String enlistTitleInMD() {
52 StringBuilder sb = new StringBuilder();
53 for (int i = 0; i < level; i++)
56 sb.append(" ").append(name.compileMd()).append("\n");
60 public ListElement createListElement(FormattedText name, int targetLevel){
61 if (currentListElement.level == (targetLevel - 1)){
62 ListElement newListElement = new ListElement(name, targetLevel, currentListElement);
63 currentListElement.addChild(newListElement);
64 currentListElement = newListElement;
65 return newListElement;
68 if (currentListElement.level > (targetLevel - 1)){
69 currentListElement = currentListElement.parent;
70 return createListElement(name, targetLevel);
74 ListElement missingIntermediate = new ListElement(
75 fromOrg("<noname>"), currentListElement.level + 1, currentListElement);
76 currentListElement.addChild(missingIntermediate);
77 currentListElement = missingIntermediate;
78 return createListElement(name, targetLevel);
79 } catch (InvalidSyntaxException e) {
80 throw new IllegalStateException("impossible situation");
84 public ListElement getCurrentHeading(){
85 return currentListElement;
88 public void parse(Tokenizer tokenizer){
89 while (tokenizer.hasMoreContent()) {
90 final TokenizerMatch tm = tokenizer.getNextToken();
92 if (tm.isGroup(TG_LIST)){
93 System.out.println("LIST!: " + tm.token);
97 if (tm.isGroup(TG_DOCUMENT_PROPERTY)){
98 // System.out.println("DOCUMENT PROPERTY!!!: " + tm.token);
102 if (tm.isGroup(null)){
103 System.out.println("unhandled \"" + tm.token + "\"");
107 tokenizer.unreadToken();