@syncfusion/ej2-office-common 35.1.37
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/.eslintrc.json +263 -0
- package/.prettierrc.json +5 -0
- package/README.md +167 -0
- package/api-extractor.json +35 -0
- package/core.js +4 -0
- package/dist/ej2-office-common.umd.min.js +11 -0
- package/dist/ej2-office-common.umd.min.js.map +1 -0
- package/dist/es6/ej2-office-common.es2015.js +6585 -0
- package/dist/es6/ej2-office-common.es2015.js.map +1 -0
- package/dist/es6/ej2-office-common.es5.js +7955 -0
- package/dist/es6/ej2-office-common.es5.js.map +1 -0
- package/dist/global/ej2-office-common.min.js +11 -0
- package/dist/global/ej2-office-common.min.js.map +1 -0
- package/dist/global/index.d.ts +14 -0
- package/encryption.js +4 -0
- package/features.js +4 -0
- package/global.json +6 -0
- package/index.js +4 -0
- package/license +10 -0
- package/nuget.config +7 -0
- package/package.json +23 -0
- package/src/all.d.ts +41 -0
- package/src/all.js +38 -0
- package/src/core/index.d.ts +6 -0
- package/src/core/index.js +6 -0
- package/src/core/xml/index.d.ts +7 -0
- package/src/core/xml/index.js +6 -0
- package/src/core/xml/model.d.ts +71 -0
- package/src/core/xml/model.js +20 -0
- package/src/encryption/agile-constants.d.ts +61 -0
- package/src/encryption/agile-constants.js +71 -0
- package/src/encryption/agile-encryption-info.d.ts +46 -0
- package/src/encryption/agile-encryption-info.js +333 -0
- package/src/encryption/agile-password.d.ts +8 -0
- package/src/encryption/agile-password.js +58 -0
- package/src/encryption/cfb-reader.d.ts +11 -0
- package/src/encryption/cfb-reader.js +345 -0
- package/src/encryption/crypto-primitives.d.ts +74 -0
- package/src/encryption/crypto-primitives.js +302 -0
- package/src/encryption/decrypt-encrypted-package.d.ts +16 -0
- package/src/encryption/decrypt-encrypted-package.js +138 -0
- package/src/encryption/encryption-info-xml.d.ts +21 -0
- package/src/encryption/encryption-info-xml.js +282 -0
- package/src/encryption/errors.d.ts +66 -0
- package/src/encryption/errors.js +124 -0
- package/src/encryption/index.d.ts +35 -0
- package/src/encryption/index.js +100 -0
- package/src/features/diagrams/constants.d.ts +83 -0
- package/src/features/diagrams/constants.js +101 -0
- package/src/features/diagrams/diagram-data-model.d.ts +148 -0
- package/src/features/diagrams/diagram-data-model.js +446 -0
- package/src/features/diagrams/diagram-parsers.d.ts +28 -0
- package/src/features/diagrams/diagram-parsers.js +182 -0
- package/src/features/diagrams/diagram-serializers.d.ts +20 -0
- package/src/features/diagrams/diagram-serializers.js +110 -0
- package/src/features/diagrams/diagram-views.d.ts +60 -0
- package/src/features/diagrams/diagram-views.js +213 -0
- package/src/features/diagrams/element-tree.d.ts +55 -0
- package/src/features/diagrams/element-tree.js +197 -0
- package/src/features/diagrams/errors.d.ts +17 -0
- package/src/features/diagrams/errors.js +59 -0
- package/src/features/diagrams/index.d.ts +17 -0
- package/src/features/diagrams/index.js +17 -0
- package/src/features/diagrams/smart-art-catalog.d.ts +107 -0
- package/src/features/diagrams/smart-art-catalog.js +422 -0
- package/src/features/diagrams/smart-art-diagram.d.ts +96 -0
- package/src/features/diagrams/smart-art-diagram.js +258 -0
- package/src/features/index.d.ts +11 -0
- package/src/features/index.js +11 -0
- package/src/features/ink/constants.d.ts +54 -0
- package/src/features/ink/constants.js +54 -0
- package/src/features/ink/index.d.ts +18 -0
- package/src/features/ink/index.js +15 -0
- package/src/features/ink/ink-effects.d.ts +35 -0
- package/src/features/ink/ink-effects.js +45 -0
- package/src/features/ink/ink-model.d.ts +237 -0
- package/src/features/ink/ink-model.js +406 -0
- package/src/features/ink/ink-parser.d.ts +59 -0
- package/src/features/ink/ink-parser.js +671 -0
- package/src/features/ink/ink-serializer.d.ts +16 -0
- package/src/features/ink/ink-serializer.js +281 -0
- package/src/features/ink/ink-units.d.ts +33 -0
- package/src/features/ink/ink-units.js +92 -0
- package/src/features/ink/ink-xml.d.ts +26 -0
- package/src/features/ink/ink-xml.js +165 -0
- package/src/features/ink/trace-codec.d.ts +127 -0
- package/src/features/ink/trace-codec.js +266 -0
- package/src/features/mathml/constants.d.ts +47 -0
- package/src/features/mathml/constants.js +47 -0
- package/src/features/mathml/errors.d.ts +50 -0
- package/src/features/mathml/errors.js +69 -0
- package/src/features/mathml/index.d.ts +30 -0
- package/src/features/mathml/index.js +22 -0
- package/src/features/mathml/math-factory.d.ts +26 -0
- package/src/features/mathml/math-factory.js +568 -0
- package/src/features/mathml/model/controls.d.ts +896 -0
- package/src/features/mathml/model/controls.js +1541 -0
- package/src/features/mathml/model/enums.d.ts +153 -0
- package/src/features/mathml/model/enums.js +133 -0
- package/src/features/mathml/model/math-element.d.ts +173 -0
- package/src/features/mathml/model/math-element.js +315 -0
- package/src/features/mathml/model/roots.d.ts +82 -0
- package/src/features/mathml/model/roots.js +177 -0
- package/src/features/mathml/openxml.d.ts +56 -0
- package/src/features/mathml/openxml.js +87 -0
- package/src/features/mathml/parse/math-parser.d.ts +43 -0
- package/src/features/mathml/parse/math-parser.js +636 -0
- package/src/features/mathml/serialize/math-serializer.d.ts +34 -0
- package/src/features/mathml/serialize/math-serializer.js +749 -0
- package/src/features/smart-art/diagram-xml.d.ts +63 -0
- package/src/features/smart-art/diagram-xml.js +459 -0
- package/src/features/smart-art/errors.d.ts +24 -0
- package/src/features/smart-art/errors.js +47 -0
- package/src/features/smart-art/index.d.ts +26 -0
- package/src/features/smart-art/index.js +26 -0
- package/src/features/smart-art/minimal-samples.d.ts +18 -0
- package/src/features/smart-art/minimal-samples.js +40 -0
- package/src/features/smart-art/mutators.d.ts +60 -0
- package/src/features/smart-art/mutators.js +566 -0
- package/src/features/smart-art/namespaces.d.ts +153 -0
- package/src/features/smart-art/namespaces.js +163 -0
- package/src/features/smart-art/package-graph.d.ts +61 -0
- package/src/features/smart-art/package-graph.js +413 -0
- package/src/features/smart-art/parse-colors.d.ts +19 -0
- package/src/features/smart-art/parse-colors.js +39 -0
- package/src/features/smart-art/parse-data.d.ts +21 -0
- package/src/features/smart-art/parse-data.js +121 -0
- package/src/features/smart-art/parse-layout.d.ts +20 -0
- package/src/features/smart-art/parse-layout.js +40 -0
- package/src/features/smart-art/parse-rel-ids.d.ts +71 -0
- package/src/features/smart-art/parse-rel-ids.js +233 -0
- package/src/features/smart-art/parse-style.d.ts +19 -0
- package/src/features/smart-art/parse-style.js +39 -0
- package/src/features/smart-art/point-text.d.ts +80 -0
- package/src/features/smart-art/point-text.js +424 -0
- package/src/features/smart-art/register.d.ts +33 -0
- package/src/features/smart-art/register.js +95 -0
- package/src/features/smart-art/serialize.d.ts +40 -0
- package/src/features/smart-art/serialize.js +48 -0
- package/src/features/smart-art/types.d.ts +403 -0
- package/src/features/smart-art/types.js +28 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +21 -0
- package/src/index.js +22 -0
- package/tsconfig.build.json +13 -0
- package/tsconfig.harness.json +32 -0
- package/tslint.json +111 -0
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InkML element-tree → {@link OfficeInk} parser ([MS-ODRAWXML] §2.1.4).
|
|
3
|
+
*
|
|
4
|
+
* The caller supplies an OpenXml element tree; this module never reads bytes
|
|
5
|
+
* and never expands entities. Count guards are surfaced via
|
|
6
|
+
* {@link getLastInkParseDiagnostics} for consumer limits policy.
|
|
7
|
+
*/
|
|
8
|
+
var __assign = (this && this.__assign) || function () {
|
|
9
|
+
__assign = Object.assign || function(t) {
|
|
10
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
11
|
+
s = arguments[i];
|
|
12
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
13
|
+
t[p] = s[p];
|
|
14
|
+
}
|
|
15
|
+
return t;
|
|
16
|
+
};
|
|
17
|
+
return __assign.apply(this, arguments);
|
|
18
|
+
};
|
|
19
|
+
var __values = (this && this.__values) || function (o) {
|
|
20
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
|
|
21
|
+
if (m) return m.call(o);
|
|
22
|
+
return {
|
|
23
|
+
next: function () {
|
|
24
|
+
if (o && i >= o.length) o = void 0;
|
|
25
|
+
return { value: o && o[i++], done: !o };
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
import { XML_NAMESPACE } from '../../core/xml/model';
|
|
30
|
+
import { INKML_NAMESPACE } from './constants';
|
|
31
|
+
import { createDecodedInk } from './ink-model';
|
|
32
|
+
import { unitValueToPoints } from './ink-units';
|
|
33
|
+
import { elementText, getAttr, isInkMlElement } from './ink-xml';
|
|
34
|
+
import { decodeTrace } from './trace-codec';
|
|
35
|
+
/**
|
|
36
|
+
* Diagnostic code for untokenizable / empty-result malformed traces.
|
|
37
|
+
*
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export var DIAG_INVALID_INK_TRACE = 'content/invalid-ink-trace';
|
|
41
|
+
var RECOGNIZED_CHANNELS = new Set(['X', 'Y', 'Z', 'S', 'T', 'SN', 'F', 'TP', 'BP', 'OTx', 'OTy', 'OA', 'OE', 'OR', 'RP', 'RR', 'RY', 'TW', 'TH', 'TC']);
|
|
42
|
+
var RECOGNIZED_CHANNEL_UNITS = new Set(['dev', 'in', 'cm', 'deg', 'rad', 's', 'lb', 'g']);
|
|
43
|
+
/** §2.1.4 ignore-list local names (skipped, never persisted). */
|
|
44
|
+
var IGNORE_LOCAL_NAMES = new Set(['timestamp', 'canvas', 'canvasTransform', 'mapping', 'bind', 'table', 'matrix', 'traceView', 'annotation', 'annotationXML', 'channelProperty', 'traceProperty', 'brushPropertyRef', 'intermittentInfo', 'latency', 'sampleRate', 'sampleRateExact', 'srcRef', 'channelRef']);
|
|
45
|
+
var BRUSH_PROP_NAMES = new Set(['width', 'height', 'color', 'transparency', 'tip', 'rasterop', 'antialiased', 'fittocurve', 'ignorepressure', 'inkeffects', 'anchorx', 'anchory', 'scalefactor']);
|
|
46
|
+
var EFFECT_TOKENS = new Map([
|
|
47
|
+
['none', 'none'],
|
|
48
|
+
['pencil', 'pencil'],
|
|
49
|
+
['rainbow', 'rainbow'],
|
|
50
|
+
['galaxy', 'galaxy'],
|
|
51
|
+
['lava', 'lava'],
|
|
52
|
+
['ocean', 'ocean'],
|
|
53
|
+
['rosegold', 'roseGold'],
|
|
54
|
+
['gold', 'gold'],
|
|
55
|
+
['silver', 'silver'],
|
|
56
|
+
['bronze', 'bronze'],
|
|
57
|
+
]);
|
|
58
|
+
/** Parse defaults ([MS-ODRAWXML] §2.1.4 / OfficeParser). */
|
|
59
|
+
var DEFAULT_WIDTH_CM = 0.053;
|
|
60
|
+
var DEFAULT_HEIGHT_CM = 0.001;
|
|
61
|
+
var DEFAULT_COLOR = '#000000';
|
|
62
|
+
var DEFAULT_TIP = 'ellipse';
|
|
63
|
+
var DEFAULT_RASTER_OP = 'copyPen';
|
|
64
|
+
var DEFAULT_CONTEXT_REF = '#ctx0';
|
|
65
|
+
var lastDiagnostics = {
|
|
66
|
+
items: [],
|
|
67
|
+
traceCount: 0,
|
|
68
|
+
packetCount: 0,
|
|
69
|
+
pointCount: 0,
|
|
70
|
+
channelValueCount: 0
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Diagnostics from the most recent {@link parseInkXml} invocation.
|
|
74
|
+
*
|
|
75
|
+
* @public
|
|
76
|
+
*/
|
|
77
|
+
export function getLastInkParseDiagnostics() {
|
|
78
|
+
return lastDiagnostics;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Parse an InkML `ink` root element tree into a branded {@link OfficeInk}.
|
|
82
|
+
*
|
|
83
|
+
* Source: [MS-ODRAWXML] §2.1.4; W3C InkML 1.0; `docs/specs/ink-shared-codec.md`.
|
|
84
|
+
*
|
|
85
|
+
* @public
|
|
86
|
+
*/
|
|
87
|
+
export function parseInkXml(root) {
|
|
88
|
+
var e_1, _a, e_2, _b;
|
|
89
|
+
var diagnostics = [];
|
|
90
|
+
var packetCount = 0;
|
|
91
|
+
var pointCount = 0;
|
|
92
|
+
var channelValueCount = 0;
|
|
93
|
+
var brushes = [];
|
|
94
|
+
var contexts = [];
|
|
95
|
+
var traces = [];
|
|
96
|
+
var treeRoots = [];
|
|
97
|
+
if (!isInkRoot(root)) {
|
|
98
|
+
lastDiagnostics = {
|
|
99
|
+
items: diagnostics,
|
|
100
|
+
traceCount: 0,
|
|
101
|
+
packetCount: 0,
|
|
102
|
+
pointCount: 0,
|
|
103
|
+
channelValueCount: 0
|
|
104
|
+
};
|
|
105
|
+
return createDecodedInk({
|
|
106
|
+
traces: [],
|
|
107
|
+
brushes: []
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// First pass: definitions (at most one considered; extras ignored after first)
|
|
111
|
+
var sawDefinitions = false;
|
|
112
|
+
try {
|
|
113
|
+
for (var _c = __values(root.children), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
114
|
+
var child = _d.value;
|
|
115
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
var name_1 = child.localName;
|
|
119
|
+
if (IGNORE_LOCAL_NAMES.has(name_1)) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (name_1 === 'definitions') {
|
|
123
|
+
if (sawDefinitions) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
sawDefinitions = true;
|
|
127
|
+
parseDefinitions(child, brushes, contexts);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
132
|
+
finally {
|
|
133
|
+
try {
|
|
134
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
135
|
+
}
|
|
136
|
+
finally { if (e_1) throw e_1.error; }
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Second pass: traces / groups in document order (C# only walks root children)
|
|
140
|
+
for (var _e = __values(root.children), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
141
|
+
var child = _f.value;
|
|
142
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
var name_2 = child.localName;
|
|
146
|
+
if (IGNORE_LOCAL_NAMES.has(name_2) || name_2 === 'definitions') {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (name_2 === 'trace') {
|
|
150
|
+
var _g = parseTraceElement(child, traces.length), trace = _g.trace, node = _g.node, stats = _g.stats, diagnostic = _g.diagnostic;
|
|
151
|
+
traces.push(trace);
|
|
152
|
+
treeRoots.push(node);
|
|
153
|
+
packetCount += stats.packetCount;
|
|
154
|
+
pointCount += stats.pointCount;
|
|
155
|
+
channelValueCount += stats.channelValueCount;
|
|
156
|
+
if (diagnostic !== undefined) {
|
|
157
|
+
diagnostics.push(diagnostic);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (name_2 === 'traceGroup') {
|
|
161
|
+
var group = parseTraceGroup(child, traces, diagnostics, function (s) {
|
|
162
|
+
packetCount += s.packetCount;
|
|
163
|
+
pointCount += s.pointCount;
|
|
164
|
+
channelValueCount += s.channelValueCount;
|
|
165
|
+
});
|
|
166
|
+
if (group.children.length > 0) {
|
|
167
|
+
treeRoots.push(group);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
173
|
+
finally {
|
|
174
|
+
try {
|
|
175
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
176
|
+
}
|
|
177
|
+
finally { if (e_2) throw e_2.error; }
|
|
178
|
+
}
|
|
179
|
+
lastDiagnostics = {
|
|
180
|
+
items: diagnostics,
|
|
181
|
+
traceCount: traces.length,
|
|
182
|
+
packetCount: packetCount,
|
|
183
|
+
pointCount: pointCount,
|
|
184
|
+
channelValueCount: channelValueCount
|
|
185
|
+
};
|
|
186
|
+
return createDecodedInk(__assign({ traces: traces,
|
|
187
|
+
brushes: brushes }, (contexts.length > 0 ? {
|
|
188
|
+
contexts: contexts
|
|
189
|
+
} : {}), (traces.length > 0 ? {
|
|
190
|
+
traceTree: treeRoots
|
|
191
|
+
} : {})));
|
|
192
|
+
}
|
|
193
|
+
function isInkRoot(el) {
|
|
194
|
+
if (el.localName !== 'ink') {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
return isInkMlElement(el) || el.namespaceUri === INKML_NAMESPACE;
|
|
198
|
+
}
|
|
199
|
+
function parseDefinitions(def, brushes, contexts) {
|
|
200
|
+
var e_3, _a;
|
|
201
|
+
try {
|
|
202
|
+
for (var _b = __values(def.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
203
|
+
var child = _c.value;
|
|
204
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (IGNORE_LOCAL_NAMES.has(child.localName)) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (child.localName === 'brush') {
|
|
211
|
+
brushes.push(parseBrush(child));
|
|
212
|
+
}
|
|
213
|
+
else if (child.localName === 'context') {
|
|
214
|
+
var ctx = parseContext(child);
|
|
215
|
+
if (ctx !== undefined) {
|
|
216
|
+
contexts.push(ctx);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// context only under definitions (already here); ignore elsewhere handled by root walk
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
223
|
+
finally {
|
|
224
|
+
try {
|
|
225
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
226
|
+
}
|
|
227
|
+
finally { if (e_3) throw e_3.error; }
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function parseContext(el) {
|
|
231
|
+
var e_4, _a;
|
|
232
|
+
var rawId = readXmlId(el);
|
|
233
|
+
if (rawId === undefined || rawId.length === 0) {
|
|
234
|
+
// Still accept context without id using a synthetic key? Spec requires id for inkSource;
|
|
235
|
+
// skip malformed context without id.
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
var id = ensureHash(rawId);
|
|
239
|
+
var inkSourceId;
|
|
240
|
+
var channels = [];
|
|
241
|
+
try {
|
|
242
|
+
for (var _b = __values(el.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
243
|
+
var child = _c.value;
|
|
244
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (IGNORE_LOCAL_NAMES.has(child.localName)) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (child.localName === 'inkSource') {
|
|
251
|
+
var srcId = readXmlId(child);
|
|
252
|
+
if (srcId !== undefined && srcId.length > 0) {
|
|
253
|
+
inkSourceId = srcId;
|
|
254
|
+
}
|
|
255
|
+
// Walk inkSource for nested traceFormat as Office often nests it here
|
|
256
|
+
collectChannelsFrom(child, channels);
|
|
257
|
+
}
|
|
258
|
+
else if (child.localName === 'traceFormat') {
|
|
259
|
+
collectChannelsFrom(child, channels);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
264
|
+
finally {
|
|
265
|
+
try {
|
|
266
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
267
|
+
}
|
|
268
|
+
finally { if (e_4) throw e_4.error; }
|
|
269
|
+
}
|
|
270
|
+
var ctx = {
|
|
271
|
+
id: id,
|
|
272
|
+
channels: channels
|
|
273
|
+
};
|
|
274
|
+
if (inkSourceId !== undefined) {
|
|
275
|
+
ctx.inkSourceId = inkSourceId;
|
|
276
|
+
}
|
|
277
|
+
return ctx;
|
|
278
|
+
}
|
|
279
|
+
function collectChannelsFrom(el, channels) {
|
|
280
|
+
var e_5, _a;
|
|
281
|
+
var _loop_1 = function (child) {
|
|
282
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
283
|
+
return "continue";
|
|
284
|
+
}
|
|
285
|
+
if (child.localName === 'traceFormat') {
|
|
286
|
+
collectChannelsFrom(child, channels);
|
|
287
|
+
return "continue";
|
|
288
|
+
}
|
|
289
|
+
if (child.localName !== 'channel') {
|
|
290
|
+
return "continue";
|
|
291
|
+
}
|
|
292
|
+
var name_3 = function () {
|
|
293
|
+
var _nc = getAttr(child, 'name');
|
|
294
|
+
return _nc != null ? _nc : '';
|
|
295
|
+
}();
|
|
296
|
+
if (!RECOGNIZED_CHANNELS.has(name_3)) {
|
|
297
|
+
return "continue";
|
|
298
|
+
}
|
|
299
|
+
var ch = {
|
|
300
|
+
name: name_3
|
|
301
|
+
};
|
|
302
|
+
var type = getAttr(child, 'type');
|
|
303
|
+
if (type !== undefined) {
|
|
304
|
+
ch.type = type;
|
|
305
|
+
}
|
|
306
|
+
var min = getAttr(child, 'min');
|
|
307
|
+
if (min !== undefined) {
|
|
308
|
+
ch.min = min;
|
|
309
|
+
}
|
|
310
|
+
var max = getAttr(child, 'max');
|
|
311
|
+
if (max !== undefined) {
|
|
312
|
+
ch.max = max;
|
|
313
|
+
}
|
|
314
|
+
var units = getAttr(child, 'units');
|
|
315
|
+
if (units !== undefined && RECOGNIZED_CHANNEL_UNITS.has(units)) {
|
|
316
|
+
ch.units = units;
|
|
317
|
+
}
|
|
318
|
+
else if (units !== undefined) {
|
|
319
|
+
// Preserve units string even if outside short list (cm always recognized)
|
|
320
|
+
ch.units = units;
|
|
321
|
+
}
|
|
322
|
+
// orientation / respectTo ignored
|
|
323
|
+
channels.push(ch);
|
|
324
|
+
};
|
|
325
|
+
try {
|
|
326
|
+
for (var _b = __values(el.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
327
|
+
var child = _c.value;
|
|
328
|
+
_loop_1(child);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
332
|
+
finally {
|
|
333
|
+
try {
|
|
334
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
335
|
+
}
|
|
336
|
+
finally { if (e_5) throw e_5.error; }
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function parseBrush(el) {
|
|
340
|
+
var e_6, _a;
|
|
341
|
+
var rawId = function () {
|
|
342
|
+
var _nc = readXmlId(el);
|
|
343
|
+
return _nc != null ? _nc : '';
|
|
344
|
+
}();
|
|
345
|
+
var id = ensureHash(rawId.length > 0 ? rawId : 'br0');
|
|
346
|
+
// Defaults (parse §2.1.4) — size stored in points after unit conversion
|
|
347
|
+
var widthPt = unitValueToPoints(DEFAULT_WIDTH_CM, 'cm');
|
|
348
|
+
var heightPt = unitValueToPoints(DEFAULT_HEIGHT_CM, 'cm');
|
|
349
|
+
var units = 'cm';
|
|
350
|
+
var color = DEFAULT_COLOR;
|
|
351
|
+
var tip = DEFAULT_TIP;
|
|
352
|
+
var rasterOp = DEFAULT_RASTER_OP;
|
|
353
|
+
var ignorePressure = false;
|
|
354
|
+
var inkEffect = 'none';
|
|
355
|
+
var anchorX;
|
|
356
|
+
var anchorY;
|
|
357
|
+
var scaleFactor;
|
|
358
|
+
var transparency;
|
|
359
|
+
var antiAliased;
|
|
360
|
+
var fitToCurve;
|
|
361
|
+
var sawWidth = false;
|
|
362
|
+
var sawHeight = false;
|
|
363
|
+
var _loop_2 = function (child) {
|
|
364
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
365
|
+
return "continue";
|
|
366
|
+
}
|
|
367
|
+
if (child.localName !== 'brushProperty') {
|
|
368
|
+
return "continue";
|
|
369
|
+
}
|
|
370
|
+
var nameRaw = getAttr(child, 'name');
|
|
371
|
+
if (nameRaw === undefined) {
|
|
372
|
+
return "continue";
|
|
373
|
+
}
|
|
374
|
+
var name_4 = nameRaw.trim().toLowerCase();
|
|
375
|
+
if (!BRUSH_PROP_NAMES.has(name_4)) {
|
|
376
|
+
return "continue";
|
|
377
|
+
}
|
|
378
|
+
var valueRaw = function () {
|
|
379
|
+
var _nc = getAttr(child, 'value');
|
|
380
|
+
return _nc != null ? _nc : '';
|
|
381
|
+
}();
|
|
382
|
+
var unitsAttr = getAttr(child, 'units');
|
|
383
|
+
switch (name_4) {
|
|
384
|
+
case 'width':
|
|
385
|
+
{
|
|
386
|
+
var n = parseLengthNumber(valueRaw);
|
|
387
|
+
if (n !== undefined) {
|
|
388
|
+
var u = unitsAttr != null ? unitsAttr : 'cm';
|
|
389
|
+
widthPt = unitValueToPoints(n, u);
|
|
390
|
+
if (!sawHeight) {
|
|
391
|
+
units = u;
|
|
392
|
+
}
|
|
393
|
+
sawWidth = true;
|
|
394
|
+
units = u;
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
case 'height':
|
|
399
|
+
{
|
|
400
|
+
var n = parseLengthNumber(valueRaw);
|
|
401
|
+
if (n !== undefined) {
|
|
402
|
+
var u = unitsAttr != null ? unitsAttr : units;
|
|
403
|
+
heightPt = unitValueToPoints(n, u);
|
|
404
|
+
sawHeight = true;
|
|
405
|
+
if (unitsAttr !== undefined) {
|
|
406
|
+
units = unitsAttr;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
case 'color':
|
|
412
|
+
{
|
|
413
|
+
var hex = normalizeColor(valueRaw);
|
|
414
|
+
if (hex !== undefined) {
|
|
415
|
+
color = hex;
|
|
416
|
+
}
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
case 'tip':
|
|
420
|
+
{
|
|
421
|
+
if (valueRaw.length > 0) {
|
|
422
|
+
tip = valueRaw;
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case 'rasterop':
|
|
427
|
+
{
|
|
428
|
+
if (valueRaw.length > 0) {
|
|
429
|
+
rasterOp = valueRaw;
|
|
430
|
+
}
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
case 'ignorepressure':
|
|
434
|
+
{
|
|
435
|
+
ignorePressure = parseBoolish(valueRaw);
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
case 'inkeffects':
|
|
439
|
+
{
|
|
440
|
+
var token = valueRaw.trim().toLowerCase().replace(/[_\s-]/g, '');
|
|
441
|
+
var mapped = EFFECT_TOKENS.get(token);
|
|
442
|
+
if (mapped !== undefined) {
|
|
443
|
+
inkEffect = mapped;
|
|
444
|
+
}
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
case 'anchorx':
|
|
448
|
+
{
|
|
449
|
+
anchorX = valueRaw;
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
case 'anchory':
|
|
453
|
+
{
|
|
454
|
+
anchorY = valueRaw;
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
case 'scalefactor':
|
|
458
|
+
{
|
|
459
|
+
scaleFactor = valueRaw;
|
|
460
|
+
break;
|
|
461
|
+
}
|
|
462
|
+
case 'transparency':
|
|
463
|
+
{
|
|
464
|
+
var n = Number(valueRaw);
|
|
465
|
+
if (Number.isFinite(n)) {
|
|
466
|
+
transparency = n;
|
|
467
|
+
}
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
case 'antialiased':
|
|
471
|
+
{
|
|
472
|
+
antiAliased = parseBoolish(valueRaw);
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
case 'fittocurve':
|
|
476
|
+
{
|
|
477
|
+
fitToCurve = parseBoolish(valueRaw);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
default:
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
try {
|
|
485
|
+
for (var _b = __values(el.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
486
|
+
var child = _c.value;
|
|
487
|
+
_loop_2(child);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
491
|
+
finally {
|
|
492
|
+
try {
|
|
493
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
494
|
+
}
|
|
495
|
+
finally { if (e_6) throw e_6.error; }
|
|
496
|
+
}
|
|
497
|
+
// If neither width nor height units seen, keep cm (default source unit)
|
|
498
|
+
if (!sawWidth && !sawHeight) {
|
|
499
|
+
units = 'cm';
|
|
500
|
+
}
|
|
501
|
+
var brush = {
|
|
502
|
+
id: id,
|
|
503
|
+
color: color,
|
|
504
|
+
size: {
|
|
505
|
+
width: widthPt,
|
|
506
|
+
height: heightPt
|
|
507
|
+
},
|
|
508
|
+
units: units,
|
|
509
|
+
inkEffect: inkEffect,
|
|
510
|
+
ignorePressure: ignorePressure,
|
|
511
|
+
tip: tip,
|
|
512
|
+
rasterOp: rasterOp
|
|
513
|
+
};
|
|
514
|
+
if (anchorX !== undefined) {
|
|
515
|
+
brush.anchorX = anchorX;
|
|
516
|
+
}
|
|
517
|
+
if (anchorY !== undefined) {
|
|
518
|
+
brush.anchorY = anchorY;
|
|
519
|
+
}
|
|
520
|
+
if (scaleFactor !== undefined) {
|
|
521
|
+
brush.scaleFactor = scaleFactor;
|
|
522
|
+
}
|
|
523
|
+
if (transparency !== undefined) {
|
|
524
|
+
brush.transparency = transparency;
|
|
525
|
+
}
|
|
526
|
+
if (antiAliased !== undefined) {
|
|
527
|
+
brush.antiAliased = antiAliased;
|
|
528
|
+
}
|
|
529
|
+
if (fitToCurve !== undefined) {
|
|
530
|
+
brush.fitToCurve = fitToCurve;
|
|
531
|
+
}
|
|
532
|
+
return brush;
|
|
533
|
+
}
|
|
534
|
+
function parseTraceElement(el, traceIndex) {
|
|
535
|
+
var brushRefRaw = function () {
|
|
536
|
+
var _nc = getAttr(el, 'brushRef');
|
|
537
|
+
return _nc != null ? _nc : '';
|
|
538
|
+
}();
|
|
539
|
+
var contextRefRaw = function () {
|
|
540
|
+
var _nc = getAttr(el, 'contextRef');
|
|
541
|
+
return _nc != null ? _nc : '';
|
|
542
|
+
}();
|
|
543
|
+
var timeOffset = getAttr(el, 'timeOffset');
|
|
544
|
+
var text = elementText(el).trim();
|
|
545
|
+
var decoded = decodeTrace(text);
|
|
546
|
+
var diagnostic;
|
|
547
|
+
// Malformed: non-empty text that produced zero points → diagnostic
|
|
548
|
+
if (text.length > 0 && decoded.points.length === 0) {
|
|
549
|
+
diagnostic = {
|
|
550
|
+
code: DIAG_INVALID_INK_TRACE,
|
|
551
|
+
message: 'malformed or untokenizable ink trace text',
|
|
552
|
+
traceIndex: traceIndex
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
var trace = {
|
|
556
|
+
points: decoded.points.map(function (p) { return ({
|
|
557
|
+
x: p.x,
|
|
558
|
+
y: p.y
|
|
559
|
+
}); }),
|
|
560
|
+
brushRef: brushRefRaw.length > 0 ? ensureHash(brushRefRaw.replace(/^#/, '')) : '',
|
|
561
|
+
contextRef: contextRefRaw.length > 0 ? ensureHash(contextRefRaw.replace(/^#/, '')) : DEFAULT_CONTEXT_REF
|
|
562
|
+
};
|
|
563
|
+
// Preserve brushRef as given with hash; empty string means unset
|
|
564
|
+
if (brushRefRaw.length > 0) {
|
|
565
|
+
trace.brushRef = brushRefRaw.startsWith('#') ? brushRefRaw : ensureHash(brushRefRaw);
|
|
566
|
+
}
|
|
567
|
+
if (timeOffset !== undefined) {
|
|
568
|
+
trace.timeOffset = timeOffset;
|
|
569
|
+
}
|
|
570
|
+
return {
|
|
571
|
+
trace: trace,
|
|
572
|
+
node: {
|
|
573
|
+
kind: 'trace',
|
|
574
|
+
traceIndex: traceIndex
|
|
575
|
+
},
|
|
576
|
+
stats: {
|
|
577
|
+
packetCount: decoded.stats.packetCount,
|
|
578
|
+
pointCount: decoded.stats.pointCount,
|
|
579
|
+
channelValueCount: decoded.stats.channelValueCount
|
|
580
|
+
},
|
|
581
|
+
diagnostic: diagnostic
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
function parseTraceGroup(el, traces, diagnostics, onStats) {
|
|
585
|
+
var e_7, _a;
|
|
586
|
+
var children = [];
|
|
587
|
+
try {
|
|
588
|
+
for (var _b = __values(el.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
589
|
+
var child = _c.value;
|
|
590
|
+
if (child.kind !== 'element' || !isInkMlElement(child)) {
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
if (IGNORE_LOCAL_NAMES.has(child.localName)) {
|
|
594
|
+
// annotationXML / annotation: ignored per §2.1.4 (decision: do not retain)
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
597
|
+
if (child.localName === 'trace') {
|
|
598
|
+
var _d = parseTraceElement(child, traces.length), trace = _d.trace, node = _d.node, stats = _d.stats, diagnostic = _d.diagnostic;
|
|
599
|
+
traces.push(trace);
|
|
600
|
+
children.push(node);
|
|
601
|
+
onStats(stats);
|
|
602
|
+
if (diagnostic !== undefined) {
|
|
603
|
+
diagnostics.push(diagnostic);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
else if (child.localName === 'traceGroup') {
|
|
607
|
+
var nested = parseTraceGroup(child, traces, diagnostics, onStats);
|
|
608
|
+
if (nested.children.length > 0) {
|
|
609
|
+
children.push(nested);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
615
|
+
finally {
|
|
616
|
+
try {
|
|
617
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
618
|
+
}
|
|
619
|
+
finally { if (e_7) throw e_7.error; }
|
|
620
|
+
}
|
|
621
|
+
return {
|
|
622
|
+
kind: 'group',
|
|
623
|
+
children: children
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
function readXmlId(el) {
|
|
627
|
+
var fromNs = getAttr(el, 'id', XML_NAMESPACE);
|
|
628
|
+
if (fromNs !== undefined) {
|
|
629
|
+
return fromNs;
|
|
630
|
+
}
|
|
631
|
+
return getAttr(el, 'id');
|
|
632
|
+
}
|
|
633
|
+
function ensureHash(id) {
|
|
634
|
+
return id.startsWith('#') ? id : "#" + id;
|
|
635
|
+
}
|
|
636
|
+
function parseLengthNumber(raw) {
|
|
637
|
+
var s = raw.trim();
|
|
638
|
+
if (s.length === 0) {
|
|
639
|
+
return undefined;
|
|
640
|
+
}
|
|
641
|
+
// GetPointValue: leading `.` → `0.`
|
|
642
|
+
if (s.startsWith('.')) {
|
|
643
|
+
s = "0" + s;
|
|
644
|
+
}
|
|
645
|
+
var n = Number(s);
|
|
646
|
+
return Number.isFinite(n) ? n : undefined;
|
|
647
|
+
}
|
|
648
|
+
function normalizeColor(raw) {
|
|
649
|
+
var s = raw.trim();
|
|
650
|
+
if (s.length === 0) {
|
|
651
|
+
return undefined;
|
|
652
|
+
}
|
|
653
|
+
if (!s.startsWith('#')) {
|
|
654
|
+
s = "#" + s;
|
|
655
|
+
}
|
|
656
|
+
// Accept #RGB or #RRGGBB
|
|
657
|
+
if (/^#[0-9A-Fa-f]{6}$/.test(s) || /^#[0-9A-Fa-f]{3}$/.test(s)) {
|
|
658
|
+
if (s.length === 4) {
|
|
659
|
+
var r = s.charAt(1);
|
|
660
|
+
var g = s.charAt(2);
|
|
661
|
+
var b = s.charAt(3);
|
|
662
|
+
return ("#" + r + r + g + g + b + b).toUpperCase();
|
|
663
|
+
}
|
|
664
|
+
return s.toUpperCase();
|
|
665
|
+
}
|
|
666
|
+
return undefined;
|
|
667
|
+
}
|
|
668
|
+
function parseBoolish(raw) {
|
|
669
|
+
var s = raw.trim().toLowerCase();
|
|
670
|
+
return s === '1' || s === 'true';
|
|
671
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* {@link OfficeInk} → InkML element tree serializer ([MS-ODRAWXML] §2.1.4).
|
|
3
|
+
*
|
|
4
|
+
* Trace text is always {@link encodeTrace} from points — never stored XML text.
|
|
5
|
+
* Brush property order matches `docs/specs/ink-shared-codec.md` / TASK-9003.
|
|
6
|
+
*/
|
|
7
|
+
import { OpenXmlElement } from '../../core/xml/model';
|
|
8
|
+
import { OfficeInk } from './ink-model';
|
|
9
|
+
/**
|
|
10
|
+
* Serialize an {@link OfficeInk} DOM to an InkML `ink` root element.
|
|
11
|
+
*
|
|
12
|
+
* Source: [MS-ODRAWXML] §2.1.4; `docs/specs/ink-shared-codec.md` Serializer behavior.
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
*/
|
|
16
|
+
export declare function serializeInkXml(ink: OfficeInk): OpenXmlElement;
|