|
1 | | -import { getDefaultStyles, generateReusableCSSClasses } from '../utils/cssTools.js'; |
2 | | -import { deepCloneWithShadow } from './clone.js'; |
3 | | -import { inlineImages } from '../modules/images.js'; |
4 | | -import { inlineBackgroundImages } from '../modules/background.js'; |
| 1 | +import { generateCSSClasses} from '../utils/cssTools.js'; |
| 2 | +import { deepClone } from './clone.js'; |
5 | 3 | import { inlinePseudoElements } from '../modules/pseudo.js'; |
6 | | -import { applyFontClasses } from '../modules/fonts.js'; |
7 | 4 |
|
8 | 5 | /** |
9 | | - * Prepares a clone of an element with all its styles and content |
| 6 | + * Prepares a clone of an element |
10 | 7 | * @param {Element} element - Element to clone |
11 | 8 | * @returns {Promise<Object>} Object containing the clone, CSS, and style cache |
12 | 9 | */ |
13 | 10 |
|
14 | | -export async function prepareClone(element) { |
15 | | - const styleMap = /* @__PURE__ */ new Map(); |
16 | | - const styleCache = /* @__PURE__ */ new WeakMap(); |
17 | | - const nodeMap = /* @__PURE__ */ new WeakMap(); |
18 | | - let defaults; |
19 | | - // TO-DO option to use default styles. Meanwhile, getDefaultStyles() is disabled; |
20 | | - try { |
21 | | - defaults = {} // getDefaultStyles(); |
22 | | - } catch (e) { |
23 | | - console.warn("getDefaultStyles failed:", e); |
24 | | - defaults = {}; |
25 | | - } |
| 11 | +export async function prepareClone(element, compress = false) { |
| 12 | + const styleMap = new Map(); |
| 13 | + const styleCache = new WeakMap(); |
| 14 | + const nodeMap = new WeakMap(); |
26 | 15 | let clone; |
| 16 | + |
27 | 17 | try { |
28 | | - clone = deepCloneWithShadow(element, styleMap, defaults, styleCache, nodeMap); |
| 18 | + clone = deepClone(element, styleMap, styleCache, nodeMap, compress); |
29 | 19 | } catch (e) { |
30 | | - console.warn("deepCloneWithShadow failed:", e); |
| 20 | + console.warn("deepClone failed:", e); |
31 | 21 | throw e; |
32 | 22 | } |
| 23 | + |
33 | 24 | try { |
34 | | - await inlineImages(clone); |
35 | | - } catch (e) { |
36 | | - console.warn("inlineImages failed:", e); |
37 | | - } |
38 | | - try { |
39 | | - await inlineBackgroundImages(element, clone, styleCache); |
40 | | - } catch (e) { |
41 | | - console.warn("inlineBackgroundImages failed:", e); |
42 | | - } |
43 | | - try { |
44 | | - await inlinePseudoElements(element, clone); |
| 25 | + await inlinePseudoElements(element, clone, styleMap, styleCache, compress); |
45 | 26 | } catch (e) { |
46 | 27 | console.warn("inlinePseudoElements failed:", e); |
47 | | - } |
48 | | - // Generate optimized CSS classes from the collected styles |
49 | | - const keyToClass = generateReusableCSSClasses(styleMap); |
50 | | - const classCSS = Array.from(keyToClass.entries()).map(([key, className]) => `.${className}{${key}}`).join(""); |
51 | | - // Apply classes to elements and remove inline styles |
| 28 | + } |
| 29 | + |
| 30 | + const keyToClass = generateCSSClasses(styleMap); |
| 31 | + const classCSS = Array.from(keyToClass.entries()) |
| 32 | + .map(([key, className]) => `.${className}{${key}}`) |
| 33 | + .join(""); |
| 34 | + |
52 | 35 | for (const [node, key] of styleMap.entries()) { |
53 | 36 | if (node.tagName === "STYLE") continue; |
54 | 37 | const className = keyToClass.get(key); |
55 | | - if (className) { |
56 | | - node.classList.add(className); |
57 | | - try { |
58 | | - applyFontClasses(node, nodeMap.get(node), styleCache); |
59 | | - } catch (e) { |
60 | | - console.warn("applyFontClasses failed for node:", node, e); |
61 | | - } |
62 | | - } |
| 38 | + if (className) node.classList.add(className); |
63 | 39 |
|
64 | | - // Preserve background images while removing other inline styles |
65 | 40 | const bgImage = node.style?.backgroundImage; |
66 | 41 | node.removeAttribute("style"); |
67 | 42 | if (bgImage && bgImage !== "none") node.style.backgroundImage = bgImage; |
68 | 43 | } |
| 44 | + |
69 | 45 | return { clone, classCSS, styleCache }; |
70 | 46 | } |
0 commit comments