馃悕馃悕馃悕
at dev 96 lines 3.2 kB view raw
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