Use regular expression tokenizer. WIP
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / Heading.java
index 6159e1d..fe335f5 100644 (file)
@@ -1,16 +1,26 @@
 package eu.svjatoslav.sixth.core.document;
 
 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 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 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;
     public Heading(FormattedText name, int level, Heading parent){
         this.level = level;
         this.name = name;
@@ -25,4 +35,77 @@ public class Heading {
         return children;
     }
 
         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;
+        }
+    }
 }
 }