Uses 16250K of libraries. Click here for Pure Java version (3763L/24K).
1 | sclass WordDocumentTemplateProcessor { |
2 | File inFile, outFile; |
3 | new WordDocumentTextReplacer2 replacer; |
4 | |
5 | swappable S getValue(S key) { null; } |
6 | |
7 | run { |
8 | replacer.inFile = inFile; |
9 | replacer.outFile = outFile; |
10 | S optSpace = regexp_spaceIncludingNbsp() + "*"; |
11 | S space = regexp_spaceIncludingNbsp() + "+"; |
12 | replacer.processParagraph = runs -> { |
13 | // replace content |
14 | replacer.regexpReplacement(runs, |
15 | "\\[" + optSpace |
16 | + "(\\d+[a-z]*)" // key |
17 | + regexp_negativeLookahead(space + "if" + space) |
18 | + "[:.]" // separator |
19 | + optSpace |
20 | + "(.*?)" // contents |
21 | + "\\]", |
22 | (text, groups) -> { |
23 | new Matches m; |
24 | S key = first(groups); |
25 | S value = getValue(key); |
26 | ret or(value, "undefined"); |
27 | }); |
28 | |
29 | // conditional paragraph parts |
30 | replacer.regexpReplacement(runs, |
31 | "\\[" + optSpace |
32 | + "(\\d+[a-z]*)" // key |
33 | + space + "if" + space |
34 | + "(.*?)" // condition |
35 | + "[:.]" // end of condition |
36 | + optSpace |
37 | + "(.*?)" // contents |
38 | + "\\]", |
39 | (text, groups) -> { |
40 | S key = first(groups); |
41 | S condition = regexpReplace_direct(second(groups), space, " "); |
42 | S contents = third(groups); |
43 | |
44 | bool result = evaluateFormCondition(key, condition); |
45 | ret result ? contents : ""; |
46 | }); |
47 | |
48 | // remove double commas |
49 | replacer.regexpReplacement(runs, "," + regexp_spaceIncludingNbsp() + "*(?=,)", (text, groups) -> ""); |
50 | }; |
51 | |
52 | replacer.postprocess = r { |
53 | // bullet points |
54 | for (int i = 0; i < l(replacer.outParagraphs); i++) { |
55 | L<WordDocumentTextReplacer2.OutRun> para = replacer.outParagraphs.get(i); |
56 | S text = replacer.fullText(para); |
57 | LS groups = regexpMatchGroupsIC(optSpace |
58 | + "\\[" |
59 | + "(\\d+[a-z]*)" // key |
60 | + space + "bullet" + space + "points" |
61 | + "\\]" + optSpace, |
62 | text); |
63 | if (groups != null) { |
64 | S key = first(groups); |
65 | S value = getValue(key); |
66 | replacer.outParagraphs.remove(i); |
67 | LS items = trimAll(splitAt(value, "|")); |
68 | printVars_str("bullet points", +value); |
69 | for (S item : items) { |
70 | print("Adding item at " + i + ": " + item); |
71 | replacer.outParagraphs.add(i++, ll(new WordDocumentTextReplacer2.OutRun(first(para).run, unicode_bullet() + " " + item))); |
72 | } |
73 | --i; |
74 | } |
75 | } |
76 | |
77 | // process conditional paragraphs |
78 | for (int i = l(replacer.outParagraphs)-1; i >= 0; i--) { |
79 | L<WordDocumentTextReplacer2.OutRun> para = replacer.outParagraphs.get(i); |
80 | S text = replacer.fullText(para); |
81 | LS groups = regexpMatchGroupsIC(optSpace |
82 | + "\\[START" + space |
83 | + "(\\d+[a-z]*)" // key |
84 | + space + "if" + space |
85 | + "(.*?)" // condition |
86 | + "\\]" + optSpace, |
87 | text); |
88 | if (groups != null) { |
89 | int j = i+1; |
90 | while (j < l(replacer.outParagraphs) && !cic( |
91 | replacer.fullText(replacer.outParagraphs.get(j)), |
92 | "[END]")) ++j; |
93 | if (j >= l(replacer.outParagraphs)) continue with print("warn: no [END] found for " + text); |
94 | S key = first(groups); |
95 | S condition = second(groups); |
96 | bool result = evaluateFormCondition(key, condition); |
97 | if (result) { |
98 | replacer.outParagraphs.remove(j); |
99 | replacer.outParagraphs.remove(i); |
100 | } else |
101 | removeSubList(replacer.outParagraphs, i, j+1); |
102 | --i; |
103 | } |
104 | } |
105 | |
106 | // take out runs of empty paragraphs |
107 | for (int i = 0; i < l(replacer.outParagraphs); i++) { |
108 | int j = i+1; |
109 | while (j < l(replacer.outParagraphs) && regexpMatchesIC( |
110 | optSpace, |
111 | replacer.fullText(replacer.outParagraphs.get(j)))) ++j; |
112 | |
113 | if (j >= i+2) { |
114 | print("Dropping empty paragraphs at " + i); |
115 | removeSubList(replacer.outParagraphs, i+2, j); |
116 | } |
117 | } |
118 | }; |
119 | |
120 | replacer.run(); |
121 | } |
122 | |
123 | bool evaluateFormCondition(S key, S condition) { |
124 | S value = getValue(key); |
125 | bool result; |
126 | new Matches m; |
127 | if (swic(condition, "contains ", m)) |
128 | result = cic(value, m.rest()); |
129 | else if (eqic(condition, "not empty")) |
130 | result = nempty(value); |
131 | else |
132 | result = eqic(value, condition); |
133 | printVars_str(+key, +condition, +value, +result); |
134 | ret result; |
135 | } |
136 | } |
download show line numbers debug dex old transpilations
Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
Snippet ID: | #1028433 |
Snippet name: | WordDocumentTemplateProcessor |
Eternal ID of this version: | #1028433/4 |
Text MD5: | 9ed2c45e65ba9c385d78f724783411e8 |
Transpilation MD5: | d30626bbdea246eed06398ddafec0309 |
Author: | stefan |
Category: | javax / a.i. |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2020-06-20 11:22:42 |
Source code size: | 4668 bytes / 136 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 197 / 499 |
Version history: | 3 change(s) |
Referenced in: | [show references] |