+++ /dev/null
-package eu.svjatoslav.sixth.core.document;
-
-import eu.svjatoslav.commons.string.String2;
-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(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);
- }
-
- 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 {
- // expected sample heading:
- // ***** test heading
-
- String[] headingSections = String2.getGroups(token.token, "(\\*+)[ \\t](.*)\\r?\\n");
- 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;
- }
-
- tokenizer.unreadToken();
- currentHeading.parse(tokenizer);
- }
-
- }
-}