1 package eu.svjatoslav.sixth.core.document;
3 import eu.svjatoslav.commons.string.String2;
4 import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
5 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
6 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
7 import eu.svjatoslav.sixth.core.document.text.FormattedText;
9 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP;
10 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE;
11 import static eu.svjatoslav.sixth.core.document.Helper.*;
12 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
14 public class Document {
15 public final Heading rootHeading = new Heading( null , 0, null);
16 private Heading currentHeading = rootHeading;
18 public Heading createHeading(FormattedText name, int targetLevel){
19 if (currentHeading.level == (targetLevel - 1)){
20 Heading newHeading = new Heading(name, targetLevel, currentHeading);
21 currentHeading.addChild(newHeading);
22 currentHeading = newHeading;
26 if (currentHeading.level > (targetLevel - 1)){
27 currentHeading = currentHeading.parent;
28 return createHeading(name, targetLevel);
32 Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
33 currentHeading.addChild(missingIntermediate);
34 currentHeading = missingIntermediate;
35 return createHeading(name, targetLevel);
36 } catch (InvalidSyntaxException e) {
37 throw new IllegalStateException("impossible situation");
41 public Heading getCurrentHeading(){
42 return currentHeading;
45 private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException {
46 // expected sample heading:
49 String[] headingSections = String2.getGroups(token.token, "(\\*+)[ \\t](.*)\\r?\\n");
50 int level = headingSections[0].length();
51 String title = headingSections[1];
52 createHeading(fromOrg(title), level);
55 public void parse(String fileContentsAsString) throws InvalidSyntaxException {
56 final Tokenizer tokenizer = new Tokenizer(fileContentsAsString);
59 // "*** Example Heading 1234"
60 tokenizer.addTerminator(PRESERVE, "\\*+[ \\t].*\\r?\\n", TG_HEADING);
62 // Org list. Examples:
65 tokenizer.addTerminator(PRESERVE, "[ \\t]*(\\+|-)([ \\t].*)?\\r?\\n", TG_LIST);
68 tokenizer.addTerminator(PRESERVE, "[ \\t]+\\*([ \\t].*)?\\r?\\n", TG_LIST);
71 // "#+OPTIONS: H:20 num:20"
72 tokenizer.addTerminator(PRESERVE, "#\\+.+:.*\\r?\\n", TG_DOCUMENT_PROPERTY);
75 tokenizer.addTerminator(DROP,"\\r?\\n", TG_NEWLINE);
78 while (tokenizer.hasMoreContent()) {
79 final TokenizerMatch tm = tokenizer.getNextToken();
81 if (tm.isGroup(TG_HEADING)){
86 tokenizer.unreadToken();
87 currentHeading.parse(tokenizer);