Files
Coop-NL/scripts/badges/measure.js
T
Jakub_HostacnyandClaude Opus 5.5 af35334688 feat: vsetky sablony cenoviek z novych SVG (zakladne, appkaci, vernostna karta)
- 22 sablon: Super cena / Super vyhodne / Zakladna v 3 farbach so SK aj bez,
  Appkaci (SK / bez), Vernostna karta (so zlavou / bez); orezane na viditelny
  obsah, rovnaka mierka (sirka = viewBox x 130 / 80,1)
- nove premenne {zlava_app}, {jednotkova_cena_app}, {cena_bez_karty},
  {zlava_bez_karty}, {jednotkova_cena_s_kartou}, {jednotkova_cena_bez_karty};
  zvisle natiahnutie textu (scaleY), viac nazvov pisma, napis zlava len pri zlave
- Vernostna karta je predvolena cenovka sekcie Vernostne zlavy
- produkty pri nacitani dostanu aktualnu verziu svojej sablony
- import: zlava pre appkacov a s vernostnou kartou z poznamky, jednotkova cena
  pre appkacov prepocitana, sirka cenovky podla sablony
- okraj stitkov predajni podla mierky cenovky
- postup prevodu v scripts/badges

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 10:36:37 +02:00

58 lines
2.4 KiB
JavaScript

// Meranie šablón cenoviek v prehliadači (dočasný súbor): orezanie na viditeľný obsah a vrstvy z textov.
window.measureBadges = async function () {
await document.fonts.load('700 20px aptly');
const C = await (await fetch('/__svg/conv.json?' + Date.now())).json();
const NS = 'http://www.w3.org/2000/svg';
const out = [];
for (const c of C) {
// 1) viditeľný obsah pozadia (alfa kanál) → orezaný viewBox
const [vx, vy, vw, vh] = c.vb;
const S = 10;
const bg = `<svg xmlns="${NS}" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="${vx} ${vy} ${vw} ${vh}" width="${vw * S}" height="${vh * S}">${c.inner}</svg>`;
const img = new Image();
img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(bg);
await img.decode();
const cv = document.createElement('canvas');
cv.width = Math.ceil(vw * S);
cv.height = Math.ceil(vh * S);
const ctx = cv.getContext('2d');
ctx.drawImage(img, 0, 0);
const a = ctx.getImageData(0, 0, cv.width, cv.height).data;
let x0 = 1e9, y0 = 1e9, x1 = -1, y1 = -1;
for (let y = 0; y < cv.height; y++)
for (let x = 0; x < cv.width; x++)
if (a[(y * cv.width + x) * 4 + 3] > 8) {
if (x < x0) x0 = x;
if (x > x1) x1 = x;
if (y < y0) y0 = y;
if (y > y1) y1 = y;
}
const pad = 0.3;
const crop = [vx + x0 / S - pad, vy + y0 / S - pad, (x1 + 1 - x0) / S + 2 * pad, (y1 + 1 - y0) / S + 2 * pad].map((v) => Math.round(v * 100) / 100);
// 2) texty z pôvodného SVG zmerané s písmom Aptly
const host = document.createElement('div');
host.style.cssText = 'position:absolute;left:-5000px;top:0';
host.innerHTML = c.original.replace(/^[\s\S]*?(<svg)/, '$1');
document.body.appendChild(host);
const els = [...host.querySelectorAll('text')];
const m = c.texts.map((info) => {
const t = els.find((x) => x.getAttribute('transform') === info.transform && x.textContent === info.text);
const tr = t.transform.baseVal.consolidate()?.matrix || { e: 0, f: 0 };
const n = t.getNumberOfChars();
const e0 = t.getExtentOfChar(0);
return {
...info,
start: tr.e + t.getStartPositionOfChar(0).x,
end: tr.e + t.getEndPositionOfChar(n - 1).x,
top: tr.f + e0.y,
h: e0.height,
aptly: /aptly/i.test(info.family)
};
});
host.remove();
out.push({ ...c, crop, m });
}
return out;
};