PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / javascript-source / utils / svg-to-png.js
independent-analytics / javascript-source / utils Last commit date
appearance.js 1 year ago svg-to-png.js 6 days ago
svg-to-png.js
109 lines
1 async function svgToPng(svgElement) {
2 const { width, height } = svgDimensions(svgElement);
3 const svgClone = svgElement.cloneNode(true);
4
5 inlineComputedSvgStyles(svgElement, svgClone);
6 svgClone.setAttribute("xmlns", "http://www.w3.org/2000/svg");
7 svgClone.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
8 svgClone.setAttribute("width", width);
9 svgClone.setAttribute("height", height);
10
11 // 1. Get SVG data
12 const svgData = new XMLSerializer().serializeToString(svgClone);
13 const svgBlob = new Blob([svgData], { type: "image/svg+xml;charset=utf-8" });
14 const url = URL.createObjectURL(svgBlob);
15
16 // 2. Load SVG into image (wrapped in promise)
17 const img = await new Promise((resolve, reject) => {
18 const image = new Image();
19 image.onload = () => resolve(image);
20 image.onerror = reject;
21 image.src = url;
22 });
23
24 // 3. Create canvas and draw
25 const canvas = document.createElement("canvas");
26 canvas.width = width;
27 canvas.height = height;
28
29 const ctx = canvas.getContext("2d");
30 ctx.drawImage(img, 0, 0, width, height);
31
32 URL.revokeObjectURL(url);
33
34 // 4. Create PNG image element
35 const pngImage = new Image();
36 pngImage.src = canvas.toDataURL("image/png");
37
38 return pngImage;
39 }
40
41 function svgDimensions(svgElement) {
42 const renderedSize = svgElement.getBoundingClientRect();
43 const viewBox = svgElement.viewBox.baseVal;
44 const attributeSize = {
45 width: svgElement.width.baseVal.value,
46 height: svgElement.height.baseVal.value,
47 };
48 const viewBoxSize = {
49 width: viewBox ? viewBox.width : 0,
50 height: viewBox ? viewBox.height : 0,
51 };
52
53 return {
54 width: firstPositiveSize(renderedSize.width, attributeSize.width, viewBoxSize.width, 300),
55 height: firstPositiveSize(renderedSize.height, attributeSize.height, viewBoxSize.height, 150),
56 };
57 }
58
59 function firstPositiveSize(...sizes) {
60 const size = sizes.find((size) => size > 0);
61
62 return Math.ceil(size);
63 }
64
65 function inlineComputedSvgStyles(sourceSvg, targetSvg) {
66 const sourceElements = [sourceSvg, ...sourceSvg.querySelectorAll("*")];
67 const targetElements = [targetSvg, ...targetSvg.querySelectorAll("*")];
68 const properties = [
69 "clip-rule",
70 "color",
71 "display",
72 "dominant-baseline",
73 "fill",
74 "fill-opacity",
75 "fill-rule",
76 "font-family",
77 "font-size",
78 "font-style",
79 "font-weight",
80 "opacity",
81 "stroke",
82 "stroke-dasharray",
83 "stroke-dashoffset",
84 "stroke-linecap",
85 "stroke-linejoin",
86 "stroke-miterlimit",
87 "stroke-opacity",
88 "stroke-width",
89 "text-anchor",
90 "vector-effect",
91 "visibility",
92 ];
93
94 sourceElements.forEach((sourceElement, index) => {
95 const targetElement = targetElements[index];
96 const computedStyle = getComputedStyle(sourceElement);
97
98 properties.forEach((property) => {
99 const value = computedStyle.getPropertyValue(property);
100
101 if (value) {
102 targetElement.setAttribute(property, value);
103 }
104 });
105 });
106 }
107
108 module.exports = { svgToPng };
109