@sheetpane/charts 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +127 -2
- package/dist/anchors.d.ts +42 -0
- package/dist/anchors.d.ts.map +1 -0
- package/dist/anchors.js +73 -0
- package/dist/anchors.js.map +1 -0
- package/dist/colors.d.ts +48 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +115 -0
- package/dist/colors.js.map +1 -0
- package/dist/index.d.ts +142 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +400 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +85 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +228 -0
- package/dist/model.js.map +1 -0
- package/dist/refs.d.ts +65 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +144 -0
- package/dist/refs.js.map +1 -0
- package/dist/svg.d.ts +124 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +398 -0
- package/dist/svg.js.map +1 -0
- package/dist/ui.d.ts +69 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +143 -0
- package/dist/ui.js.map +1 -0
- package/package.json +51 -3
package/dist/model.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// A chart part (`c:chartSpace`, DrawingML charts) → a plain model: the chart groups and their
|
|
2
|
+
// type, the title, the series with their `c:f` references and cached points, explicit fills.
|
|
3
|
+
// Namespace-agnostic (local names only), so strict and transitional parts read the same.
|
|
4
|
+
// Uses DOMParser, so it runs only in a browser — and only when a chart item renders.
|
|
5
|
+
import { spError } from '@sheetpane/grid';
|
|
6
|
+
import { parseFormulaRefs, uniqueRanges } from './refs.js';
|
|
7
|
+
// ── namespace-agnostic helpers ─────────────────────────────────────────────
|
|
8
|
+
const kids = (e, name) => (e ? Array.from(e.children).filter((c) => c.localName === name) : []);
|
|
9
|
+
const kid = (e, name) => kids(e, name)[0];
|
|
10
|
+
const path = (e, ...names) => names.reduce((x, n) => kid(x, n), e);
|
|
11
|
+
const val = (e) => e?.getAttribute('val') ?? undefined;
|
|
12
|
+
const desc = (e, name) => (e ? Array.from(e.getElementsByTagNameNS('*', name)) : []);
|
|
13
|
+
const numVal = (e, d) => { const v = Number(val(e)); return val(e) !== undefined && Number.isFinite(v) ? v : d; };
|
|
14
|
+
const boolVal = (e, d) => { const v = val(e); return v === undefined ? (e ? true : d) : v === '1' || v === 'true'; };
|
|
15
|
+
function colorOf(fill) {
|
|
16
|
+
if (!fill)
|
|
17
|
+
return undefined;
|
|
18
|
+
for (const c of Array.from(fill.children)) {
|
|
19
|
+
const kind = c.localName === 'srgbClr' ? 'srgb' : c.localName === 'schemeClr' ? 'scheme' : c.localName === 'sysClr' ? 'sys' : undefined;
|
|
20
|
+
if (!kind)
|
|
21
|
+
continue;
|
|
22
|
+
const v = kind === 'sys' ? c.getAttribute('lastClr') ?? '' : c.getAttribute('val') ?? '';
|
|
23
|
+
const mods = Array.from(c.children).map((m) => ({ name: m.localName, val: Number(m.getAttribute('val')) })).filter((m) => Number.isFinite(m.val));
|
|
24
|
+
return { kind, val: v, mods };
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
/** Points of a cache or literal (`c:numCache`, `c:strCache`, `c:numLit`, `c:strLit`, a `c:lvl`). */
|
|
29
|
+
function points(cache, numeric) {
|
|
30
|
+
if (!cache)
|
|
31
|
+
return [];
|
|
32
|
+
const pts = kids(cache, 'pt');
|
|
33
|
+
const count = Math.max(numVal(kid(cache, 'ptCount'), 0), ...pts.map((p) => Number(p.getAttribute('idx') ?? 0) + 1), 0);
|
|
34
|
+
const out = Array.from({ length: Math.min(count, 100000) }, () => null);
|
|
35
|
+
for (const p of pts) {
|
|
36
|
+
const i = Number(p.getAttribute('idx') ?? 0), t = kid(p, 'v')?.textContent ?? '';
|
|
37
|
+
if (!(i >= 0 && i < out.length))
|
|
38
|
+
continue;
|
|
39
|
+
if (numeric) {
|
|
40
|
+
const n = Number(t);
|
|
41
|
+
out[i] = t.trim() !== '' && Number.isFinite(n) ? n : null;
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
out[i] = t;
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
/** A data source element (`c:tx`, `c:cat`, `c:val`, `c:xVal`, `c:yVal`) → its reference and cache. */
|
|
49
|
+
function dataRef(e) {
|
|
50
|
+
if (!e)
|
|
51
|
+
return undefined;
|
|
52
|
+
const ref = kid(e, 'numRef') ?? kid(e, 'strRef') ?? kid(e, 'multiLvlStrRef');
|
|
53
|
+
if (ref) {
|
|
54
|
+
const f = kid(ref, 'f')?.textContent ?? undefined;
|
|
55
|
+
const numCache = kid(ref, 'numCache');
|
|
56
|
+
const strCache = kid(ref, 'strCache');
|
|
57
|
+
const multi = kid(ref, 'multiLvlStrCache');
|
|
58
|
+
// multi-level categories: the first level is the innermost — the labels next to the axis
|
|
59
|
+
const cache = numCache ?? strCache ?? (multi ? kid(multi, 'lvl') : undefined);
|
|
60
|
+
const ptCount = multi ? kid(multi, 'ptCount') : undefined;
|
|
61
|
+
const pts = points(cache, !!numCache);
|
|
62
|
+
if (ptCount && pts.length < numVal(ptCount, 0))
|
|
63
|
+
pts.push(...Array.from({ length: numVal(ptCount, 0) - pts.length }, () => null));
|
|
64
|
+
const d = { ranges: parseFormulaRefs(f), points: pts, numeric: !!numCache };
|
|
65
|
+
if (f !== undefined)
|
|
66
|
+
d.f = f;
|
|
67
|
+
const fc = kid(numCache, 'formatCode')?.textContent;
|
|
68
|
+
if (fc)
|
|
69
|
+
d.formatCode = fc;
|
|
70
|
+
return d;
|
|
71
|
+
}
|
|
72
|
+
const lit = kid(e, 'numLit') ?? kid(e, 'strLit');
|
|
73
|
+
if (lit)
|
|
74
|
+
return { ranges: [], points: points(lit, lit.localName === 'numLit'), numeric: lit.localName === 'numLit' };
|
|
75
|
+
const v = kid(e, 'v');
|
|
76
|
+
if (v)
|
|
77
|
+
return { ranges: [], points: [v.textContent ?? ''], numeric: false };
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
function series(ser, i, scatter) {
|
|
81
|
+
const tx = dataRef(kid(ser, 'tx'));
|
|
82
|
+
const spPr = kid(ser, 'spPr');
|
|
83
|
+
const ln = kid(spPr, 'ln');
|
|
84
|
+
const s = {
|
|
85
|
+
idx: numVal(kid(ser, 'idx'), i),
|
|
86
|
+
name: tx?.points.filter((p) => p !== null).join(' ') || `Series ${i + 1}`,
|
|
87
|
+
noLine: !!kid(ln, 'noFill'),
|
|
88
|
+
pointFills: new Map(),
|
|
89
|
+
};
|
|
90
|
+
if (tx)
|
|
91
|
+
s.tx = tx;
|
|
92
|
+
const cat = dataRef(kid(ser, scatter ? 'xVal' : 'cat') ?? kid(ser, 'cat'));
|
|
93
|
+
const v = dataRef(kid(ser, scatter ? 'yVal' : 'val') ?? kid(ser, 'val'));
|
|
94
|
+
if (cat)
|
|
95
|
+
s.cat = cat;
|
|
96
|
+
if (v)
|
|
97
|
+
s.val = v;
|
|
98
|
+
const fill = colorOf(kid(spPr, 'solidFill')), line = colorOf(kid(ln, 'solidFill'));
|
|
99
|
+
if (fill)
|
|
100
|
+
s.fill = fill;
|
|
101
|
+
if (line)
|
|
102
|
+
s.line = line;
|
|
103
|
+
for (const dPt of kids(ser, 'dPt')) {
|
|
104
|
+
const c = colorOf(path(dPt, 'spPr', 'solidFill'));
|
|
105
|
+
if (c)
|
|
106
|
+
s.pointFills.set(numVal(kid(dPt, 'idx'), -1), c);
|
|
107
|
+
}
|
|
108
|
+
return s;
|
|
109
|
+
}
|
|
110
|
+
const LABELS = {
|
|
111
|
+
areaChart: 'area', area3DChart: '3-D area', lineChart: 'line', line3DChart: '3-D line', stockChart: 'stock', radarChart: 'radar',
|
|
112
|
+
scatterChart: 'scatter', pieChart: 'pie', pie3DChart: '3-D pie', doughnutChart: 'doughnut', barChart: 'bar', bar3DChart: '3-D bar',
|
|
113
|
+
ofPieChart: 'pie of pie', surfaceChart: 'surface', surface3DChart: '3-D surface', bubbleChart: 'bubble',
|
|
114
|
+
};
|
|
115
|
+
function group(e) {
|
|
116
|
+
const element = e.localName;
|
|
117
|
+
const scatter = element === 'scatterChart';
|
|
118
|
+
const barDir = val(kid(e, 'barDir')) === 'bar' ? 'bar' : 'col';
|
|
119
|
+
const rawGrouping = val(kid(e, 'grouping'));
|
|
120
|
+
const grouping = rawGrouping === 'stacked' || rawGrouping === 'percentStacked' || rawGrouping === 'clustered' ? rawGrouping : element.startsWith('bar') ? 'clustered' : 'standard';
|
|
121
|
+
let kind;
|
|
122
|
+
if (element === 'barChart')
|
|
123
|
+
kind = barDir === 'bar' ? 'bar' : 'column';
|
|
124
|
+
else if (element === 'lineChart')
|
|
125
|
+
kind = 'line';
|
|
126
|
+
else if (element === 'pieChart')
|
|
127
|
+
kind = 'pie';
|
|
128
|
+
else if (element === 'doughnutChart')
|
|
129
|
+
kind = 'doughnut';
|
|
130
|
+
else if (scatter)
|
|
131
|
+
kind = 'scatter';
|
|
132
|
+
let label = LABELS[element] ?? element.replace(/Chart$/, '');
|
|
133
|
+
if (element === 'barChart' || element === 'bar3DChart') {
|
|
134
|
+
const base = `${element === 'bar3DChart' ? '3-D ' : ''}${barDir === 'bar' ? 'bar' : 'column'}`;
|
|
135
|
+
label = grouping === 'stacked' ? `stacked ${base}` : grouping === 'percentStacked' ? `100% stacked ${base}` : base;
|
|
136
|
+
}
|
|
137
|
+
else if ((element === 'lineChart' || element === 'areaChart') && grouping !== 'standard') {
|
|
138
|
+
label = `${grouping === 'stacked' ? 'stacked' : '100% stacked'} ${label}`;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
element, kind, label, grouping,
|
|
142
|
+
varyColors: boolVal(kid(e, 'varyColors'), false),
|
|
143
|
+
gapWidth: numVal(kid(e, 'gapWidth'), 150),
|
|
144
|
+
holeSize: numVal(kid(e, 'holeSize'), 50),
|
|
145
|
+
firstSliceAng: numVal(kid(e, 'firstSliceAng'), 0),
|
|
146
|
+
scatterStyle: val(kid(e, 'scatterStyle')) ?? 'marker',
|
|
147
|
+
series: kids(e, 'ser').map((s, i) => series(s, i, scatter)),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** Rich text (`c:rich`) → one line: runs joined, paragraphs joined by a space. */
|
|
151
|
+
function richText(rich) {
|
|
152
|
+
if (!rich)
|
|
153
|
+
return '';
|
|
154
|
+
return kids(rich, 'p').map((p) => desc(p, 't').map((t) => t.textContent ?? '').join('')).filter(Boolean).join(' ').trim();
|
|
155
|
+
}
|
|
156
|
+
function titleOf(chart, all) {
|
|
157
|
+
const t = kid(chart, 'title');
|
|
158
|
+
if (t) {
|
|
159
|
+
const tx = kid(t, 'tx');
|
|
160
|
+
const rich = richText(kid(tx, 'rich'));
|
|
161
|
+
if (rich)
|
|
162
|
+
return rich;
|
|
163
|
+
const ref = dataRef(tx);
|
|
164
|
+
const s = ref?.points.filter((p) => p !== null).join(' ');
|
|
165
|
+
if (s)
|
|
166
|
+
return s;
|
|
167
|
+
// a title element with no text: Excel shows the only series' name
|
|
168
|
+
if (all.length === 1 && all[0].tx)
|
|
169
|
+
return all[0].name;
|
|
170
|
+
}
|
|
171
|
+
else if (!boolVal(kid(chart, 'autoTitleDeleted'), false) && all.length === 1 && all[0].tx) {
|
|
172
|
+
return all[0].name;
|
|
173
|
+
}
|
|
174
|
+
return 'Chart';
|
|
175
|
+
}
|
|
176
|
+
const PLOT_TYPES = new Set(Object.keys(LABELS));
|
|
177
|
+
/**
|
|
178
|
+
* Parses a chart part's XML (`c:chartSpace`, by local name, so strict and transitional parts read the same).
|
|
179
|
+
* Uses DOMParser: browser only.
|
|
180
|
+
*
|
|
181
|
+
* @param xml - The chart part's text.
|
|
182
|
+
* @returns The model.
|
|
183
|
+
* @throws When the XML is not well-formed or holds no `chart`.
|
|
184
|
+
*/
|
|
185
|
+
export function parseChart(xml) {
|
|
186
|
+
const doc = new DOMParser().parseFromString(xml, 'application/xml');
|
|
187
|
+
if (doc.getElementsByTagName('parsererror').length)
|
|
188
|
+
throw spError('SP-5701', 'sheetpane charts: the chart part is not well-formed XML');
|
|
189
|
+
const root = doc.documentElement;
|
|
190
|
+
const chart = kid(root, 'chart');
|
|
191
|
+
if (!chart)
|
|
192
|
+
throw spError('SP-5702', 'sheetpane charts: the chart part has no c:chart');
|
|
193
|
+
const plot = kid(chart, 'plotArea');
|
|
194
|
+
const groups = plot ? Array.from(plot.children).filter((c) => PLOT_TYPES.has(c.localName)).map(group) : [];
|
|
195
|
+
const all = groups.flatMap((g) => g.series);
|
|
196
|
+
const pivot = !!kid(root, 'pivotSource');
|
|
197
|
+
const labels = [...new Set(groups.map((g) => g.label))];
|
|
198
|
+
const leg = kid(chart, 'legend'), legendPos = val(kid(leg, 'legendPos')) ?? 'r';
|
|
199
|
+
const m = {
|
|
200
|
+
title: titleOf(chart, all),
|
|
201
|
+
groups,
|
|
202
|
+
series: all,
|
|
203
|
+
typeLabel: labels.join(' + ') || 'chart',
|
|
204
|
+
drawable: undefined,
|
|
205
|
+
pivot,
|
|
206
|
+
sources: uniqueRanges(all.flatMap((s) => [...(s.tx?.ranges ?? []), ...(s.cat?.ranges ?? []), ...(s.val?.ranges ?? [])])),
|
|
207
|
+
plotted: uniqueRanges(all.flatMap((s) => [...(s.val?.ranges ?? []), ...(s.cat?.ranges ?? [])])),
|
|
208
|
+
legend: !leg ? 'none' : legendPos === 'b' || legendPos === 't' ? 'bottom' : 'right',
|
|
209
|
+
};
|
|
210
|
+
const vf = path(plot, 'valAx', 'numFmt')?.getAttribute('formatCode');
|
|
211
|
+
if (vf)
|
|
212
|
+
m.valueFormat = vf;
|
|
213
|
+
const kinds = new Set(groups.map((g) => g.kind));
|
|
214
|
+
if (pivot)
|
|
215
|
+
m.notDrawn = 'a pivot chart, refreshed by Excel';
|
|
216
|
+
else if (!groups.length)
|
|
217
|
+
m.notDrawn = 'no chart type this viewer knows';
|
|
218
|
+
else if (groups.length > 1)
|
|
219
|
+
m.notDrawn = 'a combination chart';
|
|
220
|
+
else if (kinds.has(undefined))
|
|
221
|
+
m.notDrawn = `${m.typeLabel} chart`;
|
|
222
|
+
else if (!all.length)
|
|
223
|
+
m.notDrawn = 'no series';
|
|
224
|
+
else
|
|
225
|
+
m.drawable = groups[0].kind;
|
|
226
|
+
return m;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/refs.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** A rectangle of cells on one sheet; zero-based, inclusive. */
|
|
2
|
+
export interface SourceRange {
|
|
3
|
+
sheet: string;
|
|
4
|
+
/** `B2:B5` (no `$`), or a single `B2`. */
|
|
5
|
+
range: string;
|
|
6
|
+
top: number;
|
|
7
|
+
left: number;
|
|
8
|
+
bottom: number;
|
|
9
|
+
right: number;
|
|
10
|
+
}
|
|
11
|
+
/** `A` → 0, `AA` → 26. */
|
|
12
|
+
export declare function colIndex(letters: string): number;
|
|
13
|
+
/** `0` → `A`, `26` → `AA`. */
|
|
14
|
+
export declare function colName(col: number): string;
|
|
15
|
+
export declare const cellRef: (row: number, col: number) => string;
|
|
16
|
+
/** `B3` or `$B$3` → `{ row: 2, col: 1 }`. */
|
|
17
|
+
export declare function parseCell(ref: string): {
|
|
18
|
+
row: number;
|
|
19
|
+
col: number;
|
|
20
|
+
} | undefined;
|
|
21
|
+
/** `A1:B2` → corners, normalised. */
|
|
22
|
+
export declare function parseArea(area: string): Omit<SourceRange, 'sheet'> | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The cell ranges a `c:f` formula names. Anything that is not a plain sheet-qualified
|
|
25
|
+
* reference — a defined name, an external workbook (`[1]Sheet1!A1`), a whole column — is skipped.
|
|
26
|
+
*
|
|
27
|
+
* @param f - The formula, e.g. `Holdings!$E$3:$E$15` or `(Sheet1!$B$2,Sheet1!$D$2)`.
|
|
28
|
+
* @returns The ranges, in order; empty for none.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseFormulaRefs(f: string | undefined): SourceRange[];
|
|
31
|
+
/**
|
|
32
|
+
* The cells of the ranges in reading order: down a column, across a row, row by row for a block.
|
|
33
|
+
*
|
|
34
|
+
* @param ranges - The ranges.
|
|
35
|
+
* @returns One `{ sheet, ref }` per cell.
|
|
36
|
+
*/
|
|
37
|
+
export declare function cellsOf(ranges: readonly SourceRange[]): {
|
|
38
|
+
sheet: string;
|
|
39
|
+
ref: string;
|
|
40
|
+
}[];
|
|
41
|
+
export declare const contains: (r: SourceRange, sheet: string, row: number, col: number) => boolean;
|
|
42
|
+
export declare const intersects: (a: Omit<SourceRange, 'sheet' | 'range'>, b: Omit<SourceRange, 'sheet' | 'range'>) => boolean;
|
|
43
|
+
/**
|
|
44
|
+
* A range as text: `Holdings!E3:E15`, quoting a sheet name that needs it.
|
|
45
|
+
*
|
|
46
|
+
* @param r - The range.
|
|
47
|
+
* @returns The sheet-qualified reference.
|
|
48
|
+
*/
|
|
49
|
+
export declare function qualified(r: SourceRange): string;
|
|
50
|
+
/** The ranges without duplicates (same sheet and corners), first occurrence first. */
|
|
51
|
+
export declare function uniqueRanges(list: readonly SourceRange[]): SourceRange[];
|
|
52
|
+
/**
|
|
53
|
+
* What one `select()` can show of a union of ranges: the ranges on the first range's sheet, as
|
|
54
|
+
* their bounding box when that box is exactly their union (adjacent columns, say), else the first
|
|
55
|
+
* range alone. The grid's selection is one rectangle; a multi-area selection would need core.
|
|
56
|
+
*
|
|
57
|
+
* @param list - The ranges.
|
|
58
|
+
* @returns A selection for `store.select()`, or `undefined` for no ranges.
|
|
59
|
+
*/
|
|
60
|
+
export declare function selectionFor(list: readonly SourceRange[]): {
|
|
61
|
+
sheet: string;
|
|
62
|
+
ref: string;
|
|
63
|
+
range?: string;
|
|
64
|
+
} | undefined;
|
|
65
|
+
//# sourceMappingURL=refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAIA,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAID,0BAA0B;AAC1B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,8BAA8B;AAC9B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,eAAO,MAAM,OAAO,QAAS,MAAM,OAAO,MAAM,KAAG,MAAqC,CAAC;AAEzF,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM/E;AAED,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,CAO9E;AAkBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAcrE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAMxF;AAED,eAAO,MAAM,QAAQ,MAAO,WAAW,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM,KAAG,OACM,CAAC;AAE1F,eAAO,MAAM,UAAU,MAAO,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,KAAG,OAC5B,CAAC;AAEnF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAGhD;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAGxE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAYrH"}
|
package/dist/refs.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Cell references a chart part names: `c:f` formulas such as `Sheet1!$B$2:$B$5`,
|
|
2
|
+
// `'Q1 data'!$A$2:$A$9` or a multi-area `(Sheet1!$A$2,Sheet1!$A$4:$A$6)`. Pure, no DOM.
|
|
3
|
+
// Kept here rather than imported from @sheetpane/export so the package's only peer is the grid.
|
|
4
|
+
const CELL = /^\$?([A-Za-z]{1,3})\$?([1-9][0-9]{0,6})$/;
|
|
5
|
+
/** `A` → 0, `AA` → 26. */
|
|
6
|
+
export function colIndex(letters) {
|
|
7
|
+
let n = 0;
|
|
8
|
+
for (const ch of letters.toUpperCase())
|
|
9
|
+
n = n * 26 + (ch.charCodeAt(0) - 64);
|
|
10
|
+
return n - 1;
|
|
11
|
+
}
|
|
12
|
+
/** `0` → `A`, `26` → `AA`. */
|
|
13
|
+
export function colName(col) {
|
|
14
|
+
let s = '';
|
|
15
|
+
for (let n = col + 1; n > 0; n = Math.floor((n - 1) / 26))
|
|
16
|
+
s = String.fromCharCode(65 + ((n - 1) % 26)) + s;
|
|
17
|
+
return s;
|
|
18
|
+
}
|
|
19
|
+
export const cellRef = (row, col) => `${colName(col)}${row + 1}`;
|
|
20
|
+
/** `B3` or `$B$3` → `{ row: 2, col: 1 }`. */
|
|
21
|
+
export function parseCell(ref) {
|
|
22
|
+
const m = CELL.exec(ref.trim());
|
|
23
|
+
if (!m)
|
|
24
|
+
return undefined;
|
|
25
|
+
const col = colIndex(m[1]), row = Number(m[2]) - 1;
|
|
26
|
+
if (col >= 16384 || row >= 1048576)
|
|
27
|
+
return undefined;
|
|
28
|
+
return { row, col };
|
|
29
|
+
}
|
|
30
|
+
/** `A1:B2` → corners, normalised. */
|
|
31
|
+
export function parseArea(area) {
|
|
32
|
+
const [a, b = a] = area.split(':');
|
|
33
|
+
const p = parseCell(a ?? ''), q = parseCell(b ?? '');
|
|
34
|
+
if (!p || !q)
|
|
35
|
+
return undefined;
|
|
36
|
+
const top = Math.min(p.row, q.row), left = Math.min(p.col, q.col), bottom = Math.max(p.row, q.row), right = Math.max(p.col, q.col);
|
|
37
|
+
const range = top === bottom && left === right ? cellRef(top, left) : `${cellRef(top, left)}:${cellRef(bottom, right)}`;
|
|
38
|
+
return { range, top, left, bottom, right };
|
|
39
|
+
}
|
|
40
|
+
/** Splits on commas outside single quotes. */
|
|
41
|
+
function splitAreas(f) {
|
|
42
|
+
const out = [];
|
|
43
|
+
let cur = '', quoted = false;
|
|
44
|
+
for (let i = 0; i < f.length; i++) {
|
|
45
|
+
const ch = f[i];
|
|
46
|
+
if (ch === "'") {
|
|
47
|
+
quoted = !quoted;
|
|
48
|
+
cur += ch;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (ch === ',' && !quoted) {
|
|
52
|
+
out.push(cur);
|
|
53
|
+
cur = '';
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
cur += ch;
|
|
57
|
+
}
|
|
58
|
+
out.push(cur);
|
|
59
|
+
return out.map((s) => s.trim()).filter(Boolean);
|
|
60
|
+
}
|
|
61
|
+
const AREA = /^(?:'((?:[^']|'')+)'|([^'!]+))!(\$?[A-Za-z]{1,3}\$?\d+(?::\$?[A-Za-z]{1,3}\$?\d+)?)$/;
|
|
62
|
+
/**
|
|
63
|
+
* The cell ranges a `c:f` formula names. Anything that is not a plain sheet-qualified
|
|
64
|
+
* reference — a defined name, an external workbook (`[1]Sheet1!A1`), a whole column — is skipped.
|
|
65
|
+
*
|
|
66
|
+
* @param f - The formula, e.g. `Holdings!$E$3:$E$15` or `(Sheet1!$B$2,Sheet1!$D$2)`.
|
|
67
|
+
* @returns The ranges, in order; empty for none.
|
|
68
|
+
*/
|
|
69
|
+
export function parseFormulaRefs(f) {
|
|
70
|
+
if (!f)
|
|
71
|
+
return [];
|
|
72
|
+
let s = f.trim();
|
|
73
|
+
if (s.startsWith('(') && s.endsWith(')'))
|
|
74
|
+
s = s.slice(1, -1);
|
|
75
|
+
const out = [];
|
|
76
|
+
for (const part of splitAreas(s)) {
|
|
77
|
+
const m = AREA.exec(part);
|
|
78
|
+
if (!m)
|
|
79
|
+
continue;
|
|
80
|
+
const sheet = m[1] !== undefined ? m[1].replace(/''/g, "'") : m[2];
|
|
81
|
+
if (sheet.startsWith('['))
|
|
82
|
+
continue;
|
|
83
|
+
const a = parseArea(m[3]);
|
|
84
|
+
if (a)
|
|
85
|
+
out.push({ sheet, ...a });
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The cells of the ranges in reading order: down a column, across a row, row by row for a block.
|
|
91
|
+
*
|
|
92
|
+
* @param ranges - The ranges.
|
|
93
|
+
* @returns One `{ sheet, ref }` per cell.
|
|
94
|
+
*/
|
|
95
|
+
export function cellsOf(ranges) {
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const r of ranges) {
|
|
98
|
+
for (let row = r.top; row <= r.bottom; row++)
|
|
99
|
+
for (let col = r.left; col <= r.right; col++)
|
|
100
|
+
out.push({ sheet: r.sheet, ref: cellRef(row, col) });
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
export const contains = (r, sheet, row, col) => r.sheet === sheet && row >= r.top && row <= r.bottom && col >= r.left && col <= r.right;
|
|
105
|
+
export const intersects = (a, b) => a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom;
|
|
106
|
+
/**
|
|
107
|
+
* A range as text: `Holdings!E3:E15`, quoting a sheet name that needs it.
|
|
108
|
+
*
|
|
109
|
+
* @param r - The range.
|
|
110
|
+
* @returns The sheet-qualified reference.
|
|
111
|
+
*/
|
|
112
|
+
export function qualified(r) {
|
|
113
|
+
const name = /^[A-Za-z_][A-Za-z0-9_.]*$/.test(r.sheet) ? r.sheet : `'${r.sheet.replace(/'/g, "''")}'`;
|
|
114
|
+
return `${name}!${r.range}`;
|
|
115
|
+
}
|
|
116
|
+
/** The ranges without duplicates (same sheet and corners), first occurrence first. */
|
|
117
|
+
export function uniqueRanges(list) {
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
return list.filter((r) => { const k = `${r.sheet}!${r.range}`; if (seen.has(k))
|
|
120
|
+
return false; seen.add(k); return true; });
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* What one `select()` can show of a union of ranges: the ranges on the first range's sheet, as
|
|
124
|
+
* their bounding box when that box is exactly their union (adjacent columns, say), else the first
|
|
125
|
+
* range alone. The grid's selection is one rectangle; a multi-area selection would need core.
|
|
126
|
+
*
|
|
127
|
+
* @param list - The ranges.
|
|
128
|
+
* @returns A selection for `store.select()`, or `undefined` for no ranges.
|
|
129
|
+
*/
|
|
130
|
+
export function selectionFor(list) {
|
|
131
|
+
const first = list[0];
|
|
132
|
+
if (!first)
|
|
133
|
+
return undefined;
|
|
134
|
+
const same = uniqueRanges(list.filter((r) => r.sheet === first.sheet));
|
|
135
|
+
const box = same.reduce((b, r) => ({ top: Math.min(b.top, r.top), left: Math.min(b.left, r.left), bottom: Math.max(b.bottom, r.bottom), right: Math.max(b.right, r.right) }), { top: first.top, left: first.left, bottom: first.bottom, right: first.right });
|
|
136
|
+
const area = (r) => (r.bottom - r.top + 1) * (r.right - r.left + 1);
|
|
137
|
+
const disjoint = same.every((a, i) => same.every((b, j) => i >= j || !intersects(a, b)));
|
|
138
|
+
const exact = disjoint && same.reduce((n, r) => n + area(r), 0) === area(box);
|
|
139
|
+
const pick = exact ? box : first;
|
|
140
|
+
const ref = cellRef(pick.top, pick.left);
|
|
141
|
+
const single = pick.top === pick.bottom && pick.left === pick.right;
|
|
142
|
+
return single ? { sheet: first.sheet, ref } : { sheet: first.sheet, ref, range: `${ref}:${cellRef(pick.bottom, pick.right)}` };
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=refs.js.map
|
package/dist/refs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"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"}
|
package/dist/svg.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { DrawKind, Grouping } from './model.js';
|
|
2
|
+
/** One series as stage 2 draws it: its values and colours. */
|
|
3
|
+
export interface PlotSeries {
|
|
4
|
+
name: string;
|
|
5
|
+
/** Fill (bars, slices, markers), `#RRGGBB`. */
|
|
6
|
+
color: string;
|
|
7
|
+
/** Stroke for lines. */
|
|
8
|
+
lineColor: string;
|
|
9
|
+
noLine: boolean;
|
|
10
|
+
values: (number | null)[];
|
|
11
|
+
/** Scatter: x values; `null` where a point has none. */
|
|
12
|
+
xs?: (number | null)[];
|
|
13
|
+
/** Pie and doughnut: one colour per point. */
|
|
14
|
+
pointColors: string[];
|
|
15
|
+
}
|
|
16
|
+
/** Everything stage 2 needs to draw one chart group. */
|
|
17
|
+
export interface PlotData {
|
|
18
|
+
kind: DrawKind;
|
|
19
|
+
grouping: Grouping;
|
|
20
|
+
cats: string[];
|
|
21
|
+
series: PlotSeries[];
|
|
22
|
+
gapWidth: number;
|
|
23
|
+
holeSize: number;
|
|
24
|
+
firstSliceAng: number;
|
|
25
|
+
scatterStyle: string;
|
|
26
|
+
/** The value axis shows percentages (`%` in its number format). */
|
|
27
|
+
percent: boolean;
|
|
28
|
+
legend: 'right' | 'bottom' | 'none';
|
|
29
|
+
}
|
|
30
|
+
export interface Box {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
}
|
|
36
|
+
/** Space at the top of the frame the title band (title, then type and series count) takes. */
|
|
37
|
+
export declare const HEAD = 42;
|
|
38
|
+
export declare const esc: (s: string) => string;
|
|
39
|
+
/**
|
|
40
|
+
* A number for an axis or label: `-9180` → `−9,180` (a true minus), at most two decimals, in the page's locale.
|
|
41
|
+
*
|
|
42
|
+
* @param v - The number.
|
|
43
|
+
* @param percent - Show `v` as a percentage (`0.25` → `25%`).
|
|
44
|
+
* @returns The text.
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatNumber(v: number, percent?: boolean): string;
|
|
47
|
+
/** Cuts a label to `max` characters with an ellipsis. */
|
|
48
|
+
export declare const clip: (s: string, max: number) => string;
|
|
49
|
+
/** An axis: its ends, its step and its tick values. */
|
|
50
|
+
export interface Scale {
|
|
51
|
+
lo: number;
|
|
52
|
+
hi: number;
|
|
53
|
+
step: number;
|
|
54
|
+
ticks: number[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A "nice" axis: steps of 1, 2, 2.5 or 5 × 10ⁿ covering [lo, hi] in about `count` intervals.
|
|
58
|
+
*
|
|
59
|
+
* @param lo - The lowest value to cover.
|
|
60
|
+
* @param hi - The highest value to cover.
|
|
61
|
+
* @param count - About how many intervals.
|
|
62
|
+
* @returns The scale; at least two ticks.
|
|
63
|
+
*/
|
|
64
|
+
export declare function niceScale(lo: number, hi: number, count: number): Scale;
|
|
65
|
+
/**
|
|
66
|
+
* Excel's automatic axis range, roughly: it includes zero unless the data sit in a narrow band far from it.
|
|
67
|
+
*
|
|
68
|
+
* @param lo - The data's minimum.
|
|
69
|
+
* @param hi - The data's maximum.
|
|
70
|
+
* @returns `[lo, hi]` widened to zero, or unchanged.
|
|
71
|
+
*/
|
|
72
|
+
export declare function withZero(lo: number, hi: number): [number, number];
|
|
73
|
+
/**
|
|
74
|
+
* Per category: the value each series contributes once stacking (or 100 % stacking) is applied.
|
|
75
|
+
*
|
|
76
|
+
* @param series - The series.
|
|
77
|
+
* @param cats - How many categories.
|
|
78
|
+
* @param grouping - The group's grouping; `clustered` and `standard` do not stack.
|
|
79
|
+
* @returns Per series, per category: `{ base, top, value }` (`value` `null` for a missing point).
|
|
80
|
+
*/
|
|
81
|
+
export declare function stackedValues(series: readonly PlotSeries[], cats: number, grouping: Grouping): {
|
|
82
|
+
base: number;
|
|
83
|
+
top: number;
|
|
84
|
+
value: number | null;
|
|
85
|
+
}[][];
|
|
86
|
+
/** The note a frame carries once a plotted cell was changed. */
|
|
87
|
+
export declare const CHANGED_TAG = "data changed \u2014 Excel will redraw";
|
|
88
|
+
/**
|
|
89
|
+
* The title band: the title in bold (the frame's HTML button sits to its right), the type and
|
|
90
|
+
* series count under it, then — once a plotted cell changed — the tag, on the same line when it
|
|
91
|
+
* fits, else on a line of its own. Returns the markup and where the plot may start.
|
|
92
|
+
*/
|
|
93
|
+
export declare function titleBand(title: string, meta: string, width: number, changed?: boolean): {
|
|
94
|
+
svg: string;
|
|
95
|
+
bottom: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Stage 2: the whole drawn chart as SVG markup, `width` × `height` in px at 100 % zoom. No font is named; every
|
|
99
|
+
* file string is escaped.
|
|
100
|
+
*
|
|
101
|
+
* @param d - What to draw.
|
|
102
|
+
* @param title - The chart's title.
|
|
103
|
+
* @param meta - The line under the title, e.g. `bar · 2 series`.
|
|
104
|
+
* @param width - Width in px.
|
|
105
|
+
* @param height - Height in px.
|
|
106
|
+
* @param attrs - Extra attributes for the `<svg>` element.
|
|
107
|
+
* @param changed - Show the "data changed — Excel will redraw" tag.
|
|
108
|
+
* @returns The `<svg>` markup.
|
|
109
|
+
*/
|
|
110
|
+
export declare function drawChart(d: PlotData, title: string, meta: string, width: number, height: number, attrs?: string, changed?: boolean): string;
|
|
111
|
+
/**
|
|
112
|
+
* Stage 1: the frame's content as SVG markup — title, type and series count, and as many of `lines` as fit under it.
|
|
113
|
+
*
|
|
114
|
+
* @param title - The chart's title.
|
|
115
|
+
* @param meta - The line under the title, e.g. `bar · 2 series`.
|
|
116
|
+
* @param lines - The lines to list (why it is not drawn, each series and the cells it reads).
|
|
117
|
+
* @param width - Width in px.
|
|
118
|
+
* @param height - Height in px.
|
|
119
|
+
* @param attrs - Extra attributes for the `<svg>` element.
|
|
120
|
+
* @param changed - Show the "data changed — Excel will redraw" tag.
|
|
121
|
+
* @returns The `<svg>` markup.
|
|
122
|
+
*/
|
|
123
|
+
export declare function frameSvg(title: string, meta: string, lines: string[], width: number, height: number, attrs?: string, changed?: boolean): string;
|
|
124
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
|