Proper handling fo multiline links. Better list handling.
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / Heading.java
index 0ae9ad5..db9f9df 100644 (file)
@@ -1,5 +1,6 @@
 package eu.svjatoslav.sixth.core.document;
 
+import eu.svjatoslav.commons.string.String2;
 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
 import eu.svjatoslav.sixth.core.document.content.ListElement;
@@ -16,7 +17,7 @@ public class Heading {
     public final Heading parent;
     private final List<Heading> children = new ArrayList<>();
 
-    public final ListElement rootListElement = new ListElement(null, -1, null, "");
+    public final ListElement rootListElement = new ListElement(null, -2, null, "");
     private ListElement currentListElement = rootListElement;
 
     public Heading(FormattedText name, int level, Heading parent){
@@ -46,12 +47,9 @@ public class Heading {
     }
 
     private String enlistTitleInMD() {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < level; i++)
-            sb.append("#");
-
-        sb.append(" ").append(name.toMD()).append("\n");
-        return sb.toString();
+        String2 s = new String2();
+        s.append("#", level).append(" ").append(name.toMD(0)).append("\n");
+        return s.toString();
     }
 
     public ListElement getCurrentHeading(){
@@ -72,23 +70,37 @@ public class Heading {
         String[] listSections = tm.getRegExpGroups();
         int indent = listSections[0].length();
         String type = listSections[1];
-
-        FormattedText title = FormattedText.fromOrg(parseFullListTitle(listSections.length > 2 ? listSections[2] : "", tm.getTokenizer(), indent));
-
-//        System.out.println("  indent: " + indent);
-//        System.out.println("  type: " + type);
-//        System.out.println("  title: " + title);
-
-        ListElement parent = null;
+        FormattedText title = FormattedText.fromOrg(parseFullListTitle(getPartialTitle(listSections), tm.getTokenizer(), indent));
 
         if (indent > currentListElement.indent){
-            ListElement newElement = new ListElement(title, indent, parent, type);
+            ListElement newElement = new ListElement(title, indent, currentListElement, type);
             currentListElement.addContent(newElement);
             currentListElement = newElement;
+            return;
+        }
+
+        if (indent == currentListElement.indent){
+            ListElement newElement = new ListElement(title, indent, currentListElement.parent, type);
+            currentListElement.parent.addContent(newElement);
+            currentListElement = newElement;
+            return;
+        }
+
+        while (true){
+            if (currentListElement.parent.indent <= indent){
+                ListElement newElement = new ListElement(title, indent, currentListElement.parent, type);
+                currentListElement.parent.addContent(newElement);
+                currentListElement = newElement;
+                return;
+            }
+            currentListElement = currentListElement.parent;
         }
 
     }
 
+    private String getPartialTitle(String[] listSections) {
+        return listSections.length > 2 ? listSections[2] : "";
+    }
 
     private String parseFullListTitle(String partialTitle, Tokenizer tokenizer, int listIndent){
         StringBuilder sb = new StringBuilder();
@@ -97,7 +109,7 @@ public class Heading {
         while (tokenizer.hasMoreContent()){
             final TokenizerMatch tm = tokenizer.getNextToken();
 
-            if (isContentContinuation(tm, listIndent, null)){
+            if (isContentContinuation(tm, listIndent, Helper.TG_NORMAL_TEXT)){
                 String titleContinuation = tm.token.substring(listIndent).trim();
                 sb.append("\n").append(titleContinuation);
                 continue;