44af05c85c8af68927b8d561d308c40d48934135
[sixth.git] / src / main / java / eu / svjatoslav / sixth / core / document / text / FormattedText.java
1 package eu.svjatoslav.sixth.core.document.text;
2
3 import eu.svjatoslav.commons.string.String2;
4 import eu.svjatoslav.commons.string.tokenizer.Tokenizer;
5 import eu.svjatoslav.commons.string.tokenizer.TokenizerMatch;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import static eu.svjatoslav.sixth.core.document.Helper.TG_HYPERLINK;
11
12 public class FormattedText {
13     List<FormattedTextElement> elements = new ArrayList<>();
14
15     public void parseOrgSyntax(String orgText) {
16
17         Tokenizer tokenizer = getTokenizer(orgText);
18         while (tokenizer.hasMoreContent()) {
19             final TokenizerMatch token = tokenizer.getNextToken();
20
21             if (token.isGroup(TG_HYPERLINK)){
22                 elements.add(Hyperlink.fromOrg(token));
23                 continue;
24             }
25
26             PlainText plainText = new PlainText(token.token);
27             elements.add(plainText);
28         }
29
30     }
31
32     public static FormattedText fromOrg(String orgText){
33         FormattedText formattedText = new FormattedText();
34         formattedText.parseOrgSyntax(orgText);
35         return formattedText;
36     }
37
38     public String toMD(int indent){
39         StringBuilder sb = new StringBuilder();
40
41         for (FormattedTextElement element : elements)
42             sb.append(element.toMD());
43
44         return ensureIndent(sb.toString(), indent);
45     }
46
47     public static String ensureIndent(String input, int indent) {
48         String[] lines = input.split("\\r?\\n");
49
50         StringBuilder sb = new StringBuilder();
51
52         sb.append(lines[0]);
53
54         for (int i = 1; i< lines.length; i++) {
55             sb.append("\n");
56             sb.append(new String2(" ").repeat(indent).toString());
57             sb.append(lines[i]);
58         }
59
60         return sb.toString();
61     }
62
63     private Tokenizer getTokenizer(String contents) {
64         final Tokenizer tokenizer = new Tokenizer(contents);
65         tokenizer.addTerminator(Hyperlink.orgTerminator);
66         tokenizer.addTerminator(Hyperlink.orgTerminator2);
67         return tokenizer;
68     }
69
70
71     public String toString(){
72         return toMD(0);
73     }
74 }