|
1 | 1 | import Page from '@brainly/html-sketchapp/html2asketch/page.js';
|
2 | 2 | import Document from '@brainly/html-sketchapp/html2asketch/document.js';
|
3 | 3 | import Text from '@brainly/html-sketchapp/html2asketch/text.js';
|
4 |
| -import SymbolMaster from '@brainly/html-sketchapp/html2asketch/symbolMaster.js'; |
5 | 4 | import nodeToSketchLayers from '@brainly/html-sketchapp/html2asketch/nodeToSketchLayers.js';
|
| 5 | +import SymbolMaster from '@brainly/html-sketchapp/html2asketch/symbolMaster.js'; |
6 | 6 |
|
7 |
| -const getAllLayers = async item => { |
| 7 | +const getAllLayers = async (item, symbolMastersByName = {}) => { |
8 | 8 | const itemAndChildren = [item, ...item.querySelectorAll('*')];
|
9 | 9 |
|
10 |
| - const layerPromises = Array.from(itemAndChildren) |
11 |
| - .map(node => nodeToSketchLayers(node)); |
| 10 | + const symbolInstanceChildren = new Set([ |
| 11 | + ...item.querySelectorAll('[data-sketch-symbol-instance] *') |
| 12 | + ]); |
| 13 | + |
| 14 | + const layerPromises = Array.from(itemAndChildren).map(node => { |
| 15 | + if (node.dataset.sketchSymbolInstance) { |
| 16 | + const symbolName = node.dataset.sketchSymbolInstance; |
| 17 | + |
| 18 | + if (!(symbolName in symbolMastersByName)) { |
| 19 | + throw new Error(`Unknown symbol master: ${symbolName}`); |
| 20 | + } |
| 21 | + |
| 22 | + const symbolMaster = symbolMastersByName[symbolName]; |
| 23 | + |
| 24 | + const { left: x, top: y, width, height } = node.getBoundingClientRect(); |
| 25 | + const symbolInstance = symbolMaster.getSymbolInstance({ x, y, width, height }); |
| 26 | + |
| 27 | + symbolInstance.setName(symbolName); |
| 28 | + |
| 29 | + return [symbolInstance]; |
| 30 | + } else if (symbolInstanceChildren.has(node)) { |
| 31 | + // Anything nested under data-sketch-symbol-instance shouldn't be rendered, |
| 32 | + // otherwise it'll be included in the symbolInstance itself. |
| 33 | + return []; |
| 34 | + } |
| 35 | + |
| 36 | + return nodeToSketchLayers(node); |
| 37 | + }); |
12 | 38 |
|
13 | 39 | const layers = await Promise.all(layerPromises);
|
14 | 40 |
|
@@ -56,22 +82,32 @@ export function setupSymbols({ name }) {
|
56 | 82 | }
|
57 | 83 |
|
58 | 84 | export async function snapshotSymbols({ suffix = '' }) {
|
59 |
| - const symbolPromises = Array.from(document.querySelectorAll('[data-sketch-symbol]')) |
60 |
| - .map(async item => { |
61 |
| - const name = item.dataset.sketchSymbol; |
62 |
| - const { left: x, top: y } = item.getBoundingClientRect(); |
63 |
| - const symbol = new SymbolMaster({ x, y }); |
| 85 | + const nodes = Array.from(document.querySelectorAll('[data-sketch-symbol]')); |
64 | 86 |
|
65 |
| - symbol.setName(`${name}${suffix}`); |
| 87 | + const symbolMastersByName = nodes.reduce((obj, item) => { |
| 88 | + const name = item.dataset.sketchSymbol; |
| 89 | + const { left: x, top: y } = item.getBoundingClientRect(); |
66 | 90 |
|
67 |
| - const layers = await getAllLayers(item); |
| 91 | + const symbol = new SymbolMaster({ x, y }); |
| 92 | + symbol.setName(`${name}${suffix}`); |
68 | 93 |
|
69 |
| - layers |
70 |
| - .filter(layer => layer !== null) |
71 |
| - .forEach(layer => symbol.addLayer(layer)); |
| 94 | + obj[name] = symbol; |
72 | 95 |
|
73 |
| - return symbol; |
74 |
| - }); |
| 96 | + return obj; |
| 97 | + }, {}); |
| 98 | + |
| 99 | + const symbolPromises = nodes.map(async item => { |
| 100 | + const name = item.dataset.sketchSymbol; |
| 101 | + const symbol = symbolMastersByName[name]; |
| 102 | + |
| 103 | + const layers = await getAllLayers(item, symbolMastersByName); |
| 104 | + |
| 105 | + layers |
| 106 | + .filter(layer => layer !== null) |
| 107 | + .forEach(layer => symbol.addLayer(layer)); |
| 108 | + |
| 109 | + return symbol; |
| 110 | + }); |
75 | 111 |
|
76 | 112 | const symbols = await Promise.all(symbolPromises);
|
77 | 113 |
|
|
0 commit comments