PluginProbe
Depicter — Popup & Slider Builder / trunk
Depicter — Popup & Slider Builder vtrunk
4.8.1 trunk 1.0.0 1.1.0 1.1.2 1.1.4 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.5 1.3.8 1.5.0 1.5.1 1.5.2 1.5.5 1.6.0 1.6.1 1.6.2 1.7.0 All 76 releases
depicter / resources / scripts / player / injector.js

injector.js in Depicter — Popup & Slider Builder trunk, at resources/scripts/player/injector.js

128 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * It's a standalone module that injects given data to the player markup right before the player initialization
3 * This module can be used to show a preview of a template on realtime with the user's given data
4 */
5
6 /**
7 * Fill the image based on type on box
8 * @param {String} type type of fit cover or contain
9 * @param {number} boxW box width
10 * @param {number} boxH box height
11 * @param {number} width media width
12 * @param {number} height media width
13 */
14 const fitToBox = (type, boxW, boxH, width, height) => {
15 const wr = boxW / width;
16 const hr = boxH / height;
17 const ratio = type === 'cover' ? Math.max(wr, hr) : Math.min(wr, hr);
18
19 return {
20 width: width * ratio,
21 height: height * ratio,
22 };
23 };
24
25 const parseJSONAttr = (value) => {
26 try {
27 return JSON.parse(value.replace(/'/g, '"'));
28 } catch {
29 console.warn('Given data value is not a valid JSON, skipped. \n ' + value);
30 }
31
32 return null;
33 };
34
35 const calcCropSize = (size, element) => {
36 // has crop data
37 if (element.dataset.crop) {
38 const cropData = parseJSONAttr(element.dataset.crop);
39 const {
40 mediaSize: { width: mw, height: mh },
41 } = cropData;
42 const { width, height } = size;
43 cropData.mediaSize = fitToBox('cover', mw, mh, width, height);
44 element.dataset.crop = JSON.stringify(cropData).replace('"', "'");
45 }
46 };
47
48 const replaceImg = (src, size, element) => {
49 calcCropSize(size, element);
50 delete element.dataset.depicterSrcset;
51 element.dataset.depicterSrc = src;
52
53 delete element.dataset.srcset;
54 element.dataset.src = src;
55 };
56
57 const replacePicture = (src, size, element) => {
58 calcCropSize(size, element);
59 const img = element.querySelector('img');
60 delete img.dataset.depicterSrcset;
61 img.dataset.depicterSrc = src;
62 element.querySelectorAll('source')?.forEach((el) => {
63 el.remove();
64 });
65 };
66
67 const replaceImages = (pattern, targetElement) => {
68 Object.entries(pattern).forEach(([className, { src, size }]) => {
69 targetElement.querySelectorAll('.' + className)?.forEach((element) => {
70 if (element.tagName === 'IMG') {
71 replaceImg(src, size, element);
72 } else if (element.tagName === 'PICTURE') {
73 replacePicture(src, size, element);
74 } else if (element.tagName === 'DIV' || element.classList.contains('depicter-section')) {
75 const targetEl = element.querySelector('img.depicter-bg');
76 if (targetEl) replaceImg(src, size, targetEl);
77
78 if (!targetEl) {
79 // check for background image
80 const bgEl = element.querySelector('picture.depicter-bg');
81 if (bgEl) replacePicture(src, size, bgEl);
82 }
83 }
84 });
85 });
86 };
87
88 const replaceContent = (pattern, targetElement) => {
89 Object.entries(pattern).forEach(([className, content]) => {
90 targetElement.querySelectorAll('.' + className)?.forEach((element) => {
91 element.innerHTML = content;
92 });
93 });
94 };
95
96 const replaceColors = (pattern, targetElement = document.documentElement) => {
97 Object.entries(pattern).forEach(([color, value]) => {
98 targetElement.style.setProperty(color, value);
99 });
100 };
101
102 window.depicterInjector = (target) => {
103 const targetElement = document.querySelector(target);
104 window.addEventListener('message', (event) => {
105 const { data } = event;
106
107 switch (data.action) {
108 case 'replaceContent':
109 replaceContent(data.pattern, targetElement);
110 break;
111 case 'replaceImages':
112 replaceImages(data.pattern, targetElement);
113 break;
114 case 'replaceColors':
115 replaceColors(data.pattern);
116 break;
117 case 'init':
118 window.Depicter.initAll();
119 break;
120 default:
121 break;
122 }
123 });
124 };
125
126 // disable auto Depicter init
127 window.DepicterDisableAutoInit = true;
128