postext 0.3.39 → 0.3.40
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/__bench__/chapter.bench.test.d.ts +2 -0
- package/dist/__bench__/chapter.bench.test.d.ts.map +1 -0
- package/dist/__bench__/chapter.bench.test.js +80 -0
- package/dist/__bench__/chapter.bench.test.js.map +1 -0
- package/dist/__tests__/buildAsync.test.d.ts +2 -0
- package/dist/__tests__/buildAsync.test.d.ts.map +1 -0
- package/dist/__tests__/buildAsync.test.js +50 -0
- package/dist/__tests__/buildAsync.test.js.map +1 -0
- package/dist/__tests__/hyphenateMemo.test.d.ts +2 -0
- package/dist/__tests__/hyphenateMemo.test.d.ts.map +1 -0
- package/dist/__tests__/hyphenateMemo.test.js +21 -0
- package/dist/__tests__/hyphenateMemo.test.js.map +1 -0
- package/dist/__tests__/knuthPlassMerge.test.d.ts +2 -0
- package/dist/__tests__/knuthPlassMerge.test.d.ts.map +1 -0
- package/dist/__tests__/knuthPlassMerge.test.js +55 -0
- package/dist/__tests__/knuthPlassMerge.test.js.map +1 -0
- package/dist/__tests__/memos.test.d.ts +2 -0
- package/dist/__tests__/memos.test.d.ts.map +1 -0
- package/dist/__tests__/memos.test.js +37 -0
- package/dist/__tests__/memos.test.js.map +1 -0
- package/dist/canvas-backend/index.d.ts +5 -0
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +7 -4
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/hyphenate.d.ts.map +1 -1
- package/dist/hyphenate.js +50 -1
- package/dist/hyphenate.js.map +1 -1
- package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
- package/dist/knuthPlass/breakpoints.js +7 -1
- package/dist/knuthPlass/breakpoints.js.map +1 -1
- package/dist/knuthPlass/types.d.ts +8 -0
- package/dist/knuthPlass/types.d.ts.map +1 -1
- package/dist/measure/plain.d.ts.map +1 -1
- package/dist/measure/plain.js +1 -0
- package/dist/measure/plain.js.map +1 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +1 -0
- package/dist/measure/rich.js.map +1 -1
- package/dist/parse/blockParser.d.ts +5 -3
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +32 -21
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/pipeline/bandCaps.d.ts +16 -0
- package/dist/pipeline/bandCaps.d.ts.map +1 -1
- package/dist/pipeline/bandCaps.js +22 -0
- package/dist/pipeline/bandCaps.js.map +1 -1
- package/dist/pipeline/build.d.ts +33 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +63 -12
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +18 -0
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/index.d.ts +2 -2
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +1 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/worker/client.d.ts +18 -2
- package/dist/worker/client.d.ts.map +1 -1
- package/dist/worker/client.js +28 -3
- package/dist/worker/client.js.map +1 -1
- package/dist/worker/layout.worker.js +135 -56
- package/dist/worker/layout.worker.js.map +1 -1
- package/dist/worker/protocol.d.ts +27 -2
- package/dist/worker/protocol.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapter.bench.test.d.ts","sourceRoot":"","sources":["../../src/__bench__/chapter.bench.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout cost of one textbook-sized chapter, cold (empty measurement cache)
|
|
3
|
+
* and warm (second build against the same cache), with the pass count.
|
|
4
|
+
* Skipped by `pnpm test`; run with `pnpm bench` (BENCH=1).
|
|
5
|
+
*
|
|
6
|
+
* Text measurement is stubbed (no canvas in node), so absolute numbers are
|
|
7
|
+
* not the browser's — but the cold/warm ratio and the pass count are, and
|
|
8
|
+
* a regression in either shows up here before it shows up in the sandbox.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it } from 'vitest';
|
|
11
|
+
import { buildDocument } from '../pipeline/build';
|
|
12
|
+
import { createMeasurementCache } from '../measure';
|
|
13
|
+
class StubCtx {
|
|
14
|
+
font = '';
|
|
15
|
+
measureText(s) {
|
|
16
|
+
let w = 0;
|
|
17
|
+
for (let i = 0; i < s.length; i++)
|
|
18
|
+
w += s.charCodeAt(i) % 5 + 5;
|
|
19
|
+
return { width: w };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
globalThis.OffscreenCanvas = class {
|
|
23
|
+
getContext() {
|
|
24
|
+
return new StubCtx();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const SENTENCES = [
|
|
28
|
+
'La terapia ocupacional interviene sobre las actividades de la vida diaria, el juego y la participación social de la persona.',
|
|
29
|
+
'El **razonamiento clínico** combina la evaluación estandarizada con la observación directa del desempeño en el entorno real.',
|
|
30
|
+
'Los marcos de referencia *biomecánico*, *rehabilitador* y *neurodesarrollo* orientan la elección de productos de apoyo.',
|
|
31
|
+
'Una férula de reposo mantiene la articulación en posición funcional y reduce el dolor durante los brotes inflamatorios.',
|
|
32
|
+
'La prevención primaria actúa antes de la aparición de la enfermedad; la secundaria busca el diagnóstico precoz.',
|
|
33
|
+
];
|
|
34
|
+
function paragraph(seed, sentences) {
|
|
35
|
+
const out = [];
|
|
36
|
+
for (let i = 0; i < sentences; i++)
|
|
37
|
+
out.push(SENTENCES[(seed + i) % SENTENCES.length]);
|
|
38
|
+
return out.join(' ');
|
|
39
|
+
}
|
|
40
|
+
/** A long chapter in the default two-column A4: headings, mixed paragraphs, lists. */
|
|
41
|
+
function chapterMarkdown() {
|
|
42
|
+
const parts = ['# Programas de intervención en geriatría', '', paragraph(0, 5), ''];
|
|
43
|
+
for (let i = 1; i <= 40; i++) {
|
|
44
|
+
parts.push(`## Sección ${i}`, '', paragraph(i, 6), '', paragraph(i + 2, 4), '');
|
|
45
|
+
parts.push(`### Detalle ${i}`, '', paragraph(i + 1, 5), '');
|
|
46
|
+
parts.push('- Valoración inicial de la persona y de su entorno.', '- Objetivos consensuados con la persona y la familia.', '- Reevaluación periódica del plan de intervención.', '');
|
|
47
|
+
parts.push(paragraph(i + 3, 3), '');
|
|
48
|
+
}
|
|
49
|
+
return parts.join('\n');
|
|
50
|
+
}
|
|
51
|
+
const markdown = chapterMarkdown();
|
|
52
|
+
const config = { bodyText: { hyphenation: { locale: 'es' } } };
|
|
53
|
+
// No node typings in this package: reach the environment through globalThis.
|
|
54
|
+
const nodeProcess = globalThis.process;
|
|
55
|
+
describe.skipIf(!nodeProcess?.env?.BENCH)('chapter layout bench', () => {
|
|
56
|
+
const ROUNDS = 5;
|
|
57
|
+
const median = (xs) => xs.slice().sort((a, b) => a - b)[Math.floor(xs.length / 2)];
|
|
58
|
+
const time = (fn) => {
|
|
59
|
+
const t0 = performance.now();
|
|
60
|
+
fn();
|
|
61
|
+
return performance.now() - t0;
|
|
62
|
+
};
|
|
63
|
+
it('reports cold / warm build time and passes', { timeout: 300_000 }, () => {
|
|
64
|
+
const cold = [];
|
|
65
|
+
for (let i = 0; i < ROUNDS; i++)
|
|
66
|
+
cold.push(time(() => buildDocument({ markdown }, config, createMeasurementCache())));
|
|
67
|
+
const warmCache = createMeasurementCache();
|
|
68
|
+
buildDocument({ markdown }, config, warmCache);
|
|
69
|
+
const warm = [];
|
|
70
|
+
for (let i = 0; i < ROUNDS; i++)
|
|
71
|
+
warm.push(time(() => buildDocument({ markdown }, config, warmCache)));
|
|
72
|
+
const passes = [];
|
|
73
|
+
const doc = buildDocument({ markdown }, config, createMeasurementCache(), { onPass: (p) => passes.push(p) });
|
|
74
|
+
const passMs = passes.map((p) => Math.round(p.ms)).join('/');
|
|
75
|
+
// Written to the process stream: vitest hides console output of passing tests.
|
|
76
|
+
nodeProcess?.stdout.write(`[bench] chapter: ${doc.pages.length} pages, ${passes.length} passes (${passMs} ms), iterationCount=${doc.iterationCount}; `
|
|
77
|
+
+ `cold median ${Math.round(median(cold))} ms, warm median ${Math.round(median(warm))} ms (${ROUNDS} rounds)\n`);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=chapter.bench.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapter.bench.test.js","sourceRoot":"","sources":["../../src/__bench__/chapter.bench.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildAsync.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/buildAsync.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument, buildDocumentAsync, BuildCancelledError } from '../pipeline/build';
|
|
3
|
+
import { createMeasurementCache } from '../measure';
|
|
4
|
+
class StubCtx {
|
|
5
|
+
font = '';
|
|
6
|
+
measureText(s) {
|
|
7
|
+
return { width: s.length * 7 };
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
globalThis.OffscreenCanvas = class {
|
|
11
|
+
getContext() {
|
|
12
|
+
return new StubCtx();
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const SENTENCE = 'La composición tipográfica editorial exige columnas alineadas, rejilla base estable y márgenes consistentes. ';
|
|
16
|
+
function markdown() {
|
|
17
|
+
const parts = ['# Documento', '', SENTENCE.repeat(6)];
|
|
18
|
+
for (let i = 1; i <= 6; i++)
|
|
19
|
+
parts.push('', `## Sección ${i}`, '', SENTENCE.repeat(5), '', SENTENCE.repeat(4));
|
|
20
|
+
return parts.join('\n');
|
|
21
|
+
}
|
|
22
|
+
const config = { headings: { balancing: { enabled: true } } };
|
|
23
|
+
describe('buildDocumentAsync', () => {
|
|
24
|
+
it('produces the same document as the synchronous build', async () => {
|
|
25
|
+
const sync = buildDocument({ markdown: markdown() }, config, createMeasurementCache());
|
|
26
|
+
const passes = [];
|
|
27
|
+
let yields = 0;
|
|
28
|
+
const async = await buildDocumentAsync({ markdown: markdown() }, config, createMeasurementCache(), {
|
|
29
|
+
onPass: (p) => passes.push(p),
|
|
30
|
+
yieldBetweenPasses: async () => { yields++; },
|
|
31
|
+
});
|
|
32
|
+
expect(async.pages.length).toBe(sync.pages.length);
|
|
33
|
+
expect(async.iterationCount).toBe(sync.iterationCount);
|
|
34
|
+
expect(passes.length).toBe(sync.iterationCount);
|
|
35
|
+
// One turn of the event loop after every pass.
|
|
36
|
+
expect(yields).toBe(passes.length);
|
|
37
|
+
});
|
|
38
|
+
it('stops at the next pass boundary once cancelled', async () => {
|
|
39
|
+
const passes = [];
|
|
40
|
+
let cancelled = false;
|
|
41
|
+
await expect(buildDocumentAsync({ markdown: markdown() }, config, createMeasurementCache(), {
|
|
42
|
+
onPass: (p) => { passes.push(p); if (passes.length === 2)
|
|
43
|
+
cancelled = true; },
|
|
44
|
+
shouldCancel: () => cancelled,
|
|
45
|
+
yieldBetweenPasses: async () => { },
|
|
46
|
+
})).rejects.toBeInstanceOf(BuildCancelledError);
|
|
47
|
+
expect(passes.length).toBe(2);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=buildAsync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildAsync.test.js","sourceRoot":"","sources":["../../src/__tests__/buildAsync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyphenateMemo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hyphenateMemo.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import Hypher from 'hypher';
|
|
3
|
+
import es from 'hyphenation.es';
|
|
4
|
+
import { hyphenateText } from '../hyphenate';
|
|
5
|
+
describe('hyphenateText', () => {
|
|
6
|
+
it('matches the dictionary applied to the whole text', () => {
|
|
7
|
+
const reference = new Hypher(es);
|
|
8
|
+
const texts = [
|
|
9
|
+
'La composición tipográfica editorial exige columnas alineadas y márgenes consistentes.',
|
|
10
|
+
'Reevaluación periódica\tdel plan; intervención (geriátrica) — enseñanza-aprendizaje.',
|
|
11
|
+
'Visita https://ejemplo.org/ruta/larga y a/b y termina/',
|
|
12
|
+
' espacios al principio y al final ',
|
|
13
|
+
];
|
|
14
|
+
for (const text of texts) {
|
|
15
|
+
expect(hyphenateText(text, 'es')).toBe(reference.hyphenateText(text));
|
|
16
|
+
// Second call: from the memo.
|
|
17
|
+
expect(hyphenateText(text, 'es')).toBe(reference.hyphenateText(text));
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=hyphenateMemo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyphenateMemo.test.js","sourceRoot":"","sources":["../../src/__tests__/hyphenateMemo.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG;YACZ,wFAAwF;YACxF,wFAAwF;YACxF,wDAAwD;YACxD,sCAAsC;SACvC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,8BAA8B;YAC9B,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knuthPlassMerge.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/knuthPlassMerge.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { computeBreakpoints } from '../knuthPlass/breakpoints';
|
|
3
|
+
import { KP_INFINITY, MAX_STRETCH, HYPHEN_PENALTY } from '../knuthPlass/constants';
|
|
4
|
+
/** Deterministic pseudo-random paragraphs: words of varying width, some
|
|
5
|
+
* with a discretionary hyphen, glue between them, the closing glue and
|
|
6
|
+
* forced break. */
|
|
7
|
+
function paragraph(seed, words) {
|
|
8
|
+
let x = seed;
|
|
9
|
+
const rnd = () => { x = (x * 1103515245 + 12345) & 0x7fffffff; return x / 0x7fffffff; };
|
|
10
|
+
const items = [];
|
|
11
|
+
for (let w = 0; w < words; w++) {
|
|
12
|
+
const width = 20 + Math.floor(rnd() * 60);
|
|
13
|
+
if (rnd() < 0.3) {
|
|
14
|
+
const head = Math.floor(width * (0.3 + rnd() * 0.4));
|
|
15
|
+
items.push({ type: 'box', width: head, sourceIndex: w });
|
|
16
|
+
items.push({ type: 'penalty', width: 6, penalty: HYPHEN_PENALTY, flagged: true, sourceIndex: w });
|
|
17
|
+
items.push({ type: 'box', width: width - head, sourceIndex: w });
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
items.push({ type: 'box', width, sourceIndex: w });
|
|
21
|
+
}
|
|
22
|
+
if (w < words - 1)
|
|
23
|
+
items.push({ type: 'glue', width: 8, stretch: 4, shrink: 2, sourceIndex: w });
|
|
24
|
+
}
|
|
25
|
+
items.push({ type: 'glue', width: 0, stretch: MAX_STRETCH, shrink: 0, sourceIndex: -1 });
|
|
26
|
+
items.push({ type: 'penalty', width: 0, penalty: -KP_INFINITY, flagged: false, sourceIndex: -1 });
|
|
27
|
+
return items;
|
|
28
|
+
}
|
|
29
|
+
const baseOptions = (indent, runt) => ({
|
|
30
|
+
lineWidth: (line) => (line === 0 ? 300 - indent : 300),
|
|
31
|
+
normalSpaceWidth: 8,
|
|
32
|
+
maxStretchRatio: 1.5,
|
|
33
|
+
minShrinkRatio: 0.75,
|
|
34
|
+
runtPenalty: runt ? 300 : 0,
|
|
35
|
+
runtMinWidth: runt ? 40 : 0,
|
|
36
|
+
});
|
|
37
|
+
describe('computeBreakpoints with lineWidthUniformFrom', () => {
|
|
38
|
+
it('chooses the same breaks as the unmerged search', () => {
|
|
39
|
+
for (let seed = 1; seed <= 120; seed++) {
|
|
40
|
+
const items = paragraph(seed, 12 + (seed % 90));
|
|
41
|
+
const options = baseOptions(seed % 3 === 0 ? 0 : 24, seed % 2 === 0);
|
|
42
|
+
const plain = computeBreakpoints(items, options);
|
|
43
|
+
const merged = computeBreakpoints(items, { ...options, lineWidthUniformFrom: 1 });
|
|
44
|
+
expect(merged).toEqual(plain);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('keeps every line count apart while a looseness target is set', () => {
|
|
48
|
+
for (let seed = 1; seed <= 40; seed++) {
|
|
49
|
+
const items = paragraph(seed, 30 + seed);
|
|
50
|
+
const options = { ...baseOptions(24, false), looseness: 1 };
|
|
51
|
+
expect(computeBreakpoints(items, { ...options, lineWidthUniformFrom: 1 })).toEqual(computeBreakpoints(items, options));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=knuthPlassMerge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knuthPlassMerge.test.js","sourceRoot":"","sources":["../../src/__tests__/knuthPlassMerge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memos.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memos.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseMarkdownMemo, parseMarkdownWithIssuesMemo, PARSE_MEMO_CAPACITY } from '../parse/blockParser';
|
|
3
|
+
import { resolveAllConfig } from '../pipeline/config';
|
|
4
|
+
describe('parseMarkdownMemo', () => {
|
|
5
|
+
it('returns the same blocks for the same input', () => {
|
|
6
|
+
const md = '# Title\n\nA paragraph.\n';
|
|
7
|
+
expect(parseMarkdownMemo(md)).toBe(parseMarkdownMemo(md));
|
|
8
|
+
expect(parseMarkdownWithIssuesMemo(md).blocks).toBe(parseMarkdownMemo(md));
|
|
9
|
+
});
|
|
10
|
+
it('keeps the last few inputs, so interleaved chapters do not re-parse', () => {
|
|
11
|
+
const a = parseMarkdownMemo('# A\n\nalpha\n');
|
|
12
|
+
const b = parseMarkdownMemo('# B\n\nbeta\n');
|
|
13
|
+
expect(parseMarkdownMemo('# A\n\nalpha\n')).toBe(a);
|
|
14
|
+
expect(parseMarkdownMemo('# B\n\nbeta\n')).toBe(b);
|
|
15
|
+
});
|
|
16
|
+
it('evicts the least recently used input past its capacity', () => {
|
|
17
|
+
const first = parseMarkdownMemo('# first\n');
|
|
18
|
+
for (let i = 0; i < PARSE_MEMO_CAPACITY; i++)
|
|
19
|
+
parseMarkdownMemo(`# filler ${i}\n`);
|
|
20
|
+
expect(parseMarkdownMemo('# first\n')).not.toBe(first);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('resolveAllConfig', () => {
|
|
24
|
+
it('resolves a config object once', () => {
|
|
25
|
+
const config = { bodyText: { textAlign: 'left' } };
|
|
26
|
+
expect(resolveAllConfig(config)).toBe(resolveAllConfig(config));
|
|
27
|
+
expect(resolveAllConfig(undefined)).toBe(resolveAllConfig(undefined));
|
|
28
|
+
});
|
|
29
|
+
it('resolves distinct objects separately', () => {
|
|
30
|
+
const a = resolveAllConfig({ bodyText: { textAlign: 'left' } });
|
|
31
|
+
const b = resolveAllConfig({ bodyText: { textAlign: 'justify' } });
|
|
32
|
+
expect(a).not.toBe(b);
|
|
33
|
+
expect(a.bodyText.textAlign).toBe('left');
|
|
34
|
+
expect(b.bodyText.textAlign).toBe('justify');
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=memos.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memos.test.js","sourceRoot":"","sources":["../../src/__tests__/memos.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,EAAE,GAAG,2BAA2B,CAAC;QACvC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE;YAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAkB,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;QAClE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -3,6 +3,11 @@ export { registerResourceImage, unregisterResourceImage, clearResourceImages, ge
|
|
|
3
3
|
export type { ResourceImageSource, RegisterResourceImageOptions } from './renderResourceBlock';
|
|
4
4
|
export interface RenderPageOptions {
|
|
5
5
|
pageNegative?: boolean;
|
|
6
|
+
/** Bitmap pixels per page pixel (1 = the page's own resolution, the
|
|
7
|
+
* document's dpi). A page shown smaller than its size is painted at the
|
|
8
|
+
* size it is shown, times the device pixel ratio: fewer pixels to fill
|
|
9
|
+
* and to keep. The drawing itself stays in page pixels. */
|
|
10
|
+
scale?: number;
|
|
6
11
|
}
|
|
7
12
|
export declare function renderPageToCanvas(page: VDTPage, doc: VDTDocument, canvas: HTMLCanvasElement, options?: RenderPageOptions): void;
|
|
8
13
|
export declare function renderPage(page: VDTPage, doc: VDTDocument): HTMLCanvasElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMnD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas-backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMnD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;gEAG4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CAqGN;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,iBAAiB,CAI7E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAEpE"}
|
|
@@ -5,22 +5,25 @@ import { renderBlock } from './blockRender';
|
|
|
5
5
|
import { renderHeaderFooterSlot } from './headerFooter';
|
|
6
6
|
export { registerResourceImage, unregisterResourceImage, clearResourceImages, getResourceImage, } from './renderResourceBlock';
|
|
7
7
|
export function renderPageToCanvas(page, doc, canvas, options) {
|
|
8
|
-
|
|
9
|
-
canvas.
|
|
8
|
+
const scale = options?.scale && options.scale > 0 ? options.scale : 1;
|
|
9
|
+
canvas.width = Math.max(1, Math.round(page.width * scale));
|
|
10
|
+
canvas.height = Math.max(1, Math.round(page.height * scale));
|
|
10
11
|
const ctx = canvas.getContext('2d');
|
|
11
12
|
if (!ctx)
|
|
12
13
|
return;
|
|
14
|
+
if (scale !== 1)
|
|
15
|
+
ctx.scale(scale, scale);
|
|
13
16
|
if (options?.pageNegative) {
|
|
14
17
|
ctx.filter = 'invert(1)';
|
|
15
18
|
}
|
|
16
19
|
const bgColor = doc.config.page.backgroundColor.hex;
|
|
17
20
|
const trimOff = doc.trimOffset;
|
|
18
21
|
ctx.fillStyle = '#ffffff';
|
|
19
|
-
ctx.fillRect(0, 0,
|
|
22
|
+
ctx.fillRect(0, 0, page.width, page.height);
|
|
20
23
|
if (bgColor && bgColor !== 'transparent') {
|
|
21
24
|
const bleedPx = trimOff > 0 ? dimensionToPx(doc.config.page.cutLines.bleed, doc.config.page.dpi) : 0;
|
|
22
25
|
ctx.fillStyle = bgColor;
|
|
23
|
-
ctx.fillRect(trimOff - bleedPx, trimOff - bleedPx,
|
|
26
|
+
ctx.fillRect(trimOff - bleedPx, trimOff - bleedPx, page.width - (trimOff - bleedPx) * 2, page.height - (trimOff - bleedPx) * 2);
|
|
24
27
|
}
|
|
25
28
|
if (doc.config.page.baselineGrid.enabled) {
|
|
26
29
|
// Bound the grid to the page's actual text: from the first text line to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canvas-backend/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canvas-backend/index.ts"],"names":[],"mappings":"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"}
|
package/dist/hyphenate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyphenate.d.ts","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA0BjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEpE;
|
|
1
|
+
{"version":3,"file":"hyphenate.d.ts","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA0BjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEpE;AAiBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA4B9E"}
|
package/dist/hyphenate.js
CHANGED
|
@@ -30,11 +30,60 @@ let currentLocale = 'en-us';
|
|
|
30
30
|
export function setHyphenationLocale(locale) {
|
|
31
31
|
currentLocale = locale;
|
|
32
32
|
}
|
|
33
|
+
/** Hyphenated form of each whitespace-delimited token, per locale. The
|
|
34
|
+
* same words come back in every paragraph, every pass and every chapter
|
|
35
|
+
* of a book; the trie walk is not cheap and its result never changes. */
|
|
36
|
+
const WORD_MEMO_SLOTS = 50_000;
|
|
37
|
+
const wordMemo = new Map();
|
|
38
|
+
function memoFor(locale) {
|
|
39
|
+
let m = wordMemo.get(locale);
|
|
40
|
+
if (!m) {
|
|
41
|
+
m = new Map();
|
|
42
|
+
wordMemo.set(locale, m);
|
|
43
|
+
}
|
|
44
|
+
return m;
|
|
45
|
+
}
|
|
33
46
|
/**
|
|
34
47
|
* Hyphenate a full text string by inserting soft hyphens at syllable boundaries
|
|
35
48
|
* using TeX/Liang patterns for the active locale.
|
|
36
49
|
*/
|
|
37
50
|
export function hyphenateText(text, locale) {
|
|
38
|
-
|
|
51
|
+
const loc = locale ?? currentLocale;
|
|
52
|
+
const hyphenator = getHyphenator(loc);
|
|
53
|
+
const memo = memoFor(loc);
|
|
54
|
+
// Token by token: whitespace never joins a word, so hyphenating the
|
|
55
|
+
// tokens one at a time gives the text the dictionary would.
|
|
56
|
+
let out = '';
|
|
57
|
+
let i = 0;
|
|
58
|
+
const n = text.length;
|
|
59
|
+
while (i < n) {
|
|
60
|
+
let j = i;
|
|
61
|
+
if (isSpace(text.charCodeAt(j))) {
|
|
62
|
+
while (j < n && isSpace(text.charCodeAt(j)))
|
|
63
|
+
j++;
|
|
64
|
+
out += text.slice(i, j);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
while (j < n && !isSpace(text.charCodeAt(j)))
|
|
68
|
+
j++;
|
|
69
|
+
const word = text.slice(i, j);
|
|
70
|
+
let hyphenated = memo.get(word);
|
|
71
|
+
if (hyphenated === undefined) {
|
|
72
|
+
hyphenated = hyphenator.hyphenateText(word);
|
|
73
|
+
if (memo.size >= WORD_MEMO_SLOTS)
|
|
74
|
+
memo.clear();
|
|
75
|
+
memo.set(word, hyphenated);
|
|
76
|
+
}
|
|
77
|
+
out += hyphenated;
|
|
78
|
+
}
|
|
79
|
+
i = j;
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function isSpace(code) {
|
|
84
|
+
// The whitespace `\s` matches, as the tokenisers split on it.
|
|
85
|
+
return code === 0x20 || (code >= 0x09 && code <= 0x0d) || code === 0xa0 || code === 0x1680
|
|
86
|
+
|| (code >= 0x2000 && code <= 0x200a) || code === 0x2028 || code === 0x2029 || code === 0x202f
|
|
87
|
+
|| code === 0x205f || code === 0x3000 || code === 0xfeff;
|
|
39
88
|
}
|
|
40
89
|
//# sourceMappingURL=hyphenate.js.map
|
package/dist/hyphenate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyphenate.js","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"AAAA,OAAO,MAAoC,MAAM,QAAQ,CAAC;AAC1D,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGhC,MAAM,QAAQ,GAAmD;IAC/D,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEvD,SAAS,aAAa,CAAC,MAAyB;IAC9C,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,aAAa,GAAsB,OAAO,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAA0B;IACpE,
|
|
1
|
+
{"version":3,"file":"hyphenate.js","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../../src/knuthPlass/breakpoints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAyD5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../../src/knuthPlass/breakpoints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAa,MAAM,SAAS,CAAC;AAyD5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,GAAG,MAAM,EAAE,CAyQhF"}
|
|
@@ -31,6 +31,10 @@ function chainWithinStretchLimit(node) {
|
|
|
31
31
|
export function computeBreakpoints(items, options) {
|
|
32
32
|
const { lineWidth, consecutiveHyphenDemerit = DEFAULT_CONSECUTIVE_HYPHEN_DEMERIT, fitnessClassDemerit = DEFAULT_FITNESS_CLASS_DEMERIT, runtPenalty = 0, runtMinWidth = 0, } = options;
|
|
33
33
|
const terminalBreakPosition = items.length - 1;
|
|
34
|
+
// Merge nodes by fitness class alone once the line width is uniform: the
|
|
35
|
+
// line count only matters for `lineWidth(line)` (and for a looseness
|
|
36
|
+
// target, which needs every count kept apart).
|
|
37
|
+
const uniformFrom = (options.looseness ?? 0) > 0 ? undefined : options.lineWidthUniformFrom;
|
|
34
38
|
// Prefix sums over box/glue widths and glue stretch/shrink.
|
|
35
39
|
// sumWidthAt has length items.length + 1: sumWidthAt[k] covers items 0..k-1,
|
|
36
40
|
// so a penalty at position i (which adds no width) satisfies
|
|
@@ -164,7 +168,9 @@ export function computeBreakpoints(items, options) {
|
|
|
164
168
|
d += fitnessClassDemerit;
|
|
165
169
|
}
|
|
166
170
|
const totalDemerits = a.totalDemerits + d;
|
|
167
|
-
|
|
171
|
+
// Keys of merged nodes (fc alone, 0–3) never collide with the
|
|
172
|
+
// per-line keys, which start at 4.
|
|
173
|
+
const key = uniformFrom !== undefined && a.line + 1 >= uniformFrom ? fc : (a.line + 1) * 4 + fc;
|
|
168
174
|
const existing = bestNewNodeByKey.get(key);
|
|
169
175
|
if (existing && existing.totalDemerits <= totalDemerits) {
|
|
170
176
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../../src/knuthPlass/breakpoints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,WAAW,EACX,kCAAkC,EAClC,6BAA6B,EAC7B,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAyBrB,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC,GAAG,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC,QAAQ;IAChC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC,CAAE,SAAS;IACjC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,CAAC,CAAC,CAAE,QAAQ;IAChC,OAAO,CAAC,CAAC,CAAgB,aAAa;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAClC,CAAC;AAED;;;;oBAIoB;AACpB,SAAS,uBAAuB,CAAC,IAAgB;IAC/C,KAAK,IAAI,CAAC,GAAsB,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpF,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAe,EAAE,OAAkB;IACpE,MAAM,EACJ,SAAS,EACT,wBAAwB,GAAG,kCAAkC,EAC7D,mBAAmB,GAAG,6BAA6B,EACnD,WAAW,GAAG,CAAC,EACf,YAAY,GAAG,CAAC,GACjB,GAAG,OAAO,CAAC;IACZ,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../../src/knuthPlass/breakpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,14 @@ export interface KPOptions {
|
|
|
50
50
|
* natural solution otherwise. Only positive values are supported.
|
|
51
51
|
* Default 0 (off). */
|
|
52
52
|
looseness?: number;
|
|
53
|
+
/** The line index from which `lineWidth` no longer varies (1 when only
|
|
54
|
+
* the first line is indented, 0 when no line is). Lets the DP merge
|
|
55
|
+
* active nodes that differ only in their line count: from that line on
|
|
56
|
+
* two nodes at the same break with the same fitness class face the same
|
|
57
|
+
* future, so the cheaper one dominates — without it the set of active
|
|
58
|
+
* nodes grows with the paragraph and the search goes quadratic. Ignored
|
|
59
|
+
* while `looseness` asks for an exact line count. */
|
|
60
|
+
lineWidthUniformFrom?: number;
|
|
53
61
|
}
|
|
54
62
|
export interface RichTokenMeta {
|
|
55
63
|
bold: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/knuthPlass/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAMhD,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;uEAImE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;qEACiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;2BAKuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/knuthPlass/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAMhD,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;uEAImE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;qEACiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;2BAKuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;0DAMsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yDACqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain.d.ts","sourceRoot":"","sources":["../../src/measure/plain.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAQ1C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AA2DlE,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EAAE,EAC1B,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,OAAO,GAClB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,aAAa,
|
|
1
|
+
{"version":3,"file":"plain.d.ts","sourceRoot":"","sources":["../../src/measure/plain.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAQ1C,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AA2DlE,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EAAE,EAC1B,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,OAAO,GAClB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,aAAa,CAyHf"}
|
package/dist/measure/plain.js
CHANGED
|
@@ -114,6 +114,7 @@ export function measureBlock(text, font, maxWidthPx, lineHeightPx, options) {
|
|
|
114
114
|
runtPenalty,
|
|
115
115
|
runtMinWidth,
|
|
116
116
|
looseness: options.looseness ?? 0,
|
|
117
|
+
lineWidthUniformFrom: 1,
|
|
117
118
|
});
|
|
118
119
|
if (breaks.length > 0) {
|
|
119
120
|
const kpLines = reconstructPretextLines(items, breaks, prepared, lineHeightPx, lineWidthFn, lineIndentFn, normalSpaceWidth, textAlign);
|