docxodus 12.6.4 → 13.0.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/README.md +8 -5
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +7 -3
- package/dist/canonical.js.map +1 -1
- package/dist/conversion-options.d.ts +16 -0
- package/dist/conversion-options.d.ts.map +1 -0
- package/dist/conversion-options.js +31 -0
- package/dist/conversion-options.js.map +1 -0
- package/dist/core.d.ts +17 -9
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +23 -24
- package/dist/core.js.map +1 -1
- package/dist/docxodus.worker.js +2 -1073
- package/dist/docxodus.worker.js.map +7 -1
- package/dist/editor.bundle.js +35 -14296
- package/dist/editor.bundle.js.map +7 -0
- package/dist/editor.d.ts +33 -2
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +6739 -4773
- package/dist/editor.js.map +7 -1
- package/dist/embed.bundle.js +159 -18703
- package/dist/embed.bundle.js.map +7 -0
- package/dist/embed.d.ts +1 -1
- package/dist/embed.iife.js +37 -18595
- package/dist/embed.iife.js.map +7 -0
- package/dist/embed.js +1 -1
- package/dist/export-assets.json +27 -27
- package/dist/export-browser.bundle.js +1388 -477
- package/dist/export-browser.d.ts +20 -0
- package/dist/export-browser.d.ts.map +1 -1
- package/dist/export-browser.js +132 -37
- package/dist/export-browser.js.map +1 -1
- package/dist/font-runtime.d.ts.map +1 -1
- package/dist/font-runtime.js +54 -0
- package/dist/font-runtime.js.map +1 -1
- package/dist/line-metrics.d.ts +60 -0
- package/dist/line-metrics.d.ts.map +1 -0
- package/dist/line-metrics.js +343 -0
- package/dist/line-metrics.js.map +1 -0
- package/dist/pagination.bundle.js +3 -3214
- package/dist/pagination.bundle.js.map +7 -0
- package/dist/pagination.d.ts +86 -9
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +358 -55
- package/dist/pagination.js.map +1 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +63 -12
- package/dist/react.js.map +1 -1
- package/dist/render-report-v2.schema.json +29 -0
- package/dist/session.bundle.js +2 -2013
- package/dist/session.bundle.js.map +7 -0
- package/dist/session.d.ts +14 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +62 -29
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +137 -21
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -1
- package/dist/wasm/_framework/Docxodus.wasm +0 -0
- package/dist/wasm/_framework/Docxodus.wasm.br +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm.br +0 -0
- package/dist/wasm/_framework/System.Collections.wasm +0 -0
- package/dist/wasm/_framework/System.Collections.wasm.br +0 -0
- package/dist/wasm/_framework/System.IO.Compression.wasm +0 -0
- package/dist/wasm/_framework/System.IO.Compression.wasm.br +0 -0
- package/dist/wasm/_framework/System.Linq.wasm +0 -0
- package/dist/wasm/_framework/System.Linq.wasm.br +0 -0
- package/dist/wasm/_framework/System.Memory.wasm +0 -0
- package/dist/wasm/_framework/System.Memory.wasm.br +0 -0
- package/dist/wasm/_framework/System.Private.CoreLib.wasm +0 -0
- package/dist/wasm/_framework/System.Private.CoreLib.wasm.br +0 -0
- package/dist/wasm/_framework/System.Private.Xml.Linq.wasm +0 -0
- package/dist/wasm/_framework/System.Private.Xml.Linq.wasm.br +0 -0
- package/dist/wasm/_framework/System.Text.RegularExpressions.wasm +0 -0
- package/dist/wasm/_framework/System.Text.RegularExpressions.wasm.br +0 -0
- package/dist/wasm/_framework/dotnet.boot.js +11 -11
- package/dist/wasm/_framework/dotnet.boot.js.br +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm.br +0 -0
- package/dist/word-text.d.ts +14 -0
- package/dist/word-text.d.ts.map +1 -0
- package/dist/word-text.js +377 -0
- package/dist/word-text.js.map +1 -0
- package/dist/worker-proxy.bundle.js +2 -536
- package/dist/worker-proxy.bundle.js.map +7 -0
- package/dist/worker-proxy.d.ts +14 -1
- package/dist/worker-proxy.d.ts.map +1 -1
- package/dist/worker-proxy.js +357 -339
- package/dist/worker-proxy.js.map +1 -1
- package/package.json +13 -12
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const config = /*json-start*/{
|
|
2
2
|
"mainAssemblyName": "DocxodusWasm.dll",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
4
|
+
"hash": "sha256-vKIxgeFrRHOtfETTw11YVlCG6Jj51Ol0ErBtCAEw5+w=",
|
|
5
5
|
"jsModuleNative": [
|
|
6
6
|
{
|
|
7
7
|
"name": "dotnet.native.js"
|
|
@@ -15,7 +15,7 @@ export const config = /*json-start*/{
|
|
|
15
15
|
"wasmNative": [
|
|
16
16
|
{
|
|
17
17
|
"name": "dotnet.native.wasm",
|
|
18
|
-
"hash": "sha256-
|
|
18
|
+
"hash": "sha256-N6e/9o8ZuyJCs6xfrmFgcjxoVXvk+3EXZA7Yz8y5GoU="
|
|
19
19
|
}
|
|
20
20
|
],
|
|
21
21
|
"coreAssembly": [
|
|
@@ -32,12 +32,12 @@ export const config = /*json-start*/{
|
|
|
32
32
|
{
|
|
33
33
|
"virtualPath": "Docxodus.wasm",
|
|
34
34
|
"name": "Docxodus.wasm",
|
|
35
|
-
"hash": "sha256-
|
|
35
|
+
"hash": "sha256-EqDZS74gNfPQa7IcOdDK17V3E2/N+18O8FaxYlnxHW4="
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"virtualPath": "DocxodusWasm.wasm",
|
|
39
39
|
"name": "DocxodusWasm.wasm",
|
|
40
|
-
"hash": "sha256-
|
|
40
|
+
"hash": "sha256-EoFtFZaNzvwD3gTyAbicrx0QtJSyXynVaU00+3iNU/g="
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"virtualPath": "System.Collections.Concurrent.wasm",
|
|
@@ -47,7 +47,7 @@ export const config = /*json-start*/{
|
|
|
47
47
|
{
|
|
48
48
|
"virtualPath": "System.Collections.wasm",
|
|
49
49
|
"name": "System.Collections.wasm",
|
|
50
|
-
"hash": "sha256-
|
|
50
|
+
"hash": "sha256-q43CrQgi5YeLF/JLmrmeqqsSm601ywtmqgu+dYSDdao="
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"virtualPath": "System.Collections.Immutable.wasm",
|
|
@@ -92,7 +92,7 @@ export const config = /*json-start*/{
|
|
|
92
92
|
{
|
|
93
93
|
"virtualPath": "System.IO.Compression.wasm",
|
|
94
94
|
"name": "System.IO.Compression.wasm",
|
|
95
|
-
"hash": "sha256-
|
|
95
|
+
"hash": "sha256-I4iPlVGoImOqMvIweNFe6aRi7YGmE36UbpLCVgiFFyM="
|
|
96
96
|
},
|
|
97
97
|
{
|
|
98
98
|
"virtualPath": "System.IO.Packaging.wasm",
|
|
@@ -107,7 +107,7 @@ export const config = /*json-start*/{
|
|
|
107
107
|
{
|
|
108
108
|
"virtualPath": "System.Linq.wasm",
|
|
109
109
|
"name": "System.Linq.wasm",
|
|
110
|
-
"hash": "sha256-
|
|
110
|
+
"hash": "sha256-L+B3ocTiGJpAoy99kRsRakTrezqzcSfIv9SHWcUVCYw="
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
113
|
"virtualPath": "System.Linq.Expressions.wasm",
|
|
@@ -117,7 +117,7 @@ export const config = /*json-start*/{
|
|
|
117
117
|
{
|
|
118
118
|
"virtualPath": "System.Memory.wasm",
|
|
119
119
|
"name": "System.Memory.wasm",
|
|
120
|
-
"hash": "sha256-
|
|
120
|
+
"hash": "sha256-6xXLBTkKJSAdTfygAKq6yjYQmfynB++Pl8HVv46OUQE="
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
123
|
"virtualPath": "System.Net.Http.wasm",
|
|
@@ -137,7 +137,7 @@ export const config = /*json-start*/{
|
|
|
137
137
|
{
|
|
138
138
|
"virtualPath": "System.Private.CoreLib.wasm",
|
|
139
139
|
"name": "System.Private.CoreLib.wasm",
|
|
140
|
-
"hash": "sha256-
|
|
140
|
+
"hash": "sha256-g4QS0bOdaErxcUUdsC5AutWmefuu/TIlANF8T42JqBs="
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
"virtualPath": "System.Private.Uri.wasm",
|
|
@@ -152,7 +152,7 @@ export const config = /*json-start*/{
|
|
|
152
152
|
{
|
|
153
153
|
"virtualPath": "System.Private.Xml.Linq.wasm",
|
|
154
154
|
"name": "System.Private.Xml.Linq.wasm",
|
|
155
|
-
"hash": "sha256
|
|
155
|
+
"hash": "sha256-+J735HT6lvJ0552zvtUAGblsFUG2L7IJMXxeB4KxEi8="
|
|
156
156
|
},
|
|
157
157
|
{
|
|
158
158
|
"virtualPath": "System.Runtime.wasm",
|
|
@@ -182,7 +182,7 @@ export const config = /*json-start*/{
|
|
|
182
182
|
{
|
|
183
183
|
"virtualPath": "System.Text.RegularExpressions.wasm",
|
|
184
184
|
"name": "System.Text.RegularExpressions.wasm",
|
|
185
|
-
"hash": "sha256-
|
|
185
|
+
"hash": "sha256-f5nynwS5qBPGC2B/fUxvYzjCQq0I+Y9h9z9V6FXtNTg="
|
|
186
186
|
},
|
|
187
187
|
{
|
|
188
188
|
"virtualPath": "System.Xml.Linq.wasm",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fractional baselines for uniform Word paragraphs in the standalone export.
|
|
3
|
+
*
|
|
4
|
+
* HTML print snaps each inline baseline to a whole CSS pixel, even with an
|
|
5
|
+
* explicit fractional line height. An SVG retains the
|
|
6
|
+
* measured line breaks and word positions while painting the baselines at the
|
|
7
|
+
* font's unrounded ascent. Source paragraph identities and block geometry stay
|
|
8
|
+
* on the original elements. Complex flow still uses the existing HTML renderer.
|
|
9
|
+
*/
|
|
10
|
+
/** Run after fonts and natural line heights resolve, before pagination measures them. */
|
|
11
|
+
export declare function prepareWordText(root: HTMLElement, checkpoint?: () => void): number;
|
|
12
|
+
/** Paint prepared paragraphs after the page tree is final. No line or page breaks change here. */
|
|
13
|
+
export declare function paintWordText(root: HTMLElement, checkpoint?: () => void): number;
|
|
14
|
+
//# sourceMappingURL=word-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-text.d.ts","sourceRoot":"","sources":["../src/word-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsKH,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CAmClF;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CA0HhF"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fractional baselines for uniform Word paragraphs in the standalone export.
|
|
3
|
+
*
|
|
4
|
+
* HTML print snaps each inline baseline to a whole CSS pixel, even with an
|
|
5
|
+
* explicit fractional line height. An SVG retains the
|
|
6
|
+
* measured line breaks and word positions while painting the baselines at the
|
|
7
|
+
* font's unrounded ascent. Source paragraph identities and block geometry stay
|
|
8
|
+
* on the original elements. Complex flow still uses the existing HTML renderer.
|
|
9
|
+
*/
|
|
10
|
+
const PREPARED = 'data-docx-word-text-prepared';
|
|
11
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
12
|
+
const PARAGRAPHS = 'p, h1, h2, h3, h4, h5, h6';
|
|
13
|
+
function plainDocument(root) {
|
|
14
|
+
if (root.querySelector('table, svg, math, canvas, video, audio, iframe, object, a, ol, ul, aside, template, header, footer, [data-hf-type], section.footnotes, section.endnotes'))
|
|
15
|
+
return false;
|
|
16
|
+
if (Array.from(root.querySelectorAll('img')).some(img => !img.closest(PARAGRAPHS)))
|
|
17
|
+
return false;
|
|
18
|
+
// A document mixing plain text with shifted runs, exact spacing or rich
|
|
19
|
+
// inline structure keeps one consistent legacy layout. Those contexts need
|
|
20
|
+
// their own line model before they can share the precision renderer.
|
|
21
|
+
return Array.from(root.querySelectorAll(PARAGRAPHS)).every(p => {
|
|
22
|
+
const run = plainRun(p);
|
|
23
|
+
return run !== null && Number(root.ownerDocument.defaultView?.getComputedStyle(p)
|
|
24
|
+
.getPropertyValue('--docx-auto-line-spacing')) > 0;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function pictureSibling(element, view) {
|
|
28
|
+
if (!(element instanceof view.HTMLElement) || element.localName !== 'span' || element.children.length !== 1)
|
|
29
|
+
return false;
|
|
30
|
+
const wrapper = element.firstElementChild;
|
|
31
|
+
if (wrapper.localName !== 'span' || wrapper.children.length !== 1 || wrapper.firstElementChild?.localName !== 'img')
|
|
32
|
+
return false;
|
|
33
|
+
if (wrapper.dataset.docxEdgePicture !== 'true')
|
|
34
|
+
return false;
|
|
35
|
+
const style = view.getComputedStyle(wrapper);
|
|
36
|
+
const outer = view.getComputedStyle(element);
|
|
37
|
+
const image = view.getComputedStyle(wrapper.firstElementChild);
|
|
38
|
+
return ['left', 'right'].includes(style.cssFloat) && style.position === 'static' && style.transform === 'none' &&
|
|
39
|
+
outer.display === 'inline' && ['static', 'relative'].includes(outer.position) && outer.transform === 'none' &&
|
|
40
|
+
image.transform === 'none' && image.position === 'static';
|
|
41
|
+
}
|
|
42
|
+
function plainRun(paragraph) {
|
|
43
|
+
const view = paragraph.ownerDocument.defaultView;
|
|
44
|
+
if (!view)
|
|
45
|
+
return null;
|
|
46
|
+
const children = Array.from(paragraph.children);
|
|
47
|
+
const content = children.filter(child => child.textContent !== '');
|
|
48
|
+
if (content.length !== 1)
|
|
49
|
+
return null;
|
|
50
|
+
const run = content[0];
|
|
51
|
+
if (children.length !== 1) {
|
|
52
|
+
// The converter carries an explicit column break on the paragraph and
|
|
53
|
+
// leaves an empty run where the break appeared. It has no text identity;
|
|
54
|
+
// accept only empty spans with the same line metrics as the visible run.
|
|
55
|
+
const runStyle = view.getComputedStyle(run);
|
|
56
|
+
for (const empty of children.filter(child => child !== run)) {
|
|
57
|
+
if (pictureSibling(empty, view)) {
|
|
58
|
+
const pictureStyle = view.getComputedStyle(empty);
|
|
59
|
+
if (['font-size', 'font-style', 'font-weight', 'vertical-align'].some(property => pictureStyle.getPropertyValue(property) !== runStyle.getPropertyValue(property)))
|
|
60
|
+
return null;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (paragraph.dataset.columnBreakBefore !== 'true')
|
|
64
|
+
return null;
|
|
65
|
+
if (!(empty instanceof view.HTMLElement) || empty.localName !== 'span' || empty.childNodes.length ||
|
|
66
|
+
Array.from(empty.attributes).some(a => !['class', 'style', 'lang', 'dir'].includes(a.name)))
|
|
67
|
+
return null;
|
|
68
|
+
const emptyStyle = view.getComputedStyle(empty);
|
|
69
|
+
if (['font-family', 'font-size', 'font-style', 'font-weight', 'font-stretch', 'line-height',
|
|
70
|
+
'display', 'position', 'top', 'vertical-align'].some(property => emptyStyle.getPropertyValue(property) !== runStyle.getPropertyValue(property)))
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!(run instanceof view.HTMLElement) || run.localName !== 'span' || run.children.length ||
|
|
75
|
+
run.childNodes.length !== 1 || run.firstChild?.nodeType !== 3)
|
|
76
|
+
return null;
|
|
77
|
+
const text = run.textContent ?? '';
|
|
78
|
+
// Other scripts need their own fallback-font metrics, shaping and bidi model.
|
|
79
|
+
if (!text.trim() || /^\s/.test(text) || !/^[\u0020-\u024f]*$/u.test(text))
|
|
80
|
+
return null;
|
|
81
|
+
if (Array.from(run.attributes).some(a => !['class', 'style', 'lang', 'dir'].includes(a.name)))
|
|
82
|
+
return null;
|
|
83
|
+
const style = view.getComputedStyle(run);
|
|
84
|
+
const parent = view.getComputedStyle(paragraph);
|
|
85
|
+
if (['Top', 'Right', 'Bottom', 'Left'].some(side => parent.getPropertyValue(`padding-${side.toLowerCase()}`) !== '0px' ||
|
|
86
|
+
parent.getPropertyValue(`border-${side.toLowerCase()}-width`) !== '0px'))
|
|
87
|
+
return null;
|
|
88
|
+
if (parent.direction !== 'ltr' || parent.writingMode !== 'horizontal-tb' ||
|
|
89
|
+
style.display !== 'inline' || !['static', 'relative'].includes(style.position) ||
|
|
90
|
+
style.textTransform !== 'none' || style.fontVariantCaps !== 'normal' ||
|
|
91
|
+
style.textDecorationLine !== 'none' || !['normal', '0px'].includes(style.letterSpacing) ||
|
|
92
|
+
!['normal', '100%'].includes(style.fontStretch) ||
|
|
93
|
+
style.backgroundColor !== 'rgba(0, 0, 0, 0)' || style.textShadow !== 'none' ||
|
|
94
|
+
style.transform !== 'none' || style.opacity !== '1' || style.verticalAlign !== 'baseline')
|
|
95
|
+
return null;
|
|
96
|
+
return run;
|
|
97
|
+
}
|
|
98
|
+
/** Word excludes the contour across the native text band, with horizontal clearance. */
|
|
99
|
+
function contourRows(image, paragraph, run, lineCount, checkpoint) {
|
|
100
|
+
const view = paragraph.ownerDocument.defaultView;
|
|
101
|
+
const wrapper = image.parentElement;
|
|
102
|
+
if (wrapper.dataset.docxWrapText !== 'bothSides' ||
|
|
103
|
+
image.closest('.page-content') !== paragraph.closest('.page-content'))
|
|
104
|
+
return null;
|
|
105
|
+
const wrapStyle = view.getComputedStyle(wrapper);
|
|
106
|
+
if (wrapStyle.marginTop !== '0px' || wrapStyle.marginBottom !== '0px')
|
|
107
|
+
return null;
|
|
108
|
+
const polygon = /^polygon\((.*)\) border-box$/.exec(wrapStyle.shapeOutside);
|
|
109
|
+
if (!polygon)
|
|
110
|
+
return null;
|
|
111
|
+
const points = polygon[1].split(',').map(point => {
|
|
112
|
+
const match = /^\s*([\d.+-]+)%\s+([\d.+-]+)%\s*$/.exec(point);
|
|
113
|
+
return match ? { x: Number(match[1]) / 100, y: Number(match[2]) / 100 } : null;
|
|
114
|
+
});
|
|
115
|
+
if (points.length < 3 || points.some(p => !p || !Number.isFinite(p.x + p.y)))
|
|
116
|
+
return null;
|
|
117
|
+
const vertices = points;
|
|
118
|
+
// One convex contour has a single excluded interval at each height. More
|
|
119
|
+
// complex contours keep the established CSS flow until they have a line model.
|
|
120
|
+
let orientation = 0;
|
|
121
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
122
|
+
const a = vertices[i], b = vertices[(i + 1) % vertices.length], c = vertices[(i + 2) % vertices.length];
|
|
123
|
+
const cross = (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);
|
|
124
|
+
if (Math.abs(cross) < 1e-8)
|
|
125
|
+
continue;
|
|
126
|
+
if (orientation && Math.sign(cross) !== orientation)
|
|
127
|
+
return null;
|
|
128
|
+
orientation = Math.sign(cross);
|
|
129
|
+
}
|
|
130
|
+
if (!orientation)
|
|
131
|
+
return null;
|
|
132
|
+
const left = Number.parseFloat(wrapStyle.getPropertyValue('--docx-wrap-distance-left')) * 4 / 3;
|
|
133
|
+
const right = Number.parseFloat(wrapStyle.getPropertyValue('--docx-wrap-distance-right')) * 4 / 3;
|
|
134
|
+
if (!Number.isFinite(left + right) || left < 0 || right < 0)
|
|
135
|
+
return null;
|
|
136
|
+
const box = paragraph.getBoundingClientRect();
|
|
137
|
+
const picture = image.getBoundingClientRect();
|
|
138
|
+
if (box.top >= picture.bottom || box.bottom <= picture.top)
|
|
139
|
+
return null;
|
|
140
|
+
const style = view.getComputedStyle(run);
|
|
141
|
+
if (!['start', 'left'].includes(view.getComputedStyle(paragraph).textAlign))
|
|
142
|
+
return null;
|
|
143
|
+
const pitch = Number.parseFloat(style.lineHeight);
|
|
144
|
+
const nativeHeight = Number.parseFloat(style.getPropertyValue('--docx-word-native-height'));
|
|
145
|
+
if (!(nativeHeight > 0) || !(pitch > 0) || !(picture.width > 0) || !(picture.height > 0))
|
|
146
|
+
return null;
|
|
147
|
+
const context = paragraph.ownerDocument.createElement('canvas').getContext('2d');
|
|
148
|
+
if (!context)
|
|
149
|
+
return null;
|
|
150
|
+
const measureScale = Number.parseFloat(style.fontSize) / 10000;
|
|
151
|
+
context.font = `${style.fontStyle} ${style.fontWeight} 10000px ${style.fontFamily}`;
|
|
152
|
+
context.fontKerning = style.fontKerning;
|
|
153
|
+
if (!context.font.includes('10000px'))
|
|
154
|
+
return null;
|
|
155
|
+
const words = Array.from(run.textContent.matchAll(/\S+\s*/gu), (match, index) => {
|
|
156
|
+
if ((index & 63) === 0)
|
|
157
|
+
checkpoint?.();
|
|
158
|
+
return { text: match[0], width: context.measureText(match[0].trimEnd()).width * measureScale,
|
|
159
|
+
advance: context.measureText(match[0]).width * measureScale };
|
|
160
|
+
});
|
|
161
|
+
const rows = new Map();
|
|
162
|
+
let next = 0;
|
|
163
|
+
for (let line = 0; line < lineCount && next < words.length; line++) {
|
|
164
|
+
checkpoint?.();
|
|
165
|
+
const top = (box.top + line * pitch - picture.top) / picture.height;
|
|
166
|
+
const bottom = top + nativeHeight / picture.height;
|
|
167
|
+
const crossings = [];
|
|
168
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
169
|
+
const a = vertices[i], b = vertices[(i + 1) % vertices.length];
|
|
170
|
+
if (a.y >= top && a.y <= bottom)
|
|
171
|
+
crossings.push(a.x);
|
|
172
|
+
for (const y of [top, bottom])
|
|
173
|
+
if (a.y !== b.y && y >= Math.min(a.y, b.y) && y <= Math.max(a.y, b.y))
|
|
174
|
+
crossings.push(a.x + (b.x - a.x) * (y - a.y) / (b.y - a.y));
|
|
175
|
+
}
|
|
176
|
+
const slots = crossings.length ? [
|
|
177
|
+
[box.left, Math.min(box.right, picture.left + Math.min(...crossings) * picture.width - left)],
|
|
178
|
+
[Math.max(box.left, picture.left + Math.max(...crossings) * picture.width + right), box.right],
|
|
179
|
+
] : [[box.left, box.right]];
|
|
180
|
+
const row = [];
|
|
181
|
+
for (const [start, end] of slots) {
|
|
182
|
+
let x = start;
|
|
183
|
+
while (next < words.length && x + words[next].width <= end + 1 / 64) {
|
|
184
|
+
const word = words[next++];
|
|
185
|
+
row.push({ text: word.text, x: x - box.left });
|
|
186
|
+
x += word.advance;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (!row.length)
|
|
190
|
+
return null;
|
|
191
|
+
rows.set(line, row);
|
|
192
|
+
}
|
|
193
|
+
// Painting cannot change pagination or paragraph geometry. Use this model
|
|
194
|
+
// only when its complete source inventory fits the measured number of lines.
|
|
195
|
+
return next === words.length && rows.size === lineCount ? rows : null;
|
|
196
|
+
}
|
|
197
|
+
/** Run after fonts and natural line heights resolve, before pagination measures them. */
|
|
198
|
+
export function prepareWordText(root, checkpoint) {
|
|
199
|
+
if (!plainDocument(root))
|
|
200
|
+
return 0;
|
|
201
|
+
const view = root.ownerDocument.defaultView;
|
|
202
|
+
if (!view)
|
|
203
|
+
return 0;
|
|
204
|
+
let prepared = 0;
|
|
205
|
+
for (const paragraph of Array.from(root.querySelectorAll(PARAGRAPHS))) {
|
|
206
|
+
checkpoint?.();
|
|
207
|
+
const run = plainRun(paragraph);
|
|
208
|
+
if (!run)
|
|
209
|
+
continue;
|
|
210
|
+
const style = view.getComputedStyle(paragraph);
|
|
211
|
+
const multiple = Number(style.getPropertyValue('--docx-auto-line-spacing'));
|
|
212
|
+
const runStyle = view.getComputedStyle(run);
|
|
213
|
+
const kerning = runStyle.getPropertyValue('--docx-font-kerning').trim() || 'none';
|
|
214
|
+
const height = Number.parseFloat(runStyle.lineHeight);
|
|
215
|
+
if (!(multiple > 0) || !(height > 0) || !['none', 'normal'].includes(kerning))
|
|
216
|
+
continue;
|
|
217
|
+
// Word's auto spacing advances on the document's twip grid. Resolve the
|
|
218
|
+
// native single-line height to twips before applying its spacing multiple.
|
|
219
|
+
const nativeTwips = Math.round(height / multiple * 15);
|
|
220
|
+
const twips = Math.floor(nativeTwips * multiple);
|
|
221
|
+
if (!(twips > 0))
|
|
222
|
+
continue;
|
|
223
|
+
run.style.fontKerning = kerning;
|
|
224
|
+
run.style.lineHeight = `${twips / 15}px`;
|
|
225
|
+
run.style.setProperty('--docx-word-native-height', `${nativeTwips / 15}px`);
|
|
226
|
+
// An empty drawing run participates in the first inline box. Give it the
|
|
227
|
+
// same resolved height so its inherited auto multiplier is not applied twice.
|
|
228
|
+
for (const picture of Array.from(paragraph.children).filter(child => pictureSibling(child, view))) {
|
|
229
|
+
picture.style.lineHeight = run.style.lineHeight;
|
|
230
|
+
picture.style.top = '0';
|
|
231
|
+
}
|
|
232
|
+
for (const empty of Array.from(paragraph.children).filter(child => child !== run && !child.children.length))
|
|
233
|
+
empty.remove();
|
|
234
|
+
paragraph.style.lineHeight = run.style.lineHeight;
|
|
235
|
+
paragraph.setAttribute(PREPARED, 'true');
|
|
236
|
+
prepared++;
|
|
237
|
+
}
|
|
238
|
+
return prepared;
|
|
239
|
+
}
|
|
240
|
+
/** Paint prepared paragraphs after the page tree is final. No line or page breaks change here. */
|
|
241
|
+
export function paintWordText(root, checkpoint) {
|
|
242
|
+
const document = root.ownerDocument;
|
|
243
|
+
const view = document.defaultView;
|
|
244
|
+
if (!view)
|
|
245
|
+
return 0;
|
|
246
|
+
const paragraphs = Array.from(root.querySelectorAll(`[${PREPARED}]`));
|
|
247
|
+
const pictures = Array.from(root.querySelectorAll('img'));
|
|
248
|
+
const hasPictures = pictures.length > 0;
|
|
249
|
+
const columnOf = (paragraph) => {
|
|
250
|
+
for (let parent = paragraph.parentElement; parent && parent !== root; parent = parent.parentElement)
|
|
251
|
+
if (Number(view.getComputedStyle(parent).columnCount) > 1)
|
|
252
|
+
return parent;
|
|
253
|
+
return null;
|
|
254
|
+
};
|
|
255
|
+
// A column container with fragmented paragraphs keeps its original line flow.
|
|
256
|
+
// Mixing fixed vector boxes with an HTML paragraph that crosses a column can
|
|
257
|
+
// reflow that paragraph outside the body band and drop its printed text.
|
|
258
|
+
const fragmentedColumns = new Set();
|
|
259
|
+
for (const paragraph of paragraphs) {
|
|
260
|
+
checkpoint?.();
|
|
261
|
+
const column = columnOf(paragraph);
|
|
262
|
+
if (column && paragraph.getClientRects().length !== 1)
|
|
263
|
+
fragmentedColumns.add(column);
|
|
264
|
+
}
|
|
265
|
+
const metrics = new Map();
|
|
266
|
+
function fontMetrics(style) {
|
|
267
|
+
const font = `${style.fontStyle} ${style.fontWeight} 10000px ${style.fontFamily}`;
|
|
268
|
+
const cached = metrics.get(font);
|
|
269
|
+
if (cached)
|
|
270
|
+
return cached;
|
|
271
|
+
const probe = document.createElement('span');
|
|
272
|
+
probe.setAttribute('aria-hidden', 'true');
|
|
273
|
+
probe.style.cssText = `position:absolute;left:-100000px;top:0;visibility:hidden;display:inline-block;white-space:nowrap;margin:0;padding:0;border:0;font:${font};line-height:normal`;
|
|
274
|
+
probe.textContent = 'Hg';
|
|
275
|
+
document.body.append(probe);
|
|
276
|
+
const height = probe.getBoundingClientRect().height / 10000;
|
|
277
|
+
probe.remove();
|
|
278
|
+
const context = document.createElement('canvas').getContext('2d');
|
|
279
|
+
if (!context)
|
|
280
|
+
return null;
|
|
281
|
+
context.font = font;
|
|
282
|
+
if (!context.font.includes('10000px'))
|
|
283
|
+
return null;
|
|
284
|
+
const descent = context.measureText('Hg').fontBoundingBoxDescent / 10000;
|
|
285
|
+
if (!(height > 0) || !(descent > 0))
|
|
286
|
+
return null;
|
|
287
|
+
const result = { height, descent };
|
|
288
|
+
metrics.set(font, result);
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
const pending = [];
|
|
292
|
+
for (const paragraph of paragraphs) {
|
|
293
|
+
checkpoint?.();
|
|
294
|
+
const column = columnOf(paragraph);
|
|
295
|
+
if (column && fragmentedColumns.has(column)) {
|
|
296
|
+
paragraph.removeAttribute(PREPARED);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const run = plainRun(paragraph);
|
|
300
|
+
if (!run)
|
|
301
|
+
continue;
|
|
302
|
+
const style = view.getComputedStyle(run);
|
|
303
|
+
const metric = fontMetrics(style);
|
|
304
|
+
const fontSize = Number.parseFloat(style.fontSize);
|
|
305
|
+
const pitch = Number.parseFloat(style.lineHeight);
|
|
306
|
+
const box = paragraph.getBoundingClientRect();
|
|
307
|
+
if (!metric || !(fontSize > 0) || !(pitch > 0) || !(box.width > 0) || !(box.height > 0))
|
|
308
|
+
continue;
|
|
309
|
+
const columnBand = column || hasPictures ? paragraph.closest('.page-content') : null;
|
|
310
|
+
const band = columnBand?.getBoundingClientRect() ?? box;
|
|
311
|
+
const text = run.textContent;
|
|
312
|
+
let rows = new Map();
|
|
313
|
+
let wordCount = 0;
|
|
314
|
+
for (const match of text.matchAll(/\S+\s*/gu)) {
|
|
315
|
+
if ((wordCount++ & 63) === 0)
|
|
316
|
+
checkpoint?.();
|
|
317
|
+
const range = document.createRange();
|
|
318
|
+
range.setStart(run.firstChild, match.index);
|
|
319
|
+
range.setEnd(run.firstChild, match.index + match[0].trimEnd().length);
|
|
320
|
+
const rect = range.getBoundingClientRect();
|
|
321
|
+
const row = Math.round(rect.top * 4);
|
|
322
|
+
const words = rows.get(row) ?? [];
|
|
323
|
+
words.push({ text: match[0], x: rect.left - box.left });
|
|
324
|
+
rows.set(row, words);
|
|
325
|
+
}
|
|
326
|
+
if (!rows.size)
|
|
327
|
+
continue;
|
|
328
|
+
if (pictures.length === 1)
|
|
329
|
+
rows = contourRows(pictures[0], paragraph, run, rows.size, checkpoint) ?? rows;
|
|
330
|
+
const svg = document.createElementNS(SVG_NS, 'svg');
|
|
331
|
+
svg.setAttribute('width', String(band.width));
|
|
332
|
+
svg.setAttribute('height', String(band.height));
|
|
333
|
+
// A larger viewBox retains fractional glyph coordinates without increasing
|
|
334
|
+
// the physical font size or changing the source font file.
|
|
335
|
+
svg.setAttribute('viewBox', `0 0 ${band.width * 4} ${band.height * 4}`);
|
|
336
|
+
svg.setAttribute('role', 'group');
|
|
337
|
+
svg.style.cssText = columnBand
|
|
338
|
+
? 'position:absolute;left:0;top:0;display:block;overflow:visible'
|
|
339
|
+
: 'display:block;overflow:visible';
|
|
340
|
+
const baseline = (metric.height - metric.descent) * fontSize;
|
|
341
|
+
Array.from(rows.values()).forEach((words, index) => {
|
|
342
|
+
const line = document.createElementNS(SVG_NS, 'text');
|
|
343
|
+
line.setAttribute('y', String((box.top - band.top + baseline + index * pitch) * 4));
|
|
344
|
+
line.setAttribute('xml:space', 'preserve');
|
|
345
|
+
for (const property of ['font-family', 'font-weight', 'font-style', 'font-stretch', 'font-kerning'])
|
|
346
|
+
line.style.setProperty(property, style.getPropertyValue(property));
|
|
347
|
+
line.style.fontSize = `${fontSize * 4}px`;
|
|
348
|
+
line.style.fill = style.color;
|
|
349
|
+
for (const word of words) {
|
|
350
|
+
const span = document.createElementNS(SVG_NS, 'tspan');
|
|
351
|
+
span.setAttribute('x', String((box.left - band.left + word.x) * 4));
|
|
352
|
+
span.textContent = word.text;
|
|
353
|
+
line.append(span);
|
|
354
|
+
}
|
|
355
|
+
svg.append(line);
|
|
356
|
+
});
|
|
357
|
+
pending.push({ paragraph, run, svg, height: box.height });
|
|
358
|
+
}
|
|
359
|
+
// Read every line before replacing any paragraph, so one vector box cannot
|
|
360
|
+
// change the column coordinates used to measure the following paragraph.
|
|
361
|
+
for (const { paragraph, run, svg, height } of pending) {
|
|
362
|
+
checkpoint?.();
|
|
363
|
+
if (Array.from(paragraph.children).some(child => pictureSibling(child, view)))
|
|
364
|
+
run.replaceWith(svg);
|
|
365
|
+
else
|
|
366
|
+
paragraph.replaceChildren(svg);
|
|
367
|
+
// CSSOM rounds a numeric height when serializing an inline declaration.
|
|
368
|
+
// A slightly lower re-parsed value loses one layout unit on every paragraph
|
|
369
|
+
// and shifts PageMap fragments on offline reopen. Custom-property tokens
|
|
370
|
+
// retain the measured value verbatim through the standalone HTML round trip.
|
|
371
|
+
paragraph.style.setProperty('--docx-word-text-height', `${height}px`);
|
|
372
|
+
paragraph.style.height = 'var(--docx-word-text-height)';
|
|
373
|
+
paragraph.removeAttribute(PREPARED);
|
|
374
|
+
}
|
|
375
|
+
return pending.length;
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=word-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-text.js","sourceRoot":"","sources":["../src/word-text.ts"],"names":[],"mappings":"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"}
|