1 | export 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 | }
|