1 package eu.svjatoslav.sixth.core.document;
3 import eu.svjatoslav.commons.string.tokenizer.InvalidSyntaxException;
4 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
5 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
6 import eu.svjatoslav.sixth.core.document.text.FormattedText;
8 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP;
9 import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE;
10 import static eu.svjatoslav.sixth.core.document.Helper.*;
11 import static eu.svjatoslav.sixth.core.document.text.FormattedText.fromOrg;
13 public class Document {
14 public final Heading rootHeading = new Heading( null , 0, null);
15 private Heading currentHeading = rootHeading;
17 public Heading createHeading(FormattedText name, int targetLevel){
18 if (currentHeading.level == (targetLevel - 1)){
19 Heading newHeading = new Heading(name, targetLevel, currentHeading);
20 currentHeading.addChild(newHeading);
21 currentHeading = newHeading;
25 if (currentHeading.level > (targetLevel - 1)){
26 currentHeading = currentHeading.parent;
27 return createHeading(name, targetLevel);
31 Heading missingIntermediate = new Heading(fromOrg("<noname>"), currentHeading.level + 1, currentHeading);
32 currentHeading.addChild(missingIntermediate);
33 currentHeading = missingIntermediate;
34 return createHeading(name, targetLevel);
35 } catch (InvalidSyntaxException e) {
36 throw new IllegalStateException("impossible situation");
40 public Heading getCurrentHeading(){
41 return currentHeading;
44 private void parseHeading(TokenizerMatch token) throws InvalidSyntaxException {
45 System.out.println("HEADING!! " + token.token);
46 int level = token.token.length()-1;
47 // createHeading(fromOrg(token.reminder), level);
50 public void parse(String fileContentsAsString) throws InvalidSyntaxException {
51 final Tokenizer tokenizer = new Tokenizer(fileContentsAsString);
54 // "*** Example Heading 1234"
55 tokenizer.addTerminator(PRESERVE, "\\*+\\s.*\\r?\\n", TG_HEADING);
57 // Org list. Examples:
60 tokenizer.addTerminator(PRESERVE, "\\s*(\\+|-)(\\s.*)?\\r?\\n", TG_LIST);
61 tokenizer.addTerminator(PRESERVE, "\\s+\\*(\\s.*)?\\r?\\n", TG_LIST);
64 // "#+OPTIONS: H:20 num:20"
65 tokenizer.addTerminator(PRESERVE, "#\\+.+:.*\\r?\\n", TG_DOCUMENT_PROPERTY);
68 tokenizer.addTerminator(DROP,"\\r?\\n", TG_NEWLINE);
71 while (tokenizer.hasMoreContent()) {
72 final TokenizerMatch tm = tokenizer.getNextToken();
74 if (tm.isGroup(TG_HEADING)){
79 tokenizer.unreadToken();
80 currentHeading.parse(tokenizer);