馃悕馃悕馃悕
1
2const TEXT = "builtin_text";
3const BREAK = "builtin_break";
4
5const inlineElements = ["b", "i"];
6
7export async function build(target, nodes, source, inline=false) {
8 let segment = document.createElement(inline ? "span" : "p");
9 let inlineEnded = false;
10
11 for (const node of nodes) {
12 const tag = node.tag.symbol;
13
14 if (tag === TEXT) {
15 const span = document.createElement("span");
16 span.innerText = source.substring(node.content.start, node.content.end + 1);
17 if (inlineEnded && /\w/.test(span.innerText[0])) {
18 segment.appendChild(document.createTextNode(" "));
19 }
20 segment.appendChild(span);
21 inlineEnded = false;
22 continue;
23 }
24
25 if (tag === BREAK) {
26 if (inline) {
27 const br = document.createElement("br");
28 segment.appendChild(br);
29 } else {
30 if (segment.childNodes.length > 0) {
31 target.appendChild(segment);
32 segment = document.createElement("p");
33 }
34 }
35 continue;
36 }
37
38 let bracketArgs = [];
39 if (node.args.start !== null) {
40 bracketArgs = source.substring(node.args.start, node.args.end + 1).split("|");
41 }
42
43 if (inlineElements.includes(tag)) {
44 const tagElement = document.createElement(tag);
45 build(tagElement, node.content.nodes, source, true);
46 for (const arg of bracketArgs) {
47 const split = arg.split("=");
48 tagElement[split[0].trim()] = split[1];
49 }
50 segment.appendChild(document.createTextNode(" "));
51 segment.appendChild(tagElement);
52 inlineEnded = true;
53 continue;
54 }
55
56 if (tag[0] !== "$") {
57 if (segment.childNodes.length > 0) {
58 target.appendChild(segment);
59 segment = document.createElement(inline ? "span" : "p");
60 }
61 try {
62 const tagElement = document.createElement(tag);
63 for (const arg of bracketArgs) {
64 const split = arg.split("=");
65 tagElement[split[0].trim()] = split[1];
66 }
67 build(tagElement, node.content.nodes, source);
68 target.appendChild(tagElement);
69 }
70 catch {
71 const _sp = document.createElement("span");
72 _sp.innerText = ` [no tag "${tag}"] `;
73 segment.appendChild(_sp);
74 }
75 continue;
76 }
77
78 try {
79 if (segment.childNodes.length > 0) {
80 target.appendChild(segment);
81 segment = document.createElement(inline ? "span" : "p");
82 }
83 $mod(tag.substring(1), target, [...bracketArgs, source.substring(node.content.start, node.content.end)]);
84 }
85 catch {
86 const _sp = document.createElement("span");
87 _sp.innerText = ` [no module "${tag}"] `;
88 segment.appendChild(_sp);
89 }
90 }
91
92 if (segment.childNodes.length > 0) {
93 target.appendChild(segment);
94 }
95}
96