X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fcore%2Fdocument%2FDocument.java;h=c4e18cdd59805c570d821432c0b9aa75ada0df67;hb=e8052e0b1948260c3701bfe80dfaa8fdf5c38053;hp=362265cae8fa50986145eacbe73c76352c1c924e;hpb=4d6637215622edcf65ed246e0a63c9e7191e3fc3;p=sixth.git diff --git a/src/main/java/eu/svjatoslav/sixth/core/document/Document.java b/src/main/java/eu/svjatoslav/sixth/core/document/Document.java index 362265c..c4e18cd 100644 --- a/src/main/java/eu/svjatoslav/sixth/core/document/Document.java +++ b/src/main/java/eu/svjatoslav/sixth/core/document/Document.java @@ -1,13 +1,23 @@ package eu.svjatoslav.sixth.core.document; -public class Document { - public final Heading rootHeading = new Heading("", 0, null); +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( null , 0, null); private Heading currentHeading = rootHeading; - public Heading createHeading(String name, int targetLevel){ + public Heading createHeading(FormattedText name, int targetLevel){ if (currentHeading.level == (targetLevel - 1)){ Heading newHeading = new Heading(name, targetLevel, currentHeading); + currentHeading.addChild(newHeading); currentHeading = newHeading; return newHeading; } @@ -17,8 +27,56 @@ public class Document { return createHeading(name, targetLevel); } - Heading missingIntermediate = new Heading("", currentHeading.level + 1, currentHeading); + Heading missingIntermediate = new Heading(fromOrg(""), currentHeading.level + 1, currentHeading); + currentHeading.addChild(missingIntermediate); currentHeading = missingIntermediate; return createHeading(name, targetLevel); } + + public Heading getCurrentHeading(){ + return currentHeading; + } + + private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException { + String[] headingSections = token.getRegExpGroups(); + int level = headingSections[0].length(); + String title = headingSections[1]; + createHeading(fromOrg(title), level); + } + + public void parse(String fileContentsAsString) throws InvalidSyntaxException { + final Tokenizer tokenizer = new Tokenizer(fileContentsAsString); + + // Org heading: + // "*** Example Heading 1234" + tokenizer.addTerminator(PRESERVE, "(\\*+)[ \\t](.*)\\r?\\n", TG_HEADING); + + // Org list. Examples: + // " + my list title" + // " - my list title" + tokenizer.addTerminator(PRESERVE, "([ \\t]*)(\\+|-)[ \\t]?(.*)?\\r?\\n", TG_LIST); + + // " * my list title" + tokenizer.addTerminator(PRESERVE, "([ \\t]+)(\\*)[ \\t]?(.*)?\\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; + } + + currentHeading.parse(tm); + } + + } }