Properly handle special case, when list depth decreases and depth is misaligned
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / text / FormattedText.java
index ae6a421..44af05c 100644 (file)
@@ -1,22 +1,24 @@
 package eu.svjatoslav.sixth.core.document.text;
 
-import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
+import eu.svjatoslav.commons.string.String2;
 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static eu.svjatoslav.sixth.core.document.Helper.TG_HYPERLINK;
+
 public class FormattedText {
     List<FormattedTextElement> elements = new ArrayList<>();
 
-    public void parseOrgSyntax(String orgText) throws InvalidSyntaxException {
+    public void parseOrgSyntax(String orgText) {
 
         Tokenizer tokenizer = getTokenizer(orgText);
         while (tokenizer.hasMoreContent()) {
             final TokenizerMatch token = tokenizer.getNextToken();
 
-            if (token.terminator == Hyperlink.orgTerminator){
+            if (token.isGroup(TG_HYPERLINK)){
                 elements.add(Hyperlink.fromOrg(token));
                 continue;
             }
@@ -27,18 +29,33 @@ public class FormattedText {
 
     }
 
-
-    public static FormattedText fromOrg(String orgText) throws InvalidSyntaxException {
+    public static FormattedText fromOrg(String orgText){
         FormattedText formattedText = new FormattedText();
         formattedText.parseOrgSyntax(orgText);
         return formattedText;
     }
 
-    public String compileMd(){
+    public String toMD(int indent){
         StringBuilder sb = new StringBuilder();
 
         for (FormattedTextElement element : elements)
-            sb.append(element.compileMd());
+            sb.append(element.toMD());
+
+        return ensureIndent(sb.toString(), indent);
+    }
+
+    public static String ensureIndent(String input, int indent) {
+        String[] lines = input.split("\\r?\\n");
+
+        StringBuilder sb = new StringBuilder();
+
+        sb.append(lines[0]);
+
+        for (int i = 1; i< lines.length; i++) {
+            sb.append("\n");
+            sb.append(new String2(" ").repeat(indent).toString());
+            sb.append(lines[i]);
+        }
 
         return sb.toString();
     }
@@ -46,7 +63,12 @@ public class FormattedText {
     private Tokenizer getTokenizer(String contents) {
         final Tokenizer tokenizer = new Tokenizer(contents);
         tokenizer.addTerminator(Hyperlink.orgTerminator);
+        tokenizer.addTerminator(Hyperlink.orgTerminator2);
         return tokenizer;
     }
 
+
+    public String toString(){
+        return toMD(0);
+    }
 }