@reportwright/viewer 0.0.0-stage → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -0
- package/LICENSE +23 -0
- package/README.md +146 -2
- package/dist/chunk-2NAW3MAP.js +1284 -0
- package/dist/chunk-2NAW3MAP.js.map +6 -0
- package/dist/chunk-3D43XGIN.js +1167 -0
- package/dist/chunk-3D43XGIN.js.map +6 -0
- package/dist/chunk-5N6OFCHJ.js +1667 -0
- package/dist/chunk-5N6OFCHJ.js.map +6 -0
- package/dist/chunk-72S6DETS.js +40 -0
- package/dist/chunk-72S6DETS.js.map +6 -0
- package/dist/chunk-AH47FS6Y.js +13 -0
- package/dist/chunk-AH47FS6Y.js.map +6 -0
- package/dist/chunk-APRPSQOD.js +301 -0
- package/dist/chunk-APRPSQOD.js.map +6 -0
- package/dist/chunk-BXKUE45K.js +1284 -0
- package/dist/chunk-BXKUE45K.js.map +6 -0
- package/dist/chunk-D2NTLAKL.js +14 -0
- package/dist/chunk-D2NTLAKL.js.map +6 -0
- package/dist/chunk-E7INJHTL.js +1284 -0
- package/dist/chunk-E7INJHTL.js.map +6 -0
- package/dist/chunk-EOVGKHAS.js +20682 -0
- package/dist/chunk-EOVGKHAS.js.map +6 -0
- package/dist/chunk-FARG6X2U.js +153 -0
- package/dist/chunk-FARG6X2U.js.map +6 -0
- package/dist/chunk-FGEFSGJT.js +1284 -0
- package/dist/chunk-FGEFSGJT.js.map +6 -0
- package/dist/chunk-GJS242RR.js +1652 -0
- package/dist/chunk-GJS242RR.js.map +6 -0
- package/dist/chunk-J56FRCFU.js +1284 -0
- package/dist/chunk-J56FRCFU.js.map +6 -0
- package/dist/chunk-KJTRZJHN.js +599 -0
- package/dist/chunk-KJTRZJHN.js.map +6 -0
- package/dist/chunk-M6GENFAH.js +14806 -0
- package/dist/chunk-M6GENFAH.js.map +6 -0
- package/dist/chunk-NJWQT6VB.js +1284 -0
- package/dist/chunk-NJWQT6VB.js.map +6 -0
- package/dist/chunk-ODREGGKA.js +219 -0
- package/dist/chunk-ODREGGKA.js.map +6 -0
- package/dist/chunk-OLLMACWA.js +35 -0
- package/dist/chunk-OLLMACWA.js.map +6 -0
- package/dist/chunk-PXXMOP4N.js +1284 -0
- package/dist/chunk-PXXMOP4N.js.map +6 -0
- package/dist/chunk-RKGIVPK5.js +1284 -0
- package/dist/chunk-RKGIVPK5.js.map +6 -0
- package/dist/chunk-RYHJUQSV.js +98 -0
- package/dist/chunk-RYHJUQSV.js.map +6 -0
- package/dist/chunk-SBD55ZES.js +316 -0
- package/dist/chunk-SBD55ZES.js.map +6 -0
- package/dist/chunk-SR2TQ2ZK.js +70 -0
- package/dist/chunk-SR2TQ2ZK.js.map +6 -0
- package/dist/designer.d.ts +48 -0
- package/dist/designer.js +35865 -0
- package/dist/designer.js.map +6 -0
- package/dist/peer/chunk-2NJMXASD.js +1282 -0
- package/dist/peer/chunk-2NJMXASD.js.map +6 -0
- package/dist/peer/chunk-76ZABVTI.js +598 -0
- package/dist/peer/chunk-76ZABVTI.js.map +6 -0
- package/dist/peer/chunk-BPF3SLL4.js +1282 -0
- package/dist/peer/chunk-BPF3SLL4.js.map +6 -0
- package/dist/peer/chunk-BWVDLOVL.js +1282 -0
- package/dist/peer/chunk-BWVDLOVL.js.map +6 -0
- package/dist/peer/chunk-CXM3YSWF.js +1282 -0
- package/dist/peer/chunk-CXM3YSWF.js.map +6 -0
- package/dist/peer/chunk-DQFZ6LVB.js +1282 -0
- package/dist/peer/chunk-DQFZ6LVB.js.map +6 -0
- package/dist/peer/chunk-GBITRNHE.js +14806 -0
- package/dist/peer/chunk-GBITRNHE.js.map +6 -0
- package/dist/peer/chunk-IMQRHDR4.js +12 -0
- package/dist/peer/chunk-IMQRHDR4.js.map +6 -0
- package/dist/peer/chunk-IPU2YRL2.js +300 -0
- package/dist/peer/chunk-IPU2YRL2.js.map +6 -0
- package/dist/peer/chunk-KBT6ZGGO.js +1666 -0
- package/dist/peer/chunk-KBT6ZGGO.js.map +6 -0
- package/dist/peer/chunk-M4AGFUWE.js +97 -0
- package/dist/peer/chunk-M4AGFUWE.js.map +6 -0
- package/dist/peer/chunk-MCJPN2KL.js +152 -0
- package/dist/peer/chunk-MCJPN2KL.js.map +6 -0
- package/dist/peer/chunk-NPYKZINU.js +6040 -0
- package/dist/peer/chunk-NPYKZINU.js.map +6 -0
- package/dist/peer/chunk-PG2PNYDX.js +1282 -0
- package/dist/peer/chunk-PG2PNYDX.js.map +6 -0
- package/dist/peer/chunk-QRAJXW2D.js +1282 -0
- package/dist/peer/chunk-QRAJXW2D.js.map +6 -0
- package/dist/peer/chunk-SHVCNAUG.js +1282 -0
- package/dist/peer/chunk-SHVCNAUG.js.map +6 -0
- package/dist/peer/chunk-Y5CAHLXS.js +218 -0
- package/dist/peer/chunk-Y5CAHLXS.js.map +6 -0
- package/dist/peer/designer.js +35841 -0
- package/dist/peer/designer.js.map +6 -0
- package/dist/peer/viewer.js +1061 -0
- package/dist/peer/viewer.js.map +6 -0
- package/dist/viewer.d.ts +77 -0
- package/dist/viewer.js +1066 -0
- package/dist/viewer.js.map +6 -0
- package/package.json +76 -4
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatValue,
|
|
3
|
+
isoDate
|
|
4
|
+
} from "../chunk-GJS242RR.js";
|
|
5
|
+
import {
|
|
6
|
+
drillUrl,
|
|
7
|
+
safeUrl
|
|
8
|
+
} from "../chunk-72S6DETS.js";
|
|
9
|
+
import {
|
|
10
|
+
withDeadline
|
|
11
|
+
} from "../chunk-D2NTLAKL.js";
|
|
12
|
+
import {
|
|
13
|
+
mergedRegions,
|
|
14
|
+
needsTableData
|
|
15
|
+
} from "../chunk-SR2TQ2ZK.js";
|
|
16
|
+
import {
|
|
17
|
+
fontFamilyCss,
|
|
18
|
+
pageToSvg
|
|
19
|
+
} from "../chunk-3D43XGIN.js";
|
|
20
|
+
|
|
21
|
+
// src/exporters/htmldata.js
|
|
22
|
+
var MAX_DATA_ROWS = 2e4;
|
|
23
|
+
var DATA_STRINGS = { pages: "Pages", tables: "Tables", all: "All", filter: "Filter", toggle: "Show or hide the rows of this group", sortAsc: "Sort ascending", sortDesc: "Sort descending" };
|
|
24
|
+
function tablesData(model, o = {}) {
|
|
25
|
+
const regions = mergedRegions(model);
|
|
26
|
+
if (!regions.length || regions.reduce((n, r) => n + r.rows.length, 0) > MAX_DATA_ROWS) return null;
|
|
27
|
+
const sortable = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const pg of model.pages) {
|
|
29
|
+
const heads = pg.items.filter((i) => i.t === "text" && i.cell?.kind === "header" && i.clip);
|
|
30
|
+
for (const l of pg.items) {
|
|
31
|
+
if (l.t !== "link" || l.action?.type !== "sort") continue;
|
|
32
|
+
const h = heads.find((t) => t.cell.table === l.action.table && Math.abs(t.clip.x - l.x) < 1);
|
|
33
|
+
if (h) (sortable.get(h.cell.table) || sortable.set(h.cell.table, /* @__PURE__ */ new Set()).get(h.cell.table)).add(h.cell.col);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const show = (c) => c.value instanceof Date ? isoDate(c.value, model.timeZone || void 0) : typeof c.value === "boolean" ? String(c.value) : formatValue(c.value, c.format, { locale: o.locale, currency: o.currency });
|
|
37
|
+
return regions.map((r) => ({
|
|
38
|
+
name: String(r.name || "Table"),
|
|
39
|
+
cols: r.columns.length,
|
|
40
|
+
sort: [...sortable.get(r.name) || []],
|
|
41
|
+
rows: r.rows.map((row) => ({
|
|
42
|
+
k: row.kind,
|
|
43
|
+
l: row.level || 0,
|
|
44
|
+
c: row.cells.filter((c) => c.colIndex >= 0).map((c) => [c.colIndex, String(show(c) ?? ""), c.value instanceof Date ? c.value.getTime() : typeof c.value === "number" ? c.value : String(c.value ?? "").toLowerCase(), c.span || 1])
|
|
45
|
+
}))
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
var DATA_SCRIPT = `(() => {
|
|
49
|
+
const d = JSON.parse(document.getElementById('pw-data').textContent), S = d.strings;
|
|
50
|
+
const bar = document.getElementById('pw-bar'), box = document.getElementById('pw-tables');
|
|
51
|
+
const el = (tag, cls, text) => { const e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; };
|
|
52
|
+
bar.hidden = false;
|
|
53
|
+
bar.addEventListener('click', (e) => {
|
|
54
|
+
const b = e.target.closest('button[data-view]');
|
|
55
|
+
if (!b) return;
|
|
56
|
+
const tables = b.dataset.view === 'tables';
|
|
57
|
+
document.body.classList.toggle('pw-show-tables', tables);
|
|
58
|
+
box.hidden = !tables;
|
|
59
|
+
for (const x of bar.querySelectorAll('button')) x.setAttribute('aria-pressed', String(x === b));
|
|
60
|
+
if (tables && !box.firstChild) for (const t of d.tables) box.appendChild(view(t));
|
|
61
|
+
});
|
|
62
|
+
function view(t) {
|
|
63
|
+
const sec = el('section', 'pw-t');
|
|
64
|
+
sec.appendChild(el('h2', null, t.name));
|
|
65
|
+
const heads = t.rows.filter(r => r.k === 'header');
|
|
66
|
+
const body = t.rows.filter(r => r.k !== 'header');
|
|
67
|
+
const label = (c) => { for (const h of heads) for (const x of h.c) if (x[0] === c) return x[1]; return String(c + 1); };
|
|
68
|
+
// filters: text columns of detail rows with a few distinct values
|
|
69
|
+
const active = new Map();
|
|
70
|
+
const bar2 = el('div', 'pw-f');
|
|
71
|
+
for (let c = 0; c < t.cols; c++) {
|
|
72
|
+
const vals = new Set(); let text = true;
|
|
73
|
+
for (const r of body) if (r.k === 'detail') for (const x of r.c) if (x[0] === c && x[1] !== '') { vals.add(x[1]); if (typeof x[2] === 'number') text = false; }
|
|
74
|
+
if (!text || vals.size < 2 || vals.size > 30) continue;
|
|
75
|
+
const lab = el('label', null, label(c) + ' ');
|
|
76
|
+
const s = el('select');
|
|
77
|
+
s.appendChild(new Option(S.all, ''));
|
|
78
|
+
for (const v of [...vals].sort()) s.appendChild(new Option(v, v));
|
|
79
|
+
s.addEventListener('change', () => { if (s.value) active.set(c, s.value); else active.delete(c); draw(); });
|
|
80
|
+
lab.appendChild(s);
|
|
81
|
+
bar2.appendChild(lab);
|
|
82
|
+
}
|
|
83
|
+
if (bar2.firstChild) { bar2.prepend(el('span', 'pw-fl', S.filter)); sec.appendChild(bar2); }
|
|
84
|
+
const table = el('table'), thead = el('thead'), tbody = el('tbody');
|
|
85
|
+
let order = null; // { c, dir }
|
|
86
|
+
const closed = new Set();
|
|
87
|
+
for (const h of heads) {
|
|
88
|
+
const tr = el('tr');
|
|
89
|
+
for (const x of h.c) {
|
|
90
|
+
const th = el('th');
|
|
91
|
+
th.scope = 'col';
|
|
92
|
+
if (x[3] > 1) th.colSpan = x[3];
|
|
93
|
+
if (t.sort.includes(x[0])) {
|
|
94
|
+
const b = el('button', 'pw-s', x[1]);
|
|
95
|
+
b.type = 'button';
|
|
96
|
+
b.title = S.sortAsc;
|
|
97
|
+
b.addEventListener('click', () => {
|
|
98
|
+
order = order && order.c === x[0] && order.dir === 1 ? { c: x[0], dir: -1 } : { c: x[0], dir: 1 };
|
|
99
|
+
for (const o of thead.querySelectorAll('th')) o.removeAttribute('aria-sort');
|
|
100
|
+
th.setAttribute('aria-sort', order.dir === 1 ? 'ascending' : 'descending');
|
|
101
|
+
b.title = order.dir === 1 ? S.sortDesc : S.sortAsc;
|
|
102
|
+
draw();
|
|
103
|
+
});
|
|
104
|
+
th.appendChild(b);
|
|
105
|
+
} else th.textContent = x[1];
|
|
106
|
+
tr.appendChild(th);
|
|
107
|
+
}
|
|
108
|
+
thead.appendChild(tr);
|
|
109
|
+
}
|
|
110
|
+
table.append(thead, tbody);
|
|
111
|
+
sec.appendChild(table);
|
|
112
|
+
const key = (r) => { const x = r.c.find(y => y[0] === order.c); return x ? x[2] : ''; };
|
|
113
|
+
const cmp = (a, b) => { const p = key(a), q = key(b); return (typeof p === typeof q ? (p < q ? -1 : p > q ? 1 : 0) : typeof p === 'number' ? -1 : 1) * order.dir; };
|
|
114
|
+
function draw() {
|
|
115
|
+
// detail rows sorted within each run between group rows; groups keep their place
|
|
116
|
+
let rows = body;
|
|
117
|
+
if (order) {
|
|
118
|
+
rows = [];
|
|
119
|
+
for (let i = 0; i < body.length;) {
|
|
120
|
+
if (body[i].k !== 'detail') { rows.push(body[i++]); continue; }
|
|
121
|
+
const run = [];
|
|
122
|
+
while (i < body.length && body[i].k === 'detail') run.push(body[i++]);
|
|
123
|
+
for (const x of run.sort(cmp)) rows.push(x);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const keep = (r) => { for (const [c, v] of active) { const x = r.c.find(y => y[0] === c); if (!x || x[1] !== v) return false; } return true; };
|
|
127
|
+
tbody.textContent = '';
|
|
128
|
+
let hideFrom = -1; // the level of a closed group whose rows are hidden
|
|
129
|
+
rows.forEach((r) => {
|
|
130
|
+
if (hideFrom >= 0 && (r.k === 'header' || r.k === 'footer' || (r.k === 'groupHeader' && r.l <= hideFrom) || (r.k === 'groupFooter' && r.l <= hideFrom))) hideFrom = -1;
|
|
131
|
+
if (hideFrom >= 0) return;
|
|
132
|
+
if (r.k === 'detail' && !keep(r)) return;
|
|
133
|
+
const tr = el('tr', 'pw-' + r.k);
|
|
134
|
+
let c0 = true;
|
|
135
|
+
for (const x of r.c) {
|
|
136
|
+
const td = el('td', typeof x[2] === 'number' ? 'pw-n' : null);
|
|
137
|
+
if (x[3] > 1) td.colSpan = x[3];
|
|
138
|
+
if (c0 && r.k === 'groupHeader') {
|
|
139
|
+
const b = el('button', 'pw-g', closed.has(r) ? '▶' : '▼');
|
|
140
|
+
b.type = 'button';
|
|
141
|
+
b.title = S.toggle;
|
|
142
|
+
b.setAttribute('aria-expanded', String(!closed.has(r)));
|
|
143
|
+
b.addEventListener('click', () => { if (closed.has(r)) closed.delete(r); else closed.add(r); draw(); });
|
|
144
|
+
td.append(b, ' ');
|
|
145
|
+
}
|
|
146
|
+
td.append(x[1]);
|
|
147
|
+
tr.appendChild(td);
|
|
148
|
+
c0 = false;
|
|
149
|
+
}
|
|
150
|
+
tbody.appendChild(tr);
|
|
151
|
+
if (r.k === 'groupHeader' && closed.has(r)) hideFrom = r.l;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
draw();
|
|
155
|
+
return sec;
|
|
156
|
+
}
|
|
157
|
+
})();`;
|
|
158
|
+
var DATA_CSS = `.pw-bar{position:sticky;top:0;z-index:2;display:flex;gap:4px;padding:4px;background:#fff;border-radius:8px;box-shadow:0 1px 3px rgba(0,0,0,.15)}
|
|
159
|
+
.pw-bar button{font:inherit;border:1px solid #c9d1d9;background:#fff;border-radius:6px;padding:4px 12px;cursor:pointer}.pw-bar button[aria-pressed=true]{background:#1f2937;color:#fff;border-color:#1f2937}
|
|
160
|
+
body.pw-show-tables .page{display:none}#pw-tables{width:100%;max-width:none;display:flex;flex-direction:column;gap:24px}
|
|
161
|
+
.pw-t{background:#fff;padding:16px;border-radius:8px;overflow-x:auto}.pw-t h2{font-size:16px;margin:0 0 8px}
|
|
162
|
+
.pw-t table{border-collapse:collapse;width:100%;font-size:13px}.pw-t th,.pw-t td{border-bottom:1px solid #e5e7eb;padding:4px 8px;text-align:left}.pw-t td.pw-n{text-align:right;font-variant-numeric:tabular-nums}
|
|
163
|
+
.pw-t th{background:#f1f5f9}.pw-t .pw-groupHeader td,.pw-t .pw-groupFooter td,.pw-t .pw-footer td{font-weight:600}
|
|
164
|
+
.pw-s,.pw-g{font:inherit;border:0;background:none;padding:0;cursor:pointer;color:inherit}.pw-s:after{content:" ⇅";opacity:.5}
|
|
165
|
+
.pw-f{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-bottom:8px;font-size:13px}.pw-fl{font-weight:600}
|
|
166
|
+
@media print{.pw-bar,#pw-tables{display:none}}`;
|
|
167
|
+
async function cspHash(text) {
|
|
168
|
+
const d = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
|
|
169
|
+
const u8 = new Uint8Array(d);
|
|
170
|
+
let s = "";
|
|
171
|
+
for (const b of u8) s += String.fromCharCode(b);
|
|
172
|
+
return btoa(s);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/exporters/html.js
|
|
176
|
+
function exportHtml(model, fontStore, opt = {}) {
|
|
177
|
+
return withDeadline(
|
|
178
|
+
htmlOf(model, fontStore, opt),
|
|
179
|
+
/** @type {any} */
|
|
180
|
+
opt.timeoutMs
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
async function htmlOf(model, fontStore, opt) {
|
|
184
|
+
const used = /* @__PURE__ */ new Map();
|
|
185
|
+
const layout = /* @__PURE__ */ new Set();
|
|
186
|
+
const add = (key, text) => {
|
|
187
|
+
let s = used.get(key);
|
|
188
|
+
if (!s) {
|
|
189
|
+
s = /* @__PURE__ */ new Set([32]);
|
|
190
|
+
used.set(key, s);
|
|
191
|
+
}
|
|
192
|
+
for (const ch of text) s.add(
|
|
193
|
+
/** @type {number} */
|
|
194
|
+
ch.codePointAt(0)
|
|
195
|
+
);
|
|
196
|
+
};
|
|
197
|
+
for (const pg of model.pages) for (const it of pg.items.flatMap((i) => i.t === "field" ? i.draw : [i])) if (it.t === "text") {
|
|
198
|
+
for (const l of it.lines) {
|
|
199
|
+
if (!l.runs) {
|
|
200
|
+
add(it.font, l.text);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
for (const r of l.runs) {
|
|
204
|
+
add(r.font, r.text);
|
|
205
|
+
if (r.shaped || r.rtl) layout.add(r.font);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const faces = [];
|
|
210
|
+
for (const [key, cps] of used) {
|
|
211
|
+
let bytes = fontStore.bytes.get(key);
|
|
212
|
+
if (!bytes) continue;
|
|
213
|
+
if (opt.subset) {
|
|
214
|
+
try {
|
|
215
|
+
bytes = await opt.subset(bytes, cps, layout.has(key) ? { layout: true } : void 0);
|
|
216
|
+
} catch {
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
faces.push(`@font-face{font-family:"${fontFamilyCss(key)}";src:url(data:font/ttf;base64,${b64(bytes)}) format("truetype")}`);
|
|
220
|
+
}
|
|
221
|
+
const esc = (s) => String(s).replace(/&/g, "&").replace(/</g, "<");
|
|
222
|
+
const anchors = /* @__PURE__ */ new Map();
|
|
223
|
+
const jumpTo = (a) => {
|
|
224
|
+
const to = a.page ? a : model.bookmarks?.find((b) => b.label === a.target) || model.headings?.find((b) => b.label === a.target);
|
|
225
|
+
if (!to?.page) return null;
|
|
226
|
+
const y = Math.max(0, Math.round(to.y || 0));
|
|
227
|
+
const key = `${to.page}:${y}`;
|
|
228
|
+
if (!anchors.has(key)) anchors.set(key, { id: `at-${to.page}-${y}`, page: to.page, y });
|
|
229
|
+
return `#${anchors.get(key).id}`;
|
|
230
|
+
};
|
|
231
|
+
const drillHref = (a) => drillUrl(opt.drillBase, a);
|
|
232
|
+
const target = (a) => {
|
|
233
|
+
if (a?.type === "url") {
|
|
234
|
+
const h = safeUrl(a.href);
|
|
235
|
+
return h ? { href: h, external: true } : null;
|
|
236
|
+
}
|
|
237
|
+
if (a?.type === "bookmark") {
|
|
238
|
+
const h = jumpTo(a);
|
|
239
|
+
return h ? { href: h } : null;
|
|
240
|
+
}
|
|
241
|
+
if (a?.type === "drill") {
|
|
242
|
+
const h = drillHref(a);
|
|
243
|
+
return h ? { href: h, external: true } : { off: `Opens the report "${a.report}" in the ReportWright viewer` };
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
};
|
|
247
|
+
const svgs = model.pages.map((p) => pageToSvg({ items: p.items.filter((it) => it.t !== "link" || target(it.action)) }, p.width ?? model.width, p.height ?? model.height, { proxyBase: opt.drillBase || "" }).replace(/<rect class="pw-link"([^>]*?)data-action="([^"]*)"[^>]*>(<title>[^<]*<\/title>)?<\/rect>/g, (m, a, act, ttl = "") => {
|
|
248
|
+
let t = null;
|
|
249
|
+
try {
|
|
250
|
+
t = target(JSON.parse(act.replace(/"/g, '"').replace(/</g, "<").replace(/>/g, ">").replace(/'/g, "'").replace(/&/g, "&")));
|
|
251
|
+
} catch {
|
|
252
|
+
}
|
|
253
|
+
if (t && "href" in t) return `<a href="${attr(t.href)}"${t.external ? ' target="_blank" rel="noopener"' : ""}><rect${a}/>${ttl}</a>`;
|
|
254
|
+
if (t && "off" in t) return `<g class="pw-off"><rect${a}/><title>${esc(t.off)}</title></g>`;
|
|
255
|
+
return `<rect${a}/>`;
|
|
256
|
+
}));
|
|
257
|
+
const pages = model.pages.map((p, i) => {
|
|
258
|
+
const H = p.height ?? model.height;
|
|
259
|
+
const marks = [...anchors.values()].filter((x) => x.page === i + 1).map((x) => `<a class="pw-at" id="${x.id}" style="top:${(Math.min(x.y, H) / H * 100).toFixed(3)}%"></a>`).join("");
|
|
260
|
+
return `<section class="page${p.width ? " wide" : ""}" id="page-${i + 1}"${p.width ? ` style="width:min(100%,${Math.round(p.width * 96 / 72)}px)"` : ""}>${marks}${svgs[i]}</section>`;
|
|
261
|
+
}).join("\n");
|
|
262
|
+
if (!opt.static) needsTableData(model, "Interactive HTML (or pass static: true)");
|
|
263
|
+
const data = opt.static ? null : tablesData(model, { locale: opt.locale, currency: opt.currency });
|
|
264
|
+
const S = { ...DATA_STRINGS, ...opt.strings || {} };
|
|
265
|
+
const csp = data ? `<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'sha256-${await cspHash(DATA_SCRIPT)}'; style-src 'unsafe-inline'; font-src data:; img-src data: https: http:; base-uri 'none'; form-action 'none'">
|
|
266
|
+
` : "";
|
|
267
|
+
const lang = opt.lang && /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(opt.lang) ? opt.lang : "en";
|
|
268
|
+
return `<!doctype html>
|
|
269
|
+
<html lang="${data ? lang : "en"}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
270
|
+
${csp}<title>${esc(opt.title || model.name || "Report")}</title>
|
|
271
|
+
<style>
|
|
272
|
+
${faces.join("\n")}
|
|
273
|
+
html{background:#e6eaee}body{margin:0;padding:24px 12px;display:flex;flex-direction:column;align-items:center;gap:18px;font-family:system-ui,sans-serif}
|
|
274
|
+
.page{position:relative;width:min(100%,${Math.round(model.width * 96 / 72)}px);background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.08),0 6px 20px rgba(0,0,0,.08)}
|
|
275
|
+
.pw-at{position:absolute;left:0;width:1px;height:1px;scroll-margin-top:12px}.pw-off{cursor:not-allowed}
|
|
276
|
+
.page svg{display:block;width:100%;height:auto}
|
|
277
|
+
@media print{html{background:#fff}body{padding:0;gap:0}.page{box-shadow:none;width:100%;break-after:page}@page{size:${model.width}pt ${model.height}pt;margin:0}}
|
|
278
|
+
${data ? DATA_CSS + "\n" : ""}</style></head><body>
|
|
279
|
+
${data ? `<nav class="pw-bar" id="pw-bar" hidden><button type="button" data-view="pages" aria-pressed="true">${esc(S.pages)}</button><button type="button" data-view="tables" aria-pressed="false">${esc(S.tables)}</button></nav>
|
|
280
|
+
` : ""}${pages}
|
|
281
|
+
${data ? `<div id="pw-tables" hidden></div>
|
|
282
|
+
<script type="application/json" id="pw-data">${JSON.stringify({ tables: data, strings: S }).replace(/</g, "\\u003c")}<\/script>
|
|
283
|
+
<script>${DATA_SCRIPT}<\/script>
|
|
284
|
+
` : ""}</body></html>`;
|
|
285
|
+
}
|
|
286
|
+
var attr = (s) => String(s).replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/'/g, "'");
|
|
287
|
+
function b64(u8) {
|
|
288
|
+
if (typeof Buffer !== "undefined") return Buffer.from(u8).toString("base64");
|
|
289
|
+
let s = "";
|
|
290
|
+
for (let i = 0; i < u8.length; i += 32768) s += String.fromCharCode.apply(
|
|
291
|
+
null,
|
|
292
|
+
/** @type {any} */
|
|
293
|
+
u8.subarray(i, i + 32768)
|
|
294
|
+
);
|
|
295
|
+
return btoa(s);
|
|
296
|
+
}
|
|
297
|
+
export {
|
|
298
|
+
exportHtml
|
|
299
|
+
};
|
|
300
|
+
//# sourceMappingURL=chunk-IPU2YRL2.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/exporters/htmldata.js", "../../../src/exporters/html.js"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|