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){
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);
+ }
+
}
}