postext 0.1.12 → 0.1.14

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/hyphenate.js CHANGED
@@ -1,140 +1,40 @@
1
- const SOFT_HYPHEN = '\u00AD';
2
- const MIN_WORD_LENGTH = 5;
3
- const MIN_PREFIX = 2;
4
- const MIN_SUFFIX = 3;
5
- // ---------------------------------------------------------------------------
6
- // Vowel sets per locale
7
- // ---------------------------------------------------------------------------
8
- const VOWELS = {
9
- 'en-us': new Set('aeiouyAEIOUY'),
10
- 'es': new Set('aeiouáéíóúüAEIOUÁÉÍÓÚÜ'),
11
- 'fr': new Set('aeiouyàâæéèêëïîôœùûüÿAEIOUYÀÂÆÉÈÊËÏÎÔŒÙÛÜŸ'),
12
- 'de': new Set('aeiouyäöüAEIOUYÄÖÜ'),
13
- 'it': new Set('aeiouyàèéìíòóùúAEIOUYÀÈÉÌÍÒÓÙÚ'),
14
- 'pt': new Set('aeiouyáâãàéêíóôõúüAEIOUYÁÂÃÀÉÊÍÓÔÕÚÜ'),
15
- 'ca': new Set('aeiouyàèéíïòóúüAEIOUYÀÈÉÍÏÒÓÚÜ'),
16
- 'nl': new Set('aeiouyAEIOUY'),
1
+ import Hypher from 'hypher';
2
+ import enUs from 'hyphenation.en-us';
3
+ import es from 'hyphenation.es';
4
+ import fr from 'hyphenation.fr';
5
+ import de from 'hyphenation.de';
6
+ import it from 'hyphenation.it';
7
+ import pt from 'hyphenation.pt';
8
+ import ca from 'hyphenation.ca';
9
+ import nl from 'hyphenation.nl';
10
+ const PATTERNS = {
11
+ 'en-us': enUs,
12
+ 'es': es,
13
+ 'fr': fr,
14
+ 'de': de,
15
+ 'it': it,
16
+ 'pt': pt,
17
+ 'ca': ca,
18
+ 'nl': nl,
17
19
  };
18
- // ---------------------------------------------------------------------------
19
- // Common prefixes & suffixes for better break points
20
- // ---------------------------------------------------------------------------
21
- const COMMON_PREFIXES = {
22
- 'en-us': ['over', 'under', 'inter', 'trans', 'super', 'anti', 'auto', 'counter', 'dis', 'mis', 'non', 'pre', 'post', 'semi', 'sub', 'un', 're'],
23
- 'es': ['des', 'inter', 'trans', 'sobre', 'contra', 'anti', 'auto', 'pre', 'post', 'semi', 'sub', 'in', 're'],
24
- 'fr': ['contre', 'entre', 'inter', 'trans', 'super', 'anti', 'auto', 'pré', 'post', 'semi', 'sous', 'sur', 'dé', 're'],
25
- 'de': ['über', 'unter', 'zwischen', 'gegen', 'wider', 'vor', 'nach', 'aus', 'ein', 'um', 'ab', 'an', 'auf', 'ver', 'zer', 'ent', 'emp', 'be', 'ge', 'miss'],
26
- 'it': ['contro', 'inter', 'trans', 'sopra', 'sotto', 'anti', 'auto', 'pre', 'post', 'semi', 'dis', 'ri', 'in'],
27
- 'pt': ['des', 'inter', 'trans', 'sobre', 'contra', 'anti', 'auto', 'pré', 'pós', 'semi', 'sub', 'in', 're'],
28
- 'ca': ['des', 'inter', 'trans', 'sobre', 'contra', 'anti', 'auto', 'pre', 'post', 'semi', 'sub', 'in', 're'],
29
- 'nl': ['over', 'onder', 'tussen', 'tegen', 'voor', 'ver', 'her', 'ont', 'be', 'ge'],
30
- };
31
- const COMMON_SUFFIXES = {
32
- 'en-us': ['tion', 'sion', 'ment', 'ness', 'able', 'ible', 'ful', 'less', 'ous', 'ive', 'ing', 'ence', 'ance', 'ity'],
33
- 'es': ['ción', 'sión', 'mente', 'miento', 'idad', 'ble', 'oso', 'ivo', 'ando', 'endo', 'ción', 'dad'],
34
- 'fr': ['tion', 'sion', 'ment', 'eur', 'euse', 'able', 'ible', 'eux', 'ive', 'ence', 'ance', 'ité'],
35
- 'de': ['ung', 'heit', 'keit', 'lich', 'isch', 'schaft', 'ment', 'tion', 'bar', 'sam', 'haft'],
36
- 'it': ['zione', 'sione', 'mente', 'mento', 'ità', 'bile', 'oso', 'ivo', 'ando', 'endo'],
37
- 'pt': ['ção', 'são', 'mente', 'mento', 'dade', 'vel', 'oso', 'ivo', 'ando', 'endo'],
38
- 'ca': ['ció', 'sió', 'ment', 'tat', 'ble', 'ós', 'iu', 'ant', 'ent'],
39
- 'nl': ['heid', 'lijk', 'ting', 'baar', 'zaam', 'isch', 'ment', 'sel'],
40
- };
41
- // ---------------------------------------------------------------------------
42
- // Core hyphenation algorithm
43
- // ---------------------------------------------------------------------------
44
- function isVowel(char, vowelSet) {
45
- return vowelSet.has(char);
46
- }
47
- function isConsonant(char, vowelSet) {
48
- return /\p{L}/u.test(char) && !vowelSet.has(char);
49
- }
50
- /**
51
- * Find syllable break points in a word using vowel/consonant patterns.
52
- * Returns an array of indices where soft hyphens should be inserted.
53
- */
54
- function findBreakPoints(word, locale) {
55
- if (word.length < MIN_WORD_LENGTH)
56
- return [];
57
- const vowelSet = VOWELS[locale] ?? VOWELS['en-us'];
58
- const lower = word.toLowerCase();
59
- const breaks = [];
60
- // Check for prefix break
61
- const prefixes = COMMON_PREFIXES[locale] ?? COMMON_PREFIXES['en-us'];
62
- for (const prefix of prefixes) {
63
- if (lower.startsWith(prefix) && word.length - prefix.length >= MIN_SUFFIX) {
64
- breaks.push(prefix.length);
65
- break;
66
- }
67
- }
68
- // Check for suffix break
69
- const suffixes = COMMON_SUFFIXES[locale] ?? COMMON_SUFFIXES['en-us'];
70
- for (const suffix of suffixes) {
71
- if (lower.endsWith(suffix) && word.length - suffix.length >= MIN_PREFIX) {
72
- const idx = word.length - suffix.length;
73
- if (!breaks.includes(idx))
74
- breaks.push(idx);
75
- break;
76
- }
20
+ const instances = new Map();
21
+ function getHyphenator(locale) {
22
+ let h = instances.get(locale);
23
+ if (!h) {
24
+ h = new Hypher(PATTERNS[locale] ?? PATTERNS['en-us']);
25
+ instances.set(locale, h);
77
26
  }
78
- // V-CV pattern: break before a consonant followed by a vowel
79
- // VC-CV pattern: break between consonants when surrounded by vowels
80
- for (let i = MIN_PREFIX; i < word.length - MIN_SUFFIX + 1; i++) {
81
- if (breaks.includes(i))
82
- continue;
83
- const prev = word[i - 1];
84
- const curr = word[i];
85
- const next = i + 1 < word.length ? word[i + 1] : '';
86
- // Break before consonant + vowel (V-CV)
87
- if (isVowel(prev, vowelSet) && isConsonant(curr, vowelSet) && next && isVowel(next, vowelSet)) {
88
- breaks.push(i);
89
- continue;
90
- }
91
- // Break between two consonants (VC-CV)
92
- if (i >= 2) {
93
- const prevPrev = word[i - 2];
94
- if (isVowel(prevPrev, vowelSet) && isConsonant(prev, vowelSet) && isConsonant(curr, vowelSet) && next && isVowel(next, vowelSet)) {
95
- breaks.push(i);
96
- }
97
- }
98
- }
99
- return breaks.sort((a, b) => a - b);
27
+ return h;
100
28
  }
101
- /**
102
- * Insert soft hyphens into a word at syllable boundaries.
103
- */
104
- function hyphenateWord(word, locale) {
105
- // Skip short words, words with existing hyphens, numbers, etc.
106
- if (word.length < MIN_WORD_LENGTH)
107
- return word;
108
- if (/[\d]/.test(word))
109
- return word;
110
- const breakPoints = findBreakPoints(word, locale);
111
- if (breakPoints.length === 0)
112
- return word;
113
- let result = '';
114
- let lastIdx = 0;
115
- for (const bp of breakPoints) {
116
- result += word.slice(lastIdx, bp) + SOFT_HYPHEN;
117
- lastIdx = bp;
118
- }
119
- result += word.slice(lastIdx);
120
- return result;
121
- }
122
- // ---------------------------------------------------------------------------
123
- // Public API
124
- // ---------------------------------------------------------------------------
125
29
  let currentLocale = 'en-us';
126
- /**
127
- * Set the current hyphenation locale.
128
- */
129
30
  export function setHyphenationLocale(locale) {
130
31
  currentLocale = locale;
131
32
  }
132
33
  /**
133
- * Hyphenate a full text string by inserting soft hyphens at syllable boundaries.
134
- * Only affects words, preserving all whitespace and punctuation.
34
+ * Hyphenate a full text string by inserting soft hyphens at syllable boundaries
35
+ * using TeX/Liang patterns for the active locale.
135
36
  */
136
37
  export function hyphenateText(text, locale) {
137
- const loc = locale ?? currentLocale;
138
- return text.replace(/\p{L}+/gu, (word) => hyphenateWord(word, loc));
38
+ return getHyphenator(locale ?? currentLocale).hyphenateText(text);
139
39
  }
140
40
  //# sourceMappingURL=hyphenate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hyphenate.js","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"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"}
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,OAAO,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { createLayout } from './createLayout';
2
2
  export { buildDocument } from './pipeline';
3
3
  export { renderToCanvas, renderPage, renderPageToCanvas } from './canvas-backend';
4
+ export type { RenderPageOptions } from './canvas-backend';
4
5
  export { dimensionToPx } from './units';
5
6
  export { buildFontString, measureBlock, measureRichBlock, measureGlyphWidth, initHyphenator, clearMeasurementCache } from './measure';
6
7
  export type { MeasuredBlock, MeasureBlockOptions } from './measure';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtI,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxtB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,gCAAgC,EAChC,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,EACf,OAAO,EACP,WAAW,GACZ,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtI,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxtB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,gCAAgC,EAChC,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,SAAS,EACT,eAAe,EACf,OAAO,EACP,WAAW,GACZ,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEtI,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEtI,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Knuth-Plass optimal paragraph line-breaking algorithm.
3
+ *
4
+ * Replaces the greedy first-fit line breaker with a dynamic-programming
5
+ * approach that minimizes total demerits across all lines of a paragraph,
6
+ * producing more even word-spacing and fewer "loose" lines.
7
+ */
8
+ import type { PreparedTextWithSegments } from '@chenglou/pretext';
9
+ import type { VDTLine } from './vdt';
10
+ import type { TextAlign } from './types';
11
+ export interface KPBox {
12
+ type: 'box';
13
+ width: number;
14
+ sourceIndex: number;
15
+ meta?: unknown;
16
+ }
17
+ export interface KPGlue {
18
+ type: 'glue';
19
+ width: number;
20
+ stretch: number;
21
+ shrink: number;
22
+ sourceIndex: number;
23
+ meta?: unknown;
24
+ }
25
+ export interface KPPenalty {
26
+ type: 'penalty';
27
+ width: number;
28
+ penalty: number;
29
+ flagged: boolean;
30
+ sourceIndex: number;
31
+ meta?: unknown;
32
+ }
33
+ export type KPItem = KPBox | KPGlue | KPPenalty;
34
+ export interface KPOptions {
35
+ /** Available width for each line (varies with indent). */
36
+ lineWidth: (lineIndex: number) => number;
37
+ /** Normal space width for the font. */
38
+ normalSpaceWidth: number;
39
+ /** Max space stretch as multiplier of normalSpaceWidth (e.g. 1.5). */
40
+ maxStretchRatio: number;
41
+ /** Min space width as multiplier of normalSpaceWidth (e.g. 0.8). */
42
+ minShrinkRatio: number;
43
+ /** Penalty for two consecutive hyphenated lines. */
44
+ consecutiveHyphenDemerit?: number;
45
+ /** Penalty for adjacent lines of very different tightness. */
46
+ fitnessClassDemerit?: number;
47
+ }
48
+ export declare function computeBreakpoints(items: KPItem[], options: KPOptions): number[];
49
+ export declare function pretextSegmentsToItems(prepared: PreparedTextWithSegments, normalSpaceWidth: number, maxStretchRatio: number, minShrinkRatio: number): KPItem[];
50
+ interface RichBreakPoint {
51
+ charIndex: number;
52
+ widthBefore: number;
53
+ }
54
+ interface RichToken {
55
+ text: string;
56
+ bold: boolean;
57
+ italic: boolean;
58
+ kind: 'text' | 'space';
59
+ width: number;
60
+ breakPoints?: RichBreakPoint[];
61
+ hyphenWidth?: number;
62
+ }
63
+ export interface RichTokenMeta {
64
+ bold: boolean;
65
+ italic: boolean;
66
+ originalTokenIndex: number;
67
+ /** Character index within the original token where this sub-box starts. */
68
+ subStart?: number;
69
+ /** Character index within the original token where this sub-box ends. */
70
+ subEnd?: number;
71
+ }
72
+ export declare function richTokensToItems(tokens: RichToken[], normalSpaceWidth: number, maxStretchRatio: number, minShrinkRatio: number): KPItem[];
73
+ export declare function reconstructPretextLines(items: KPItem[], breaks: number[], prepared: PreparedTextWithSegments, lineHeightPx: number, lineWidthFn: (lineIndex: number) => number, lineIndentFn: (lineIndex: number) => number, normalSpaceWidth: number, textAlign: TextAlign): VDTLine[];
74
+ export declare function reconstructRichLines(items: KPItem[], breaks: number[], tokens: RichToken[], lineHeightPx: number, lineWidthFn: (lineIndex: number) => number, lineIndentFn: (lineIndex: number) => number, normalSpaceWidth: number, textAlign: TextAlign): VDTLine[];
75
+ export {};
76
+ //# sourceMappingURL=knuthPlass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knuthPlass.d.ts","sourceRoot":"","sources":["../src/knuthPlass.ts"],"names":[],"mappings":"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"}