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.
Files changed (58) hide show
  1. package/README.md +4 -3
  2. package/dist/esm/core/bidi/index.d.ts +2 -0
  3. package/dist/esm/core/bidi/index.js +1 -0
  4. package/dist/esm/core/bidi/segments.d.ts +6 -0
  5. package/dist/esm/core/bidi/segments.js +41 -0
  6. package/dist/esm/core/converter/facade.js +1 -1
  7. package/dist/esm/core/converter/project.js +3 -2
  8. package/dist/esm/core/converter/ream.js +2 -1
  9. package/dist/esm/core/font/index.d.ts +2 -0
  10. package/dist/esm/core/font/measure.d.ts +7 -0
  11. package/dist/esm/core/font/measure.js +30 -0
  12. package/dist/esm/core/images.d.ts +17 -0
  13. package/dist/esm/core/images.js +308 -0
  14. package/dist/esm/core/line-breaker/index.d.ts +1 -1
  15. package/dist/esm/core/line-breaker/knuth-plass.d.ts +1 -0
  16. package/dist/esm/core/line-breaker/knuth-plass.js +2 -2
  17. package/dist/esm/core/numbering/apply.d.ts +3 -0
  18. package/dist/esm/core/numbering/apply.js +62 -0
  19. package/dist/esm/core/numbering/index.d.ts +1 -0
  20. package/dist/esm/core/opc/package.d.ts +2 -1
  21. package/dist/esm/core/opc/package.js +6 -2
  22. package/dist/esm/core/style-cascade/index.d.ts +1 -1
  23. package/dist/esm/core/style-cascade/resolver.d.ts +3 -1
  24. package/dist/esm/core/style-cascade/resolver.js +75 -2
  25. package/dist/esm/core/style-cascade/types.d.ts +2 -1
  26. package/dist/esm/core/vector.d.ts +45 -0
  27. package/dist/esm/core/vector.js +48 -0
  28. package/dist/esm/excel/print-model.js +21 -3
  29. package/dist/esm/excel/xlsx-reader.js +2 -2
  30. package/dist/esm/index.d.ts +3 -3
  31. package/dist/esm/index.js +2 -1
  32. package/dist/esm/{pdf → layout}/arc-to-bezier.d.ts +1 -1
  33. package/dist/esm/{pdf → layout}/arc-to-bezier.js +2 -2
  34. package/dist/esm/{pdf → layout}/math-layout.d.ts +1 -1
  35. package/dist/esm/{pdf → layout}/math-layout.js +1 -1
  36. package/dist/esm/layout/page-doc.d.ts +133 -0
  37. package/dist/esm/layout/page-doc.js +38 -0
  38. package/dist/esm/{pdf → layout}/preset-geometry.d.ts +1 -1
  39. package/dist/esm/{pdf → layout}/preset-geometry.js +2 -2
  40. package/dist/esm/layout/styled-layout.d.ts +84 -0
  41. package/dist/esm/layout/styled-layout.js +1729 -0
  42. package/dist/esm/pdf/cid-font.d.ts +0 -6
  43. package/dist/esm/pdf/cid-font.js +2 -28
  44. package/dist/esm/pdf/image-xobject.d.ts +3 -17
  45. package/dist/esm/pdf/image-xobject.js +2 -306
  46. package/dist/esm/pdf/index.js +1 -0
  47. package/dist/esm/pdf/styled-page-emitter.d.ts +8 -2
  48. package/dist/esm/pdf/styled-page-emitter.js +29 -14
  49. package/dist/esm/pdf/styled-page-renderer.d.ts +4 -217
  50. package/dist/esm/pdf/styled-page-renderer.js +3 -1824
  51. package/dist/esm/pdf/vector-graphics.d.ts +3 -45
  52. package/dist/esm/pdf/vector-graphics.js +2 -46
  53. package/dist/esm/svg/svg-writer.d.ts +1 -1
  54. package/dist/esm/svg/svg-writer.js +14 -15
  55. package/dist/esm/word/docx-reader.js +4 -3
  56. package/package.json +2 -2
  57. /package/dist/esm/{pdf → layout}/chart-geometry.d.ts +0 -0
  58. /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 baseRunProps = xf ? runPropsFromXf(xf, styles) : {};
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 ? { 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,
@@ -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 './pdf/styled-page-renderer.js';
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 './pdf/styled-page-renderer.js';
27
- export type { LaidOutDocument } from './pdf/styled-page-renderer.js';
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 { layoutStyledDocument, renderStyledPdf } from "./pdf/styled-page-renderer.js";
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 './vector-graphics.js';
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 "./vector-graphics.js";
2
- //#region src/pdf/arc-to-bezier.ts
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 './vector-graphics.js';
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';
@@ -1,4 +1,4 @@
1
- //#region src/pdf/math-layout.ts
1
+ //#region src/layout/math-layout.ts
2
2
  var ASCENT = .72;
3
3
  var DESCENT = .2;
4
4
  var AXIS = .26;
@@ -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 './vector-graphics.js';
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 "./vector-graphics.js";
1
+ import { PathBuilder } from "../core/vector.js";
2
2
  import { arcToBeziers, ellipseSegments, roundRectSegments } from "./arc-to-bezier.js";
3
- //#region src/pdf/preset-geometry.ts
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
+ }