Use regular expression tokenizer. WIP
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / Document.java
index 2385284..e626304 100644 (file)
@@ -1,12 +1,17 @@
 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 static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP;
+import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE;
+import static eu.svjatoslav.sixth.core.document.Helper.*;
 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
 
 public class Document {
-    public final Heading rootHeading = new Heading( fromOrg("<root>") , 0, null);
-
+    public final Heading rootHeading = new Heading( null , 0, null);
     private Heading currentHeading = rootHeading;
 
     public Heading createHeading(FormattedText name, int targetLevel){
@@ -22,9 +27,58 @@ public class Document {
             return createHeading(name, targetLevel);
         }
 
-        Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
-        currentHeading.addChild(missingIntermediate);
-        currentHeading = missingIntermediate;
-        return createHeading(name, targetLevel);
+        try {
+            Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
+            currentHeading.addChild(missingIntermediate);
+            currentHeading = missingIntermediate;
+            return createHeading(name, targetLevel);
+        } catch (InvalidSyntaxException e) {
+            throw new IllegalStateException("impossible situation");
+        }
+    }
+
+    public Heading getCurrentHeading(){
+        return currentHeading;
+    }
+
+    private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException {
+        System.out.println("HEADING!! " + token.token);
+        int level = token.token.length()-1;
+//        createHeading(fromOrg(token.reminder), level);
+    }
+
+    public void parse(String fileContentsAsString) throws InvalidSyntaxException {
+        final Tokenizer tokenizer = new Tokenizer(fileContentsAsString);
+
+        // Org heading:
+        // "*** Example Heading 1234"
+        tokenizer.addTerminator(PRESERVE, "\\*+\\s.*\\r?\\n", TG_HEADING);
+
+        // Org list. Examples:
+        // "   + my list title"
+        // "+"
+        tokenizer.addTerminator(PRESERVE, "\\s*(\\+|-)(\\s.*)?\\r?\\n", TG_LIST);
+        tokenizer.addTerminator(PRESERVE, "\\s+\\*(\\s.*)?\\r?\\n", TG_LIST);
+
+        // DocumentProperty:
+        // "#+OPTIONS: H:20 num:20"
+        tokenizer.addTerminator(PRESERVE, "#\\+.+:.*\\r?\\n", TG_DOCUMENT_PROPERTY);
+
+        // newline
+        tokenizer.addTerminator(DROP,"\\r?\\n", TG_NEWLINE);
+
+
+        while (tokenizer.hasMoreContent()) {
+            final TokenizerMatch tm = tokenizer.getNextToken();
+
+            if (tm.isGroup(TG_HEADING)){
+                parseHeading(tm);
+                continue;
+            }
+
+            tokenizer.unreadToken();
+            currentHeading.parse(tokenizer);
+        }
+
     }
 }