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/README.md +18 -0
- package/dist/__tests__/knuthPlass.test.d.ts +2 -0
- package/dist/__tests__/knuthPlass.test.d.ts.map +1 -0
- package/dist/__tests__/knuthPlass.test.js +209 -0
- package/dist/__tests__/knuthPlass.test.js.map +1 -0
- package/dist/canvas-backend.d.ts +4 -1
- package/dist/canvas-backend.d.ts.map +1 -1
- package/dist/canvas-backend.js +9 -1
- package/dist/canvas-backend.js.map +1 -1
- package/dist/defaults/bodyText.d.ts +2 -2
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +9 -3
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/debug.d.ts.map +1 -1
- package/dist/defaults/debug.js +12 -0
- package/dist/defaults/debug.js.map +1 -1
- package/dist/hyphenate.d.ts +2 -5
- package/dist/hyphenate.d.ts.map +1 -1
- package/dist/hyphenate.js +28 -128
- package/dist/hyphenate.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass.d.ts +76 -0
- package/dist/knuthPlass.d.ts.map +1 -0
- package/dist/knuthPlass.js +653 -0
- package/dist/knuthPlass.js.map +1 -0
- package/dist/measure.d.ts +6 -0
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +63 -4
- package/dist/measure.js.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +3 -0
- package/dist/pipeline/build.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -2
package/dist/hyphenate.js
CHANGED
|
@@ -1,140 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
package/dist/hyphenate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hyphenate.js","sourceRoot":"","sources":["../src/hyphenate.ts"],"names":[],"mappings":"
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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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"}
|