reamkit 1.0.0 → 1.0.2
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 +4 -3
- package/dist/esm/core/bidi/index.d.ts +2 -0
- package/dist/esm/core/bidi/index.js +1 -0
- package/dist/esm/core/bidi/segments.d.ts +6 -0
- package/dist/esm/core/bidi/segments.js +41 -0
- package/dist/esm/core/converter/facade.js +1 -1
- package/dist/esm/core/converter/project.js +3 -2
- package/dist/esm/core/converter/ream.js +2 -1
- package/dist/esm/core/font/index.d.ts +2 -0
- package/dist/esm/core/font/measure.d.ts +7 -0
- package/dist/esm/core/font/measure.js +30 -0
- package/dist/esm/core/images.d.ts +17 -0
- package/dist/esm/core/images.js +308 -0
- package/dist/esm/core/line-breaker/index.d.ts +1 -1
- package/dist/esm/core/line-breaker/knuth-plass.d.ts +1 -0
- package/dist/esm/core/line-breaker/knuth-plass.js +2 -2
- package/dist/esm/core/numbering/apply.d.ts +3 -0
- package/dist/esm/core/numbering/apply.js +62 -0
- package/dist/esm/core/numbering/index.d.ts +1 -0
- package/dist/esm/core/opc/package.d.ts +2 -1
- package/dist/esm/core/opc/package.js +6 -2
- package/dist/esm/core/style-cascade/index.d.ts +1 -1
- package/dist/esm/core/style-cascade/resolver.d.ts +3 -1
- package/dist/esm/core/style-cascade/resolver.js +75 -2
- package/dist/esm/core/style-cascade/types.d.ts +2 -1
- package/dist/esm/core/vector.d.ts +45 -0
- package/dist/esm/core/vector.js +48 -0
- package/dist/esm/excel/print-model.js +21 -3
- package/dist/esm/excel/xlsx-reader.js +2 -2
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +2 -1
- package/dist/esm/{pdf → layout}/arc-to-bezier.d.ts +1 -1
- package/dist/esm/{pdf → layout}/arc-to-bezier.js +2 -2
- package/dist/esm/{pdf → layout}/math-layout.d.ts +1 -1
- package/dist/esm/{pdf → layout}/math-layout.js +1 -1
- package/dist/esm/layout/page-doc.d.ts +133 -0
- package/dist/esm/layout/page-doc.js +38 -0
- package/dist/esm/{pdf → layout}/preset-geometry.d.ts +1 -1
- package/dist/esm/{pdf → layout}/preset-geometry.js +2 -2
- package/dist/esm/layout/styled-layout.d.ts +84 -0
- package/dist/esm/layout/styled-layout.js +1729 -0
- package/dist/esm/pdf/cid-font.d.ts +0 -6
- package/dist/esm/pdf/cid-font.js +2 -28
- package/dist/esm/pdf/image-xobject.d.ts +3 -17
- package/dist/esm/pdf/image-xobject.js +2 -306
- package/dist/esm/pdf/index.js +1 -0
- package/dist/esm/pdf/styled-page-emitter.d.ts +8 -2
- package/dist/esm/pdf/styled-page-emitter.js +29 -14
- package/dist/esm/pdf/styled-page-renderer.d.ts +4 -217
- package/dist/esm/pdf/styled-page-renderer.js +3 -1824
- package/dist/esm/pdf/vector-graphics.d.ts +3 -45
- package/dist/esm/pdf/vector-graphics.js +2 -46
- package/dist/esm/svg/svg-writer.d.ts +1 -1
- package/dist/esm/svg/svg-writer.js +14 -15
- package/dist/esm/word/docx-reader.js +4 -3
- package/package.json +2 -2
- /package/dist/esm/{pdf → layout}/chart-geometry.d.ts +0 -0
- /package/dist/esm/{pdf → layout}/chart-geometry.js +0 -0
|
@@ -5,7 +5,25 @@ var EMPTY_STYLE_SHEET = {
|
|
|
5
5
|
defaultParagraphProperties: {},
|
|
6
6
|
styles: /* @__PURE__ */ new Map()
|
|
7
7
|
};
|
|
8
|
+
var runCascadeCache = /* @__PURE__ */ new WeakMap();
|
|
8
9
|
function resolveRunProperties(runDirect, paragraphDirect, sheet) {
|
|
10
|
+
let bySheet = runCascadeCache.get(sheet);
|
|
11
|
+
if (!bySheet) {
|
|
12
|
+
bySheet = /* @__PURE__ */ new WeakMap();
|
|
13
|
+
runCascadeCache.set(sheet, bySheet);
|
|
14
|
+
}
|
|
15
|
+
let byRun = bySheet.get(runDirect);
|
|
16
|
+
if (!byRun) {
|
|
17
|
+
byRun = /* @__PURE__ */ new WeakMap();
|
|
18
|
+
bySheet.set(runDirect, byRun);
|
|
19
|
+
}
|
|
20
|
+
const hit = byRun.get(paragraphDirect);
|
|
21
|
+
if (hit) return hit;
|
|
22
|
+
const resolved = computeRunProperties(runDirect, paragraphDirect, sheet);
|
|
23
|
+
byRun.set(paragraphDirect, resolved);
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
function computeRunProperties(runDirect, paragraphDirect, sheet) {
|
|
9
27
|
let acc = mergeRun(DEFAULT_RESOLVED_RUN, sheet.defaultRunProperties);
|
|
10
28
|
if (paragraphDirect.styleId) {
|
|
11
29
|
const chain = resolveStyleChain(paragraphDirect.styleId, sheet);
|
|
@@ -17,7 +35,20 @@ function resolveRunProperties(runDirect, paragraphDirect, sheet) {
|
|
|
17
35
|
}
|
|
18
36
|
return mergeRun(acc, runDirect);
|
|
19
37
|
}
|
|
38
|
+
var paragraphCascadeCache = /* @__PURE__ */ new WeakMap();
|
|
20
39
|
function resolveParagraphProperties(paragraphDirect, sheet) {
|
|
40
|
+
let bySheet = paragraphCascadeCache.get(sheet);
|
|
41
|
+
if (!bySheet) {
|
|
42
|
+
bySheet = /* @__PURE__ */ new WeakMap();
|
|
43
|
+
paragraphCascadeCache.set(sheet, bySheet);
|
|
44
|
+
}
|
|
45
|
+
const hit = bySheet.get(paragraphDirect);
|
|
46
|
+
if (hit) return hit;
|
|
47
|
+
const resolved = computeParagraphProperties(paragraphDirect, sheet);
|
|
48
|
+
bySheet.set(paragraphDirect, resolved);
|
|
49
|
+
return resolved;
|
|
50
|
+
}
|
|
51
|
+
function computeParagraphProperties(paragraphDirect, sheet) {
|
|
21
52
|
let acc = mergePar(DEFAULT_RESOLVED_PARAGRAPH, sheet.defaultParagraphProperties);
|
|
22
53
|
if (paragraphDirect.styleId) {
|
|
23
54
|
const chain = resolveStyleChain(paragraphDirect.styleId, sheet);
|
|
@@ -68,6 +99,7 @@ function mergeRun(base, override) {
|
|
|
68
99
|
function mergePar(base, override) {
|
|
69
100
|
const outlineLevel = override.outlineLevel ?? base.outlineLevel;
|
|
70
101
|
const styleId = override.styleId ?? base.styleId;
|
|
102
|
+
const numbering = override.numbering ?? base.numbering;
|
|
71
103
|
return {
|
|
72
104
|
alignment: override.alignment ?? base.alignment,
|
|
73
105
|
spacingBefore: override.spacingBefore ?? base.spacingBefore,
|
|
@@ -80,7 +112,8 @@ function mergePar(base, override) {
|
|
|
80
112
|
pageBreakBefore: override.pageBreakBefore ?? base.pageBreakBefore,
|
|
81
113
|
bidi: override.bidi ?? base.bidi,
|
|
82
114
|
...outlineLevel !== void 0 ? { outlineLevel } : {},
|
|
83
|
-
...styleId !== void 0 ? { styleId } : {}
|
|
115
|
+
...styleId !== void 0 ? { styleId } : {},
|
|
116
|
+
...numbering !== void 0 ? { numbering } : {}
|
|
84
117
|
};
|
|
85
118
|
}
|
|
86
119
|
function mergeRunPartial(base, override) {
|
|
@@ -97,5 +130,45 @@ function copyDefined(base, override) {
|
|
|
97
130
|
}
|
|
98
131
|
return out;
|
|
99
132
|
}
|
|
133
|
+
function primeResolvedFixpoint(run, para) {
|
|
134
|
+
let bySheet = runCascadeCache.get(EMPTY_STYLE_SHEET);
|
|
135
|
+
if (!bySheet) {
|
|
136
|
+
bySheet = /* @__PURE__ */ new WeakMap();
|
|
137
|
+
runCascadeCache.set(EMPTY_STYLE_SHEET, bySheet);
|
|
138
|
+
}
|
|
139
|
+
let byRun = bySheet.get(run);
|
|
140
|
+
if (!byRun) {
|
|
141
|
+
byRun = /* @__PURE__ */ new WeakMap();
|
|
142
|
+
bySheet.set(run, byRun);
|
|
143
|
+
}
|
|
144
|
+
if (!byRun.has(para)) byRun.set(para, run);
|
|
145
|
+
}
|
|
146
|
+
function primeParagraphFixpoint(para) {
|
|
147
|
+
let bySheet = paragraphCascadeCache.get(EMPTY_STYLE_SHEET);
|
|
148
|
+
if (!bySheet) {
|
|
149
|
+
bySheet = /* @__PURE__ */ new WeakMap();
|
|
150
|
+
paragraphCascadeCache.set(EMPTY_STYLE_SHEET, bySheet);
|
|
151
|
+
}
|
|
152
|
+
if (!bySheet.has(para)) bySheet.set(para, para);
|
|
153
|
+
}
|
|
154
|
+
function resolveBodyStyles(body, sheet) {
|
|
155
|
+
const visitParagraph = (p) => {
|
|
156
|
+
for (const r of p.runs) r.properties = resolveRunProperties(r.properties, p.properties, sheet);
|
|
157
|
+
p.properties = resolveParagraphProperties(p.properties, sheet);
|
|
158
|
+
primeParagraphFixpoint(p.properties);
|
|
159
|
+
for (const r of p.runs) primeResolvedFixpoint(r.properties, p.properties);
|
|
160
|
+
};
|
|
161
|
+
const visit = (el) => {
|
|
162
|
+
if (el.kind === "paragraph") visitParagraph(el.paragraph);
|
|
163
|
+
else if (el.kind === "table") for (const row of el.table.rows) for (const cell of row.cells) for (const child of cell.content) visit(child);
|
|
164
|
+
else if (el.kind === "shape" && el.shape.text) for (const child of el.shape.text.content) visit(child);
|
|
165
|
+
};
|
|
166
|
+
for (const el of body) visit(el);
|
|
167
|
+
return body;
|
|
168
|
+
}
|
|
169
|
+
function resolveHeadersFootersStyles(hf, sheet) {
|
|
170
|
+
for (const value of hf.values()) resolveBodyStyles(value, sheet);
|
|
171
|
+
return hf;
|
|
172
|
+
}
|
|
100
173
|
//#endregion
|
|
101
|
-
export { EMPTY_STYLE_SHEET, resolveParagraphProperties, resolveRunProperties };
|
|
174
|
+
export { EMPTY_STYLE_SHEET, resolveBodyStyles, resolveHeadersFootersStyles, resolveParagraphProperties, resolveRunProperties };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Alignment, FontFamilyMap, UnderlineStyle, VerticalAlign } from '../document-model/index.js';
|
|
1
|
+
import { Alignment, FontFamilyMap, NumberingReference, UnderlineStyle, VerticalAlign } from '../document-model/index.js';
|
|
2
2
|
import { Pt } from '../ir/index.js';
|
|
3
3
|
export interface ResolvedRunProperties {
|
|
4
4
|
readonly bold: boolean;
|
|
@@ -25,6 +25,7 @@ export interface ResolvedParagraphProperties {
|
|
|
25
25
|
readonly bidi: boolean;
|
|
26
26
|
readonly outlineLevel?: number;
|
|
27
27
|
readonly styleId?: string;
|
|
28
|
+
readonly numbering?: NumberingReference;
|
|
28
29
|
}
|
|
29
30
|
export declare const DEFAULT_RESOLVED_RUN: ResolvedRunProperties;
|
|
30
31
|
export declare const DEFAULT_RESOLVED_PARAGRAPH: ResolvedParagraphProperties;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export type PathSegment = {
|
|
2
|
+
readonly op: 'move';
|
|
3
|
+
readonly x: number;
|
|
4
|
+
readonly y: number;
|
|
5
|
+
} | {
|
|
6
|
+
readonly op: 'line';
|
|
7
|
+
readonly x: number;
|
|
8
|
+
readonly y: number;
|
|
9
|
+
} | {
|
|
10
|
+
readonly op: 'cubic';
|
|
11
|
+
readonly x1: number;
|
|
12
|
+
readonly y1: number;
|
|
13
|
+
readonly x2: number;
|
|
14
|
+
readonly y2: number;
|
|
15
|
+
readonly x: number;
|
|
16
|
+
readonly y: number;
|
|
17
|
+
} | {
|
|
18
|
+
readonly op: 'close';
|
|
19
|
+
};
|
|
20
|
+
export interface VectorPath {
|
|
21
|
+
readonly segments: ReadonlyArray<PathSegment>;
|
|
22
|
+
readonly fillRule?: 'nonzero' | 'evenodd';
|
|
23
|
+
}
|
|
24
|
+
export interface StrokeStyle {
|
|
25
|
+
readonly colorHex: string;
|
|
26
|
+
readonly widthPt: number;
|
|
27
|
+
readonly cap?: 'butt' | 'round' | 'square';
|
|
28
|
+
readonly join?: 'miter' | 'round' | 'bevel';
|
|
29
|
+
readonly dash?: ReadonlyArray<number>;
|
|
30
|
+
}
|
|
31
|
+
export interface VectorShape {
|
|
32
|
+
readonly paths: ReadonlyArray<VectorPath>;
|
|
33
|
+
readonly fillColorHex?: string;
|
|
34
|
+
readonly stroke?: StrokeStyle;
|
|
35
|
+
readonly transform: readonly [number, number, number, number, number, number];
|
|
36
|
+
}
|
|
37
|
+
export declare class PathBuilder {
|
|
38
|
+
private readonly segments;
|
|
39
|
+
moveTo(x: number, y: number): this;
|
|
40
|
+
lineTo(x: number, y: number): this;
|
|
41
|
+
cubicTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this;
|
|
42
|
+
append(segments: ReadonlyArray<PathSegment>): this;
|
|
43
|
+
close(): this;
|
|
44
|
+
build(fillRule?: 'nonzero' | 'evenodd'): VectorPath;
|
|
45
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/core/vector.ts
|
|
2
|
+
var PathBuilder = class {
|
|
3
|
+
segments = [];
|
|
4
|
+
moveTo(x, y) {
|
|
5
|
+
this.segments.push({
|
|
6
|
+
op: "move",
|
|
7
|
+
x,
|
|
8
|
+
y
|
|
9
|
+
});
|
|
10
|
+
return this;
|
|
11
|
+
}
|
|
12
|
+
lineTo(x, y) {
|
|
13
|
+
this.segments.push({
|
|
14
|
+
op: "line",
|
|
15
|
+
x,
|
|
16
|
+
y
|
|
17
|
+
});
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
cubicTo(x1, y1, x2, y2, x, y) {
|
|
21
|
+
this.segments.push({
|
|
22
|
+
op: "cubic",
|
|
23
|
+
x1,
|
|
24
|
+
y1,
|
|
25
|
+
x2,
|
|
26
|
+
y2,
|
|
27
|
+
x,
|
|
28
|
+
y
|
|
29
|
+
});
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
append(segments) {
|
|
33
|
+
for (const s of segments) this.segments.push(s);
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
close() {
|
|
37
|
+
this.segments.push({ op: "close" });
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
build(fillRule) {
|
|
41
|
+
return {
|
|
42
|
+
segments: this.segments.slice(),
|
|
43
|
+
...fillRule ? { fillRule } : {}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { PathBuilder };
|
|
@@ -169,6 +169,25 @@ function worksheetToBody(worksheet, sharedStrings, styles, date1904, print) {
|
|
|
169
169
|
const scaled = printScale < .999;
|
|
170
170
|
const breakRows = new Set(worksheet.rowBreaks ?? []);
|
|
171
171
|
let textBudget = MAX_SHEET_TEXT_CHARS;
|
|
172
|
+
const runPropsByXf = /* @__PURE__ */ new Map();
|
|
173
|
+
const cellRunProps = (xf) => {
|
|
174
|
+
let props = runPropsByXf.get(xf);
|
|
175
|
+
if (props === void 0) {
|
|
176
|
+
const base = xf ? runPropsFromXf(xf, styles) : {};
|
|
177
|
+
props = scaled ? scaleRunFont(base, printScale) : base;
|
|
178
|
+
runPropsByXf.set(xf, props);
|
|
179
|
+
}
|
|
180
|
+
return props;
|
|
181
|
+
};
|
|
182
|
+
const paraPropsByAlignment = /* @__PURE__ */ new Map();
|
|
183
|
+
const cellParaProps = (alignment) => {
|
|
184
|
+
let props = paraPropsByAlignment.get(alignment);
|
|
185
|
+
if (props === void 0) {
|
|
186
|
+
props = alignment ? { alignment } : {};
|
|
187
|
+
paraPropsByAlignment.set(alignment, props);
|
|
188
|
+
}
|
|
189
|
+
return props;
|
|
190
|
+
};
|
|
172
191
|
const rows = [];
|
|
173
192
|
for (let r = 0; r < rowCount; r++) {
|
|
174
193
|
const absR = r + rowStart;
|
|
@@ -186,8 +205,7 @@ function worksheetToBody(worksheet, sharedStrings, styles, date1904, print) {
|
|
|
186
205
|
if (text.length > textBudget) text = text.slice(0, Math.max(0, textBudget));
|
|
187
206
|
textBudget -= text.length;
|
|
188
207
|
const xf = ws && ws.styleIndex !== void 0 ? styles.cellXfs[ws.styleIndex] : void 0;
|
|
189
|
-
const
|
|
190
|
-
const runProps = scaled ? scaleRunFont(baseRunProps, printScale) : baseRunProps;
|
|
208
|
+
const runProps = cellRunProps(xf);
|
|
191
209
|
const alignment = xf ? alignmentFromXf(xf) : void 0;
|
|
192
210
|
const shading = xf ? shadingFromXf(xf, styles) : void 0;
|
|
193
211
|
const borders = xf ? bordersFromXf(xf, styles) : void 0;
|
|
@@ -210,7 +228,7 @@ function worksheetToBody(worksheet, sharedStrings, styles, date1904, print) {
|
|
|
210
228
|
...shading ? { shading } : {},
|
|
211
229
|
...borders ? { borders } : {}
|
|
212
230
|
};
|
|
213
|
-
const paragraphProps = alignment
|
|
231
|
+
const paragraphProps = cellParaProps(alignment);
|
|
214
232
|
cells.push({
|
|
215
233
|
properties,
|
|
216
234
|
content: [{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResourceStore } from "../core/ir/resources.js";
|
|
2
2
|
import { FEATURES } from "../core/ir/features.js";
|
|
3
|
-
import { EMPTY_STYLE_SHEET } from "../core/style-cascade/resolver.js";
|
|
3
|
+
import { EMPTY_STYLE_SHEET, resolveBodyStyles } from "../core/style-cascade/resolver.js";
|
|
4
4
|
import "../core/style-cascade/index.js";
|
|
5
5
|
import { bytesInclude } from "../core/bytes.js";
|
|
6
6
|
import { OpcPackage } from "../core/opc/package.js";
|
|
@@ -59,7 +59,7 @@ function readXlsx(xlsx) {
|
|
|
59
59
|
return {
|
|
60
60
|
doc: {
|
|
61
61
|
kind: "flow",
|
|
62
|
-
body,
|
|
62
|
+
body: resolveBodyStyles(body, EMPTY_STYLE_SHEET),
|
|
63
63
|
sections: [],
|
|
64
64
|
...firstSheetSection ? { section: firstSheetSection } : {},
|
|
65
65
|
styles: EMPTY_STYLE_SHEET,
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -18,10 +18,10 @@ export { Ream } from './core/converter/ream.js';
|
|
|
18
18
|
export type { ReamConvertOptions, ReamParseOptions, ReamTarget } from './core/converter/ream.js';
|
|
19
19
|
export { createConverter } from './core/converter/facade.js';
|
|
20
20
|
export type { Converter, ConvertOptions, ConvertResult, CreateConverterOptions, } from './core/converter/facade.js';
|
|
21
|
-
export type { PageItem, PageItemBase, TextLineItem, BorderItem, FillItem, ImageItem, ShapeItem, LaidOutPage, } from './
|
|
21
|
+
export type { PageItem, PageItemBase, TextLineItem, BorderItem, FillItem, ImageItem, ShapeItem, LaidOutPage, } from './layout/page-doc.js';
|
|
22
22
|
export { chainProviders, callerFontProvider, embeddedDocFontProvider, remoteFontProvider, localFontProvider, readOs2FsType, isEmbeddingRestricted, NO_FONT, } from './core/fonts/provider.js';
|
|
23
23
|
export type { FontProvider, FontRequest, FontAnswer } from './core/fonts/provider.js';
|
|
24
24
|
export { svgWriter, writeSvg } from './svg/svg-writer.js';
|
|
25
25
|
export type { SvgWriteOptions } from './svg/svg-writer.js';
|
|
26
|
-
export { layoutStyledDocument } from './
|
|
27
|
-
export type { LaidOutDocument } from './
|
|
26
|
+
export { layoutStyledDocument } from './layout/styled-layout.js';
|
|
27
|
+
export type { LaidOutDocument } from './layout/page-doc.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -6,8 +6,9 @@ import { eighthPtToPt, emuToPt, halfPtToPt, inchToPt, mmToPt, pt, pxToPt, twipsT
|
|
|
6
6
|
import { ResourceStore } from "./core/ir/resources.js";
|
|
7
7
|
import { FEATURES } from "./core/ir/features.js";
|
|
8
8
|
import { ConversionLossError, formatLoss } from "./core/ir/loss.js";
|
|
9
|
+
import { layoutStyledDocument } from "./layout/styled-layout.js";
|
|
9
10
|
import { signPdf } from "./pdf/signature.js";
|
|
10
|
-
import {
|
|
11
|
+
import { renderStyledPdf } from "./pdf/styled-page-renderer.js";
|
|
11
12
|
import "./pdf/index.js";
|
|
12
13
|
import { createHyphenator, splitPatternBundle } from "./core/hyphenation/liang.js";
|
|
13
14
|
import { createLanguageHyphenator, getHyphenator } from "./core/hyphenation/index.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PathSegment } from '
|
|
1
|
+
import { PathSegment } from '../core/vector.js';
|
|
2
2
|
export declare function arcPoint(cx: number, cy: number, rx: number, ry: number, angleRad: number): readonly [number, number];
|
|
3
3
|
export declare function arcToBeziers(cx: number, cy: number, rx: number, ry: number, startAngleRad: number, sweepAngleRad: number): Array<PathSegment>;
|
|
4
4
|
export declare function ellipseSegments(w: number, h: number): ReadonlyArray<PathSegment>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PathBuilder } from "
|
|
2
|
-
//#region src/
|
|
1
|
+
import { PathBuilder } from "../core/vector.js";
|
|
2
|
+
//#region src/layout/arc-to-bezier.ts
|
|
3
3
|
function arcPoint(cx, cy, rx, ry, angleRad) {
|
|
4
4
|
return [cx + rx * Math.cos(angleRad), cy + ry * Math.sin(angleRad)];
|
|
5
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MathNode } from '../core/document-model/index.js';
|
|
2
|
-
import { PathSegment } from '
|
|
2
|
+
import { PathSegment } from '../core/vector.js';
|
|
3
3
|
export type MathVariant = 'regular' | 'italic' | 'bold' | 'boldItalic';
|
|
4
4
|
export interface MathGlyphItem {
|
|
5
5
|
readonly kind: 'glyph';
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Pt, ResourceId, ResourceStore } from '../core/ir/index.js';
|
|
2
|
+
import { FontMeasure, ParsedTtf } from '../core/font/index.js';
|
|
3
|
+
import { ResolvedParagraphProperties, ResolvedRunProperties } from '../core/style-cascade/index.js';
|
|
4
|
+
import { PathSegment, VectorShape } from '../core/vector.js';
|
|
5
|
+
import { PreparedImage } from '../core/images.js';
|
|
6
|
+
export interface FontResource {
|
|
7
|
+
readonly resourceName: string;
|
|
8
|
+
readonly parsed: ParsedTtf;
|
|
9
|
+
readonly measure: FontMeasure;
|
|
10
|
+
readonly gids: ReadonlySet<number>;
|
|
11
|
+
}
|
|
12
|
+
export interface TextToken {
|
|
13
|
+
readonly kind: 'text';
|
|
14
|
+
readonly text: string;
|
|
15
|
+
readonly isSpace: boolean;
|
|
16
|
+
readonly resolvedRun: ResolvedRunProperties;
|
|
17
|
+
readonly font: FontResource;
|
|
18
|
+
readonly fontSizePt: number;
|
|
19
|
+
readonly widthPt: number;
|
|
20
|
+
readonly bidiLevel: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ImageToken {
|
|
23
|
+
readonly kind: 'image';
|
|
24
|
+
readonly imageResourceName: string;
|
|
25
|
+
readonly widthPt: number;
|
|
26
|
+
readonly heightPt: number;
|
|
27
|
+
readonly isSpace: false;
|
|
28
|
+
readonly bidiLevel: number;
|
|
29
|
+
}
|
|
30
|
+
export type ResolvedMathItem = {
|
|
31
|
+
readonly kind: 'glyph';
|
|
32
|
+
readonly x: number;
|
|
33
|
+
readonly y: number;
|
|
34
|
+
readonly text: string;
|
|
35
|
+
readonly font: FontResource;
|
|
36
|
+
readonly sizePt: number;
|
|
37
|
+
} | {
|
|
38
|
+
readonly kind: 'rule';
|
|
39
|
+
readonly x: number;
|
|
40
|
+
readonly y: number;
|
|
41
|
+
readonly w: number;
|
|
42
|
+
readonly h: number;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'path';
|
|
45
|
+
readonly segments: ReadonlyArray<PathSegment>;
|
|
46
|
+
readonly strokeWidthPt?: number;
|
|
47
|
+
readonly fill?: boolean;
|
|
48
|
+
};
|
|
49
|
+
export interface MathToken {
|
|
50
|
+
readonly kind: 'math';
|
|
51
|
+
readonly items: ReadonlyArray<ResolvedMathItem>;
|
|
52
|
+
readonly widthPt: number;
|
|
53
|
+
readonly ascentPt: number;
|
|
54
|
+
readonly descentPt: number;
|
|
55
|
+
readonly isSpace: false;
|
|
56
|
+
readonly bidiLevel: number;
|
|
57
|
+
}
|
|
58
|
+
export type Token = TextToken | ImageToken | MathToken;
|
|
59
|
+
export interface Line {
|
|
60
|
+
readonly tokens: ReadonlyArray<Token>;
|
|
61
|
+
readonly contentWidthPt: number;
|
|
62
|
+
readonly maxFontSizePt: number;
|
|
63
|
+
readonly availableWidthPt: number;
|
|
64
|
+
readonly firstLine: boolean;
|
|
65
|
+
readonly resolved: ResolvedParagraphProperties;
|
|
66
|
+
isLastInParagraph: boolean;
|
|
67
|
+
readonly mathAscentPt?: number;
|
|
68
|
+
readonly mathDescentPt?: number;
|
|
69
|
+
}
|
|
70
|
+
export interface ImageResource {
|
|
71
|
+
readonly resourceName: string;
|
|
72
|
+
readonly prepared: PreparedImage;
|
|
73
|
+
}
|
|
74
|
+
export interface PageItemBase {
|
|
75
|
+
readonly structId?: number;
|
|
76
|
+
readonly artifact?: 'pagination';
|
|
77
|
+
}
|
|
78
|
+
export interface TextLineItem extends PageItemBase {
|
|
79
|
+
readonly type: 'line';
|
|
80
|
+
readonly line: Line;
|
|
81
|
+
readonly originX: Pt;
|
|
82
|
+
readonly baselineY: Pt;
|
|
83
|
+
}
|
|
84
|
+
export interface BorderItem extends PageItemBase {
|
|
85
|
+
readonly type: 'border';
|
|
86
|
+
readonly side: 'top' | 'right' | 'bottom' | 'left';
|
|
87
|
+
readonly x: Pt;
|
|
88
|
+
readonly y: Pt;
|
|
89
|
+
readonly width: Pt;
|
|
90
|
+
readonly height: Pt;
|
|
91
|
+
readonly borderSizePt: number;
|
|
92
|
+
readonly borderColorHex: string;
|
|
93
|
+
}
|
|
94
|
+
export interface FillItem extends PageItemBase {
|
|
95
|
+
readonly type: 'fill';
|
|
96
|
+
readonly x: Pt;
|
|
97
|
+
readonly y: Pt;
|
|
98
|
+
readonly width: Pt;
|
|
99
|
+
readonly height: Pt;
|
|
100
|
+
readonly fillColorHex: string;
|
|
101
|
+
}
|
|
102
|
+
export interface ImageItem extends PageItemBase {
|
|
103
|
+
readonly type: 'image';
|
|
104
|
+
readonly x: Pt;
|
|
105
|
+
readonly y: Pt;
|
|
106
|
+
readonly width: Pt;
|
|
107
|
+
readonly height: Pt;
|
|
108
|
+
readonly imageResourceName: string;
|
|
109
|
+
}
|
|
110
|
+
export interface ShapeItem extends PageItemBase {
|
|
111
|
+
readonly type: 'shape';
|
|
112
|
+
readonly shape: VectorShape;
|
|
113
|
+
}
|
|
114
|
+
export type PageItem = TextLineItem | BorderItem | FillItem | ImageItem | ShapeItem;
|
|
115
|
+
export interface PagePaintPlan {
|
|
116
|
+
readonly fills: ReadonlyArray<FillItem>;
|
|
117
|
+
readonly images: ReadonlyArray<ImageItem>;
|
|
118
|
+
readonly borders: ReadonlyArray<BorderItem>;
|
|
119
|
+
readonly shapes: ReadonlyArray<ShapeItem>;
|
|
120
|
+
readonly lines: ReadonlyArray<TextLineItem>;
|
|
121
|
+
}
|
|
122
|
+
export declare function paintPlan(commands: ReadonlyArray<PageItem>): PagePaintPlan;
|
|
123
|
+
export interface LaidOutDocument {
|
|
124
|
+
readonly pages: ReadonlyArray<LaidOutPage>;
|
|
125
|
+
readonly resources: ResourceStore;
|
|
126
|
+
readonly fontResources: Map<string, FontResource>;
|
|
127
|
+
readonly imageResources: Map<ResourceId, ImageResource>;
|
|
128
|
+
}
|
|
129
|
+
export interface LaidOutPage {
|
|
130
|
+
readonly commands: Array<PageItem>;
|
|
131
|
+
readonly width: Pt;
|
|
132
|
+
readonly height: Pt;
|
|
133
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/layout/page-doc.ts
|
|
2
|
+
function paintPlan(commands) {
|
|
3
|
+
const fills = [];
|
|
4
|
+
const images = [];
|
|
5
|
+
const borders = [];
|
|
6
|
+
const shapes = [];
|
|
7
|
+
const lines = [];
|
|
8
|
+
for (const c of commands) switch (c.type) {
|
|
9
|
+
case "fill":
|
|
10
|
+
fills.push(c);
|
|
11
|
+
break;
|
|
12
|
+
case "image":
|
|
13
|
+
images.push(c);
|
|
14
|
+
break;
|
|
15
|
+
case "border":
|
|
16
|
+
borders.push(c);
|
|
17
|
+
break;
|
|
18
|
+
case "shape":
|
|
19
|
+
shapes.push(c);
|
|
20
|
+
break;
|
|
21
|
+
case "line":
|
|
22
|
+
lines.push(c);
|
|
23
|
+
break;
|
|
24
|
+
default: assertNeverPageItem(c);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
fills,
|
|
28
|
+
images,
|
|
29
|
+
borders,
|
|
30
|
+
shapes,
|
|
31
|
+
lines
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function assertNeverPageItem(item) {
|
|
35
|
+
throw new Error(`Unhandled PageItem kind: ${String(item.type)}`);
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { paintPlan };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CustomGeometry } from '../core/document-model/index.js';
|
|
2
|
-
import { PathSegment, VectorPath } from '
|
|
2
|
+
import { PathSegment, VectorPath } from '../core/vector.js';
|
|
3
3
|
export declare function rectSegments(w: number, h: number): ReadonlyArray<PathSegment>;
|
|
4
4
|
export declare function rectPath(w: number, h: number): VectorPath;
|
|
5
5
|
export declare function presetPaths(preset: string, w: number, h: number, adjust: ReadonlyMap<string, number>): Array<VectorPath> | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PathBuilder } from "
|
|
1
|
+
import { PathBuilder } from "../core/vector.js";
|
|
2
2
|
import { arcToBeziers, ellipseSegments, roundRectSegments } from "./arc-to-bezier.js";
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/layout/preset-geometry.ts
|
|
4
4
|
function rectSegments(w, h) {
|
|
5
5
|
return new PathBuilder().moveTo(0, 0).lineTo(w, 0).lineTo(w, h).lineTo(0, h).close().build().segments;
|
|
6
6
|
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { BodyElement, Chart, DocumentInfo, Numbering, Section, SectionProperties, StyleSheet } from '../core/document-model/index.js';
|
|
2
|
+
import { FontRegistry } from '../core/font/index.js';
|
|
3
|
+
import { FamilyKey } from '../core/fonts/index.js';
|
|
4
|
+
import { Hyphenator } from '../core/hyphenation/index.js';
|
|
5
|
+
import { LaidOutDocument, PageItem } from './page-doc.js';
|
|
6
|
+
import { AttachedFile } from '../pdf/embedded-file.js';
|
|
7
|
+
import { SignaturePlaceholder } from '../pdf/signature.js';
|
|
8
|
+
import { ResourceStore } from '../core/ir/index.js';
|
|
9
|
+
import { StructTreeBuilder } from '../pdf/struct-tree.js';
|
|
10
|
+
export type PdfALevel = 'PDF/A-1b' | 'PDF/A-1a' | 'PDF/A-2b' | 'PDF/A-2u' | 'PDF/A-2a' | 'PDF/A-3b' | 'PDF/A-3u' | 'PDF/A-3a';
|
|
11
|
+
export interface PdfAProfile {
|
|
12
|
+
readonly part: 1 | 2 | 3;
|
|
13
|
+
readonly level: 'a' | 'b' | 'u';
|
|
14
|
+
readonly tagged: boolean;
|
|
15
|
+
readonly version: '1.4' | '1.7';
|
|
16
|
+
}
|
|
17
|
+
export interface StyledRenderOptions {
|
|
18
|
+
readonly registry: FontRegistry;
|
|
19
|
+
readonly registriesByFamily?: ReadonlyMap<FamilyKey, FontRegistry>;
|
|
20
|
+
readonly embeddedFonts?: ReadonlyMap<string, FontRegistry>;
|
|
21
|
+
readonly styles: StyleSheet;
|
|
22
|
+
readonly numbering?: Numbering;
|
|
23
|
+
readonly section?: SectionProperties;
|
|
24
|
+
readonly sections?: ReadonlyArray<Section>;
|
|
25
|
+
readonly headersFooters?: ReadonlyMap<string, ReadonlyArray<BodyElement>>;
|
|
26
|
+
readonly resources?: ResourceStore;
|
|
27
|
+
readonly charts?: ReadonlyMap<string, Chart>;
|
|
28
|
+
readonly pageWidth?: number;
|
|
29
|
+
readonly pageHeight?: number;
|
|
30
|
+
readonly marginLeft?: number;
|
|
31
|
+
readonly marginRight?: number;
|
|
32
|
+
readonly marginTop?: number;
|
|
33
|
+
readonly marginBottom?: number;
|
|
34
|
+
readonly hyphenator?: Hyphenator;
|
|
35
|
+
readonly info?: DocumentInfo;
|
|
36
|
+
readonly pdfA?: PdfALevel;
|
|
37
|
+
readonly tagged?: boolean;
|
|
38
|
+
readonly language?: string;
|
|
39
|
+
readonly attachments?: ReadonlyArray<AttachedFile>;
|
|
40
|
+
readonly signaturePlaceholder?: SignaturePlaceholder;
|
|
41
|
+
}
|
|
42
|
+
export type { DocumentInfo } from '../core/document-model/index.js';
|
|
43
|
+
export declare const A4_WIDTH = 595;
|
|
44
|
+
export declare const A4_HEIGHT = 842;
|
|
45
|
+
export interface PdfLayoutAux {
|
|
46
|
+
readonly structBuilder: StructTreeBuilder | undefined;
|
|
47
|
+
readonly sectionCtxs: ReadonlyArray<SectionRenderCtx>;
|
|
48
|
+
readonly pdfaProfile: PdfAProfile | undefined;
|
|
49
|
+
readonly tagged: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface LaidOutPdfDocument extends LaidOutDocument {
|
|
52
|
+
readonly pdf: PdfLayoutAux;
|
|
53
|
+
}
|
|
54
|
+
export declare function layoutStyledDocument(body: ReadonlyArray<BodyElement>, options: StyledRenderOptions): LaidOutPdfDocument;
|
|
55
|
+
export interface PageDimensions {
|
|
56
|
+
readonly pageWidth: number;
|
|
57
|
+
readonly pageHeight: number;
|
|
58
|
+
readonly marginLeft: number;
|
|
59
|
+
readonly marginRight: number;
|
|
60
|
+
readonly marginTop: number;
|
|
61
|
+
readonly marginBottom: number;
|
|
62
|
+
readonly headerOffsetPt: number;
|
|
63
|
+
readonly footerOffsetPt: number;
|
|
64
|
+
}
|
|
65
|
+
export interface SectionRenderCtx {
|
|
66
|
+
readonly endIndex: number;
|
|
67
|
+
readonly properties: SectionProperties;
|
|
68
|
+
readonly pageWidth: number;
|
|
69
|
+
readonly pageHeight: number;
|
|
70
|
+
readonly marginLeft: number;
|
|
71
|
+
readonly marginTop: number;
|
|
72
|
+
readonly marginBottom: number;
|
|
73
|
+
readonly contentWidth: number;
|
|
74
|
+
readonly pageContentHeight: number;
|
|
75
|
+
readonly headerSet: HeaderFooterSet;
|
|
76
|
+
readonly footerSet: HeaderFooterSet;
|
|
77
|
+
readonly titlePg: boolean;
|
|
78
|
+
readonly evenAndOddHeaders: boolean;
|
|
79
|
+
}
|
|
80
|
+
interface HeaderFooterSet {
|
|
81
|
+
readonly default: Array<PageItem>;
|
|
82
|
+
readonly first: Array<PageItem>;
|
|
83
|
+
readonly even: Array<PageItem>;
|
|
84
|
+
}
|