@mailwoman/normalize 9.1.0 → 9.3.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.
- package/README.md +2 -2
- package/{abbreviations.ts → lib/abbreviations.ts} +3 -3
- package/{cjk.ts → lib/cjk.ts} +39 -4
- package/lib/comma-spacing.ts +68 -0
- package/{compute.ts → lib/compute.ts} +25 -9
- package/lib/fold.ts +30 -0
- package/{index.ts → lib/index.ts} +9 -8
- package/{nfc.ts → lib/nfc.ts} +1 -1
- package/{punctuation.ts → lib/punctuation.ts} +3 -1
- package/{types.ts → lib/types.ts} +8 -0
- package/{whitespace.ts → lib/whitespace.ts} +15 -11
- package/out/abbreviations.d.ts +2 -2
- package/out/abbreviations.d.ts.map +1 -1
- package/out/abbreviations.js +2 -2
- package/out/abbreviations.js.map +1 -1
- package/out/cjk.d.ts +7 -2
- package/out/cjk.d.ts.map +1 -1
- package/out/cjk.js +30 -4
- package/out/cjk.js.map +1 -1
- package/out/comma-spacing.d.ts +30 -0
- package/out/comma-spacing.d.ts.map +1 -0
- package/out/comma-spacing.js +52 -0
- package/out/comma-spacing.js.map +1 -0
- package/out/compute.d.ts +1 -1
- package/out/compute.d.ts.map +1 -1
- package/out/compute.js +22 -8
- package/out/compute.js.map +1 -1
- package/out/fold.d.ts +22 -0
- package/out/fold.d.ts.map +1 -0
- package/out/fold.js +28 -0
- package/out/fold.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +8 -7
- package/out/index.js.map +1 -1
- package/out/nfc.d.ts.map +1 -1
- package/out/nfc.js +1 -1
- package/out/nfc.js.map +1 -1
- package/out/offset-map.d.ts.map +1 -1
- package/out/offset-map.js.map +1 -1
- package/out/punctuation.d.ts.map +1 -1
- package/out/punctuation.js +3 -1
- package/out/punctuation.js.map +1 -1
- package/out/types.d.ts +10 -0
- package/out/types.d.ts.map +1 -1
- package/out/types.js.map +1 -1
- package/out/whitespace.d.ts +9 -3
- package/out/whitespace.d.ts.map +1 -1
- package/out/whitespace.js +11 -10
- package/out/whitespace.js.map +1 -1
- package/package.json +111 -3
- /package/{offset-map.ts → lib/offset-map.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comma-spacing.d.ts","sourceRoot":"","sources":["../lib/comma-spacing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CAChB;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAsBjE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Comma spacing — a comma directly followed by a letter gains one space, so `Biggin Hill,United Kingdom`
|
|
7
|
+
* reaches stage 2 as `Biggin Hill, United Kingdom`. A tight comma is an ordinary typing pattern, and the parse
|
|
8
|
+
* is the first stage that reads it differently: with no space, the tokenizer glues `,United` into one piece,
|
|
9
|
+
* the segmenter still splits, and the decoder labels the glued piece as a street or a locality it is not.
|
|
10
|
+
*
|
|
11
|
+
* A letter or a digit after the comma triggers the insertion, with one exception: a comma with a digit on
|
|
12
|
+
* BOTH sides is a numeric separator (`12,5`, `1,000`) and is left as typed. `Köln,50733` has a letter before
|
|
13
|
+
* the comma, so it is a list separator and gains the space. A space, punctuation or end of input after the
|
|
14
|
+
* comma is left as typed. The inserted space maps to the comma's own offset, the same rule the `…`
|
|
15
|
+
* expansion in `punctuation.ts` follows, so every span that starts after it still points into the raw input.
|
|
16
|
+
*/
|
|
17
|
+
import { identityMap } from "#offset-map";
|
|
18
|
+
/**
|
|
19
|
+
* Any letter or decimal digit in any script: the Unicode property classes `\p{L}` and `\p{Nd}`.
|
|
20
|
+
*/
|
|
21
|
+
const LETTER_OR_DIGIT = /[\p{L}\p{Nd}]/u;
|
|
22
|
+
const DIGIT = /\p{Nd}/u;
|
|
23
|
+
/**
|
|
24
|
+
* A comma with a decimal digit on both sides: `12,5`, `1,000`.
|
|
25
|
+
*/
|
|
26
|
+
function isNumericSeparator(input, commaIndex) {
|
|
27
|
+
return commaIndex > 0 && DIGIT.test(input[commaIndex - 1]) && DIGIT.test(input[commaIndex + 1]);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Insert one space after every comma that is directly followed by a letter or digit, unless the comma is a numeric
|
|
31
|
+
* separator. Offset-map-correct: the inserted space maps to the comma.
|
|
32
|
+
*/
|
|
33
|
+
export function spaceAfterComma(input) {
|
|
34
|
+
let inserted = 0;
|
|
35
|
+
const out = [];
|
|
36
|
+
const map = [];
|
|
37
|
+
for (let i = 0; i < input.length; i++) {
|
|
38
|
+
const ch = input[i];
|
|
39
|
+
out.push(ch);
|
|
40
|
+
map.push(i);
|
|
41
|
+
if (ch === "," && i + 1 < input.length && LETTER_OR_DIGIT.test(input[i + 1]) && !isNumericSeparator(input, i)) {
|
|
42
|
+
out.push(" ");
|
|
43
|
+
map.push(i);
|
|
44
|
+
inserted += 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!inserted) {
|
|
48
|
+
return { text: input, map: identityMap(input.length), inserted: 0 };
|
|
49
|
+
}
|
|
50
|
+
return { text: out.join(""), map, inserted };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=comma-spacing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comma-spacing.js","sourceRoot":"","sources":["../lib/comma-spacing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC;;GAEG;AACH,MAAM,eAAe,GAAG,gBAAgB,CAAA;AACxC,MAAM,KAAK,GAAG,SAAS,CAAA;AAWvB;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAE,UAAkB;IAC5D,OAAO,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAE,CAAC,CAAA;AAClG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACpB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEX,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAChH,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACX,QAAQ,IAAI,CAAC,CAAA;QACd,CAAC;IACF,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;IACpE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AAC7C,CAAC"}
|
package/out/compute.d.ts
CHANGED
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
* `normalize(raw, opts)` — the Stage 1 entry point. Composes NFC + punctuation + whitespace
|
|
7
7
|
* (always) with case-fold + abbreviation expansion (opt-in).
|
|
8
8
|
*/
|
|
9
|
-
import type { NormalizedInput, NormalizeOpts } from "
|
|
9
|
+
import type { NormalizedInput, NormalizeOpts } from "#types";
|
|
10
10
|
export declare function normalize(raw: string, opts?: NormalizeOpts): NormalizedInput;
|
|
11
11
|
//# sourceMappingURL=compute.d.ts.map
|
package/out/compute.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../compute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../lib/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAA0B,eAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAGpF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,eAAe,CAgG5E"}
|
package/out/compute.js
CHANGED
|
@@ -6,12 +6,13 @@
|
|
|
6
6
|
* `normalize(raw, opts)` — the Stage 1 entry point. Composes NFC + punctuation + whitespace
|
|
7
7
|
* (always) with case-fold + abbreviation expansion (opt-in).
|
|
8
8
|
*/
|
|
9
|
-
import { expandAbbreviations } from "
|
|
10
|
-
import { applyCjkNormalization } from "
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
9
|
+
import { expandAbbreviations } from "#abbreviations";
|
|
10
|
+
import { applyCjkNormalization } from "#cjk";
|
|
11
|
+
import { spaceAfterComma } from "#comma-spacing";
|
|
12
|
+
import { applyNFC } from "#nfc";
|
|
13
|
+
import { composeMaps, identityMap } from "#offset-map";
|
|
14
|
+
import { applyPunctuation } from "#punctuation";
|
|
15
|
+
import { collapseWhitespace } from "#whitespace";
|
|
15
16
|
export function normalize(raw, opts) {
|
|
16
17
|
const transforms = [];
|
|
17
18
|
let text = raw;
|
|
@@ -27,7 +28,7 @@ export function normalize(raw, opts) {
|
|
|
27
28
|
// parse) and fold full-width ASCII + the ideographic space. Runs after NFC so it sees composed
|
|
28
29
|
// forms, before punctuation/whitespace so any gap left by 〒 is then collapsed. No-op off-script.
|
|
29
30
|
{
|
|
30
|
-
const r = applyCjkNormalization(text);
|
|
31
|
+
const r = applyCjkNormalization(text, opts?.postalMark ? { postalMark: opts.postalMark } : {});
|
|
31
32
|
if (r.folded > 0 || r.stripped > 0) {
|
|
32
33
|
text = r.text;
|
|
33
34
|
map = composeMaps(map, r.map);
|
|
@@ -43,10 +44,23 @@ export function normalize(raw, opts) {
|
|
|
43
44
|
transforms.push({ kind: "normalize_punctuation", replacements: r.replacements });
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
// 2.5 Comma spacing — a comma glued to a letter gains a space. Runs after punctuation (so a folded
|
|
48
|
+
// full-width comma is seen) and before whitespace collapse (so a comma already followed by a space is
|
|
49
|
+
// never doubled).
|
|
50
|
+
{
|
|
51
|
+
const r = spaceAfterComma(text);
|
|
52
|
+
if (r.inserted > 0) {
|
|
53
|
+
text = r.text;
|
|
54
|
+
map = composeMaps(map, r.map);
|
|
55
|
+
transforms.push({ kind: "space_after_comma", inserted: r.inserted });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
46
58
|
// 3. Whitespace
|
|
47
59
|
{
|
|
48
60
|
const r = collapseWhitespace(text);
|
|
49
|
-
|
|
61
|
+
// Compare the TEXT, not its length: folding a lone tab to a space is length-preserving, and a
|
|
62
|
+
// length test reads that edit as no edit at all.
|
|
63
|
+
if (r.text !== text) {
|
|
50
64
|
text = r.text;
|
|
51
65
|
map = composeMaps(map, r.map);
|
|
52
66
|
transforms.push({ kind: "collapse_whitespace", runs: r.runs });
|
package/out/compute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../compute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../lib/compute.ts"],"names":[],"mappings":"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"}
|
package/out/fold.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Match-key folds: the loss-y transforms a comparison applies to both sides.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Lower-case, whitespace runs collapsed to one space, ends trimmed. The fold every string comparison applies before it
|
|
9
|
+
* compares; it keeps punctuation and diacritics, so `Saint-Étienne` and `Saint-Etienne` stay distinct.
|
|
10
|
+
*/
|
|
11
|
+
export declare function foldCaseWhitespace(input: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Combining marks removed after NFD decomposition: `é` → `e`, `ł` unchanged (it is not a base plus a mark). Case and
|
|
14
|
+
* whitespace are untouched.
|
|
15
|
+
*/
|
|
16
|
+
export declare function stripCombiningMarks(input: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* {@link foldCaseWhitespace} over the NFKC composition, with locale-aware lower-casing: fullwidth and compatibility
|
|
19
|
+
* forms fold together before comparison.
|
|
20
|
+
*/
|
|
21
|
+
export declare function foldNFKCWhitespace(input: string): string;
|
|
22
|
+
//# sourceMappingURL=fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../lib/fold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
package/out/fold.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Match-key folds: the loss-y transforms a comparison applies to both sides.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Lower-case, whitespace runs collapsed to one space, ends trimmed. The fold every string comparison applies before it
|
|
9
|
+
* compares; it keeps punctuation and diacritics, so `Saint-Étienne` and `Saint-Etienne` stay distinct.
|
|
10
|
+
*/
|
|
11
|
+
export function foldCaseWhitespace(input) {
|
|
12
|
+
return input.toLowerCase().replaceAll(/\s+/gu, " ").trim();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Combining marks removed after NFD decomposition: `é` → `e`, `ł` unchanged (it is not a base plus a mark). Case and
|
|
16
|
+
* whitespace are untouched.
|
|
17
|
+
*/
|
|
18
|
+
export function stripCombiningMarks(input) {
|
|
19
|
+
return input.normalize("NFD").replaceAll(/\p{M}/gu, "");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* {@link foldCaseWhitespace} over the NFKC composition, with locale-aware lower-casing: fullwidth and compatibility
|
|
23
|
+
* forms fold together before comparison.
|
|
24
|
+
*/
|
|
25
|
+
export function foldNFKCWhitespace(input) {
|
|
26
|
+
return input.normalize("NFKC").toLocaleLowerCase().replaceAll(/\s+/gu, " ").trim();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=fold.js.map
|
package/out/fold.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../lib/fold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACnF,CAAC"}
|
package/out/index.d.ts
CHANGED
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
*
|
|
13
13
|
* See `docs/engineering/reference/STAGES.md` § Stage 1 for the contract.
|
|
14
14
|
*/
|
|
15
|
-
export { type AbbreviationEntry, abbreviationDictionary, expandAbbreviations } from "
|
|
16
|
-
export { applyCjkNormalization, type CjkResult } from "
|
|
17
|
-
export { normalize } from "
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
21
|
-
export
|
|
22
|
-
export {
|
|
15
|
+
export { type AbbreviationEntry, abbreviationDictionary, expandAbbreviations } from "#abbreviations";
|
|
16
|
+
export { applyCjkNormalization, type CjkResult } from "#cjk";
|
|
17
|
+
export { normalize } from "#compute";
|
|
18
|
+
export { foldCaseWhitespace, foldNFKCWhitespace, stripCombiningMarks } from "#fold";
|
|
19
|
+
export { applyNFC } from "#nfc";
|
|
20
|
+
export { composeMaps, identityMap } from "#offset-map";
|
|
21
|
+
export { applyPunctuation } from "#punctuation";
|
|
22
|
+
export type { NormalizationTransform, NormalizeOpts, NormalizedInput, SpanRange } from "#types";
|
|
23
|
+
export { collapseWhitespace } from "#whitespace";
|
|
23
24
|
//# sourceMappingURL=index.d.ts.map
|
package/out/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpG,OAAO,EAAE,qBAAqB,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
|
package/out/index.js
CHANGED
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
*
|
|
13
13
|
* See `docs/engineering/reference/STAGES.md` § Stage 1 for the contract.
|
|
14
14
|
*/
|
|
15
|
-
export { abbreviationDictionary, expandAbbreviations } from "
|
|
16
|
-
export { applyCjkNormalization } from "
|
|
17
|
-
export { normalize } from "
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
21
|
-
export {
|
|
15
|
+
export { abbreviationDictionary, expandAbbreviations } from "#abbreviations";
|
|
16
|
+
export { applyCjkNormalization } from "#cjk";
|
|
17
|
+
export { normalize } from "#compute";
|
|
18
|
+
export { foldCaseWhitespace, foldNFKCWhitespace, stripCombiningMarks } from "#fold";
|
|
19
|
+
export { applyNFC } from "#nfc";
|
|
20
|
+
export { composeMaps, identityMap } from "#offset-map";
|
|
21
|
+
export { applyPunctuation } from "#punctuation";
|
|
22
|
+
export { collapseWhitespace } from "#whitespace";
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
package/out/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAA0B,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAA0B,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpG,OAAO,EAAE,qBAAqB,EAAkB,MAAM,MAAM,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
|
package/out/nfc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfc.d.ts","sourceRoot":"","sources":["../nfc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQjD"}
|
|
1
|
+
{"version":3,"file":"nfc.d.ts","sourceRoot":"","sources":["../lib/nfc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQjD"}
|
package/out/nfc.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* map each output index to the start of its source sequence. Rare CJK edge cases involving
|
|
12
12
|
* variant selectors may produce off-by-one offsets — acceptable for v1.
|
|
13
13
|
*/
|
|
14
|
-
import { identityMap } from "
|
|
14
|
+
import { identityMap } from "#offset-map";
|
|
15
15
|
export function applyNFC(input) {
|
|
16
16
|
const normalized = input.normalize("NFC");
|
|
17
17
|
if (normalized === input) {
|
package/out/nfc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfc.js","sourceRoot":"","sources":["../nfc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"nfc.js","sourceRoot":"","sources":["../lib/nfc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAWzC,MAAM,UAAU,QAAQ,CAAC,KAAa;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAEzC,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACvE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACnF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAa,EAAE,MAAc;IACpD,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAE,CAAA;QACzC,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEvC,gGAAgG;QAChG,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAE,CAAA;YACtC,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAE/B,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAE,CAAA;gBAExC,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC5C,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAClC,CAAC;qBAAM,CAAC;oBACP,MAAK;gBACN,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,CAAA;QACZ,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC"}
|
package/out/offset-map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offset-map.d.ts","sourceRoot":"","sources":["../offset-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAShF"}
|
|
1
|
+
{"version":3,"file":"offset-map.d.ts","sourceRoot":"","sources":["../lib/offset-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAShF"}
|
package/out/offset-map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offset-map.js","sourceRoot":"","sources":["../offset-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACpC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAA;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACT,CAAC;IAED,OAAO,CAAC,CAAA;AACT,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,YAAsB;IACrE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,YAAY,CAAC,MAAM,CAAC,CAAA;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAE,CAAA;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC"}
|
|
1
|
+
{"version":3,"file":"offset-map.js","sourceRoot":"","sources":["../lib/offset-map.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACpC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAA;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACT,CAAC;IAED,OAAO,CAAC,CAAA;AACT,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,YAAsB;IACrE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,YAAY,CAAC,MAAM,CAAC,CAAA;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAE,CAAA;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC"}
|
package/out/punctuation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation.d.ts","sourceRoot":"","sources":["../punctuation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"punctuation.d.ts","sourceRoot":"","sources":["../lib/punctuation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA8BjE"}
|
package/out/punctuation.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Punctuation normalization — fancy quotes / dashes to ASCII equivalents. Identity-length: every
|
|
7
7
|
* fancy character is a single codepoint that maps to a single ASCII char.
|
|
8
8
|
*/
|
|
9
|
-
import { identityMap } from "
|
|
9
|
+
import { identityMap } from "#offset-map";
|
|
10
10
|
const REPLACEMENTS = new Map([
|
|
11
11
|
["‘", "'"], // ‘
|
|
12
12
|
["’", "'"], // ’
|
|
@@ -14,8 +14,10 @@ const REPLACEMENTS = new Map([
|
|
|
14
14
|
["”", '"'], // ”
|
|
15
15
|
["–", "-"], // – en dash
|
|
16
16
|
["—", "-"], // — em dash
|
|
17
|
+
["‐", "-"], // ‐ U+2010 hyphen
|
|
17
18
|
["−", "-"], // − U+2212 minus sign — Japanese IMEs emit this as the block separator (1−2−3)
|
|
18
19
|
["―", "-"], // ― U+2015 horizontal bar — another common JP block separator
|
|
20
|
+
["﹣", "-"], // ﹣ U+FE63 small hyphen-minus
|
|
19
21
|
["…", "..."], // … expands; tracked specially
|
|
20
22
|
[" ", " "], // non-breaking space
|
|
21
23
|
]);
|
package/out/punctuation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punctuation.js","sourceRoot":"","sources":["../punctuation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"punctuation.js","sourceRoot":"","sources":["../lib/punctuation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAiB;IAC5C,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI;IAChB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI;IAChB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI;IAChB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI;IAChB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY;IACxB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY;IACxB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,kBAAkB;IAC9B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,+EAA+E;IAC3F,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,8DAA8D;IAC1E,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,8BAA8B;IAC1C,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,+BAA+B;IAC7C,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,qBAAqB;CACjC,CAAC,CAAA;AAQF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACpB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEhC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,IAAI,CAAC,CAAA;YAEjB,mGAAmG;YACnG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAA;gBACjB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACZ,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IACxE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAA;AACjD,CAAC"}
|
package/out/types.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ export type NormalizationTransform = {
|
|
|
28
28
|
} | {
|
|
29
29
|
kind: "normalize_punctuation";
|
|
30
30
|
replacements: number;
|
|
31
|
+
} | {
|
|
32
|
+
kind: "space_after_comma";
|
|
33
|
+
inserted: number;
|
|
31
34
|
} | {
|
|
32
35
|
kind: "normalize_cjk";
|
|
33
36
|
folded: number;
|
|
@@ -79,5 +82,12 @@ export interface NormalizeOpts {
|
|
|
79
82
|
* Skip Unicode NFC. Only use for debugging — production callers should leave on.
|
|
80
83
|
*/
|
|
81
84
|
skipNFC?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* What the CJK pass does with the postal mark 〒 (U+3012). `strip` (the default) drops it: it is byte-fallback OOV for
|
|
87
|
+
* the SentencePiece tokenizer and fragments the digits after it. `keep` leaves it in place for a classifier whose
|
|
88
|
+
* vocabulary carries it — the character-path CJK model was trained with the mark in front of every postcode, and
|
|
89
|
+
* without it misreads the prefecture boundary (`885-0061 宮崎県都城市…` → prefecture `崎県都`).
|
|
90
|
+
*/
|
|
91
|
+
postalMark?: "strip" | "keep";
|
|
82
92
|
}
|
|
83
93
|
//# sourceMappingURL=types.d.ts.map
|
package/out/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,SAAS,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,UAAU,EAAE,sBAAsB,EAAE,CAAA;IAEpC;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,SAAS,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,UAAU,EAAE,sBAAsB,EAAE,CAAA;IAEpC;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC7B"}
|
package/out/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/out/whitespace.d.ts
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Whitespace collapse —
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Whitespace collapse — a run of inline whitespace (`[ \t]`) becomes one ASCII space AT EVERY RUN
|
|
7
|
+
* LENGTH, so a lone tab normalizes exactly as a doubled one does. Newlines (`\n`/`\r`) are preserved:
|
|
8
|
+
* QueryShape's segmentation grammar reads one as a segment separator on a par with a comma, and it
|
|
9
|
+
* reads a RAW tab the same way — folding every tab here is what keeps a tab-separated export from
|
|
10
|
+
* re-segmenting the query. The trailing trim also drops trailing sentence-punctuation NOISE (#829 tail): a
|
|
9
11
|
* trailing `.`/`,`/`;`/`:` (e.g. `…Washington DC.`) glues onto the last token and drops the street
|
|
10
12
|
* tier (`address_point`→`admin`). Trailing only + a conservative set — leading punctuation and
|
|
11
13
|
* quotes/brackets are never touched (they can be meaningful). Offset-map-correct via the same slice
|
|
@@ -14,6 +16,10 @@
|
|
|
14
16
|
export interface WhitespaceResult {
|
|
15
17
|
text: string;
|
|
16
18
|
map: number[];
|
|
19
|
+
/**
|
|
20
|
+
* How many inline-whitespace runs were REWRITTEN — a run longer than one character, or a one-character run that was
|
|
21
|
+
* not already an ASCII space. A run that was already a single space is not one of them.
|
|
22
|
+
*/
|
|
17
23
|
runs: number;
|
|
18
24
|
}
|
|
19
25
|
export declare function collapseWhitespace(input: string): WhitespaceResult;
|
package/out/whitespace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whitespace.d.ts","sourceRoot":"","sources":["../whitespace.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"whitespace.d.ts","sourceRoot":"","sources":["../lib/whitespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,EAAE,CAAA;IACb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAsElE"}
|
package/out/whitespace.js
CHANGED
|
@@ -3,20 +3,22 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Whitespace collapse —
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Whitespace collapse — a run of inline whitespace (`[ \t]`) becomes one ASCII space AT EVERY RUN
|
|
7
|
+
* LENGTH, so a lone tab normalizes exactly as a doubled one does. Newlines (`\n`/`\r`) are preserved:
|
|
8
|
+
* QueryShape's segmentation grammar reads one as a segment separator on a par with a comma, and it
|
|
9
|
+
* reads a RAW tab the same way — folding every tab here is what keeps a tab-separated export from
|
|
10
|
+
* re-segmenting the query. The trailing trim also drops trailing sentence-punctuation NOISE (#829 tail): a
|
|
9
11
|
* trailing `.`/`,`/`;`/`:` (e.g. `…Washington DC.`) glues onto the last token and drops the street
|
|
10
12
|
* tier (`address_point`→`admin`). Trailing only + a conservative set — leading punctuation and
|
|
11
13
|
* quotes/brackets are never touched (they can be meaningful). Offset-map-correct via the same slice
|
|
12
14
|
* as the whitespace trim, so span alignment survives.
|
|
13
15
|
*/
|
|
14
|
-
import { identityMap } from "
|
|
16
|
+
import { identityMap } from "#offset-map";
|
|
15
17
|
const INLINE_SPACE = /[ \t]/;
|
|
16
18
|
const ANY_SPACE = /[ \t\n\r]/;
|
|
17
19
|
/**
|
|
18
20
|
* Trailing NOISE trimmed off the END of the input: whitespace + the sentence-punctuation that a user commonly appends.
|
|
19
|
-
* NOT leading (a leading token is
|
|
21
|
+
* NOT leading (a leading token is required) and NOT quotes/brackets/parens.
|
|
20
22
|
*/
|
|
21
23
|
const TRAILING_NOISE = /[ \t\n\r.,;:]/;
|
|
22
24
|
export function collapseWhitespace(input) {
|
|
@@ -42,16 +44,15 @@ export function collapseWhitespace(input) {
|
|
|
42
44
|
while (i < input.length && INLINE_SPACE.test(input[i])) {
|
|
43
45
|
i += 1;
|
|
44
46
|
}
|
|
45
|
-
|
|
47
|
+
// A one-character run counts too when the character is not already an ASCII space: the tab→space
|
|
48
|
+
// rewrite emitted above is a real edit, and `changed` is what decides whether the caller ever
|
|
49
|
+
// receives it — the early return below hands back the untouched input otherwise.
|
|
50
|
+
if (i - start > 1 || ch !== " ") {
|
|
46
51
|
changed = true;
|
|
47
52
|
runs += 1;
|
|
48
53
|
}
|
|
49
54
|
continue;
|
|
50
55
|
}
|
|
51
|
-
// Collapse \r\n into one
|
|
52
|
-
if (ch === "\n" && out.at(-1) === "\r") {
|
|
53
|
-
// Already handled in CR branch above by emitting both; skip combiner check
|
|
54
|
-
}
|
|
55
56
|
out.push(ch);
|
|
56
57
|
map.push(i);
|
|
57
58
|
i += 1;
|
package/out/whitespace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whitespace.js","sourceRoot":"","sources":["../whitespace.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"whitespace.js","sourceRoot":"","sources":["../lib/whitespace.ts"],"names":[],"mappings":"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"}
|