X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=sixth.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fcore%2Fdocument%2FDocument.java;h=c61d613842249402978b07ba39afc865df307542;hp=2c3d2f61dd5ce84eb614935a8c2d0718f6e25a1d;hb=168cf05300cec2bb4c0607711b752609976b2901;hpb=7f9e6d11eb956ba3e1df724a21313c6a6bd1eb49 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 2c3d2f6..c61d613 100644 --- a/src/main/java/eu/svjatoslav/sixth/core/document/Document.java +++ b/src/main/java/eu/svjatoslav/sixth/core/document/Document.java @@ -1,4 +1,110 @@ 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.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(FormattedText name, int targetLevel){ + if (currentHeading.level == (targetLevel - 1)){ + Heading newHeading = new Heading(name, targetLevel, currentHeading); + currentHeading.addChild(newHeading); + currentHeading = newHeading; + return newHeading; + } + + if (currentHeading.level > (targetLevel - 1)){ + currentHeading = currentHeading.parent; + return createHeading(name, targetLevel); + } + + 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); + + // TODO: add numbered list + + // DocumentProperty: + // "#+OPTIONS: H:20 num:20" + tokenizer.addTerminator(PRESERVE, "#\\+([^\\s]+):(.*)\\r?\\n", TG_DOCUMENT_PROPERTY); + + // Drawer property: + // " :ID: 533734b9-0456-4448-9830-a43646345615" + tokenizer.addTerminator(PRESERVE, "([ \\t]*):([^\\s]+):(.*)\\r?\\n", TG_DRAWER_PROPERTY); + + + // multiline code block + tokenizer.addTerminator(PRESERVE, + "([ \\t]*)#\\+BEGIN_SRC" + // source begin identifier + "(([ \\t]+)(.*))?(\\r?\\n)" + // source block parameters + "((?:.|\\n|\\r)*?)" + // source content + "(\\r?\\n)([ \\t]*)#\\+END_SRC(.*)\\r?\\n" // source end identifier + , TG_MULTILINE_CODE); + + // verse + tokenizer.addTerminator(PRESERVE, + "([ \\t]*)#\\+BEGIN_VERSE" + // verse begin identifier + "(([ \\t]+)(.*))?(\\r?\\n)" + // verse block parameters + "((?:.|\\n|\\r)*?)" + // verse + "(\\r?\\n)([ \\t]*)#\\+END_VERSE(.*)\\r?\\n" // verse end identifier + , TG_VERSE); + + + // TODO: add support for export blocks: + // #+begin_export latex + // \clearpage + //#+end_export + + + // normal text + tokenizer.addTerminator(PRESERVE,".*\\r?\\n", TG_NORMAL_TEXT); + + while (tokenizer.hasMoreContent()) { + final TokenizerMatch tm = tokenizer.getNextToken(); + + if (tm.isGroup(TG_HEADING)){ + parseHeading(tm); + continue; + } + + currentHeading.parse(tm); + } + + } }