postext 0.1.2 → 0.1.4
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/dist/__tests__/exports.test.js +34 -2
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/canvas-backend.d.ts +5 -0
- package/dist/canvas-backend.d.ts.map +1 -0
- package/dist/canvas-backend.js +156 -0
- package/dist/canvas-backend.js.map +1 -0
- package/dist/createLayout.d.ts +2 -2
- package/dist/createLayout.d.ts.map +1 -1
- package/dist/createLayout.js +25 -2
- package/dist/createLayout.js.map +1 -1
- package/dist/defaults.d.ts +23 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +387 -0
- package/dist/defaults.js.map +1 -0
- package/dist/hyphenate.d.ts +11 -0
- package/dist/hyphenate.d.ts.map +1 -0
- package/dist/hyphenate.js +140 -0
- package/dist/hyphenate.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/measure.d.ts +40 -0
- package/dist/measure.d.ts.map +1 -0
- package/dist/measure.js +267 -0
- package/dist/measure.js.map +1 -0
- package/dist/parse.d.ts +17 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +152 -0
- package/dist/parse.js.map +1 -0
- package/dist/pipeline.d.ts +4 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +324 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/types.d.ts +131 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/units.d.ts +9 -0
- package/dist/units.d.ts.map +1 -0
- package/dist/units.js +27 -0
- package/dist/units.js.map +1 -0
- package/dist/vdt.d.ts +83 -0
- package/dist/vdt.d.ts.map +1 -0
- package/dist/vdt.js +50 -0
- package/dist/vdt.js.map +1 -0
- package/package.json +4 -1
|
@@ -7,8 +7,40 @@ describe("package exports", () => {
|
|
|
7
7
|
});
|
|
8
8
|
it("does not export unexpected values", () => {
|
|
9
9
|
const exportedKeys = Object.keys(postext);
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
expect(exportedKeys).toEqual([
|
|
11
|
+
"createLayout",
|
|
12
|
+
"buildDocument",
|
|
13
|
+
"renderToCanvas",
|
|
14
|
+
"renderPage",
|
|
15
|
+
"renderPageToCanvas",
|
|
16
|
+
"dimensionToPx",
|
|
17
|
+
"buildFontString",
|
|
18
|
+
"measureBlock",
|
|
19
|
+
"measureRichBlock",
|
|
20
|
+
"initHyphenator",
|
|
21
|
+
"clearMeasurementCache",
|
|
22
|
+
"hyphenateText",
|
|
23
|
+
"setHyphenationLocale",
|
|
24
|
+
"parseMarkdown",
|
|
25
|
+
"DEFAULT_PAGE_CONFIG",
|
|
26
|
+
"PAGE_SIZE_PRESETS",
|
|
27
|
+
"resolvePageConfig",
|
|
28
|
+
"DEFAULT_LAYOUT_CONFIG",
|
|
29
|
+
"resolveLayoutConfig",
|
|
30
|
+
"stripLayoutDefaults",
|
|
31
|
+
"DEFAULT_BODY_TEXT_CONFIG",
|
|
32
|
+
"DEFAULT_HYPHENATION_CONFIG",
|
|
33
|
+
"resolveBodyTextConfig",
|
|
34
|
+
"stripBodyTextDefaults",
|
|
35
|
+
"hyphenationEqual",
|
|
36
|
+
"DEFAULT_HEADINGS_CONFIG",
|
|
37
|
+
"resolveHeadingsConfig",
|
|
38
|
+
"stripHeadingsDefaults",
|
|
39
|
+
"dimensionsEqual",
|
|
40
|
+
"colorsEqual",
|
|
41
|
+
"stripPageDefaults",
|
|
42
|
+
"stripConfigDefaults",
|
|
43
|
+
]);
|
|
12
44
|
});
|
|
13
45
|
});
|
|
14
46
|
//# sourceMappingURL=exports.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,UAAU,CAAC;AAEpC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,
|
|
1
|
+
{"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,UAAU,CAAC;AAEpC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YAC3B,cAAc;YACd,eAAe;YACf,gBAAgB;YAChB,YAAY;YACZ,oBAAoB;YACpB,eAAe;YACf,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,gBAAgB;YAChB,uBAAuB;YACvB,eAAe;YACf,sBAAsB;YACtB,eAAe;YACf,qBAAqB;YACrB,mBAAmB;YACnB,mBAAmB;YACnB,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B;YAC5B,uBAAuB;YACvB,uBAAuB;YACvB,kBAAkB;YAClB,yBAAyB;YACzB,uBAAuB;YACvB,uBAAuB;YACvB,iBAAiB;YACjB,aAAa;YACb,mBAAmB;YACnB,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { VDTDocument, VDTPage } from './vdt';
|
|
2
|
+
export declare function renderPageToCanvas(page: VDTPage, doc: VDTDocument, canvas: HTMLCanvasElement): void;
|
|
3
|
+
export declare function renderPage(page: VDTPage, doc: VDTDocument): HTMLCanvasElement;
|
|
4
|
+
export declare function renderToCanvas(doc: VDTDocument): HTMLCanvasElement[];
|
|
5
|
+
//# sourceMappingURL=canvas-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-backend.d.ts","sourceRoot":"","sources":["../src/canvas-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAkC,MAAM,OAAO,CAAC;AAwIlF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAqDN;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,GACf,iBAAiB,CAInB;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAEpE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { dimensionToPx } from './units';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Baseline grid overlay
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
function renderBaselineGrid(ctx, contentArea, baselineIncrement, color, lineWidth) {
|
|
6
|
+
ctx.save();
|
|
7
|
+
ctx.strokeStyle = color;
|
|
8
|
+
ctx.lineWidth = lineWidth;
|
|
9
|
+
// Draw one baseline per line that actually fits in the content area.
|
|
10
|
+
// Must match the placement logic: Math.floor(height / lineHeight) lines.
|
|
11
|
+
const maxLines = Math.floor(contentArea.height / baselineIncrement);
|
|
12
|
+
let y = contentArea.y + baselineIncrement * 0.8;
|
|
13
|
+
const right = contentArea.x + contentArea.width;
|
|
14
|
+
for (let i = 0; i < maxLines; i++) {
|
|
15
|
+
ctx.beginPath();
|
|
16
|
+
ctx.moveTo(contentArea.x, y);
|
|
17
|
+
ctx.lineTo(right, y);
|
|
18
|
+
ctx.stroke();
|
|
19
|
+
y += baselineIncrement;
|
|
20
|
+
}
|
|
21
|
+
ctx.restore();
|
|
22
|
+
}
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Text rendering
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function renderLine(ctx, line, font, boldFont, color, textAlign, columnWidth) {
|
|
27
|
+
ctx.fillStyle = color;
|
|
28
|
+
ctx.textBaseline = 'alphabetic';
|
|
29
|
+
const hasBoldSegments = boldFont && line.segments && line.segments.some((s) => s.bold);
|
|
30
|
+
// Justified rendering with per-segment spacing
|
|
31
|
+
if (textAlign === 'justify' && !line.isLastLine && line.segments && line.segments.length > 0) {
|
|
32
|
+
let wordWidth = 0;
|
|
33
|
+
let spaceCount = 0;
|
|
34
|
+
for (const seg of line.segments) {
|
|
35
|
+
if (seg.kind === 'space')
|
|
36
|
+
spaceCount++;
|
|
37
|
+
else
|
|
38
|
+
wordWidth += seg.width;
|
|
39
|
+
}
|
|
40
|
+
if (spaceCount > 0) {
|
|
41
|
+
const justifiedSpaceWidth = (columnWidth - wordWidth) / spaceCount;
|
|
42
|
+
let x = line.bbox.x;
|
|
43
|
+
for (const seg of line.segments) {
|
|
44
|
+
if (seg.kind === 'space') {
|
|
45
|
+
x += justifiedSpaceWidth;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
ctx.font = seg.bold && boldFont ? boldFont : font;
|
|
49
|
+
ctx.fillText(seg.text, x, line.baseline);
|
|
50
|
+
x += seg.width;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Ragged (left-aligned) rendering — also used for last lines of justified blocks
|
|
57
|
+
// If there are bold segments, render per-segment to apply correct fonts
|
|
58
|
+
if (hasBoldSegments && line.segments) {
|
|
59
|
+
let x = line.bbox.x;
|
|
60
|
+
for (const seg of line.segments) {
|
|
61
|
+
if (seg.kind === 'space') {
|
|
62
|
+
x += seg.width;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
ctx.font = seg.bold && boldFont ? boldFont : font;
|
|
66
|
+
ctx.fillText(seg.text, x, line.baseline);
|
|
67
|
+
x += seg.width;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
ctx.font = font;
|
|
73
|
+
ctx.fillText(line.text, line.bbox.x, line.baseline);
|
|
74
|
+
}
|
|
75
|
+
function renderBlock(ctx, block, columnWidth) {
|
|
76
|
+
for (const line of block.lines) {
|
|
77
|
+
renderLine(ctx, line, block.fontString, block.boldFontString, block.color, block.textAlign, columnWidth);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Page rendering
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
function computeContentArea(page, doc) {
|
|
84
|
+
const { dpi, margins } = doc.config.page;
|
|
85
|
+
// We can derive content area from page dimensions and margins
|
|
86
|
+
// (same logic as pipeline, but we recalculate from resolved config)
|
|
87
|
+
const pxPerCm = dpi / 2.54;
|
|
88
|
+
const marginTop = margins.top.unit === 'cm' ? margins.top.value * pxPerCm : margins.top.value;
|
|
89
|
+
const marginLeft = margins.left.unit === 'cm' ? margins.left.value * pxPerCm : margins.left.value;
|
|
90
|
+
// Use the first column's bbox to infer content area bounds
|
|
91
|
+
if (page.columns.length > 0) {
|
|
92
|
+
const firstCol = page.columns[0];
|
|
93
|
+
const lastCol = page.columns[page.columns.length - 1];
|
|
94
|
+
return {
|
|
95
|
+
x: firstCol.bbox.x,
|
|
96
|
+
y: firstCol.bbox.y,
|
|
97
|
+
width: (lastCol.bbox.x + lastCol.bbox.width) - firstCol.bbox.x,
|
|
98
|
+
height: firstCol.bbox.height,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { x: marginLeft, y: marginTop, width: 0, height: 0 };
|
|
102
|
+
}
|
|
103
|
+
export function renderPageToCanvas(page, doc, canvas) {
|
|
104
|
+
canvas.width = Math.round(page.width);
|
|
105
|
+
canvas.height = Math.round(page.height);
|
|
106
|
+
const ctx = canvas.getContext('2d');
|
|
107
|
+
if (!ctx)
|
|
108
|
+
return;
|
|
109
|
+
// Background
|
|
110
|
+
const bgColor = doc.config.page.backgroundColor.hex;
|
|
111
|
+
if (bgColor && bgColor !== 'transparent') {
|
|
112
|
+
ctx.fillStyle = bgColor;
|
|
113
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
ctx.fillStyle = '#ffffff';
|
|
117
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
118
|
+
}
|
|
119
|
+
// Baseline grid overlay
|
|
120
|
+
if (doc.config.page.baselineGrid.enabled) {
|
|
121
|
+
const contentArea = computeContentArea(page, doc);
|
|
122
|
+
const isLastPage = page.index === doc.pages.length - 1;
|
|
123
|
+
// On non-last pages, limit the grid to the height actually used by
|
|
124
|
+
// placed blocks so that no "phantom" baselines appear at the bottom
|
|
125
|
+
// when the split / orphan-control algorithm leaves unused space.
|
|
126
|
+
if (!isLastPage && page.columns.length > 0) {
|
|
127
|
+
const maxUsed = Math.max(...page.columns.map((col) => col.bbox.height - col.availableHeight));
|
|
128
|
+
contentArea.height = maxUsed;
|
|
129
|
+
}
|
|
130
|
+
const gridLineWidthPx = dimensionToPx(doc.config.page.baselineGrid.lineWidth, doc.config.page.dpi);
|
|
131
|
+
renderBaselineGrid(ctx, contentArea, doc.baselineGrid, doc.config.page.baselineGrid.color.hex, gridLineWidthPx);
|
|
132
|
+
}
|
|
133
|
+
// Render all blocks (clip to column bounds to prevent overflow)
|
|
134
|
+
for (const col of page.columns) {
|
|
135
|
+
ctx.save();
|
|
136
|
+
ctx.beginPath();
|
|
137
|
+
ctx.rect(col.bbox.x, col.bbox.y, col.bbox.width, col.bbox.height);
|
|
138
|
+
ctx.clip();
|
|
139
|
+
for (const block of col.blocks) {
|
|
140
|
+
renderBlock(ctx, block, col.bbox.width);
|
|
141
|
+
}
|
|
142
|
+
ctx.restore();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function renderPage(page, doc) {
|
|
146
|
+
const canvas = document.createElement('canvas');
|
|
147
|
+
renderPageToCanvas(page, doc, canvas);
|
|
148
|
+
return canvas;
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Public API
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
export function renderToCanvas(doc) {
|
|
154
|
+
return doc.pages.map((page) => renderPage(page, doc));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=canvas-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-backend.js","sourceRoot":"","sources":["../src/canvas-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/createLayout.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type FC } from 'react';
|
|
2
2
|
import type { PostextContent, PostextConfig } from './types';
|
|
3
|
-
export declare function createLayout(
|
|
3
|
+
export declare function createLayout(content: PostextContent, config?: PostextConfig): FC;
|
|
4
4
|
//# sourceMappingURL=createLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLayout.d.ts","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"createLayout.d.ts","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAqB,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,GACrB,EAAE,CA6BJ"}
|
package/dist/createLayout.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { buildDocument } from './pipeline';
|
|
3
|
+
import { renderToCanvas } from './canvas-backend';
|
|
4
|
+
export function createLayout(content, config) {
|
|
5
|
+
const Layout = () => {
|
|
6
|
+
const containerRef = useRef(null);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const container = containerRef.current;
|
|
9
|
+
if (!container)
|
|
10
|
+
return;
|
|
11
|
+
const doc = buildDocument(content, config);
|
|
12
|
+
const pages = renderToCanvas(doc);
|
|
13
|
+
// Clear previous content
|
|
14
|
+
container.innerHTML = '';
|
|
15
|
+
// Display all pages
|
|
16
|
+
for (const canvas of pages) {
|
|
17
|
+
canvas.style.width = '100%';
|
|
18
|
+
canvas.style.height = 'auto';
|
|
19
|
+
canvas.style.display = 'block';
|
|
20
|
+
canvas.style.marginBottom = '16px';
|
|
21
|
+
container.appendChild(canvas);
|
|
22
|
+
}
|
|
23
|
+
}, []);
|
|
24
|
+
return null;
|
|
25
|
+
};
|
|
3
26
|
Layout.displayName = 'PostextLayout';
|
|
4
27
|
return Layout;
|
|
5
28
|
}
|
package/dist/createLayout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLayout.js","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createLayout.js","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,YAAY,CAC1B,OAAuB,EACvB,MAAsB;IAEtB,MAAM,MAAM,GAAO,GAAG,EAAE;QACtB,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;QAElD,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAElC,yBAAyB;YACzB,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;YAEzB,oBAAoB;YACpB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;gBACnC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PageConfig, ResolvedPageConfig, PageSizePreset, Dimension, PostextConfig, LayoutConfig, ResolvedLayoutConfig, BodyTextConfig, ResolvedBodyTextConfig, HeadingsConfig, ResolvedHeadingsConfig, ColorValue, HyphenationConfig } from './types';
|
|
2
|
+
export declare const PAGE_SIZE_PRESETS: Record<Exclude<PageSizePreset, 'custom'>, {
|
|
3
|
+
width: Dimension;
|
|
4
|
+
height: Dimension;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const DEFAULT_PAGE_CONFIG: ResolvedPageConfig;
|
|
7
|
+
export declare function dimensionsEqual(a: Dimension, b: Dimension): boolean;
|
|
8
|
+
export declare function colorsEqual(a: ColorValue, b: ColorValue): boolean;
|
|
9
|
+
export declare function stripPageDefaults(page?: PageConfig): PageConfig | undefined;
|
|
10
|
+
export declare const DEFAULT_LAYOUT_CONFIG: ResolvedLayoutConfig;
|
|
11
|
+
export declare function stripLayoutDefaults(layout?: LayoutConfig): LayoutConfig | undefined;
|
|
12
|
+
export declare const DEFAULT_HYPHENATION_CONFIG: ResolvedBodyTextConfig['hyphenation'];
|
|
13
|
+
export declare const DEFAULT_BODY_TEXT_CONFIG: ResolvedBodyTextConfig;
|
|
14
|
+
export declare function hyphenationEqual(a: HyphenationConfig | undefined, b: HyphenationConfig | undefined): boolean;
|
|
15
|
+
export declare function stripBodyTextDefaults(bodyText?: BodyTextConfig): BodyTextConfig | undefined;
|
|
16
|
+
export declare const DEFAULT_HEADINGS_CONFIG: ResolvedHeadingsConfig;
|
|
17
|
+
export declare function stripHeadingsDefaults(headings?: HeadingsConfig): HeadingsConfig | undefined;
|
|
18
|
+
export declare function stripConfigDefaults(config: PostextConfig): PostextConfig;
|
|
19
|
+
export declare function resolvePageConfig(partial?: PageConfig): ResolvedPageConfig;
|
|
20
|
+
export declare function resolveLayoutConfig(partial?: LayoutConfig): ResolvedLayoutConfig;
|
|
21
|
+
export declare function resolveBodyTextConfig(partial?: BodyTextConfig): ResolvedBodyTextConfig;
|
|
22
|
+
export declare function resolveHeadingsConfig(partial?: HeadingsConfig): ResolvedHeadingsConfig;
|
|
23
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAe,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,sBAAsB,EAAE,cAAc,EAAsB,sBAAsB,EAA8B,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExT,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,EACjC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAMxC,CAAC;AASF,eAAO,MAAM,mBAAmB,EAAE,kBASjC,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAEnE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CA2D3E;AAED,eAAO,MAAM,qBAAqB,EAAE,oBAInC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAoBnF;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAAsB,CAAC,aAAa,CAG5E,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,sBAStC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAK5G;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAwC3F;AAkBD,eAAO,MAAM,uBAAuB,EAAE,sBASrC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CA8E3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CA2BxE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,kBAAkB,CA0B1E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,oBAAoB,CAQhF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAgBtF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,sBAAsB,CA0BtF"}
|