@ycookiey/yfuzzy 0.4.1 → 0.5.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 +14 -0
- package/dist/entry.d.ts +8 -0
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +8 -1
- package/dist/entry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/matches.d.ts +5 -0
- package/dist/matches.d.ts.map +1 -1
- package/dist/matches.js +3 -3
- package/dist/matches.js.map +1 -1
- package/dist/pipeline.d.ts +2 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +46 -0
- package/dist/pipeline.js.map +1 -1
- package/dist/query.d.ts +6 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +13 -1
- package/dist/query.js.map +1 -1
- package/dist/romaji/convert.d.ts +2 -0
- package/dist/romaji/convert.d.ts.map +1 -1
- package/dist/romaji/convert.js +8 -0
- package/dist/romaji/convert.js.map +1 -1
- package/dist/terms.d.ts +20 -0
- package/dist/terms.d.ts.map +1 -0
- package/dist/terms.js +199 -0
- package/dist/terms.js.map +1 -0
- package/dist/tiers/tier1-exact.d.ts +31 -1
- package/dist/tiers/tier1-exact.d.ts.map +1 -1
- package/dist/tiers/tier1-exact.js +26 -15
- package/dist/tiers/tier1-exact.js.map +1 -1
- package/dist/tiers/tier2-flexible.d.ts.map +1 -1
- package/dist/tiers/tier2-flexible.js +3 -1
- package/dist/tiers/tier2-flexible.js.map +1 -1
- package/dist/tiers/tier3-typo.js +1 -1
- package/dist/tiers/tier3-typo.js.map +1 -1
- package/dist/tiers/tier4-structural.js +1 -1
- package/dist/tiers/tier4-structural.js.map +1 -1
- package/dist/tiers/types.d.ts +4 -1
- package/dist/tiers/types.d.ts.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/yfuzzy.min.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -125,6 +125,17 @@ const r = search('keki', ['ケーキ'], { includeMatches: true });
|
|
|
125
125
|
|
|
126
126
|
同点のときは literal の結果を採る(ハイライトが入力した文字の位置になる)。
|
|
127
127
|
|
|
128
|
+
ローマ字で長音を打った入力(`saabaa`・IME 式の `sa-ba-`)も、長音「ー」を含む item に直接一致する(打ちかけの `saab` でも当たる)。長音の位置を印にして照合するので、長音のない別の語(`obaasan` に対する オバサン)には当たらない。長音を省いた入力(`saba`)は従来どおり当たる。
|
|
129
|
+
|
|
130
|
+
### 複数の語
|
|
131
|
+
|
|
132
|
+
空白で区切ったクエリは、すべての語を含む item に絞る(語の順番は問わない。`cal goo` → `Google Calendar`)。
|
|
133
|
+
|
|
134
|
+
- 各語は直接一致(tier 1)だけを認める。1 文字の語は item の先頭か単語の頭からの一致だけ
|
|
135
|
+
- 別の語は別の単語に当たる(`claude c` の `c` は `Claude` 自身には当てない)
|
|
136
|
+
- score は最も弱い語の score。空白込みのクエリ全体としての一致と比べて高いほうを採る(並びどおり現れる item は今までどおり当たる)
|
|
137
|
+
- 並びは tier → 最も弱い語の段(下の tier 1 の段)→ 語の順番どおりか → 長さ
|
|
138
|
+
|
|
128
139
|
### tier
|
|
129
140
|
|
|
130
141
|
クエリは tier 1 から順に評価され、最初に一致した tier で確定する(既定は tier 1〜3。`maxTier: 4` で tier 4 も有効化)。`score` は 0〜1 で、上の tier ほど高い。
|
|
@@ -178,10 +189,13 @@ type SearchResult<T> = {
|
|
|
178
189
|
refIndex: number; // items 内の位置
|
|
179
190
|
score: number; // 0〜1、高いほど良い
|
|
180
191
|
tier: 1 | 2 | 3 | 4;
|
|
192
|
+
kind: MatchKind; // 一致の種類(下)
|
|
181
193
|
matches?: readonly [number, number][]; // includeMatches 時、tier 1/2 のみ
|
|
182
194
|
};
|
|
183
195
|
```
|
|
184
196
|
|
|
197
|
+
`kind` は一致の種類。tier 1 は `'prefix'`(item の先頭から)・`'word'`(単語の頭から)・`'initials'`(各単語の頭文字)・`'inner'`(単語の途中)、tier 2 は `'subsequence'`、tier 3 は `'typo'`、tier 4 は `'similar'`。複数の語のクエリでは、語ごとの一致を採用したときは最も弱い語の種類、空白込みの全体の一致を採用したときはその一致の種類。例えば長い文字列で偶然そろう頭文字の一致を除きたいときは `kind !== 'initials'` で絞る。
|
|
198
|
+
|
|
185
199
|
## 性能
|
|
186
200
|
|
|
187
201
|
短い文字列の索引向け(数百〜数十万件)。内部の前段フィルタと早期打ち切りにより、1 クエリの実測値は千件で約 1.5ms、1 万件で約 10ms、10 万件で約 90ms(環境依存)。同条件で fuse.js より高速。英字の item をかなを含むクエリで探すときは打鍵の照合が加わり、1.5〜2 倍程度になる。`maxTier` を下げる、または `romaji` を一方の方式だけに絞ると更に軽くなる。索引構築は 10 万件で約 0.7 秒(一度きり)。
|
package/dist/entry.d.ts
CHANGED
|
@@ -26,6 +26,14 @@ export interface IndexEntry {
|
|
|
26
26
|
readonly kunrei: RomajiForm | null;
|
|
27
27
|
/** ヘボン式 RomajiForm(romaji オプションで無効時 null) */
|
|
28
28
|
readonly hepburn: RomajiForm | null;
|
|
29
|
+
/**
|
|
30
|
+
* 長音の位置に印(-)を残したローマ字(spec 2.2)。長音「ー」を含む item だけ(それ以外は null)。
|
|
31
|
+
* ー を - に置き換えたかなを変換する(1 文字どうしの置き換えなので kana との位置の対応はそのまま)
|
|
32
|
+
*/
|
|
33
|
+
readonly long: RomajiForm | null;
|
|
34
|
+
readonly longHeads: ReadonlySet<number>;
|
|
35
|
+
readonly longHeadList: readonly number[];
|
|
36
|
+
readonly longMask: number;
|
|
29
37
|
/** 打鍵の文字(英小文字・'・-)を含むか。含まなければ打鍵ラティスの打鍵経路は一致し得ない */
|
|
30
38
|
readonly hasKeystrokeChar: boolean;
|
|
31
39
|
/** bigram 集合(tier 4 用、遅延生成) */
|
package/dist/entry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAI9E,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,iBAAiB;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,qCAAqC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,+BAA+B;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7B;AA8BD,yBAAyB;AACzB,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAgC1F;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAG5D"}
|
package/dist/entry.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// データ側派生表現(spec 2.3)。Index 構築時に item ごとの正規化・ローマ字を事前計算する。
|
|
2
2
|
// bigram は maxTier:4 が per-call で要否不明のため遅延生成(spec 判断メモ)。
|
|
3
3
|
import { normalize } from './normalize.js';
|
|
4
|
-
import { KUNREI, HEPBURN, kunreiEnabled, hepburnEnabled, } from './romaji/convert.js';
|
|
4
|
+
import { KUNREI, HEPBURN, kunreiEnabled, hepburnEnabled, longVowelTable, } from './romaji/convert.js';
|
|
5
5
|
import { toRomajiForm, kanaBoundaries } from './syllable.js';
|
|
6
6
|
import { generateBigrams } from './bigram.js';
|
|
7
7
|
import { charMask } from './charmask.js';
|
|
@@ -42,6 +42,9 @@ export function buildEntry(raw, refIndex, romaji) {
|
|
|
42
42
|
const heads = wordHeads(kana, raw);
|
|
43
43
|
const kunreiHeads = romajiHeads(kunrei, heads);
|
|
44
44
|
const hepburnHeads = romajiHeads(hepburn, heads);
|
|
45
|
+
const longTable = longVowelTable(romaji);
|
|
46
|
+
const long = longTable !== null && kana.text.includes('ー') ? toRomajiForm(kana.text.replaceAll('ー', '-'), longTable) : null;
|
|
47
|
+
const longHeads = romajiHeads(long, heads);
|
|
45
48
|
return {
|
|
46
49
|
refIndex,
|
|
47
50
|
raw,
|
|
@@ -52,6 +55,10 @@ export function buildEntry(raw, refIndex, romaji) {
|
|
|
52
55
|
kanaHeadList: sorted(heads),
|
|
53
56
|
kunreiHeadList: sorted(kunreiHeads),
|
|
54
57
|
hepburnHeadList: sorted(hepburnHeads),
|
|
58
|
+
long,
|
|
59
|
+
longHeads,
|
|
60
|
+
longHeadList: sorted(longHeads),
|
|
61
|
+
longMask: long ? charMask(long.text) : 0,
|
|
55
62
|
kanaMask: charMask(kana.text),
|
|
56
63
|
kunreiMask: kunrei ? charMask(kunrei.text) : 0,
|
|
57
64
|
hepburnMask: hepburn ? charMask(hepburn.text) : 0,
|
package/dist/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yDAAyD;AAEzD,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IndexOptions, SearchOptions, SearchResult, SearchIndex } from './types.js';
|
|
2
|
-
export type { IndexOptions, SearchOptions, SearchResult, SearchIndex, RomajiOption, SeparatorConfig, MatchingOption, } from './types.js';
|
|
2
|
+
export type { IndexOptions, SearchOptions, SearchResult, SearchIndex, RomajiOption, SeparatorConfig, MatchKind, MatchingOption, } from './types.js';
|
|
3
3
|
export declare function createIndex(items: readonly string[], options?: IndexOptions<string> & SearchOptions): SearchIndex<string>;
|
|
4
4
|
export declare function createIndex<T>(items: readonly T[], options: IndexOptions<T> & SearchOptions & {
|
|
5
5
|
getText: (item: T) => string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAwBpB,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAC7C,WAAW,CAAC,MAAM,CAAC,CAAC;AACvB,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,GAC1E,WAAW,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAwBpB,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAC7C,WAAW,CAAC,MAAM,CAAC,CAAC;AACvB,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,GAC1E,WAAW,CAAC,CAAC,CAAC,CAAC;AAgDlB,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAC7C,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1B,wBAAgB,MAAM,CAAC,CAAC,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAE,GAC1E,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// 単発 search は createIndex の薄いラッパ(spec 1章: 両者は完全等価)。
|
|
3
3
|
import { buildEntry } from './entry.js';
|
|
4
4
|
import { runSearch } from './pipeline.js';
|
|
5
|
-
import { computeMatches } from './matches.js';
|
|
5
|
+
import { computeMatches, mergeSpans } from './matches.js';
|
|
6
6
|
const DEFAULT_MAX_TIER = 3;
|
|
7
7
|
const DEFAULT_MIN_SCORE = 0;
|
|
8
8
|
function resolveConfig(romaji, separatorExpansion, matching, opts) {
|
|
@@ -41,9 +41,13 @@ export function createIndex(items, options = {}) {
|
|
|
41
41
|
refIndex: h.refIndex,
|
|
42
42
|
score: h.score,
|
|
43
43
|
tier: h.tier,
|
|
44
|
+
kind: h.match.kind,
|
|
44
45
|
};
|
|
45
46
|
// tier 1/2 のみ matches を付与(tier 3/4 は positions=null → undefined のまま)
|
|
46
|
-
if (config.includeMatches && h.
|
|
47
|
+
if (config.includeMatches && h.parts !== undefined) {
|
|
48
|
+
result.matches = mergeSpans(h.parts.flatMap((p) => computeMatches(entries[h.refIndex], p)));
|
|
49
|
+
}
|
|
50
|
+
else if (config.includeMatches && h.match.positions !== null) {
|
|
47
51
|
result.matches = computeMatches(entries[h.refIndex], h.match);
|
|
48
52
|
}
|
|
49
53
|
return result;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AAEpD,OAAO,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/matches.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { IndexEntry } from './entry.js';
|
|
2
2
|
import type { TierMatch } from './tiers/types.js';
|
|
3
|
+
import type { Syllable } from './syllable.js';
|
|
4
|
+
/** romaji 位置 p を含む音節の kana 位置(音節全体)を返す */
|
|
5
|
+
export declare function romajiPosToKana(p: number, syllables: readonly Syllable[]): number[];
|
|
6
|
+
/** spans を昇順ソートし、重複・隣接(半開区間で接する)を連続区間にマージ */
|
|
7
|
+
export declare function mergeSpans(spans: [number, number][]): [number, number][];
|
|
3
8
|
/**
|
|
4
9
|
* 採用位置から元文字列上の一致区間を算出する。
|
|
5
10
|
* match.positions が null(tier 3/4)の場合は [] を返す(呼び出し側で undefined 扱い)。
|
package/dist/matches.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches.d.ts","sourceRoot":"","sources":["../src/matches.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"matches.d.ts","sourceRoot":"","sources":["../src/matches.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CASnF;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAaxE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAyBtF"}
|
package/dist/matches.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// 2. kana 位置 → 元文字列位置(normMap 経由。n:1 正規化は元区間全体)
|
|
5
5
|
// tier 3/4 は positions=null のため呼ばれない(呼ばれても [] を返す)。
|
|
6
6
|
/** romaji 位置 p を含む音節の kana 位置(音節全体)を返す */
|
|
7
|
-
function romajiPosToKana(p, syllables) {
|
|
7
|
+
export function romajiPosToKana(p, syllables) {
|
|
8
8
|
for (const s of syllables) {
|
|
9
9
|
if (p >= s.romajiStart && p < s.romajiStart + s.romajiLen) {
|
|
10
10
|
const out = [];
|
|
@@ -16,7 +16,7 @@ function romajiPosToKana(p, syllables) {
|
|
|
16
16
|
return [];
|
|
17
17
|
}
|
|
18
18
|
/** spans を昇順ソートし、重複・隣接(半開区間で接する)を連続区間にマージ */
|
|
19
|
-
function mergeSpans(spans) {
|
|
19
|
+
export function mergeSpans(spans) {
|
|
20
20
|
if (spans.length === 0)
|
|
21
21
|
return [];
|
|
22
22
|
spans.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
@@ -47,7 +47,7 @@ export function computeMatches(entry, match) {
|
|
|
47
47
|
kanaPositions.add(p);
|
|
48
48
|
}
|
|
49
49
|
else {
|
|
50
|
-
const form = match.space === 'kunrei' ? entry.kunrei : entry.hepburn;
|
|
50
|
+
const form = match.space === 'kunrei' ? entry.kunrei : match.space === 'hepburn' ? entry.hepburn : entry.long;
|
|
51
51
|
if (form) {
|
|
52
52
|
for (const p of match.positions) {
|
|
53
53
|
for (const kp of romajiPosToKana(p, form.syllables))
|
package/dist/matches.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches.js","sourceRoot":"","sources":["../src/matches.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,4CAA4C;AAC5C,8DAA8D;AAC9D,kDAAkD;AAClD,oDAAoD;AAMpD,0CAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"matches.js","sourceRoot":"","sources":["../src/matches.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface SearchHit {
|
|
|
19
19
|
readonly score: number;
|
|
20
20
|
readonly tier: 1 | 2 | 3 | 4;
|
|
21
21
|
readonly match: TierMatch;
|
|
22
|
+
/** 複数の語の一致(spec 2.7)のとき、各語の一致(ハイライトはこれらを合わせる) */
|
|
23
|
+
readonly parts?: readonly TierMatch[];
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
26
|
* 検索本体。query は生入力、entries は構築済みエントリ。
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY3D,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAuBD,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,MAAM,EAAE,YAAY,GACnB,SAAS,EAAE,CAMb"}
|
package/dist/pipeline.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// 公開 API(index.ts)から呼ばれる内部エンジン。
|
|
3
3
|
import { normalizeQuery } from './query.js';
|
|
4
4
|
import { expandQuery } from './expand.js';
|
|
5
|
+
import { KIND_OF_CLASS } from './tiers/tier1-exact.js';
|
|
6
|
+
import { matchTerms } from './terms.js';
|
|
5
7
|
import { tier1Exact } from './tiers/tier1-exact.js';
|
|
6
8
|
import { tier2Flexible } from './tiers/tier2-flexible.js';
|
|
7
9
|
import { tier3Typo } from './tiers/tier3-typo.js';
|
|
@@ -68,6 +70,50 @@ export function runSearch(query, entries, config) {
|
|
|
68
70
|
const trimmed = query.trim();
|
|
69
71
|
if (trimmed === '')
|
|
70
72
|
return []; // 空文字・空白のみ(spec 7章)
|
|
73
|
+
const words = trimmed.split(/\s+/u);
|
|
74
|
+
if (words.length >= 2)
|
|
75
|
+
return runTerms(trimmed, words, entries, config);
|
|
76
|
+
return runSingle(trimmed, entries, config);
|
|
77
|
+
}
|
|
78
|
+
/** 段の番号(tier 1 の kind から) */
|
|
79
|
+
const CLASS_OF_KIND = { prefix: 3, word: 2, initials: 1, inner: 0 };
|
|
80
|
+
/** 複数の語のクエリの tier 1 の点数(spec 2.7): tier 1 の帯の中で (段 + 0.5×順番どおり + 0.5×素点) / 4 */
|
|
81
|
+
function termsScore(cls, ordered, raw) {
|
|
82
|
+
return (3 + (cls + (ordered ? 0.5 : 0) + 0.5 * raw) / 4) / 4;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 複数の語(spec 2.7): 空白込みの全体の一致と、語ごとの一致(すべての語を含む item)の高いほうを採る。
|
|
86
|
+
* 全体の一致は順番どおり扱いで、tier 1 は複数の語と同じ形の点数に直して比べる(完全一致は 1.0 のまま)
|
|
87
|
+
*/
|
|
88
|
+
function runTerms(trimmed, words, entries, config) {
|
|
89
|
+
const modes = modesFor(config.matching);
|
|
90
|
+
const terms = words.map((w) => expandQuery(w, config.separatorExpansion).flatMap((p) => normalizePath(p, config.romaji, modes)));
|
|
91
|
+
const singles = words.map((w) => [...w].length === 1);
|
|
92
|
+
const best = new Map();
|
|
93
|
+
// 全体の一致は上位 limit 件だけで足りる: 点数の直し方は順位を保ち、最終の点数は全体の一致の点数以上なので、
|
|
94
|
+
// 全体の一致で上位 limit 件に入らない item が全体の一致の点数で最終の上位 limit 件に入ることはない
|
|
95
|
+
for (const h of runSingle(trimmed, entries, { ...config, minScore: 0 })) {
|
|
96
|
+
if (h.tier !== 1) {
|
|
97
|
+
best.set(h.refIndex, h);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const cls = CLASS_OF_KIND[h.match.kind];
|
|
101
|
+
best.set(h.refIndex, { ...h, score: termsScore(cls, true, h.match.intraScore * 4 - cls) });
|
|
102
|
+
}
|
|
103
|
+
for (const [idx, t] of matchTerms(terms, singles, entries)) {
|
|
104
|
+
const score = termsScore(t.cls, t.ordered, t.raw);
|
|
105
|
+
const cur = best.get(idx);
|
|
106
|
+
if (cur !== undefined && cur.score >= score)
|
|
107
|
+
continue;
|
|
108
|
+
const match = { tier: 1, kind: KIND_OF_CLASS[t.cls], intraScore: score * 4 - 3, space: 'kana', positions: null };
|
|
109
|
+
best.set(idx, { refIndex: idx, score, tier: 1, match, parts: t.parts });
|
|
110
|
+
}
|
|
111
|
+
const hits = [...best.values()].filter((h) => h.score >= config.minScore);
|
|
112
|
+
hits.sort((a, b) => b.score - a.score || a.refIndex - b.refIndex);
|
|
113
|
+
return config.limit !== undefined ? hits.slice(0, config.limit) : hits;
|
|
114
|
+
}
|
|
115
|
+
/** 1 つの語(空白を含まないクエリ)の検索 */
|
|
116
|
+
function runSingle(trimmed, entries, config) {
|
|
71
117
|
const pathStrings = expandQuery(trimmed, config.separatorExpansion);
|
|
72
118
|
if (pathStrings.length === 0)
|
|
73
119
|
return [];
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,gCAAgC;AAEhC,OAAO,EAAE,cAAc,EAAwC,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAKhE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gDAAgD;AAChD,8CAA8C;AAC9C,MAAM,YAAY,GAAuB,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAajG,iDAAiD;AACjD,SAAS,QAAQ,CAAC,QAAwB;IACxC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,CAAS,EAAE,MAAoB,EAAE,KAA2B;IACjF,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,CAAE,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,CAAC,CAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/query.d.ts
CHANGED
|
@@ -16,6 +16,12 @@ export interface NormalizedQuery {
|
|
|
16
16
|
readonly kanaMask: number;
|
|
17
17
|
readonly kunreiMask: number;
|
|
18
18
|
readonly hepburnMask: number;
|
|
19
|
+
/**
|
|
20
|
+
* 長音の印つきローマ字(spec 2.2)。phonetic 経路で、母音の重なり(aa)か母音の後の - があるときだけ。
|
|
21
|
+
* 母音の重なりを「母音 + -」にしてからかな・ローマ字にする(saab → sa-b)。データ側 long と照合する
|
|
22
|
+
*/
|
|
23
|
+
readonly long: string | null;
|
|
24
|
+
readonly longMask: number;
|
|
19
25
|
/** 打鍵ラティス(literal 経路でかなを含むとき。それ以外は null で kana を文字列照合) */
|
|
20
26
|
readonly lattice: Lattice | null;
|
|
21
27
|
/**
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAQA,OAAO,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAQA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAE1D,yBAAyB;AACzB,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/C,oBAAoB;AACpB,MAAM,WAAW,eAAe;IAC9B,aAAa;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7B;AAED,yBAAyB;AACzB,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,SAAsB,GAC3B,eAAe,CAsBjB;AAiBD,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,CAGlE"}
|
package/dist/query.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// postKana(手順4-5)。literal 経路は toKana を通さず、データ側と同じ正規化になる。
|
|
6
6
|
import { applyTransforms } from './normalize.js';
|
|
7
7
|
import { toKana } from './to-kana.js';
|
|
8
|
-
import { KUNREI, HEPBURN, kunreiEnabled, hepburnEnabled, } from './romaji/convert.js';
|
|
8
|
+
import { KUNREI, HEPBURN, kunreiEnabled, hepburnEnabled, longVowelTable, } from './romaji/convert.js';
|
|
9
9
|
import { kanaToRomaji } from './syllable.js';
|
|
10
10
|
import { generateBigrams } from './bigram.js';
|
|
11
11
|
import { charMask } from './charmask.js';
|
|
@@ -18,6 +18,7 @@ export function normalizeQuery(raw, romaji, mode = 'phonetic') {
|
|
|
18
18
|
const phonetic = mode === 'phonetic';
|
|
19
19
|
const kunrei = phonetic && kunreiEnabled(romaji) ? kanaToRomaji(kana, KUNREI) : null;
|
|
20
20
|
const hepburn = phonetic && hepburnEnabled(romaji) ? kanaToRomaji(kana, HEPBURN) : null;
|
|
21
|
+
const long = phonetic ? longVowelForm(pre, romaji) : null;
|
|
21
22
|
return {
|
|
22
23
|
kana,
|
|
23
24
|
singleChar: isSingleCodePoint(kana),
|
|
@@ -26,11 +27,22 @@ export function normalizeQuery(raw, romaji, mode = 'phonetic') {
|
|
|
26
27
|
kanaMask: charMask(kana),
|
|
27
28
|
kunreiMask: kunrei !== null ? charMask(kunrei) : 0,
|
|
28
29
|
hepburnMask: hepburn !== null ? charMask(hepburn) : 0,
|
|
30
|
+
long,
|
|
31
|
+
longMask: long !== null ? charMask(long) : 0,
|
|
29
32
|
lattice: phonetic ? null : buildLattice(kana),
|
|
30
33
|
shadowed: false,
|
|
31
34
|
bigrams: null,
|
|
32
35
|
};
|
|
33
36
|
}
|
|
37
|
+
const LONG_VOWEL = /([aiueo])\1|[aiueo]-/;
|
|
38
|
+
/** 長音の印つきローマ字(spec 2.2)。印が無ければ null */
|
|
39
|
+
function longVowelForm(pre, romaji) {
|
|
40
|
+
const table = longVowelTable(romaji);
|
|
41
|
+
if (table === null || !LONG_VOWEL.test(pre))
|
|
42
|
+
return null;
|
|
43
|
+
const marked = pre.replace(/([aiueo])\1+/g, '$1-');
|
|
44
|
+
return kanaToRomaji(applyTransforms(toKana(marked), 'postKana'), table);
|
|
45
|
+
}
|
|
34
46
|
function isSingleCodePoint(s) {
|
|
35
47
|
if (s.length === 0)
|
|
36
48
|
return false;
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,6CAA6C;AAC7C,EAAE;AACF,iEAAiE;AACjE,yDAAyD;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAgB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/romaji/convert.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export type RomajiOption = 'hepburn' | 'kunrei' | 'both' | false;
|
|
|
13
13
|
export declare function kunreiEnabled(option: RomajiOption): boolean;
|
|
14
14
|
/** ヘボン式の生成・照合が有効か */
|
|
15
15
|
export declare function hepburnEnabled(option: RomajiOption): boolean;
|
|
16
|
+
/** 長音の印つきローマ字(spec 2.2)に使う方式: 訓令、無効なら ヘボン、どちらも無効なら null */
|
|
17
|
+
export declare function longVowelTable(option: RomajiOption): RomajiTable | null;
|
|
16
18
|
/**
|
|
17
19
|
* core kana(1文字 or 拗音ダイグラフ 2文字、ー/ッ を含まない)をローマ字へ。
|
|
18
20
|
* テーブルに無い文字(漢字・記号・英数)は小文字化してそのまま返す(パススルー)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/romaji/convert.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,eAAO,MAAM,MAAM,EAAE,WAAkE,CAAC;AACxF,eAAO,MAAM,OAAO,EAAE,WAAoE,CAAC;AAE3F;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEjE,oBAAoB;AACpB,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3D;AAED,qBAAqB;AACrB,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE5D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAQpE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/romaji/convert.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,eAAO,MAAM,MAAM,EAAE,WAAkE,CAAC;AACxF,eAAO,MAAM,OAAO,EAAE,WAAoE,CAAC;AAE3F;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAEjE,oBAAoB;AACpB,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3D;AAED,qBAAqB;AACrB,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE5D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAIvE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAQpE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
package/dist/romaji/convert.js
CHANGED
|
@@ -12,6 +12,14 @@ export function kunreiEnabled(option) {
|
|
|
12
12
|
export function hepburnEnabled(option) {
|
|
13
13
|
return option === 'both' || option === 'hepburn';
|
|
14
14
|
}
|
|
15
|
+
/** 長音の印つきローマ字(spec 2.2)に使う方式: 訓令、無効なら ヘボン、どちらも無効なら null */
|
|
16
|
+
export function longVowelTable(option) {
|
|
17
|
+
if (kunreiEnabled(option))
|
|
18
|
+
return KUNREI;
|
|
19
|
+
if (hepburnEnabled(option))
|
|
20
|
+
return HEPBURN;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
15
23
|
/**
|
|
16
24
|
* core kana(1文字 or 拗音ダイグラフ 2文字、ー/ッ を含まない)をローマ字へ。
|
|
17
25
|
* テーブルに無い文字(漢字・記号・英数)は小文字化してそのまま返す(パススルー)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/romaji/convert.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,0CAA0C;AAE1C,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO5F,MAAM,CAAC,MAAM,MAAM,GAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACxF,MAAM,CAAC,MAAM,OAAO,GAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAQ3F,oBAAoB;AACpB,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC;AAClD,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAkB;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/romaji/convert.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,0CAA0C;AAE1C,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO5F,MAAM,CAAC,MAAM,MAAM,GAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACxF,MAAM,CAAC,MAAM,OAAO,GAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAQ3F,oBAAoB;AACpB,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,CAAC;AAClD,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC;AACnD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAkB;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/terms.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NormalizedQuery } from './query.js';
|
|
2
|
+
import type { IndexEntry } from './entry.js';
|
|
3
|
+
import type { TierMatch } from './tiers/types.js';
|
|
4
|
+
/** item ごとの最良の組み合わせ */
|
|
5
|
+
export interface TermsHit {
|
|
6
|
+
/** 弱い語の段 */
|
|
7
|
+
readonly cls: number;
|
|
8
|
+
/** 弱い語の素点 */
|
|
9
|
+
readonly raw: number;
|
|
10
|
+
/** 語の順番どおりに単語が並ぶか */
|
|
11
|
+
readonly ordered: boolean;
|
|
12
|
+
/** 各語の一致(ハイライト用) */
|
|
13
|
+
readonly parts: readonly TierMatch[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 語ごとの正規化済みクエリ(各語の経路の一覧)で照合し、すべての語を含む item の最良の組み合わせを返す。
|
|
17
|
+
* 先にすべての語の tier 1 で item を絞り(2 語目以降は、それまでの語に当たった item だけ)、残った item で出現を集める。
|
|
18
|
+
*/
|
|
19
|
+
export declare function matchTerms(terms: readonly (readonly NormalizedQuery[])[], singles: readonly boolean[], entries: readonly IndexEntry[]): Map<number, TermsHit>;
|
|
20
|
+
//# sourceMappingURL=terms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../src/terms.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAS,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA8BzD,uBAAuB;AACvB,MAAM,WAAW,QAAQ;IACvB,YAAY;IACZ,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oBAAoB;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAyKD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,CAAC,SAAS,eAAe,EAAE,CAAC,EAAE,EAC9C,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,EAAE,SAAS,UAAU,EAAE,GAC7B,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAmBvB"}
|