cspell-dictionary 6.9.0 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/package.json +6 -5
  2. package/dist/SpellingDictionary/Dictionaries.d.ts +0 -9
  3. package/dist/SpellingDictionary/Dictionaries.js +0 -61
  4. package/dist/SpellingDictionary/SpellingDictionaryError.d.ts +0 -10
  5. package/dist/SpellingDictionary/SpellingDictionaryError.js +0 -18
  6. package/dist/util/Comparable.d.ts +0 -20
  7. package/dist/util/Comparable.js +0 -55
  8. package/dist/util/FreqCounter.d.ts +0 -16
  9. package/dist/util/FreqCounter.js +0 -52
  10. package/dist/util/Memorizer.d.ts +0 -65
  11. package/dist/util/Memorizer.js +0 -138
  12. package/dist/util/MinHeapQueue.d.ts +0 -23
  13. package/dist/util/MinHeapQueue.js +0 -97
  14. package/dist/util/PairingHeap.d.ts +0 -32
  15. package/dist/util/PairingHeap.js +0 -90
  16. package/dist/util/TextMap.d.ts +0 -15
  17. package/dist/util/TextMap.js +0 -62
  18. package/dist/util/TextRange.d.ts +0 -28
  19. package/dist/util/TextRange.js +0 -144
  20. package/dist/util/debugPerf.d.ts +0 -9
  21. package/dist/util/debugPerf.js +0 -22
  22. package/dist/util/errors.d.ts +0 -17
  23. package/dist/util/errors.js +0 -52
  24. package/dist/util/fileReader.d.ts +0 -4
  25. package/dist/util/fileReader.js +0 -21
  26. package/dist/util/iterableIteratorLib.d.ts +0 -4
  27. package/dist/util/iterableIteratorLib.js +0 -14
  28. package/dist/util/logger.d.ts +0 -33
  29. package/dist/util/logger.js +0 -46
  30. package/dist/util/memorizerWeak.d.ts +0 -6
  31. package/dist/util/memorizerWeak.js +0 -42
  32. package/dist/util/resolveFile.d.ts +0 -13
  33. package/dist/util/resolveFile.js +0 -127
  34. package/dist/util/search.d.ts +0 -6
  35. package/dist/util/search.js +0 -23
  36. package/dist/util/textRegex.d.ts +0 -1
  37. package/dist/util/textRegex.js +0 -2
  38. package/dist/util/timer.d.ts +0 -26
  39. package/dist/util/timer.js +0 -58
  40. package/dist/util/util.test copy.d.ts +0 -2
  41. package/dist/util/util.test copy.js +0 -17
  42. package/dist/util/wordSplitter.d.ts +0 -46
  43. package/dist/util/wordSplitter.js +0 -326
@@ -1,127 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.resolveFile = void 0;
30
- const fs = __importStar(require("fs"));
31
- const path = __importStar(require("path"));
32
- const resolve_from_1 = __importDefault(require("resolve-from"));
33
- const os = __importStar(require("os"));
34
- const resolve_global_1 = __importDefault(require("resolve-global"));
35
- const testNodeModules = /^node_modules\//;
36
- /**
37
- * Resolve filename to absolute paths.
38
- * It tries to look for local files as well as node_modules
39
- * @param filename an absolute path, relative path, `~` path, or a node_module.
40
- * @param relativeTo absolute path
41
- */
42
- function resolveFile(filename, relativeTo) {
43
- filename = filename.replace(/^~/, os.homedir());
44
- const steps = [
45
- { filename, fn: tryUrl },
46
- { filename, fn: tryNodeResolve },
47
- { filename: path.resolve(relativeTo, filename), fn: tryResolveExists },
48
- { filename: path.resolve(filename), fn: tryResolveExists },
49
- { filename, fn: tryNodeResolveDefaultPaths },
50
- { filename, fn: tryResolveFrom },
51
- { filename: filename.replace(testNodeModules, ''), fn: tryResolveFrom },
52
- { filename, fn: tryResolveGlobal },
53
- ];
54
- for (const step of steps) {
55
- const r = step.fn(step.filename, relativeTo);
56
- if (r.found)
57
- return r;
58
- }
59
- return { filename: path.resolve(relativeTo, filename), relativeTo, found: false };
60
- }
61
- exports.resolveFile = resolveFile;
62
- const isUrlRegExp = /^\w+:\/\//i;
63
- /**
64
- * Check to see if it is a URL.
65
- * Note: URLs are absolute!
66
- * @param filename - url string
67
- * @returns ResolveFileResult
68
- */
69
- function tryUrl(filename, relativeTo) {
70
- if (isUrlRegExp.test(filename)) {
71
- return { filename, relativeTo: undefined, found: true };
72
- }
73
- if (isUrlRegExp.test(relativeTo)) {
74
- const url = new URL(filename, relativeTo);
75
- return { filename: url.href, relativeTo, found: true };
76
- }
77
- return { filename, relativeTo: undefined, found: false };
78
- }
79
- function tryNodeResolveDefaultPaths(filename) {
80
- try {
81
- const r = require.resolve(filename);
82
- return { filename: r, relativeTo: undefined, found: true };
83
- }
84
- catch (_) {
85
- return { filename, relativeTo: undefined, found: false };
86
- }
87
- }
88
- function tryNodeResolve(filename, relativeTo) {
89
- const home = os.homedir();
90
- function calcPaths(p) {
91
- const paths = [p];
92
- // Do not progress towards the root if it is a relative filename.
93
- if (filename.startsWith('.') &&
94
- (filename.startsWith('./') || filename.startsWith('.' + path.sep) || filename.startsWith('..'))) {
95
- return paths;
96
- }
97
- for (; p && path.dirname(p) !== p && p !== home; p = path.dirname(p)) {
98
- paths.push(p);
99
- }
100
- return paths;
101
- }
102
- const paths = calcPaths(path.resolve(relativeTo));
103
- try {
104
- const r = require.resolve(filename, { paths });
105
- return { filename: r, relativeTo, found: true };
106
- }
107
- catch (_) {
108
- return { filename, relativeTo, found: false };
109
- }
110
- }
111
- function tryResolveGlobal(filename) {
112
- const r = resolve_global_1.default.silent(filename);
113
- return { filename: r || filename, relativeTo: undefined, found: !!r };
114
- }
115
- function tryResolveExists(filename) {
116
- return { filename, relativeTo: undefined, found: fs.existsSync(filename) };
117
- }
118
- function tryResolveFrom(filename, relativeTo) {
119
- try {
120
- return { filename: (0, resolve_from_1.default)(relativeTo, filename), relativeTo, found: true };
121
- }
122
- catch (error) {
123
- // Failed to resolve a relative module request
124
- return { filename: filename, relativeTo, found: false };
125
- }
126
- }
127
- //# sourceMappingURL=resolveFile.js.map
@@ -1,6 +0,0 @@
1
- /**
2
- * Search for an item in a sorted array.
3
- * The value returned is either the position of the item or where it should be inserted.
4
- */
5
- export declare function binarySearch<T>(arr: Array<T>, item: T, leftOffset?: number, rightOffset?: number): number;
6
- //# sourceMappingURL=search.d.ts.map
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.binarySearch = void 0;
4
- /**
5
- * Search for an item in a sorted array.
6
- * The value returned is either the position of the item or where it should be inserted.
7
- */
8
- function binarySearch(arr, item, leftOffset, rightOffset) {
9
- let left = Math.max(leftOffset ?? 0, 0);
10
- let right = Math.min(rightOffset ?? arr.length, arr.length);
11
- while (left < right) {
12
- const pos = (left + right) >> 1;
13
- if (arr[pos] < item) {
14
- left = pos + 1;
15
- }
16
- else {
17
- right = pos;
18
- }
19
- }
20
- return left;
21
- }
22
- exports.binarySearch = binarySearch;
23
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- //# sourceMappingURL=textRegex.d.ts.map
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=textRegex.js.map
@@ -1,26 +0,0 @@
1
- export interface Timer {
2
- /** Start / restart the timer. */
3
- start(): void;
4
- /**
5
- * Calculate the amount of time in ms since the
6
- * timer was created / started.
7
- */
8
- elapsed(): number;
9
- /**
10
- * Calculate the amount of time in ms since the
11
- * end of the last lap.
12
- */
13
- lap(): number;
14
- }
15
- export declare function createTimer(hrTimeFn?: HRTimeFn): Timer;
16
- export declare type HRTimeFn = (time?: HRTime) => HRTime;
17
- export declare type HRTime = [number, number];
18
- export declare function toMilliseconds(t: HRTime): number;
19
- export declare function polyHrTime(time?: HRTime): HRTime;
20
- export interface LapRecorder {
21
- times: [name: string, lapTime: number, totalTime: number][];
22
- lap(name: string): void;
23
- report(): string[];
24
- }
25
- export declare function createLapRecorder(): LapRecorder;
26
- //# sourceMappingURL=timer.d.ts.map
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLapRecorder = exports.polyHrTime = exports.toMilliseconds = exports.createTimer = void 0;
4
- const _hrTime = process?.hrtime || polyHrTime;
5
- function createTimer(hrTimeFn = _hrTime) {
6
- let start = hrTimeFn();
7
- let lastLap = 0;
8
- function elapsed() {
9
- return toMilliseconds(hrTimeFn(start));
10
- }
11
- return {
12
- start() {
13
- start = hrTimeFn();
14
- lastLap = 0;
15
- },
16
- elapsed,
17
- lap() {
18
- const now = elapsed();
19
- const diff = now - lastLap;
20
- lastLap = now;
21
- return diff;
22
- },
23
- };
24
- }
25
- exports.createTimer = createTimer;
26
- function toMilliseconds(t) {
27
- return (t[0] + t[1] * 1e-9) * 1000;
28
- }
29
- exports.toMilliseconds = toMilliseconds;
30
- function polyHrTime(time) {
31
- const now = Date.now() - (time ? toMilliseconds(time) : 0);
32
- const inSeconds = now * 1.0e-3;
33
- const s = Math.floor(inSeconds);
34
- const n = (inSeconds - s) * 1.0e9;
35
- return [s, n];
36
- }
37
- exports.polyHrTime = polyHrTime;
38
- function createLapRecorder() {
39
- const timer = createTimer();
40
- const times = [];
41
- let lapTime = 0;
42
- function lap(name) {
43
- const now = timer.elapsed();
44
- const diff = now - lapTime;
45
- times.push([name, diff, now]);
46
- lapTime = diff;
47
- }
48
- function report() {
49
- return times.map(([name, time]) => `${name}: ${time.toFixed(2)}`);
50
- }
51
- return {
52
- times,
53
- lap,
54
- report,
55
- };
56
- }
57
- exports.createLapRecorder = createLapRecorder;
58
- //# sourceMappingURL=timer.js.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=util.test%20copy.d.ts.map
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const clean_1 = require("./clean");
4
- describe('Validate util', () => {
5
- test('tests clean up obj', () => {
6
- const obj = {
7
- a: undefined,
8
- b: 1,
9
- c: true,
10
- d: undefined,
11
- e: 'str',
12
- };
13
- const cleanObj = (0, clean_1.clean)(obj);
14
- expect([...Object.keys(cleanObj)]).toEqual(['b', 'c', 'e']);
15
- });
16
- });
17
- //# sourceMappingURL=util.test%20copy.js.map
@@ -1,46 +0,0 @@
1
- import type { TextOffset } from '@cspell/cspell-types';
2
- export declare type IsValidWordFn = (word: TextOffset) => boolean;
3
- export interface SplitResult {
4
- /** Original line passed to the split function */
5
- line: TextOffset;
6
- /** Starting point of processing - Original offset passed to the split function */
7
- offset: number;
8
- /** The span of text that was split */
9
- text: TextOffset;
10
- /** The collection of words that `text` was split into */
11
- words: TextOffsetWithValid[];
12
- /** the offset at which the split stopped */
13
- endOffset: number;
14
- }
15
- export interface LineSegment {
16
- line: TextOffset;
17
- relStart: number;
18
- relEnd: number;
19
- }
20
- export interface TextOffsetWithValid extends TextOffset {
21
- isFound: boolean;
22
- }
23
- export interface SplitOptions extends WordBreakOptions {
24
- }
25
- export declare function split(line: TextOffset, offset: number, isValidWord: IsValidWordFn, options?: SplitOptions): SplitResult;
26
- declare type BreakPairs = readonly number[];
27
- interface PossibleWordBreak {
28
- /** offset from the start of the string */
29
- offset: number;
30
- /**
31
- * break pairs (start, end)
32
- * (the characters between the start and end are removed)
33
- * With a pure break, start === end.
34
- */
35
- breaks: BreakPairs[];
36
- }
37
- export declare type SortedBreaks = PossibleWordBreak[];
38
- interface WordBreakOptions {
39
- optionalWordBreakCharacters?: string;
40
- }
41
- declare function generateWordBreaks(line: LineSegment, options: WordBreakOptions): SortedBreaks;
42
- export declare const __testing__: {
43
- generateWordBreaks: typeof generateWordBreaks;
44
- };
45
- export {};
46
- //# sourceMappingURL=wordSplitter.d.ts.map
@@ -1,326 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.__testing__ = exports.split = void 0;
4
- const PairingHeap_1 = require("./PairingHeap");
5
- const regexHelper_1 = require("./regexHelper");
6
- const textRegex_1 = require("./textRegex");
7
- const ignoreBreak = Object.freeze([]);
8
- function split(line, offset, isValidWord, options = {}) {
9
- const relWordToSplit = findNextWordText({ text: line.text, offset: offset - line.offset });
10
- const lineOffset = line.offset;
11
- const requested = new Map();
12
- if (!relWordToSplit.text) {
13
- const text = rebaseTextOffset(relWordToSplit);
14
- return {
15
- line,
16
- offset,
17
- text: text,
18
- words: [],
19
- endOffset: text.offset + text.text.length,
20
- };
21
- }
22
- const lineSegment = {
23
- line,
24
- relStart: relWordToSplit.offset,
25
- relEnd: relWordToSplit.offset + relWordToSplit.text.length,
26
- };
27
- const possibleBreaks = generateWordBreaks(lineSegment, options);
28
- if (!possibleBreaks.length) {
29
- const text = rebaseTextOffset(relWordToSplit);
30
- return {
31
- line,
32
- offset,
33
- text: text,
34
- words: [{ ...text, isFound: isValidWord(text) }],
35
- endOffset: text.offset + text.text.length,
36
- };
37
- }
38
- function rebaseTextOffset(relText) {
39
- return {
40
- ...relText,
41
- offset: relText.offset + lineOffset,
42
- };
43
- }
44
- function has(word) {
45
- const i = word.offset;
46
- const j = word.text.length;
47
- let v = i + (j << 20);
48
- if (i < 1 << 20 && j < 1 << 11) {
49
- const b = requested.get(v);
50
- if (b !== undefined)
51
- return b;
52
- }
53
- else {
54
- v = -1;
55
- }
56
- const r = isValidWord(rebaseTextOffset(word));
57
- if (v >= 0) {
58
- requested.set(v, r);
59
- }
60
- return r;
61
- }
62
- // Add a dummy break at the end to avoid needing to check for last break.
63
- possibleBreaks.push({
64
- offset: lineSegment.relEnd,
65
- breaks: [ignoreBreak],
66
- });
67
- const result = {
68
- line,
69
- offset,
70
- text: rebaseTextOffset(relWordToSplit),
71
- words: splitIntoWords(lineSegment, possibleBreaks, has).map(rebaseTextOffset),
72
- endOffset: lineOffset + lineSegment.relEnd,
73
- };
74
- return result;
75
- }
76
- exports.split = split;
77
- function findNextWordText({ text, offset }) {
78
- const reg = new RegExp(textRegex_1.regExWordsAndDigits);
79
- reg.lastIndex = offset;
80
- const m = reg.exec(text);
81
- if (!m) {
82
- return {
83
- text: '',
84
- offset: offset + text.length,
85
- };
86
- }
87
- return {
88
- text: m[0],
89
- offset: m.index,
90
- };
91
- }
92
- function generateWordBreaks(line, options) {
93
- const camelBreaks = genWordBreakCamel(line);
94
- const symbolBreaks = genSymbolBreaks(line);
95
- const optionalBreaks = genOptionalWordBreaks(line, options.optionalWordBreakCharacters);
96
- return mergeSortedBreaks(...camelBreaks, ...symbolBreaks, ...optionalBreaks);
97
- }
98
- function offsetRegEx(reg, offset) {
99
- const r = new RegExp(reg);
100
- r.lastIndex = offset;
101
- return r;
102
- }
103
- function genWordBreakCamel(line) {
104
- const breaksCamel1 = [];
105
- const text = line.line.text.slice(0, line.relEnd);
106
- // lower,Upper: camelCase -> camel|Case
107
- for (const m of text.matchAll(offsetRegEx(textRegex_1.regExSplitWords, line.relStart))) {
108
- if (m.index === undefined)
109
- break;
110
- const i = m.index + 1;
111
- breaksCamel1.push({
112
- offset: m.index,
113
- breaks: [[i, i], ignoreBreak],
114
- });
115
- }
116
- const breaksCamel2 = [];
117
- // cspell:ignore ERRORC
118
- // Upper,Upper,lower: ERRORCodes -> ERROR|Codes, ERRORC|odes
119
- for (const m of text.matchAll(offsetRegEx(textRegex_1.regExSplitWords2, line.relStart))) {
120
- if (m.index === undefined)
121
- break;
122
- const i = m.index + m[1].length;
123
- const j = i + 1;
124
- breaksCamel2.push({
125
- offset: m.index,
126
- breaks: [[i, i], [j, j], ignoreBreak],
127
- });
128
- }
129
- return [breaksCamel1, breaksCamel2];
130
- }
131
- function calcBreaksForRegEx(line, reg, calcBreak) {
132
- const sb = [];
133
- const text = line.line.text.slice(0, line.relEnd);
134
- for (const m of text.matchAll(offsetRegEx(reg, line.relStart))) {
135
- const b = calcBreak(m);
136
- if (b) {
137
- sb.push(b);
138
- }
139
- }
140
- return sb;
141
- }
142
- function genOptionalWordBreaks(line, optionalBreakCharacters) {
143
- function calcBreaks(m) {
144
- const i = m.index;
145
- if (i === undefined)
146
- return;
147
- const j = i + m[0].length;
148
- return {
149
- offset: i,
150
- breaks: [
151
- [i, j],
152
- ignoreBreak,
153
- ],
154
- };
155
- }
156
- const breaks = [
157
- calcBreaksForRegEx(line, textRegex_1.regExDanglingQuote, calcBreaks),
158
- calcBreaksForRegEx(line, textRegex_1.regExTrailingEndings, calcBreaks),
159
- ];
160
- if (optionalBreakCharacters) {
161
- const regex = new RegExp(`[${(0, regexHelper_1.escapeRegEx)(optionalBreakCharacters)}]`, 'gu');
162
- breaks.push(calcBreaksForRegEx(line, regex, calcBreaks));
163
- }
164
- return breaks;
165
- }
166
- function genSymbolBreaks(line) {
167
- function calcBreaks(m) {
168
- const i = m.index;
169
- if (i === undefined)
170
- return;
171
- const j = i + m[0].length;
172
- return {
173
- offset: i,
174
- breaks: [
175
- [i, j],
176
- [i, i],
177
- [j, j],
178
- ignoreBreak,
179
- ],
180
- };
181
- }
182
- return [
183
- calcBreaksForRegEx(line, textRegex_1.regExPossibleWordBreaks, calcBreaks),
184
- calcBreaksForRegEx(line, /\d+/g, calcBreaks),
185
- calcBreaksForRegEx(line, textRegex_1.regExEscapeCharacters, calcBreaks),
186
- ];
187
- }
188
- function splitIntoWords(lineSeg, breaks, has) {
189
- const maxIndex = lineSeg.relEnd;
190
- const maxAttempts = 1000;
191
- const knownPathsByIndex = new Map();
192
- /**
193
- * Create a set of possible candidate to consider
194
- * @param p - prev candidate that lead to this one
195
- * @param i - offset within the string
196
- * @param bi - current index into the set of breaks
197
- * @param currentCost - current cost accrued
198
- */
199
- function makeCandidates(p, i, bi, currentCost) {
200
- const len = maxIndex;
201
- while (bi < breaks.length && breaks[bi].offset < i) {
202
- bi += 1;
203
- }
204
- if (bi >= breaks.length) {
205
- return [];
206
- }
207
- const br = breaks[bi];
208
- function c(bp) {
209
- const d = bp.length < 2 ? len - i : (bp[0] - i) * 0.5 + len - bp[1];
210
- const ec = currentCost + d;
211
- return {
212
- p,
213
- i,
214
- bi,
215
- bp,
216
- c: currentCost,
217
- ec,
218
- text: undefined,
219
- };
220
- }
221
- return br.breaks.map(c);
222
- }
223
- function toTextOffset(text, offset) {
224
- const valid = has({ text, offset });
225
- return {
226
- text,
227
- offset,
228
- isFound: valid,
229
- };
230
- }
231
- function compare(a, b) {
232
- return a.ec - b.ec || b.i - a.i;
233
- }
234
- function pathToWords(node) {
235
- const results = [];
236
- for (let p = node; p; p = p.n) {
237
- if (p.text) {
238
- results.push(p.text);
239
- }
240
- }
241
- return results;
242
- }
243
- function addToKnownPaths(candidate, path) {
244
- for (let can = candidate; can !== undefined; can = can.p) {
245
- const t = can.text;
246
- const i = can.i;
247
- const cost = (!t || t.isFound ? 0 : t.text.length) + (path?.c ?? 0);
248
- const exitingPath = knownPathsByIndex.get(i);
249
- // Keep going only if this is a better candidate than the existing path
250
- if (exitingPath && exitingPath.c <= cost) {
251
- return undefined;
252
- }
253
- const node = {
254
- n: path,
255
- i,
256
- c: cost,
257
- text: t,
258
- };
259
- knownPathsByIndex.set(i, node);
260
- path = node;
261
- }
262
- return path;
263
- }
264
- let maxCost = lineSeg.relEnd - lineSeg.relStart;
265
- const candidates = new PairingHeap_1.PairingHeap(compare);
266
- const text = lineSeg.line.text;
267
- candidates.concat(makeCandidates(undefined, lineSeg.relStart, 0, 0));
268
- let attempts = 0;
269
- let bestPath;
270
- while (maxCost && candidates.length && attempts++ < maxAttempts) {
271
- /** Best Candidate Index */
272
- const best = candidates.dequeue();
273
- if (!best || best.c >= maxCost) {
274
- continue;
275
- }
276
- // Does it have a split?
277
- if (best.bp.length) {
278
- // yes
279
- const i = best.bp[0];
280
- const j = best.bp[1];
281
- const t = i > best.i ? toTextOffset(text.slice(best.i, i), best.i) : undefined;
282
- const cost = !t || t.isFound ? 0 : t.text.length;
283
- const mc = maxIndex - j;
284
- best.c += cost;
285
- best.ec = best.c + mc;
286
- best.text = t;
287
- const possiblePath = knownPathsByIndex.get(j);
288
- if (possiblePath) {
289
- // We found a known apply to candidate
290
- const f = addToKnownPaths(best, possiblePath);
291
- bestPath = !bestPath || (f && f.c < bestPath.c) ? f : bestPath;
292
- }
293
- else if (best.c < maxCost) {
294
- const c = makeCandidates(t ? best : best.p, j, best.bi + 1, best.c);
295
- candidates.concat(c);
296
- }
297
- }
298
- else {
299
- // It is a pass through
300
- const c = makeCandidates(best.p, best.i, best.bi + 1, best.c);
301
- candidates.concat(c);
302
- if (!c.length) {
303
- const t = maxIndex > best.i ? toTextOffset(text.slice(best.i, maxIndex), best.i) : undefined;
304
- const cost = !t || t.isFound ? 0 : t.text.length;
305
- best.c += cost;
306
- best.ec = best.c;
307
- best.text = t;
308
- const segText = t || best.p?.text || toTextOffset('', best.i);
309
- const can = t ? { ...best, text: segText } : { ...best, ...best.p, text: segText };
310
- const f = addToKnownPaths(can, undefined);
311
- bestPath = !bestPath || (f && f.c < bestPath.c) ? f : bestPath;
312
- }
313
- }
314
- if (bestPath && bestPath.c < maxCost) {
315
- maxCost = bestPath.c;
316
- }
317
- }
318
- return pathToWords(bestPath);
319
- }
320
- function mergeSortedBreaks(...maps) {
321
- return [].concat(...maps).sort((a, b) => a.offset - b.offset);
322
- }
323
- exports.__testing__ = {
324
- generateWordBreaks,
325
- };
326
- //# sourceMappingURL=wordSplitter.js.map