{"version":3,"sources":["html-template-strings.ts"],"sourcesContent":["import { Datex } from \"datex-core-legacy/mod.ts\";\nimport { escapeString, getParseJSX } from \"../jsx/parser.ts\";\nimport type { DOMContext } from \"../dom/DOMContext.ts\";\nimport { type DOMUtils, JSX_INSERT_STRING } from \"../datex-bindings/dom-utils.ts\";\n\nimport { he } from \"./he.js\";\nimport { Class } from \"datex-core-legacy/utils/global_types.ts\";\n\nconst injectionMarker = '\\x00';\nconst tagStart = /^<([\\w\\-.:]*|\\x00\\[\\d+\\])\\s*( |\\/|>)/;\nconst extractInjectedId = /\\x00\\[(\\d+)\\]/;\nconst extractInjectedIds = /\\x00\\[(\\d+)\\]/gm;\nconst extractInjectedIdsNoGroup = /\\x00\\[(?:\\d+)\\]/gm;\nconst attrStart = /^\\s*([\\w-]+)\\s*=\\s*/;\nconst string = /^(\"(?:(?:.|\\n)*?[^\\\\])??(?:(?:\\\\\\\\)+)?\"|'(?:(?:.|\\n)*?[^\\\\])??(?:(?:\\\\\\\\)+)?')/;\nconst word = /^[\\w-]+\\b/;\nconst tagEnd = /^\\s*(\\/)?>/\nconst closingTag = /^<\\/\\s*([\\w\\-.:]*|\\x00\\[\\d+\\])\\s*>/\nconst injectedDatex = /^\\#\\(/;\nconst untilTagClose = /[^<]*(?=<|$)/\n\n/**\n * Alternative to JSX, just using native JS template strings\n * @param template html template string\n * @param content \n * @returns \n */\nexport function getHTMLGenerator(context: DOMContext, domUtils: DOMUtils, jsx: ReturnType<typeof getParseJSX>) {\n\n\tfunction matchTag(html:string, content:any[]) {\n\t\tconst start = html.match(tagStart);\n\t\tconst tag = start?.[1];\n\t\n\t\t// no tag - html content\n\t\tif (!tag) {\n\t\t\tconst matchInner = html.match(untilTagClose);\n\t\t\tif (!matchInner) throw new Error(\"UIX.HTML: Invalid HTML\")\n\t\t\tconst inner = matchInner[0];\n\t\t\thtml = html.replace(matchInner[0], \"\")//.trimStart();\n\t\t\tconst injectedIds = [...inner.matchAll(extractInjectedIds)].map(v=>Number(v[1]));\n\t\t\tconst injected = content.slice(injectedIds.at(0), injectedIds.at(-1)!+1)\n\t\t\tconst contentParts = inner.split(extractInjectedIdsNoGroup).map(v=>he.decode(v)); // convert &nbsp; etc\n\t\n\t\t\tconst combined = contentParts.map((e,i) => [e, injected[i]]).flat().slice(0, -1).filter(c=>c!==\"\");\n\t\t\treturn [html, ...combined]\n\t\t}\n\t\n\t\thtml = html.replace(start[0], \"\")//.trimStart();\n\t\tconst immediateTagClose = start[2] == \"/\";\n\t\tconst noAttrs = immediateTagClose || start[2] == \">\"\n\t\n\t\t// reinsert immediately closing > or /\n\t\tif (immediateTagClose) html = \"/\" + html\n\t\telse if (noAttrs) html = \">\" + html\n\t\n\t\tlet tagName:string|Class = tag;\n\t\tif (tag.startsWith(injectionMarker)) tagName = content[Number(tag.match(extractInjectedId)![1])]\n\t\n\t\t// tag start - attributes\n\t\tconst attrs = {children: []} as JSX.ElementChildrenAttribute & {children:any[]};\n\t\n\t\tif (!noAttrs) {\n\t\t\twhile (html && !html.match(tagEnd)) {\n\t\t\t\thtml = matchAttribute(html, content, attrs)//.trimStart();\n\t\t\t}\n\t\t}\n\t\t\n\t\tconst endMatch = html.match(tagEnd)!;\n\t\tconst selfClosing = immediateTagClose || !!endMatch[1]\n\t\thtml = html.replace(endMatch[0], \"\")//.trimStart();\n\t\t\n\t\t// children\n\t\tif (!selfClosing) {\n\t\t\tlet matchClose:RegExpMatchArray|null|undefined\n\t\t\twhile (html && !((matchClose=html.match(closingTag)))) {\n\t\t\t\tconst [newhtml, ...children] = matchTag(html, content);\n\t\t\t\tattrs.children.push(...children);\n\t\t\t\thtml = newhtml;\n\t\t\t}\n\t\t\tif (!matchClose) console.warn(\"UIX.HTML: missing closing tag for \" + (typeof tagName == \"string\" ? tagName : tagName.name))\n\t\t\tif (matchClose && matchClose![1]!=tagName) throw new Error(\"UIX.HTML: closing tag \"+matchClose![1]+\" does not match \" + (typeof tagName == \"string\" ? tagName : tagName.name))\n\t\t\tif (matchClose) html = html.replace(matchClose![0], \"\")//.trimStart();\n\t\t}\n\t\n\t\t// single child\n\t\tif (attrs.children.length == 1) attrs.children = attrs.children[0];\n\t\t\n\t\treturn [html, jsx(tagName, attrs)] as const;\n\t}\n\t\n\tfunction matchAttribute(html:string, content:any[], attrs:Record<string,any>) {\n\t\n\t\tif (!html.match(word)) {\n\t\t\tthrow new Error(\"UIX.HTML: invalid token (near '\"+html+\"')\")\n\t\t}\n\t\n\t\t// attr=\n\t\tconst attr = html.match(attrStart);\n\t\t// standalone attribute without value\n\t\tif (!attr) {\n\t\t\tconst trueAttr = html.match(word);\n\t\t\tif (trueAttr) {\n\t\t\t\thtml = html.replace(trueAttr[0], \"\")//.trimStart();\n\t\t\t\tattrs[trueAttr[0]] = true;\n\t\t\t}\n\t\t\treturn html;\n\t\t}\n\t\n\t\thtml = html.replace(attr[0], \"\")//.trimStart();\n\t\tconst attrName = attr[1];\n\t\n\t\tconst attrValMatch = html.match(string);\n\t\n\t\tlet attrVal: any;\n\t\tlet contentInserted = false;\n\t\n\t\t// get value:\n\t\n\t\t// matched \" or '\n\t\tif (attrValMatch) {\n\t\t\thtml = html.replace(attrValMatch[0], \"\")//.trimStart();\n\t\t\tattrVal = attrValMatch?.[0]?.slice(1,-1)\n\t\t}\n\t\t// injected js\n\t\telse if (html.startsWith(injectionMarker)) {\n\t\t\tconst match = html.match(extractInjectedId);\n\t\t\tattrVal = content[Number(match![1])];\n\t\t\thtml = html.replace(match![0], \"\")//.trimStart();\n\t\t\tcontentInserted = true;\n\t\t}\n\t\t// injected dx\n\t\telse if (html.match(injectedDatex)) {\n\t\t\tlet [dx, newHTML] = html.split(\")\", 2)\n\t\t\tdx = dx.replace(injectedDatex, '')\n\t\t\tconst injectedIds = [...dx.matchAll(extractInjectedIds)].map(v=>Number(v[1]));\n\t\t\tdx = dx.replaceAll(extractInjectedIds, Datex.INSERT_MARK);\n\t\t\tdx = `always(${dx})`;\n\t\t\tconst injected = content.slice(injectedIds.at(0), injectedIds.at(-1)!+1)\n\t\t\tattrVal = datex(dx, injected)\n\t\t\thtml = newHTML;\n\t\t}\n\t\t// unescaped value\n\t\telse if (html.match(word)) {\n\t\t\tconst valMatch = html.match(word);\n\t\t\tif (!valMatch) throw new Error(\"UIX.HTML: Invalid HTML, invalid attribute definition (\"+attrName+\")\");\n\t\t\thtml = html.replace(valMatch[0], \"\")//.trimStart();\n\t\t\tattrVal = valMatch[0];\n\t\t}\n\t\telse {\n\t\t\tthrow new Error(\"UIX.HTML: Invalid HTML, invalid attribute definition (\"+attrName+\")\");\n\t\t}\n\t\n\t\t// resolve \"\\x00(1)\"\n\t\tif (!contentInserted && typeof attrVal==\"string\" && attrVal?.includes(injectionMarker)) {\n\t\t\tconst injectedIds = [...attrVal.matchAll(extractInjectedIds)].map(v=>Number(v[1]));\n\n\t\t\tif (injectedIds.length == 1 && !attrVal.match(/^\\[\\d+\\]$/)) {\n\t\t\t\tconst injected = content[injectedIds[0]];\n\t\t\t\tattrVal = injected?.[JSX_INSERT_STRING] ? (injected as any).val : injected; // attrVal.replaceAll(extractInjectedIds, Datex.INSERT_MARK);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow \"Transforms for HTML attributes are not yet implemented\"\n\t\t\t}\n\t\t}\n\t\n\t\tattrs[attrName] = attrVal;\n\t\treturn html;\n\t}\n\t\n\n\n\t// export function HTML(value:any): Element|DocumentFragment\n\t// export function HTML<R extends Element|DocumentFragment = Element|DocumentFragment>(template:TemplateStringsArray|string, ...content:(Element|Datex.CompatValue<unknown>)[]): R\n\n\treturn function HTML(template:any, ...content:(Element|Datex.RefOrValue<unknown>)[]) {\n\t\tconst isTemplate = template?.raw instanceof Array && template instanceof Array;\n\t\t// non template value - convert to HTML node\n\t\tif (!isTemplate) {\n\t\t\treturn domUtils.getNode(template);\n\t\t}\n\t\t// templatee\n\t\telse {\n\t\n\t\t\t// escape non-pointer strings in content\n\t\t\tfor (let i=0; i<content.length; i++) {\n\t\t\t\tif (typeof content[i] === \"string\") content[i] = escapeString(content[i] as string);\n\t\t\t}\n\t\n\t\t\t// combine html\n\t\t\tlet html = \"\";\n\t\t\tlet c = 0;\n\t\t\tfor (const raw of (template as unknown as TemplateStringsArray).raw) {\n\t\t\t\thtml += raw;\n\t\t\t\tif (c<(template as unknown as TemplateStringsArray).raw.length-1) html += `\\x00[${c++}]`;\n\t\t\t}\n\t\t\thtml = html//.trimStart();\n\t\t\tconst all = [];\n\t\t\twhile (true) {\n\t\t\t\tconst [_html, ...children] = matchTag(html, content);\n\t\t\t\thtml = _html;\n\t\t\t\tall.push(domUtils.valuesToDOMElement(...children));\n\t\t\t\tif (!html.trim()) break;\n\t\t\t}\n\t\t\treturn domUtils.valuesToDOMElement(...all);\n\t\t}\n\t\t\n\t}\t\n}\n\n\n"],"names":["Datex","escapeString","JSX_INSERT_STRING","he","tagStart","extractInjectedId","extractInjectedIds","extractInjectedIdsNoGroup","attrStart","string","word","tagEnd","closingTag","injectedDatex","untilTagClose","getHTMLGenerator","context","domUtils","jsx","matchTag","html","content","start","match","tag","matchInner","Error","inner","replace","injectedIds","matchAll","map","v","Number","injected","slice","at","contentParts","split","decode","e","i","flat","filter","c","immediateTagClose","noAttrs","tagName","startsWith","attrs","children","matchAttribute","endMatch","selfClosing","matchClose","newhtml","push","console","warn","name","length","attrVal","attr","trueAttr","attrName","attrValMatch","contentInserted","dx","newHTML","replaceAll","INSERT_MARK","datex","valMatch","includes","val","HTML","template","raw","Array","getNode","all","_html","valuesToDOMElement","trim"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/uix-dom/html-template-strings/","file":"html-template-strings.ts"}