UNPKG

1.28 kBJavaScriptView Raw
1export default function h(strings, ...args) {
2 let result = ``;
3 const appends = {};
4 for (let i = 0; i < args.length; i++) {
5 if (args[i] instanceof HTMLElement) {
6 const id = `id${i}`;
7 appends[id] = args[i];
8 result += `${strings[i]}<div append="${id}"></div>`;
9 } else {
10 result += strings[i] + args[i];
11 }
12 }
13 result += strings[strings.length - 1];
14
15 const template = document.createElement(`template`);
16 template.innerHTML = result;
17
18 const content = template.content;
19
20 [...content.querySelectorAll(`[append]`)].forEach(refNode => {
21 const newNode = appends[refNode.getAttribute('append')];
22 refNode.parentNode.insertBefore(newNode, refNode);
23 refNode.parentNode.removeChild(refNode);
24 });
25
26 content.collect = ({ attr = 'ref', keepAttribute, to = {} } = {}) => {
27 const refElements = content.querySelectorAll(`[${attr}]`);
28 return [...refElements].reduce((acc, element) => {
29 const propName = element.getAttribute(attr).trim();
30 !keepAttribute && element.removeAttribute(attr);
31 acc[propName] = acc[propName]
32 ? Array.isArray(acc[propName])
33 ? [...acc[propName], element]
34 : [acc[propName], element]
35 : element;
36 return acc;
37 }, to);
38 };
39
40 return content;
41}