tokana 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/{compile-VQJF62SJ.js → compile-HVQHHVCT.js} +4 -3
- package/dist/compile-HVQHHVCT.js.map +1 -0
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/compile-VQJF62SJ.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -150,8 +150,9 @@ var ByteBuffer = class {
|
|
|
150
150
|
position;
|
|
151
151
|
constructor(arg) {
|
|
152
152
|
if (arg instanceof Uint8Array) {
|
|
153
|
-
const
|
|
154
|
-
|
|
153
|
+
const isShared = typeof SharedArrayBuffer !== "undefined" && arg.buffer instanceof SharedArrayBuffer;
|
|
154
|
+
const src = isShared ? new ArrayBuffer(arg.byteLength) : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);
|
|
155
|
+
if (isShared) {
|
|
155
156
|
new Uint8Array(src).set(arg);
|
|
156
157
|
}
|
|
157
158
|
this.buffer = src;
|
|
@@ -738,4 +739,4 @@ async function writeGzipped(path, data) {
|
|
|
738
739
|
export {
|
|
739
740
|
compile
|
|
740
741
|
};
|
|
741
|
-
//# sourceMappingURL=compile-
|
|
742
|
+
//# sourceMappingURL=compile-HVQHHVCT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/compile.ts","../src/trie/DoubleArrayBuilder.ts","../src/util/ByteBuffer.ts","../src/dict/ConnectionCosts.ts","../src/dict/CharacterDefinition.ts","../src/util/encoding.ts"],"sourcesContent":["/**\n * Dictionary compilation command.\n * Compiles MeCab source files (CSV, matrix.def, char.def, unk.def) into binary .dat.gz files.\n */\n\nimport { readFile, readdir, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { gzipSync } from \"node:zlib\";\nimport { DoubleArrayBuilder } from \"../../trie/DoubleArrayBuilder.js\";\nimport { ByteBuffer } from \"../../util/ByteBuffer.js\";\nimport { ConnectionCosts } from \"../../dict/ConnectionCosts.js\";\nimport { CharacterDefinition } from \"../../dict/CharacterDefinition.js\";\nimport { decodeAutoDetect } from \"../../util/encoding.js\";\n\nexport async function compile(args: string[]): Promise<void> {\n const sourceDir = args[0];\n const outputDir = args[1];\n // const formatFlag = args.indexOf(\"--format\");\n // const format = formatFlag >= 0 ? args[formatFlag + 1] : \"ipadic\";\n\n if (!sourceDir || !outputDir) {\n console.error(\"Usage: tokana build <source-dir> <output-dir> [--format ipadic|unidic|neologd]\");\n process.exit(1);\n }\n\n console.log(`Compiling dictionary from ${sourceDir} to ${outputDir}`);\n\n await mkdir(outputDir, { recursive: true });\n\n // Step 1: Parse matrix.def → connection costs\n console.log(\" Parsing matrix.def...\");\n const ccBuffer = await parseMatrixDef(join(sourceDir, \"matrix.def\"));\n await writeGzipped(join(outputDir, \"cc.dat.gz\"), ccBuffer);\n\n // Step 2: Parse char.def → character definitions\n console.log(\" Parsing char.def...\");\n const { categoryMap, compatMap, invokeBuf, charDef } = await parseCharDef(\n join(sourceDir, \"char.def\")\n );\n await writeGzipped(join(outputDir, \"unk_char.dat.gz\"), categoryMap);\n await writeGzipped(\n join(outputDir, \"unk_compat.dat.gz\"),\n new Uint8Array(compatMap.buffer)\n );\n await writeGzipped(join(outputDir, \"unk_invoke.dat.gz\"), invokeBuf);\n\n // Step 3: Parse CSV dictionary files → trie + token info\n console.log(\" Parsing CSV dictionary files...\");\n const csvFiles = (await readdir(sourceDir)).filter((f) => f.endsWith(\".csv\"));\n\n interface DictEntry {\n surface: string;\n leftId: number;\n rightId: number;\n cost: number;\n features: string;\n }\n\n const entries: DictEntry[] = [];\n for (const csvFile of csvFiles) {\n const raw = await readFile(join(sourceDir, csvFile));\n const text = decodeAutoDetect(new Uint8Array(raw));\n for (const line of text.split(\"\\n\")) {\n if (line.trim() === \"\") continue;\n // MeCab CSV format: surface,leftId,rightId,cost,features...\n const parts = parseCsvLine(line);\n if (parts.length < 5) continue;\n entries.push({\n surface: parts[0],\n leftId: parseInt(parts[1], 10),\n rightId: parseInt(parts[2], 10),\n cost: parseInt(parts[3], 10),\n features: parts.slice(4).join(\",\"),\n });\n }\n }\n\n // Sort entries by surface for trie construction\n entries.sort((a, b) => (a.surface < b.surface ? -1 : a.surface > b.surface ? 1 : 0));\n\n // Build trie and token info dictionary\n console.log(` Building trie from ${entries.length} entries...`);\n\n // Group entries by surface to handle duplicates\n const surfaceGroups = new Map<string, DictEntry[]>();\n for (const entry of entries) {\n const group = surfaceGroups.get(entry.surface);\n if (group) {\n group.push(entry);\n } else {\n surfaceGroups.set(entry.surface, [entry]);\n }\n }\n\n // Build token info dictionary buffer\n const tidBuffer = new ByteBuffer(entries.length * 64);\n const tidMapEntries: number[] = []; // wordId → position in tidBuffer\n let wordId = 0;\n\n const trieKeys: { key: number[]; value: number }[] = [];\n\n for (const [surface, group] of surfaceGroups) {\n const firstWordId = wordId;\n for (const entry of group) {\n const pos = tidBuffer.getPosition();\n tidMapEntries.push(pos);\n\n tidBuffer.putInt16(entry.leftId);\n tidBuffer.putInt16(entry.rightId);\n tidBuffer.putInt16(entry.cost);\n tidBuffer.putInt16(entry.features.length);\n tidBuffer.putString(entry.features);\n\n wordId++;\n }\n\n // Trie maps surface → first word ID for this surface\n trieKeys.push({\n key: Array.from(surface).map((ch) => ch.charCodeAt(0)),\n value: firstWordId,\n });\n }\n\n // Sort trie keys lexicographically\n trieKeys.sort((a, b) => {\n const len = Math.min(a.key.length, b.key.length);\n for (let i = 0; i < len; i++) {\n if (a.key[i] !== b.key[i]) return a.key[i] - b.key[i];\n }\n return a.key.length - b.key.length;\n });\n\n const { base, check } = DoubleArrayBuilder.build(trieKeys);\n\n // Save trie (base + check concatenated)\n const trieBuffer = new Int32Array(base.length + check.length);\n trieBuffer.set(base, 0);\n trieBuffer.set(check, base.length);\n await writeGzipped(\n join(outputDir, \"base.dat.gz\"),\n new Uint8Array(trieBuffer.buffer)\n );\n\n // Save token info dictionary\n await writeGzipped(join(outputDir, \"tid.dat.gz\"), tidBuffer.shrink());\n\n // Save token info position data (empty for now, features stored inline)\n await writeGzipped(join(outputDir, \"tid_pos.dat.gz\"), new Uint8Array(0));\n\n // Save target map\n const mapBuf = new ByteBuffer(4 + tidMapEntries.length * 4);\n mapBuf.putInt32(tidMapEntries.length);\n for (const pos of tidMapEntries) {\n mapBuf.putInt32(pos);\n }\n await writeGzipped(join(outputDir, \"tid_map.dat.gz\"), mapBuf.shrink());\n\n // Step 4: Parse unk.def → unknown word dictionary\n console.log(\" Parsing unk.def...\");\n const { unkBuf, unkPosBuf, unkMapBuf } = await parseUnkDef(\n join(sourceDir, \"unk.def\"),\n charDef\n );\n await writeGzipped(join(outputDir, \"unk.dat.gz\"), unkBuf);\n await writeGzipped(join(outputDir, \"unk_pos.dat.gz\"), unkPosBuf);\n await writeGzipped(join(outputDir, \"unk_map.dat.gz\"), unkMapBuf);\n\n console.log(\" Done!\");\n}\n\nfunction parseCsvLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') {\n if (inQuotes && i + 1 < line.length && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === \",\" && !inQuotes) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n}\n\nasync function parseMatrixDef(path: string): Promise<Uint8Array> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n // First line: forward_size backward_size\n const [forwardStr, backwardStr] = lines[0].split(/\\s+/);\n const forwardSize = parseInt(forwardStr, 10);\n const backwardSize = parseInt(backwardStr, 10);\n\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n\n for (let i = 1; i < lines.length; i++) {\n const parts = lines[i].trim().split(/\\s+/);\n if (parts.length < 3) continue;\n const fwd = parseInt(parts[0], 10);\n const bwd = parseInt(parts[1], 10);\n const cost = parseInt(parts[2], 10);\n cc.put(fwd, bwd, cost);\n }\n\n const buf = cc.toBuffer();\n return new Uint8Array(buf.buffer);\n}\n\nasync function parseCharDef(\n path: string\n): Promise<{\n categoryMap: Uint8Array;\n compatMap: Uint32Array;\n invokeBuf: Uint8Array;\n charDef: CharacterDefinition;\n}> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n const charDef = new CharacterDefinition();\n\n // First pass: register character classes\n const classNames = new Map<string, number>();\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n\n // Character class definition: CLASSNAME invoke group length\n const match = trimmed.match(\n /^([A-Z_]+)\\s+(0|1)\\s+(0|1)\\s+(\\d+)/\n );\n if (match && !trimmed.startsWith(\"0x\")) {\n const name = match[1];\n if (!classNames.has(name)) {\n const id = charDef.addCharacterClass({\n name,\n invoke: match[2] === \"1\",\n group: match[3] === \"1\",\n length: parseInt(match[4], 10),\n });\n classNames.set(name, id);\n }\n }\n }\n\n // Second pass: character range mappings\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n\n // Range mapping: 0xHHHH [..0xHHHH] CLASSNAME [COMPAT_CLASSES...]\n const match = trimmed.match(\n /^(0x[0-9A-Fa-f]+)(?:\\.\\.(0x[0-9A-Fa-f]+))?\\s+(\\S+)(?:\\s+(.*))?$/\n );\n if (match) {\n const start = parseInt(match[1], 16);\n const end = match[2] ? parseInt(match[2], 16) : start;\n const className = match[3];\n const classId = classNames.get(className);\n if (classId === undefined) continue;\n\n const compatStr = match[4]?.trim() ?? \"\";\n const compatClasses = compatStr\n ? compatStr\n .split(/\\s+/)\n .map((name) => classNames.get(name))\n .filter((id): id is number => id !== undefined)\n : [];\n\n charDef.setCharacterCategory(start, end, classId, [\n classId,\n ...compatClasses,\n ]);\n }\n }\n\n return {\n categoryMap: charDef.getCategoryMap(),\n compatMap: charDef.getCompatibleCategoryMap(),\n invokeBuf: charDef.toInvokeBuffer(),\n charDef,\n };\n}\n\nasync function parseUnkDef(\n path: string,\n _charDef: CharacterDefinition\n): Promise<{ unkBuf: Uint8Array; unkPosBuf: Uint8Array; unkMapBuf: Uint8Array }> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n const unkBuffer = new ByteBuffer(1024 * 64);\n const unkMapEntries: number[] = [];\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.startsWith(\"#\")) continue;\n const parts = parseCsvLine(line);\n if (parts.length < 5) continue;\n\n // Format: className,leftId,rightId,cost,features...\n // parts[0] is className\n const leftId = parseInt(parts[1], 10);\n const rightId = parseInt(parts[2], 10);\n const cost = parseInt(parts[3], 10);\n const features = parts.slice(4).join(\",\");\n\n const pos = unkBuffer.getPosition();\n unkMapEntries.push(pos);\n\n unkBuffer.putInt16(leftId);\n unkBuffer.putInt16(rightId);\n unkBuffer.putInt16(cost);\n unkBuffer.putInt16(features.length);\n unkBuffer.putString(features);\n }\n\n // Build map buffer\n const mapBuf = new ByteBuffer(4 + unkMapEntries.length * 4);\n mapBuf.putInt32(unkMapEntries.length);\n for (const pos of unkMapEntries) {\n mapBuf.putInt32(pos);\n }\n\n return {\n unkBuf: unkBuffer.shrink(),\n unkPosBuf: new Uint8Array(0),\n unkMapBuf: mapBuf.shrink(),\n };\n}\n\nasync function writeGzipped(path: string, data: Uint8Array): Promise<void> {\n const compressed = gzipSync(data);\n await writeFile(path, compressed);\n}\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const isShared =\n typeof SharedArrayBuffer !== \"undefined\" && arg.buffer instanceof SharedArrayBuffer;\n const src = isShared\n ? new ArrayBuffer(arg.byteLength)\n : (arg.buffer as ArrayBuffer).slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (isShared) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Encoding utilities for dictionary compilation.\n * Handles EUC-JP to UTF-8 conversion for MeCab dictionary sources.\n */\n\n/**\n * Decode EUC-JP encoded bytes to a UTF-8 string.\n * Uses the TextDecoder API available in both Node.js and browsers.\n */\nexport function decodeEucJp(data: Uint8Array): string {\n const decoder = new TextDecoder(\"euc-jp\");\n return decoder.decode(data);\n}\n\n/**\n * Detect if data is likely EUC-JP encoded.\n */\nexport function isEucJp(data: Uint8Array): boolean {\n // Check for EUC-JP high-byte patterns\n for (let i = 0; i < Math.min(data.length, 1000); i++) {\n const b = data[i];\n if (b >= 0xa1 && b <= 0xfe) {\n // Likely EUC-JP double-byte character\n if (i + 1 < data.length) {\n const b2 = data[i + 1];\n if (b2 >= 0xa1 && b2 <= 0xfe) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Decode data with automatic encoding detection (UTF-8 or EUC-JP).\n */\nexport function decodeAutoDetect(data: Uint8Array): string {\n // Try UTF-8 first\n try {\n const utf8 = new TextDecoder(\"utf-8\", { fatal: true });\n return utf8.decode(data);\n } catch {\n // Fall back to EUC-JP\n return decodeEucJp(data);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -806,8 +806,9 @@ var ByteBuffer = class {
|
|
|
806
806
|
position;
|
|
807
807
|
constructor(arg) {
|
|
808
808
|
if (arg instanceof Uint8Array) {
|
|
809
|
-
const
|
|
810
|
-
|
|
809
|
+
const isShared = typeof SharedArrayBuffer !== "undefined" && arg.buffer instanceof SharedArrayBuffer;
|
|
810
|
+
const src = isShared ? new ArrayBuffer(arg.byteLength) : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);
|
|
811
|
+
if (isShared) {
|
|
811
812
|
new Uint8Array(src).set(arg);
|
|
812
813
|
}
|
|
813
814
|
this.buffer = src;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader/NodeLoader.ts","../src/loader/BrowserLoader.ts","../src/loader/LoaderFactory.ts","../src/index.ts","../src/viterbi/ViterbiNode.ts","../src/viterbi/ViterbiLattice.ts","../src/viterbi/ViterbiBuilder.ts","../src/viterbi/ViterbiSearcher.ts","../src/tokenizer/Tokenizer.ts","../src/types/dictionary.ts","../src/trie/DoubleArrayBuilder.ts","../src/trie/DoubleArray.ts","../src/dict/ConnectionCosts.ts","../src/util/ByteBuffer.ts","../src/dict/TokenInfoDictionary.ts","../src/dict/CharacterDefinition.ts","../src/dict/UnknownDictionary.ts","../src/dict/DictionaryContainer.ts","../src/tokenizer/TokenizerBuilder.ts","../src/dict/format/IpadicFormat.ts","../src/dict/format/UnidicFormat.ts","../src/dict/format/NeologdFormat.ts","../src/util/SurrogateAwareString.ts"],"sourcesContent":["/**\n * Dictionary loader for Node.js using native fs and zlib.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class NodeLoader implements DictionaryLoader {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const path = await import(\"node:path\");\n const fs = await import(\"node:fs/promises\");\n const zlib = await import(\"node:zlib\");\n const { promisify } = await import(\"node:util\");\n\n const gunzip = promisify(zlib.gunzip);\n const filePath = path.join(this.basePath, fileName);\n const compressed = await fs.readFile(filePath);\n const decompressed = await gunzip(compressed);\n return decompressed.buffer.slice(\n decompressed.byteOffset,\n decompressed.byteOffset + decompressed.byteLength\n );\n }\n}\n","/**\n * Dictionary loader for browser using fetch and DecompressionStream.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class BrowserLoader implements DictionaryLoader {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Ensure trailing slash\n this.baseUrl = baseUrl.endsWith(\"/\") ? baseUrl : baseUrl + \"/\";\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const url = this.baseUrl + fileName;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch dictionary file: ${url} (${response.status})`);\n }\n\n if (!response.body) {\n throw new Error(`Response body is null for: ${url}`);\n }\n\n // Use native DecompressionStream for gzip decompression\n const ds = new DecompressionStream(\"gzip\");\n const decompressedStream = response.body.pipeThrough(ds);\n const reader = decompressedStream.getReader();\n\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.byteLength;\n }\n\n // Concatenate chunks\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer;\n }\n}\n","/**\n * Factory for creating the appropriate dictionary loader based on the runtime environment.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport async function createLoaderAsync(dicPath: string): Promise<DictionaryLoader> {\n if (isNodeEnvironment()) {\n const { NodeLoader } = await import(\"./NodeLoader.js\");\n return new NodeLoader(dicPath);\n } else {\n const { BrowserLoader } = await import(\"./BrowserLoader.js\");\n return new BrowserLoader(dicPath);\n }\n}\n\nfunction isNodeEnvironment(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n","/**\n * tokana - Modern Japanese Morphological Analyzer\n */\n\nexport { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nexport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\n\n// Types\nexport type {\n BaseToken,\n IpadicToken,\n UnidicToken,\n Token,\n TokenType,\n} from \"./types/token.js\";\nexport type { TokenizerOptions, DictionaryFormatType } from \"./types/options.js\";\n\n// Dictionary formats\nexport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nexport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nexport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\nexport type { DictionaryFormat } from \"./dict/format/DictionaryFormat.js\";\n\n// Dictionary components (for advanced use)\nexport { DoubleArray } from \"./trie/DoubleArray.js\";\nexport { DoubleArrayBuilder } from \"./trie/DoubleArrayBuilder.js\";\nexport { ConnectionCosts } from \"./dict/ConnectionCosts.js\";\nexport { TokenInfoDictionary } from \"./dict/TokenInfoDictionary.js\";\nexport { UnknownDictionary } from \"./dict/UnknownDictionary.js\";\nexport { CharacterDefinition } from \"./dict/CharacterDefinition.js\";\nexport { DictionaryContainer } from \"./dict/DictionaryContainer.js\";\n\n// Loaders\nexport type { DictionaryLoader } from \"./loader/DictionaryLoader.js\";\nexport { NodeLoader } from \"./loader/NodeLoader.js\";\nexport { BrowserLoader } from \"./loader/BrowserLoader.js\";\n\n// Utilities\nexport { ByteBuffer } from \"./util/ByteBuffer.js\";\nexport { SurrogateAwareString } from \"./util/SurrogateAwareString.js\";\n\n// Convenience factory\nimport type { IpadicToken, UnidicToken, BaseToken } from \"./types/token.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\nimport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nimport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nimport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\n\n/**\n * Create a tokenizer with the given options.\n *\n * @example\n * ```typescript\n * const tokenizer = await createTokenizer({\n * format: \"ipadic\",\n * dicPath: \"./dict\",\n * });\n * const tokens = tokenizer.tokenize(\"東京都に住んでいる\");\n * ```\n */\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"ipadic\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"unidic\" }\n): Promise<Tokenizer<UnidicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"neologd\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>> {\n const { createLoaderAsync } = await import(\"./loader/LoaderFactory.js\");\n const loader = await createLoaderAsync(options.dicPath);\n\n const format = options.format ?? \"ipadic\";\n switch (format) {\n case \"ipadic\":\n return TokenizerBuilder.build(options, loader, new IpadicFormatHandler());\n case \"unidic\":\n return TokenizerBuilder.build(options, loader, new UnidicFormatHandler());\n case \"neologd\":\n return TokenizerBuilder.build(options, loader, new NeologdFormatHandler());\n default:\n throw new Error(`Unknown dictionary format: ${format}`);\n }\n}\n","/**\n * Node in the Viterbi lattice.\n */\n\nimport type { TokenType } from \"../types/token.js\";\n\nexport class ViterbiNode {\n /** Word ID in the dictionary */\n wordId: number;\n /** Word cost from the dictionary */\n wordCost: number;\n /** Start position in the input string */\n startPos: number;\n /** Length of the surface form */\n length: number;\n /** Left context ID for connection cost lookup */\n leftId: number;\n /** Right context ID for connection cost lookup */\n rightId: number;\n /** Token type */\n type: TokenType;\n /** Surface form */\n surface: string;\n\n /** Shortest path cost from BOS to this node */\n shortestCost: number;\n /** Previous node in the shortest path */\n prev: ViterbiNode | null;\n\n constructor(\n wordId: number,\n wordCost: number,\n startPos: number,\n length: number,\n leftId: number,\n rightId: number,\n type: TokenType,\n surface: string\n ) {\n this.wordId = wordId;\n this.wordCost = wordCost;\n this.startPos = startPos;\n this.length = length;\n this.leftId = leftId;\n this.rightId = rightId;\n this.type = type;\n this.surface = surface;\n this.shortestCost = Number.MAX_SAFE_INTEGER;\n this.prev = null;\n }\n\n static createBOS(): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n 0, // startPos\n 0, // length\n 0, // leftId (BOS/EOS left ID)\n 0, // rightId (BOS/EOS right ID)\n \"BOS\",\n \"\"\n );\n }\n\n static createEOS(inputLength: number): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n inputLength, // startPos\n 0, // length\n 0, // leftId\n 0, // rightId\n \"EOS\",\n \"\"\n );\n }\n}\n","/**\n * Viterbi lattice structure.\n * Organizes nodes by their starting position in the input string.\n */\n\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiLattice {\n /** Nodes indexed by end position (position after the last character) */\n private nodesEndAt: ViterbiNode[][];\n /** Length of the input string */\n private readonly inputLength: number;\n\n /** BOS node */\n readonly bos: ViterbiNode;\n /** EOS node */\n readonly eos: ViterbiNode;\n\n constructor(inputLength: number) {\n this.inputLength = inputLength;\n // nodesEndAt[i] = nodes whose surface ends at position i\n // Index 0 is for BOS, index inputLength+1 is for EOS\n this.nodesEndAt = new Array(inputLength + 2);\n for (let i = 0; i < this.nodesEndAt.length; i++) {\n this.nodesEndAt[i] = [];\n }\n\n this.bos = ViterbiNode.createBOS();\n this.bos.shortestCost = 0;\n this.nodesEndAt[0].push(this.bos);\n\n this.eos = ViterbiNode.createEOS(inputLength);\n }\n\n /**\n * Add a node to the lattice.\n * Node is indexed by its end position (startPos + length).\n */\n addNode(node: ViterbiNode): void {\n const endPos = node.startPos + node.length;\n if (endPos >= 0 && endPos < this.nodesEndAt.length) {\n this.nodesEndAt[endPos].push(node);\n }\n }\n\n /**\n * Get all nodes that end at the given position.\n */\n getNodesEndAt(pos: number): ViterbiNode[] {\n return this.nodesEndAt[pos] ?? [];\n }\n\n getInputLength(): number {\n return this.inputLength;\n }\n}\n","/**\n * Builds a Viterbi lattice from input text using the trie and dictionaries.\n */\n\nimport type { DoubleArray } from \"../trie/DoubleArray.js\";\nimport type { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport type { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\nimport { ViterbiLattice } from \"./ViterbiLattice.js\";\n\nexport class ViterbiBuilder {\n private readonly trie: DoubleArray;\n private readonly tokenInfoDictionary: TokenInfoDictionary;\n private readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.unknownDictionary = unknownDictionary;\n }\n\n /**\n * Build a Viterbi lattice for the given input text.\n */\n build(text: string): ViterbiLattice {\n const lattice = new ViterbiLattice(text.length);\n const charDef = this.unknownDictionary.getCharacterDefinition();\n\n for (let i = 0; i < text.length; i++) {\n const suffix = text.substring(i);\n\n // Search known words using trie\n const matches = this.trie.commonPrefixSearch(suffix);\n let hasKnownWord = false;\n\n for (const match of matches) {\n if (match.length === 0) continue;\n hasKnownWord = true;\n const wordId = match.value;\n const surface = text.substring(i, i + match.length);\n\n const node = new ViterbiNode(\n wordId,\n this.tokenInfoDictionary.getWordCost(wordId),\n i,\n match.length,\n this.tokenInfoDictionary.getLeftId(wordId),\n this.tokenInfoDictionary.getRightId(wordId),\n \"KNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n\n // Process unknown words\n const charCode = text.charCodeAt(i);\n const isInvoke = charDef.isInvoke(charCode);\n\n // Add unknown word nodes if:\n // 1. No known word was found, OR\n // 2. The character class has invoke=true\n if (!hasKnownWord || isInvoke) {\n this.addUnknownNodes(lattice, text, i, charDef);\n }\n }\n\n return lattice;\n }\n\n private addUnknownNodes(\n lattice: ViterbiLattice,\n text: string,\n pos: number,\n charDef: import(\"../dict/CharacterDefinition.js\").CharacterDefinition\n ): void {\n const charCode = text.charCodeAt(pos);\n const classId = charDef.getCharacterClass(charCode);\n const isGroup = charDef.isGroup(charCode);\n const maxLength = charDef.getMaxLength(charCode);\n\n // Get unknown word entries for this character class\n const wordIds = this.unknownDictionary.lookup(charCode);\n\n if (wordIds.length === 0) return;\n\n // If group flag is set, try to group consecutive same-class characters\n if (isGroup) {\n let endPos = pos + 1;\n while (endPos < text.length) {\n const nextClass = charDef.getCharacterClass(text.charCodeAt(endPos));\n if (nextClass !== classId) break;\n endPos++;\n }\n\n const surface = text.substring(pos, endPos);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n surface.length,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // Also try individual character lengths up to maxLength\n const limit = maxLength > 0 ? Math.min(maxLength, text.length - pos) : 1;\n for (let len = 1; len <= limit; len++) {\n if (len > 1) {\n const nextClass = charDef.getCharacterClass(\n text.charCodeAt(pos + len - 1)\n );\n if (nextClass !== classId) break;\n }\n\n const surface = text.substring(pos, pos + len);\n for (const wordId of wordIds) {\n // Avoid duplicating the grouped entry\n if (isGroup && len === 1) continue;\n\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n len,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // If no nodes were added (non-group, maxLength=0), add single character\n if (!isGroup && maxLength === 0) {\n const surface = text.substring(pos, pos + 1);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n 1,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n }\n}\n","/**\n * Viterbi algorithm searcher.\n * Finds the optimal path through the lattice using dynamic programming.\n */\n\nimport type { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport type { ViterbiLattice } from \"./ViterbiLattice.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiSearcher {\n private readonly connectionCosts: ConnectionCosts;\n\n constructor(connectionCosts: ConnectionCosts) {\n this.connectionCosts = connectionCosts;\n }\n\n /**\n * Find the optimal (lowest cost) path through the lattice.\n * Returns the path as an array of ViterbiNodes from first token to last (excluding BOS/EOS).\n */\n search(lattice: ViterbiLattice): ViterbiNode[] {\n // Forward pass: compute shortest cost to each node\n this.forward(lattice);\n\n // Backward pass: trace back from EOS to BOS\n return this.backward(lattice);\n }\n\n /**\n * Forward pass: for each position, find the shortest path cost to each node.\n */\n private forward(lattice: ViterbiLattice): void {\n const inputLength = lattice.getInputLength();\n\n for (let endPos = 1; endPos <= inputLength; endPos++) {\n const nodes = lattice.getNodesEndAt(endPos);\n\n for (const node of nodes) {\n // Find the best previous node\n const prevNodes = lattice.getNodesEndAt(node.startPos);\n\n for (const prevNode of prevNodes) {\n if (prevNode.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(\n prevNode.rightId,\n node.leftId\n );\n const totalCost =\n prevNode.shortestCost + connectionCost + node.wordCost;\n\n if (totalCost < node.shortestCost) {\n node.shortestCost = totalCost;\n node.prev = prevNode;\n }\n }\n }\n }\n\n // Connect EOS\n const eos = lattice.eos;\n const lastNodes = lattice.getNodesEndAt(inputLength);\n for (const node of lastNodes) {\n if (node.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(node.rightId, eos.leftId);\n const totalCost = node.shortestCost + connectionCost + eos.wordCost;\n\n if (totalCost < eos.shortestCost) {\n eos.shortestCost = totalCost;\n eos.prev = node;\n }\n }\n }\n\n /**\n * Backward pass: trace back from EOS to BOS to get the optimal path.\n */\n private backward(lattice: ViterbiLattice): ViterbiNode[] {\n const path: ViterbiNode[] = [];\n let node: ViterbiNode | null = lattice.eos.prev;\n\n while (node !== null && node.type !== \"BOS\") {\n path.unshift(node);\n node = node.prev;\n }\n\n return path;\n }\n}\n","/**\n * Main tokenizer class.\n * Performs Japanese morphological analysis using Viterbi algorithm.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { ViterbiBuilder } from \"../viterbi/ViterbiBuilder.js\";\nimport { ViterbiSearcher } from \"../viterbi/ViterbiSearcher.js\";\n\nexport class Tokenizer<T extends BaseToken = BaseToken> {\n private readonly viterbiBuilder: ViterbiBuilder;\n private readonly viterbiSearcher: ViterbiSearcher;\n private readonly dictionary: DictionaryContainer;\n private readonly format: DictionaryFormat<T>;\n\n constructor(dictionary: DictionaryContainer, format: DictionaryFormat<T>) {\n this.dictionary = dictionary;\n this.format = format;\n\n this.viterbiBuilder = new ViterbiBuilder(\n dictionary.trie,\n dictionary.tokenInfoDictionary,\n dictionary.unknownDictionary\n );\n\n this.viterbiSearcher = new ViterbiSearcher(dictionary.connectionCosts);\n }\n\n /**\n * Tokenize input text into morphemes.\n */\n tokenize(text: string): T[] {\n if (text.length === 0) {\n return [];\n }\n\n // Build lattice\n const lattice = this.viterbiBuilder.build(text);\n\n // Find optimal path\n const path = this.viterbiSearcher.search(lattice);\n\n // Convert path nodes to typed tokens\n return path.map((node) => {\n const dict =\n node.type === \"UNKNOWN\"\n ? this.dictionary.unknownDictionary\n : this.dictionary.tokenInfoDictionary;\n const features = dict.getFeatures(node.wordId);\n\n return this.format.parseToken(\n {\n wordId: node.wordId,\n type: node.type,\n surface: node.surface,\n offset: node.startPos,\n length: node.length,\n cost: node.shortestCost,\n },\n features\n );\n });\n }\n\n /**\n * Get the dictionary format handler.\n */\n getFormat(): DictionaryFormat<T> {\n return this.format;\n }\n}\n","/**\n * Dictionary-related type definitions.\n */\n\n/** Character class definition entry */\nexport interface CharacterClass {\n /** Class name (e.g., DEFAULT, SPACE, KANJI) */\n name: string;\n /** Whether to invoke unknown word processing */\n invoke: boolean;\n /** Whether to group consecutive same-class chars */\n group: boolean;\n /** Maximum unknown word length (0 = unlimited) */\n length: number;\n}\n\n/** Character-to-class mapping */\nexport interface CharacterMapping {\n /** Character class index */\n classId: number;\n /** Compatible classes */\n compatibleClasses: number[];\n}\n\n/** Unknown word dictionary entry */\nexport interface UnknownEntry {\n /** Character class name */\n className: string;\n /** Left context ID */\n leftId: number;\n /** Right context ID */\n rightId: number;\n /** Word cost */\n cost: number;\n /** Token info features */\n features: string[];\n}\n\n/** Dictionary file names */\nexport const DICT_FILES = {\n trie: \"base.dat.gz\",\n tid: \"tid.dat.gz\",\n tidPos: \"tid_pos.dat.gz\",\n tidMap: \"tid_map.dat.gz\",\n cc: \"cc.dat.gz\",\n unk: \"unk.dat.gz\",\n unkPos: \"unk_pos.dat.gz\",\n unkMap: \"unk_map.dat.gz\",\n unkChar: \"unk_char.dat.gz\",\n unkCompat: \"unk_compat.dat.gz\",\n unkInvoke: \"unk_invoke.dat.gz\",\n} as const;\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Double Array Trie for efficient prefix matching.\n * Supports exact lookup and common prefix search.\n */\n\nimport { DoubleArrayBuilder } from \"./DoubleArrayBuilder.js\";\n\nexport interface KeyValue {\n /** The value associated with the key */\n value: number;\n /** Length of the matched key (in code units) */\n length: number;\n}\n\nexport class DoubleArray {\n private base: Int32Array;\n private check: Int32Array;\n\n constructor(base?: Int32Array, check?: Int32Array) {\n this.base = base ?? new Int32Array(0);\n this.check = check ?? new Int32Array(0);\n }\n\n /**\n * Build a DoubleArray from sorted string keys.\n * Keys must be sorted lexicographically.\n */\n static build(keys: { key: string; value: number }[]): DoubleArray {\n const encoded = keys.map(({ key, value }) => ({\n key: Array.from(key).map((ch) => ch.charCodeAt(0)),\n value,\n }));\n const { base, check } = DoubleArrayBuilder.build(encoded);\n return new DoubleArray(base, check);\n }\n\n /**\n * Exact lookup of a key string.\n * Returns the associated value, or -1 if not found.\n */\n lookup(key: string): number {\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next >= this.check.length || this.check[next] !== pos + 1) {\n return -1;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal (code 0)\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n return -v - 1;\n }\n }\n return -1;\n }\n\n /**\n * Find all keys that are prefixes of the given string.\n * Returns values and their matched lengths.\n */\n commonPrefixSearch(key: string): KeyValue[] {\n const results: KeyValue[] = [];\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n // Check for terminal at current position\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: i });\n }\n }\n\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next < 0 || next >= this.check.length || this.check[next] !== pos + 1) {\n return results;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal at the end\n const termPos = baseVal;\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: key.length });\n }\n }\n\n return results;\n }\n\n /**\n * Check if any key exists that starts with the given prefix.\n */\n contain(key: string): boolean {\n return this.lookup(key) !== -1;\n }\n\n /**\n * Get the raw base array (for serialization).\n */\n getBase(): Int32Array {\n return this.base;\n }\n\n /**\n * Get the raw check array (for serialization).\n */\n getCheck(): Int32Array {\n return this.check;\n }\n\n /**\n * Create a DoubleArray from raw base and check arrays (for deserialization).\n */\n static fromArrays(base: Int32Array, check: Int32Array): DoubleArray {\n return new DoubleArray(base, check);\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const src = arg.buffer instanceof SharedArrayBuffer\n ? new ArrayBuffer(arg.byteLength)\n : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (arg.buffer instanceof SharedArrayBuffer) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Token information dictionary.\n * Stores morpheme features (POS, reading, pronunciation, etc.)\n * indexed by word ID.\n */\nimport { ByteBuffer } from \"../util/ByteBuffer.js\";\n\nexport class TokenInfoDictionary {\n /** Feature data for each word, stored as concatenated strings */\n private dictionary: ByteBuffer;\n\n /** Mapping from word ID to position in features buffer */\n private targetMap: Record<number, number>;\n\n constructor() {\n this.dictionary = new ByteBuffer(1024 * 1024);\n this.targetMap = {};\n }\n\n buildDictionary(entries: { wordId: number; leftId: number; rightId: number; cost: number }[]): {\n wordId: number;\n leftId: number;\n rightId: number;\n cost: number;\n }[] {\n return entries;\n }\n\n /**\n * Add a token entry to the dictionary.\n */\n put(wordId: number, leftId: number, rightId: number, cost: number, features: string): void {\n const pos = this.dictionary.getPosition();\n this.targetMap[wordId] = pos;\n\n // Store: leftId(2) + rightId(2) + cost(2) + features_length(2) + features\n this.dictionary.putInt16(leftId);\n this.dictionary.putInt16(rightId);\n this.dictionary.putInt16(cost);\n this.dictionary.putInt16(features.length);\n this.dictionary.putString(features);\n }\n\n /**\n * Add a mapping from word ID to buffer position.\n */\n addMapping(wordId: number, position: number): void {\n this.targetMap[wordId] = position;\n }\n\n /**\n * Get left context ID for a word.\n */\n getLeftId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos);\n }\n\n /**\n * Get right context ID for a word.\n */\n getRightId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 2);\n }\n\n /**\n * Get word cost for a word.\n */\n getWordCost(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 4);\n }\n\n /**\n * Get feature string for a word.\n */\n getFeatures(wordId: number): string {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return \"\";\n const len = this.dictionary.getInt16(pos + 6);\n const saved = this.dictionary.getPosition();\n this.dictionary.setPosition(pos + 8);\n const str = this.dictionary.readString(len);\n this.dictionary.setPosition(saved);\n return str;\n }\n\n /**\n * Load the dictionary data buffer.\n */\n loadDictionary(data: Uint8Array): this {\n this.dictionary = new ByteBuffer(data);\n return this;\n }\n\n /**\n * Load the position data buffer.\n */\n loadPosVector(_data: Uint8Array): this {\n // POS vector data reserved for future use\n return this;\n }\n\n /**\n * Load the target map buffer.\n * Format: sequence of int32 pairs [wordId, position]\n */\n loadTargetMap(data: Uint8Array): this {\n const view = new DataView(\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n this.targetMap = {};\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 4;\n const pos = view.getInt32(offset, true);\n this.targetMap[i] = pos;\n }\n return this;\n }\n\n getDictionary(): ByteBuffer {\n return this.dictionary;\n }\n\n getTargetMap(): Record<number, number> {\n return this.targetMap;\n }\n\n getTargetMapData(): Uint8Array {\n const ids = Object.keys(this.targetMap)\n .map(Number)\n .sort((a, b) => a - b);\n const maxId = ids.length > 0 ? ids[ids.length - 1] : -1;\n const buf = new ByteBuffer(4 + (maxId + 1) * 4);\n buf.putInt32(maxId + 1);\n for (let i = 0; i <= maxId; i++) {\n buf.putInt32(this.targetMap[i] ?? -1);\n }\n return buf.shrink();\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Unknown word dictionary.\n * Handles words not found in the main dictionary by using character type information.\n */\n\nimport { CharacterDefinition } from \"./CharacterDefinition.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\n\nexport class UnknownDictionary extends TokenInfoDictionary {\n private characterDefinition: CharacterDefinition;\n\n constructor() {\n super();\n this.characterDefinition = new CharacterDefinition();\n }\n\n setCharacterDefinition(charDef: CharacterDefinition): void {\n this.characterDefinition = charDef;\n }\n\n getCharacterDefinition(): CharacterDefinition {\n return this.characterDefinition;\n }\n\n /**\n * Lookup unknown word entries for a given character class.\n * Returns word IDs for the given character class index.\n */\n lookup(charCode: number): number[] {\n return this.lookupByCharClass(\n this.characterDefinition.getCharacterClass(charCode)\n );\n }\n\n /**\n * Lookup word IDs by character class index.\n */\n lookupByCharClass(_classId: number): number[] {\n const map = this.getTargetMap();\n const ids: number[] = [];\n for (const key of Object.keys(map)) {\n const wordId = Number(key);\n const features = this.getFeatures(wordId);\n if (features !== \"\") {\n ids.push(wordId);\n }\n }\n return ids;\n }\n\n /**\n * Load from category map and dictionary data.\n */\n loadCharacterDefinition(charDef: CharacterDefinition): this {\n this.characterDefinition = charDef;\n return this;\n }\n}\n","/**\n * Container that holds all dictionary components needed for tokenization.\n */\n\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"./ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"./UnknownDictionary.js\";\n\nexport class DictionaryContainer {\n readonly trie: DoubleArray;\n readonly tokenInfoDictionary: TokenInfoDictionary;\n readonly connectionCosts: ConnectionCosts;\n readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n connectionCosts: ConnectionCosts,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.connectionCosts = connectionCosts;\n this.unknownDictionary = unknownDictionary;\n }\n}\n","/**\n * Asynchronous tokenizer builder.\n * Loads dictionary files and constructs a ready-to-use Tokenizer.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { TokenizerOptions } from \"../types/options.js\";\nimport type { DictionaryLoader } from \"../loader/DictionaryLoader.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { DICT_FILES } from \"../types/dictionary.js\";\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { CharacterDefinition } from \"../dict/CharacterDefinition.js\";\nimport { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport { Tokenizer } from \"./Tokenizer.js\";\n\nexport class TokenizerBuilder {\n /**\n * Build a tokenizer with the given options.\n */\n static async build<T extends BaseToken>(\n _options: TokenizerOptions,\n loader: DictionaryLoader,\n format: DictionaryFormat<T>\n ): Promise<Tokenizer<T>> {\n // Load all dictionary files in parallel\n const [\n trieData,\n tidData,\n tidPosData,\n tidMapData,\n ccData,\n unkData,\n unkPosData,\n unkMapData,\n unkCharData,\n unkCompatData,\n unkInvokeData,\n ] = await Promise.all([\n loader.loadArrayBuffer(DICT_FILES.trie),\n loader.loadArrayBuffer(DICT_FILES.tid),\n loader.loadArrayBuffer(DICT_FILES.tidPos),\n loader.loadArrayBuffer(DICT_FILES.tidMap),\n loader.loadArrayBuffer(DICT_FILES.cc),\n loader.loadArrayBuffer(DICT_FILES.unk),\n loader.loadArrayBuffer(DICT_FILES.unkPos),\n loader.loadArrayBuffer(DICT_FILES.unkMap),\n loader.loadArrayBuffer(DICT_FILES.unkChar),\n loader.loadArrayBuffer(DICT_FILES.unkCompat),\n loader.loadArrayBuffer(DICT_FILES.unkInvoke),\n ]);\n\n // Build trie\n const baseArray = new Int32Array(trieData);\n // The trie data contains base and check arrays concatenated\n // First half is base, second half is check\n const halfLen = baseArray.length / 2;\n const base = baseArray.slice(0, halfLen);\n const check = baseArray.slice(halfLen);\n const trie = DoubleArray.fromArrays(base, check);\n\n // Build connection costs\n const ccArray = new Int16Array(ccData);\n const connectionCosts = ConnectionCosts.fromBuffer(ccArray);\n\n // Build token info dictionary\n const tokenInfoDictionary = new TokenInfoDictionary();\n tokenInfoDictionary.loadDictionary(new Uint8Array(tidData));\n tokenInfoDictionary.loadPosVector(new Uint8Array(tidPosData));\n tokenInfoDictionary.loadTargetMap(new Uint8Array(tidMapData));\n\n // Build character definition\n const charDef = CharacterDefinition.fromBuffers(\n new Uint8Array(unkCharData),\n new Uint32Array(unkCompatData),\n new Uint8Array(unkInvokeData)\n );\n\n // Build unknown dictionary\n const unknownDictionary = new UnknownDictionary();\n unknownDictionary.loadDictionary(new Uint8Array(unkData));\n unknownDictionary.loadPosVector(new Uint8Array(unkPosData));\n unknownDictionary.loadTargetMap(new Uint8Array(unkMapData));\n unknownDictionary.loadCharacterDefinition(charDef);\n\n // Create container\n const container = new DictionaryContainer(\n trie,\n tokenInfoDictionary,\n connectionCosts,\n unknownDictionary\n );\n\n return new Tokenizer<T>(container, format);\n }\n}\n","/**\n * IPAdic dictionary format parser.\n * Parses features in the IPAdic format (MeCab-IPADIC).\n */\n\nimport type { BaseToken, IpadicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class IpadicFormatHandler implements DictionaryFormat<IpadicToken> {\n readonly name: string = \"ipadic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): IpadicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos: parts[0] ?? \"*\",\n posDetail1: parts[1] ?? \"*\",\n posDetail2: parts[2] ?? \"*\",\n posDetail3: parts[3] ?? \"*\",\n conjugationType: parts[4] ?? \"*\",\n conjugationForm: parts[5] ?? \"*\",\n baseForm: parts[6] ?? \"*\",\n reading: parts[7] ?? \"*\",\n pronunciation: parts[8] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 9;\n }\n}\n","/**\n * UniDic dictionary format parser.\n */\n\nimport type { BaseToken, UnidicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class UnidicFormatHandler implements DictionaryFormat<UnidicToken> {\n readonly name = \"unidic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): UnidicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos1: parts[0] ?? \"*\",\n pos2: parts[1] ?? \"*\",\n pos3: parts[2] ?? \"*\",\n pos4: parts[3] ?? \"*\",\n cType: parts[4] ?? \"*\",\n cForm: parts[5] ?? \"*\",\n lForm: parts[6] ?? \"*\",\n lemma: parts[7] ?? \"*\",\n orth: parts[8] ?? \"*\",\n orthBase: parts[9] ?? \"*\",\n pron: parts[10] ?? \"*\",\n pronBase: parts[11] ?? \"*\",\n goshu: parts[12] ?? \"*\",\n iType: parts[13] ?? \"*\",\n iForm: parts[14] ?? \"*\",\n fType: parts[15] ?? \"*\",\n fForm: parts[16] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 17;\n }\n}\n","/**\n * NEologd dictionary format parser.\n * NEologd is based on IPAdic format with the same feature structure.\n */\n\nimport type { IpadicToken } from \"../../types/token.js\";\nimport { IpadicFormatHandler } from \"./IpadicFormat.js\";\n\nexport class NeologdFormatHandler extends IpadicFormatHandler {\n override readonly name: string = \"neologd\";\n}\n\nexport type NeologdToken = IpadicToken;\n","/**\n * Unicode-aware string that correctly handles surrogate pairs.\n * Provides character-level indexing that treats surrogate pairs as single characters.\n */\nexport class SurrogateAwareString {\n private readonly codePoints: number[];\n readonly length: number;\n\n constructor(str: string) {\n this.codePoints = [];\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const low = str.charCodeAt(i + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n this.codePoints.push(\n (code - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000\n );\n i++;\n continue;\n }\n }\n this.codePoints.push(code);\n }\n this.length = this.codePoints.length;\n }\n\n charAt(index: number): string {\n if (index < 0 || index >= this.length) return \"\";\n return String.fromCodePoint(this.codePoints[index]);\n }\n\n charCodeAt(index: number): number {\n if (index < 0 || index >= this.length) return NaN;\n return this.codePoints[index];\n }\n\n substring(start: number, end?: number): string {\n const e = end ?? this.length;\n return this.codePoints\n .slice(start, e)\n .map((cp) => String.fromCodePoint(cp))\n .join(\"\");\n }\n\n slice(start: number, end?: number): string {\n return this.substring(start, end);\n }\n\n toString(): string {\n return this.codePoints.map((cp) => String.fromCodePoint(cp)).join(\"\");\n }\n}\n"],"mappings":"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","names":["NodeLoader","BrowserLoader","termPos","createLoaderAsync"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader/NodeLoader.ts","../src/loader/BrowserLoader.ts","../src/loader/LoaderFactory.ts","../src/index.ts","../src/viterbi/ViterbiNode.ts","../src/viterbi/ViterbiLattice.ts","../src/viterbi/ViterbiBuilder.ts","../src/viterbi/ViterbiSearcher.ts","../src/tokenizer/Tokenizer.ts","../src/types/dictionary.ts","../src/trie/DoubleArrayBuilder.ts","../src/trie/DoubleArray.ts","../src/dict/ConnectionCosts.ts","../src/util/ByteBuffer.ts","../src/dict/TokenInfoDictionary.ts","../src/dict/CharacterDefinition.ts","../src/dict/UnknownDictionary.ts","../src/dict/DictionaryContainer.ts","../src/tokenizer/TokenizerBuilder.ts","../src/dict/format/IpadicFormat.ts","../src/dict/format/UnidicFormat.ts","../src/dict/format/NeologdFormat.ts","../src/util/SurrogateAwareString.ts"],"sourcesContent":["/**\n * Dictionary loader for Node.js using native fs and zlib.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class NodeLoader implements DictionaryLoader {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const path = await import(\"node:path\");\n const fs = await import(\"node:fs/promises\");\n const zlib = await import(\"node:zlib\");\n const { promisify } = await import(\"node:util\");\n\n const gunzip = promisify(zlib.gunzip);\n const filePath = path.join(this.basePath, fileName);\n const compressed = await fs.readFile(filePath);\n const decompressed = await gunzip(compressed);\n return decompressed.buffer.slice(\n decompressed.byteOffset,\n decompressed.byteOffset + decompressed.byteLength\n );\n }\n}\n","/**\n * Dictionary loader for browser using fetch and DecompressionStream.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class BrowserLoader implements DictionaryLoader {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Ensure trailing slash\n this.baseUrl = baseUrl.endsWith(\"/\") ? baseUrl : baseUrl + \"/\";\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const url = this.baseUrl + fileName;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch dictionary file: ${url} (${response.status})`);\n }\n\n if (!response.body) {\n throw new Error(`Response body is null for: ${url}`);\n }\n\n // Use native DecompressionStream for gzip decompression\n const ds = new DecompressionStream(\"gzip\");\n const decompressedStream = response.body.pipeThrough(ds);\n const reader = decompressedStream.getReader();\n\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.byteLength;\n }\n\n // Concatenate chunks\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer;\n }\n}\n","/**\n * Factory for creating the appropriate dictionary loader based on the runtime environment.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport async function createLoaderAsync(dicPath: string): Promise<DictionaryLoader> {\n if (isNodeEnvironment()) {\n const { NodeLoader } = await import(\"./NodeLoader.js\");\n return new NodeLoader(dicPath);\n } else {\n const { BrowserLoader } = await import(\"./BrowserLoader.js\");\n return new BrowserLoader(dicPath);\n }\n}\n\nfunction isNodeEnvironment(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n","/**\n * tokana - Modern Japanese Morphological Analyzer\n */\n\nexport { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nexport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\n\n// Types\nexport type {\n BaseToken,\n IpadicToken,\n UnidicToken,\n Token,\n TokenType,\n} from \"./types/token.js\";\nexport type { TokenizerOptions, DictionaryFormatType } from \"./types/options.js\";\n\n// Dictionary formats\nexport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nexport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nexport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\nexport type { DictionaryFormat } from \"./dict/format/DictionaryFormat.js\";\n\n// Dictionary components (for advanced use)\nexport { DoubleArray } from \"./trie/DoubleArray.js\";\nexport { DoubleArrayBuilder } from \"./trie/DoubleArrayBuilder.js\";\nexport { ConnectionCosts } from \"./dict/ConnectionCosts.js\";\nexport { TokenInfoDictionary } from \"./dict/TokenInfoDictionary.js\";\nexport { UnknownDictionary } from \"./dict/UnknownDictionary.js\";\nexport { CharacterDefinition } from \"./dict/CharacterDefinition.js\";\nexport { DictionaryContainer } from \"./dict/DictionaryContainer.js\";\n\n// Loaders\nexport type { DictionaryLoader } from \"./loader/DictionaryLoader.js\";\nexport { NodeLoader } from \"./loader/NodeLoader.js\";\nexport { BrowserLoader } from \"./loader/BrowserLoader.js\";\n\n// Utilities\nexport { ByteBuffer } from \"./util/ByteBuffer.js\";\nexport { SurrogateAwareString } from \"./util/SurrogateAwareString.js\";\n\n// Convenience factory\nimport type { IpadicToken, UnidicToken, BaseToken } from \"./types/token.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\nimport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nimport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nimport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\n\n/**\n * Create a tokenizer with the given options.\n *\n * @example\n * ```typescript\n * const tokenizer = await createTokenizer({\n * format: \"ipadic\",\n * dicPath: \"./dict\",\n * });\n * const tokens = tokenizer.tokenize(\"東京都に住んでいる\");\n * ```\n */\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"ipadic\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"unidic\" }\n): Promise<Tokenizer<UnidicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"neologd\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>> {\n const { createLoaderAsync } = await import(\"./loader/LoaderFactory.js\");\n const loader = await createLoaderAsync(options.dicPath);\n\n const format = options.format ?? \"ipadic\";\n switch (format) {\n case \"ipadic\":\n return TokenizerBuilder.build(options, loader, new IpadicFormatHandler());\n case \"unidic\":\n return TokenizerBuilder.build(options, loader, new UnidicFormatHandler());\n case \"neologd\":\n return TokenizerBuilder.build(options, loader, new NeologdFormatHandler());\n default:\n throw new Error(`Unknown dictionary format: ${format}`);\n }\n}\n","/**\n * Node in the Viterbi lattice.\n */\n\nimport type { TokenType } from \"../types/token.js\";\n\nexport class ViterbiNode {\n /** Word ID in the dictionary */\n wordId: number;\n /** Word cost from the dictionary */\n wordCost: number;\n /** Start position in the input string */\n startPos: number;\n /** Length of the surface form */\n length: number;\n /** Left context ID for connection cost lookup */\n leftId: number;\n /** Right context ID for connection cost lookup */\n rightId: number;\n /** Token type */\n type: TokenType;\n /** Surface form */\n surface: string;\n\n /** Shortest path cost from BOS to this node */\n shortestCost: number;\n /** Previous node in the shortest path */\n prev: ViterbiNode | null;\n\n constructor(\n wordId: number,\n wordCost: number,\n startPos: number,\n length: number,\n leftId: number,\n rightId: number,\n type: TokenType,\n surface: string\n ) {\n this.wordId = wordId;\n this.wordCost = wordCost;\n this.startPos = startPos;\n this.length = length;\n this.leftId = leftId;\n this.rightId = rightId;\n this.type = type;\n this.surface = surface;\n this.shortestCost = Number.MAX_SAFE_INTEGER;\n this.prev = null;\n }\n\n static createBOS(): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n 0, // startPos\n 0, // length\n 0, // leftId (BOS/EOS left ID)\n 0, // rightId (BOS/EOS right ID)\n \"BOS\",\n \"\"\n );\n }\n\n static createEOS(inputLength: number): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n inputLength, // startPos\n 0, // length\n 0, // leftId\n 0, // rightId\n \"EOS\",\n \"\"\n );\n }\n}\n","/**\n * Viterbi lattice structure.\n * Organizes nodes by their starting position in the input string.\n */\n\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiLattice {\n /** Nodes indexed by end position (position after the last character) */\n private nodesEndAt: ViterbiNode[][];\n /** Length of the input string */\n private readonly inputLength: number;\n\n /** BOS node */\n readonly bos: ViterbiNode;\n /** EOS node */\n readonly eos: ViterbiNode;\n\n constructor(inputLength: number) {\n this.inputLength = inputLength;\n // nodesEndAt[i] = nodes whose surface ends at position i\n // Index 0 is for BOS, index inputLength+1 is for EOS\n this.nodesEndAt = new Array(inputLength + 2);\n for (let i = 0; i < this.nodesEndAt.length; i++) {\n this.nodesEndAt[i] = [];\n }\n\n this.bos = ViterbiNode.createBOS();\n this.bos.shortestCost = 0;\n this.nodesEndAt[0].push(this.bos);\n\n this.eos = ViterbiNode.createEOS(inputLength);\n }\n\n /**\n * Add a node to the lattice.\n * Node is indexed by its end position (startPos + length).\n */\n addNode(node: ViterbiNode): void {\n const endPos = node.startPos + node.length;\n if (endPos >= 0 && endPos < this.nodesEndAt.length) {\n this.nodesEndAt[endPos].push(node);\n }\n }\n\n /**\n * Get all nodes that end at the given position.\n */\n getNodesEndAt(pos: number): ViterbiNode[] {\n return this.nodesEndAt[pos] ?? [];\n }\n\n getInputLength(): number {\n return this.inputLength;\n }\n}\n","/**\n * Builds a Viterbi lattice from input text using the trie and dictionaries.\n */\n\nimport type { DoubleArray } from \"../trie/DoubleArray.js\";\nimport type { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport type { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\nimport { ViterbiLattice } from \"./ViterbiLattice.js\";\n\nexport class ViterbiBuilder {\n private readonly trie: DoubleArray;\n private readonly tokenInfoDictionary: TokenInfoDictionary;\n private readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.unknownDictionary = unknownDictionary;\n }\n\n /**\n * Build a Viterbi lattice for the given input text.\n */\n build(text: string): ViterbiLattice {\n const lattice = new ViterbiLattice(text.length);\n const charDef = this.unknownDictionary.getCharacterDefinition();\n\n for (let i = 0; i < text.length; i++) {\n const suffix = text.substring(i);\n\n // Search known words using trie\n const matches = this.trie.commonPrefixSearch(suffix);\n let hasKnownWord = false;\n\n for (const match of matches) {\n if (match.length === 0) continue;\n hasKnownWord = true;\n const wordId = match.value;\n const surface = text.substring(i, i + match.length);\n\n const node = new ViterbiNode(\n wordId,\n this.tokenInfoDictionary.getWordCost(wordId),\n i,\n match.length,\n this.tokenInfoDictionary.getLeftId(wordId),\n this.tokenInfoDictionary.getRightId(wordId),\n \"KNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n\n // Process unknown words\n const charCode = text.charCodeAt(i);\n const isInvoke = charDef.isInvoke(charCode);\n\n // Add unknown word nodes if:\n // 1. No known word was found, OR\n // 2. The character class has invoke=true\n if (!hasKnownWord || isInvoke) {\n this.addUnknownNodes(lattice, text, i, charDef);\n }\n }\n\n return lattice;\n }\n\n private addUnknownNodes(\n lattice: ViterbiLattice,\n text: string,\n pos: number,\n charDef: import(\"../dict/CharacterDefinition.js\").CharacterDefinition\n ): void {\n const charCode = text.charCodeAt(pos);\n const classId = charDef.getCharacterClass(charCode);\n const isGroup = charDef.isGroup(charCode);\n const maxLength = charDef.getMaxLength(charCode);\n\n // Get unknown word entries for this character class\n const wordIds = this.unknownDictionary.lookup(charCode);\n\n if (wordIds.length === 0) return;\n\n // If group flag is set, try to group consecutive same-class characters\n if (isGroup) {\n let endPos = pos + 1;\n while (endPos < text.length) {\n const nextClass = charDef.getCharacterClass(text.charCodeAt(endPos));\n if (nextClass !== classId) break;\n endPos++;\n }\n\n const surface = text.substring(pos, endPos);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n surface.length,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // Also try individual character lengths up to maxLength\n const limit = maxLength > 0 ? Math.min(maxLength, text.length - pos) : 1;\n for (let len = 1; len <= limit; len++) {\n if (len > 1) {\n const nextClass = charDef.getCharacterClass(\n text.charCodeAt(pos + len - 1)\n );\n if (nextClass !== classId) break;\n }\n\n const surface = text.substring(pos, pos + len);\n for (const wordId of wordIds) {\n // Avoid duplicating the grouped entry\n if (isGroup && len === 1) continue;\n\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n len,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // If no nodes were added (non-group, maxLength=0), add single character\n if (!isGroup && maxLength === 0) {\n const surface = text.substring(pos, pos + 1);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n 1,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n }\n}\n","/**\n * Viterbi algorithm searcher.\n * Finds the optimal path through the lattice using dynamic programming.\n */\n\nimport type { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport type { ViterbiLattice } from \"./ViterbiLattice.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiSearcher {\n private readonly connectionCosts: ConnectionCosts;\n\n constructor(connectionCosts: ConnectionCosts) {\n this.connectionCosts = connectionCosts;\n }\n\n /**\n * Find the optimal (lowest cost) path through the lattice.\n * Returns the path as an array of ViterbiNodes from first token to last (excluding BOS/EOS).\n */\n search(lattice: ViterbiLattice): ViterbiNode[] {\n // Forward pass: compute shortest cost to each node\n this.forward(lattice);\n\n // Backward pass: trace back from EOS to BOS\n return this.backward(lattice);\n }\n\n /**\n * Forward pass: for each position, find the shortest path cost to each node.\n */\n private forward(lattice: ViterbiLattice): void {\n const inputLength = lattice.getInputLength();\n\n for (let endPos = 1; endPos <= inputLength; endPos++) {\n const nodes = lattice.getNodesEndAt(endPos);\n\n for (const node of nodes) {\n // Find the best previous node\n const prevNodes = lattice.getNodesEndAt(node.startPos);\n\n for (const prevNode of prevNodes) {\n if (prevNode.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(\n prevNode.rightId,\n node.leftId\n );\n const totalCost =\n prevNode.shortestCost + connectionCost + node.wordCost;\n\n if (totalCost < node.shortestCost) {\n node.shortestCost = totalCost;\n node.prev = prevNode;\n }\n }\n }\n }\n\n // Connect EOS\n const eos = lattice.eos;\n const lastNodes = lattice.getNodesEndAt(inputLength);\n for (const node of lastNodes) {\n if (node.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(node.rightId, eos.leftId);\n const totalCost = node.shortestCost + connectionCost + eos.wordCost;\n\n if (totalCost < eos.shortestCost) {\n eos.shortestCost = totalCost;\n eos.prev = node;\n }\n }\n }\n\n /**\n * Backward pass: trace back from EOS to BOS to get the optimal path.\n */\n private backward(lattice: ViterbiLattice): ViterbiNode[] {\n const path: ViterbiNode[] = [];\n let node: ViterbiNode | null = lattice.eos.prev;\n\n while (node !== null && node.type !== \"BOS\") {\n path.unshift(node);\n node = node.prev;\n }\n\n return path;\n }\n}\n","/**\n * Main tokenizer class.\n * Performs Japanese morphological analysis using Viterbi algorithm.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { ViterbiBuilder } from \"../viterbi/ViterbiBuilder.js\";\nimport { ViterbiSearcher } from \"../viterbi/ViterbiSearcher.js\";\n\nexport class Tokenizer<T extends BaseToken = BaseToken> {\n private readonly viterbiBuilder: ViterbiBuilder;\n private readonly viterbiSearcher: ViterbiSearcher;\n private readonly dictionary: DictionaryContainer;\n private readonly format: DictionaryFormat<T>;\n\n constructor(dictionary: DictionaryContainer, format: DictionaryFormat<T>) {\n this.dictionary = dictionary;\n this.format = format;\n\n this.viterbiBuilder = new ViterbiBuilder(\n dictionary.trie,\n dictionary.tokenInfoDictionary,\n dictionary.unknownDictionary\n );\n\n this.viterbiSearcher = new ViterbiSearcher(dictionary.connectionCosts);\n }\n\n /**\n * Tokenize input text into morphemes.\n */\n tokenize(text: string): T[] {\n if (text.length === 0) {\n return [];\n }\n\n // Build lattice\n const lattice = this.viterbiBuilder.build(text);\n\n // Find optimal path\n const path = this.viterbiSearcher.search(lattice);\n\n // Convert path nodes to typed tokens\n return path.map((node) => {\n const dict =\n node.type === \"UNKNOWN\"\n ? this.dictionary.unknownDictionary\n : this.dictionary.tokenInfoDictionary;\n const features = dict.getFeatures(node.wordId);\n\n return this.format.parseToken(\n {\n wordId: node.wordId,\n type: node.type,\n surface: node.surface,\n offset: node.startPos,\n length: node.length,\n cost: node.shortestCost,\n },\n features\n );\n });\n }\n\n /**\n * Get the dictionary format handler.\n */\n getFormat(): DictionaryFormat<T> {\n return this.format;\n }\n}\n","/**\n * Dictionary-related type definitions.\n */\n\n/** Character class definition entry */\nexport interface CharacterClass {\n /** Class name (e.g., DEFAULT, SPACE, KANJI) */\n name: string;\n /** Whether to invoke unknown word processing */\n invoke: boolean;\n /** Whether to group consecutive same-class chars */\n group: boolean;\n /** Maximum unknown word length (0 = unlimited) */\n length: number;\n}\n\n/** Character-to-class mapping */\nexport interface CharacterMapping {\n /** Character class index */\n classId: number;\n /** Compatible classes */\n compatibleClasses: number[];\n}\n\n/** Unknown word dictionary entry */\nexport interface UnknownEntry {\n /** Character class name */\n className: string;\n /** Left context ID */\n leftId: number;\n /** Right context ID */\n rightId: number;\n /** Word cost */\n cost: number;\n /** Token info features */\n features: string[];\n}\n\n/** Dictionary file names */\nexport const DICT_FILES = {\n trie: \"base.dat.gz\",\n tid: \"tid.dat.gz\",\n tidPos: \"tid_pos.dat.gz\",\n tidMap: \"tid_map.dat.gz\",\n cc: \"cc.dat.gz\",\n unk: \"unk.dat.gz\",\n unkPos: \"unk_pos.dat.gz\",\n unkMap: \"unk_map.dat.gz\",\n unkChar: \"unk_char.dat.gz\",\n unkCompat: \"unk_compat.dat.gz\",\n unkInvoke: \"unk_invoke.dat.gz\",\n} as const;\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Double Array Trie for efficient prefix matching.\n * Supports exact lookup and common prefix search.\n */\n\nimport { DoubleArrayBuilder } from \"./DoubleArrayBuilder.js\";\n\nexport interface KeyValue {\n /** The value associated with the key */\n value: number;\n /** Length of the matched key (in code units) */\n length: number;\n}\n\nexport class DoubleArray {\n private base: Int32Array;\n private check: Int32Array;\n\n constructor(base?: Int32Array, check?: Int32Array) {\n this.base = base ?? new Int32Array(0);\n this.check = check ?? new Int32Array(0);\n }\n\n /**\n * Build a DoubleArray from sorted string keys.\n * Keys must be sorted lexicographically.\n */\n static build(keys: { key: string; value: number }[]): DoubleArray {\n const encoded = keys.map(({ key, value }) => ({\n key: Array.from(key).map((ch) => ch.charCodeAt(0)),\n value,\n }));\n const { base, check } = DoubleArrayBuilder.build(encoded);\n return new DoubleArray(base, check);\n }\n\n /**\n * Exact lookup of a key string.\n * Returns the associated value, or -1 if not found.\n */\n lookup(key: string): number {\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next >= this.check.length || this.check[next] !== pos + 1) {\n return -1;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal (code 0)\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n return -v - 1;\n }\n }\n return -1;\n }\n\n /**\n * Find all keys that are prefixes of the given string.\n * Returns values and their matched lengths.\n */\n commonPrefixSearch(key: string): KeyValue[] {\n const results: KeyValue[] = [];\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n // Check for terminal at current position\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: i });\n }\n }\n\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next < 0 || next >= this.check.length || this.check[next] !== pos + 1) {\n return results;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal at the end\n const termPos = baseVal;\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: key.length });\n }\n }\n\n return results;\n }\n\n /**\n * Check if any key exists that starts with the given prefix.\n */\n contain(key: string): boolean {\n return this.lookup(key) !== -1;\n }\n\n /**\n * Get the raw base array (for serialization).\n */\n getBase(): Int32Array {\n return this.base;\n }\n\n /**\n * Get the raw check array (for serialization).\n */\n getCheck(): Int32Array {\n return this.check;\n }\n\n /**\n * Create a DoubleArray from raw base and check arrays (for deserialization).\n */\n static fromArrays(base: Int32Array, check: Int32Array): DoubleArray {\n return new DoubleArray(base, check);\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const isShared =\n typeof SharedArrayBuffer !== \"undefined\" && arg.buffer instanceof SharedArrayBuffer;\n const src = isShared\n ? new ArrayBuffer(arg.byteLength)\n : (arg.buffer as ArrayBuffer).slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (isShared) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Token information dictionary.\n * Stores morpheme features (POS, reading, pronunciation, etc.)\n * indexed by word ID.\n */\nimport { ByteBuffer } from \"../util/ByteBuffer.js\";\n\nexport class TokenInfoDictionary {\n /** Feature data for each word, stored as concatenated strings */\n private dictionary: ByteBuffer;\n\n /** Mapping from word ID to position in features buffer */\n private targetMap: Record<number, number>;\n\n constructor() {\n this.dictionary = new ByteBuffer(1024 * 1024);\n this.targetMap = {};\n }\n\n buildDictionary(entries: { wordId: number; leftId: number; rightId: number; cost: number }[]): {\n wordId: number;\n leftId: number;\n rightId: number;\n cost: number;\n }[] {\n return entries;\n }\n\n /**\n * Add a token entry to the dictionary.\n */\n put(wordId: number, leftId: number, rightId: number, cost: number, features: string): void {\n const pos = this.dictionary.getPosition();\n this.targetMap[wordId] = pos;\n\n // Store: leftId(2) + rightId(2) + cost(2) + features_length(2) + features\n this.dictionary.putInt16(leftId);\n this.dictionary.putInt16(rightId);\n this.dictionary.putInt16(cost);\n this.dictionary.putInt16(features.length);\n this.dictionary.putString(features);\n }\n\n /**\n * Add a mapping from word ID to buffer position.\n */\n addMapping(wordId: number, position: number): void {\n this.targetMap[wordId] = position;\n }\n\n /**\n * Get left context ID for a word.\n */\n getLeftId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos);\n }\n\n /**\n * Get right context ID for a word.\n */\n getRightId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 2);\n }\n\n /**\n * Get word cost for a word.\n */\n getWordCost(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 4);\n }\n\n /**\n * Get feature string for a word.\n */\n getFeatures(wordId: number): string {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return \"\";\n const len = this.dictionary.getInt16(pos + 6);\n const saved = this.dictionary.getPosition();\n this.dictionary.setPosition(pos + 8);\n const str = this.dictionary.readString(len);\n this.dictionary.setPosition(saved);\n return str;\n }\n\n /**\n * Load the dictionary data buffer.\n */\n loadDictionary(data: Uint8Array): this {\n this.dictionary = new ByteBuffer(data);\n return this;\n }\n\n /**\n * Load the position data buffer.\n */\n loadPosVector(_data: Uint8Array): this {\n // POS vector data reserved for future use\n return this;\n }\n\n /**\n * Load the target map buffer.\n * Format: sequence of int32 pairs [wordId, position]\n */\n loadTargetMap(data: Uint8Array): this {\n const view = new DataView(\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n this.targetMap = {};\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 4;\n const pos = view.getInt32(offset, true);\n this.targetMap[i] = pos;\n }\n return this;\n }\n\n getDictionary(): ByteBuffer {\n return this.dictionary;\n }\n\n getTargetMap(): Record<number, number> {\n return this.targetMap;\n }\n\n getTargetMapData(): Uint8Array {\n const ids = Object.keys(this.targetMap)\n .map(Number)\n .sort((a, b) => a - b);\n const maxId = ids.length > 0 ? ids[ids.length - 1] : -1;\n const buf = new ByteBuffer(4 + (maxId + 1) * 4);\n buf.putInt32(maxId + 1);\n for (let i = 0; i <= maxId; i++) {\n buf.putInt32(this.targetMap[i] ?? -1);\n }\n return buf.shrink();\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Unknown word dictionary.\n * Handles words not found in the main dictionary by using character type information.\n */\n\nimport { CharacterDefinition } from \"./CharacterDefinition.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\n\nexport class UnknownDictionary extends TokenInfoDictionary {\n private characterDefinition: CharacterDefinition;\n\n constructor() {\n super();\n this.characterDefinition = new CharacterDefinition();\n }\n\n setCharacterDefinition(charDef: CharacterDefinition): void {\n this.characterDefinition = charDef;\n }\n\n getCharacterDefinition(): CharacterDefinition {\n return this.characterDefinition;\n }\n\n /**\n * Lookup unknown word entries for a given character class.\n * Returns word IDs for the given character class index.\n */\n lookup(charCode: number): number[] {\n return this.lookupByCharClass(\n this.characterDefinition.getCharacterClass(charCode)\n );\n }\n\n /**\n * Lookup word IDs by character class index.\n */\n lookupByCharClass(_classId: number): number[] {\n const map = this.getTargetMap();\n const ids: number[] = [];\n for (const key of Object.keys(map)) {\n const wordId = Number(key);\n const features = this.getFeatures(wordId);\n if (features !== \"\") {\n ids.push(wordId);\n }\n }\n return ids;\n }\n\n /**\n * Load from category map and dictionary data.\n */\n loadCharacterDefinition(charDef: CharacterDefinition): this {\n this.characterDefinition = charDef;\n return this;\n }\n}\n","/**\n * Container that holds all dictionary components needed for tokenization.\n */\n\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"./ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"./UnknownDictionary.js\";\n\nexport class DictionaryContainer {\n readonly trie: DoubleArray;\n readonly tokenInfoDictionary: TokenInfoDictionary;\n readonly connectionCosts: ConnectionCosts;\n readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n connectionCosts: ConnectionCosts,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.connectionCosts = connectionCosts;\n this.unknownDictionary = unknownDictionary;\n }\n}\n","/**\n * Asynchronous tokenizer builder.\n * Loads dictionary files and constructs a ready-to-use Tokenizer.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { TokenizerOptions } from \"../types/options.js\";\nimport type { DictionaryLoader } from \"../loader/DictionaryLoader.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { DICT_FILES } from \"../types/dictionary.js\";\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { CharacterDefinition } from \"../dict/CharacterDefinition.js\";\nimport { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport { Tokenizer } from \"./Tokenizer.js\";\n\nexport class TokenizerBuilder {\n /**\n * Build a tokenizer with the given options.\n */\n static async build<T extends BaseToken>(\n _options: TokenizerOptions,\n loader: DictionaryLoader,\n format: DictionaryFormat<T>\n ): Promise<Tokenizer<T>> {\n // Load all dictionary files in parallel\n const [\n trieData,\n tidData,\n tidPosData,\n tidMapData,\n ccData,\n unkData,\n unkPosData,\n unkMapData,\n unkCharData,\n unkCompatData,\n unkInvokeData,\n ] = await Promise.all([\n loader.loadArrayBuffer(DICT_FILES.trie),\n loader.loadArrayBuffer(DICT_FILES.tid),\n loader.loadArrayBuffer(DICT_FILES.tidPos),\n loader.loadArrayBuffer(DICT_FILES.tidMap),\n loader.loadArrayBuffer(DICT_FILES.cc),\n loader.loadArrayBuffer(DICT_FILES.unk),\n loader.loadArrayBuffer(DICT_FILES.unkPos),\n loader.loadArrayBuffer(DICT_FILES.unkMap),\n loader.loadArrayBuffer(DICT_FILES.unkChar),\n loader.loadArrayBuffer(DICT_FILES.unkCompat),\n loader.loadArrayBuffer(DICT_FILES.unkInvoke),\n ]);\n\n // Build trie\n const baseArray = new Int32Array(trieData);\n // The trie data contains base and check arrays concatenated\n // First half is base, second half is check\n const halfLen = baseArray.length / 2;\n const base = baseArray.slice(0, halfLen);\n const check = baseArray.slice(halfLen);\n const trie = DoubleArray.fromArrays(base, check);\n\n // Build connection costs\n const ccArray = new Int16Array(ccData);\n const connectionCosts = ConnectionCosts.fromBuffer(ccArray);\n\n // Build token info dictionary\n const tokenInfoDictionary = new TokenInfoDictionary();\n tokenInfoDictionary.loadDictionary(new Uint8Array(tidData));\n tokenInfoDictionary.loadPosVector(new Uint8Array(tidPosData));\n tokenInfoDictionary.loadTargetMap(new Uint8Array(tidMapData));\n\n // Build character definition\n const charDef = CharacterDefinition.fromBuffers(\n new Uint8Array(unkCharData),\n new Uint32Array(unkCompatData),\n new Uint8Array(unkInvokeData)\n );\n\n // Build unknown dictionary\n const unknownDictionary = new UnknownDictionary();\n unknownDictionary.loadDictionary(new Uint8Array(unkData));\n unknownDictionary.loadPosVector(new Uint8Array(unkPosData));\n unknownDictionary.loadTargetMap(new Uint8Array(unkMapData));\n unknownDictionary.loadCharacterDefinition(charDef);\n\n // Create container\n const container = new DictionaryContainer(\n trie,\n tokenInfoDictionary,\n connectionCosts,\n unknownDictionary\n );\n\n return new Tokenizer<T>(container, format);\n }\n}\n","/**\n * IPAdic dictionary format parser.\n * Parses features in the IPAdic format (MeCab-IPADIC).\n */\n\nimport type { BaseToken, IpadicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class IpadicFormatHandler implements DictionaryFormat<IpadicToken> {\n readonly name: string = \"ipadic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): IpadicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos: parts[0] ?? \"*\",\n posDetail1: parts[1] ?? \"*\",\n posDetail2: parts[2] ?? \"*\",\n posDetail3: parts[3] ?? \"*\",\n conjugationType: parts[4] ?? \"*\",\n conjugationForm: parts[5] ?? \"*\",\n baseForm: parts[6] ?? \"*\",\n reading: parts[7] ?? \"*\",\n pronunciation: parts[8] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 9;\n }\n}\n","/**\n * UniDic dictionary format parser.\n */\n\nimport type { BaseToken, UnidicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class UnidicFormatHandler implements DictionaryFormat<UnidicToken> {\n readonly name = \"unidic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): UnidicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos1: parts[0] ?? \"*\",\n pos2: parts[1] ?? \"*\",\n pos3: parts[2] ?? \"*\",\n pos4: parts[3] ?? \"*\",\n cType: parts[4] ?? \"*\",\n cForm: parts[5] ?? \"*\",\n lForm: parts[6] ?? \"*\",\n lemma: parts[7] ?? \"*\",\n orth: parts[8] ?? \"*\",\n orthBase: parts[9] ?? \"*\",\n pron: parts[10] ?? \"*\",\n pronBase: parts[11] ?? \"*\",\n goshu: parts[12] ?? \"*\",\n iType: parts[13] ?? \"*\",\n iForm: parts[14] ?? \"*\",\n fType: parts[15] ?? \"*\",\n fForm: parts[16] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 17;\n }\n}\n","/**\n * NEologd dictionary format parser.\n * NEologd is based on IPAdic format with the same feature structure.\n */\n\nimport type { IpadicToken } from \"../../types/token.js\";\nimport { IpadicFormatHandler } from \"./IpadicFormat.js\";\n\nexport class NeologdFormatHandler extends IpadicFormatHandler {\n override readonly name: string = \"neologd\";\n}\n\nexport type NeologdToken = IpadicToken;\n","/**\n * Unicode-aware string that correctly handles surrogate pairs.\n * Provides character-level indexing that treats surrogate pairs as single characters.\n */\nexport class SurrogateAwareString {\n private readonly codePoints: number[];\n readonly length: number;\n\n constructor(str: string) {\n this.codePoints = [];\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const low = str.charCodeAt(i + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n this.codePoints.push(\n (code - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000\n );\n i++;\n continue;\n }\n }\n this.codePoints.push(code);\n }\n this.length = this.codePoints.length;\n }\n\n charAt(index: number): string {\n if (index < 0 || index >= this.length) return \"\";\n return String.fromCodePoint(this.codePoints[index]);\n }\n\n charCodeAt(index: number): number {\n if (index < 0 || index >= this.length) return NaN;\n return this.codePoints[index];\n }\n\n substring(start: number, end?: number): string {\n const e = end ?? this.length;\n return this.codePoints\n .slice(start, e)\n .map((cp) => String.fromCodePoint(cp))\n .join(\"\");\n }\n\n slice(start: number, end?: number): string {\n return this.substring(start, end);\n }\n\n toString(): string {\n return this.codePoints.map((cp) => String.fromCodePoint(cp)).join(\"\");\n }\n}\n"],"mappings":"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","names":["NodeLoader","BrowserLoader","termPos","createLoaderAsync"]}
|
package/dist/index.js
CHANGED
|
@@ -761,8 +761,9 @@ var ByteBuffer = class {
|
|
|
761
761
|
position;
|
|
762
762
|
constructor(arg) {
|
|
763
763
|
if (arg instanceof Uint8Array) {
|
|
764
|
-
const
|
|
765
|
-
|
|
764
|
+
const isShared = typeof SharedArrayBuffer !== "undefined" && arg.buffer instanceof SharedArrayBuffer;
|
|
765
|
+
const src = isShared ? new ArrayBuffer(arg.byteLength) : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);
|
|
766
|
+
if (isShared) {
|
|
766
767
|
new Uint8Array(src).set(arg);
|
|
767
768
|
}
|
|
768
769
|
this.buffer = src;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader/NodeLoader.ts","../src/loader/BrowserLoader.ts","../src/loader/LoaderFactory.ts","../src/viterbi/ViterbiNode.ts","../src/viterbi/ViterbiLattice.ts","../src/viterbi/ViterbiBuilder.ts","../src/viterbi/ViterbiSearcher.ts","../src/tokenizer/Tokenizer.ts","../src/types/dictionary.ts","../src/trie/DoubleArrayBuilder.ts","../src/trie/DoubleArray.ts","../src/dict/ConnectionCosts.ts","../src/util/ByteBuffer.ts","../src/dict/TokenInfoDictionary.ts","../src/dict/CharacterDefinition.ts","../src/dict/UnknownDictionary.ts","../src/dict/DictionaryContainer.ts","../src/tokenizer/TokenizerBuilder.ts","../src/dict/format/IpadicFormat.ts","../src/dict/format/UnidicFormat.ts","../src/dict/format/NeologdFormat.ts","../src/index.ts","../src/util/SurrogateAwareString.ts"],"sourcesContent":["/**\n * Dictionary loader for Node.js using native fs and zlib.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class NodeLoader implements DictionaryLoader {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const path = await import(\"node:path\");\n const fs = await import(\"node:fs/promises\");\n const zlib = await import(\"node:zlib\");\n const { promisify } = await import(\"node:util\");\n\n const gunzip = promisify(zlib.gunzip);\n const filePath = path.join(this.basePath, fileName);\n const compressed = await fs.readFile(filePath);\n const decompressed = await gunzip(compressed);\n return decompressed.buffer.slice(\n decompressed.byteOffset,\n decompressed.byteOffset + decompressed.byteLength\n );\n }\n}\n","/**\n * Dictionary loader for browser using fetch and DecompressionStream.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class BrowserLoader implements DictionaryLoader {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Ensure trailing slash\n this.baseUrl = baseUrl.endsWith(\"/\") ? baseUrl : baseUrl + \"/\";\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const url = this.baseUrl + fileName;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch dictionary file: ${url} (${response.status})`);\n }\n\n if (!response.body) {\n throw new Error(`Response body is null for: ${url}`);\n }\n\n // Use native DecompressionStream for gzip decompression\n const ds = new DecompressionStream(\"gzip\");\n const decompressedStream = response.body.pipeThrough(ds);\n const reader = decompressedStream.getReader();\n\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.byteLength;\n }\n\n // Concatenate chunks\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer;\n }\n}\n","/**\n * Factory for creating the appropriate dictionary loader based on the runtime environment.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport async function createLoaderAsync(dicPath: string): Promise<DictionaryLoader> {\n if (isNodeEnvironment()) {\n const { NodeLoader } = await import(\"./NodeLoader.js\");\n return new NodeLoader(dicPath);\n } else {\n const { BrowserLoader } = await import(\"./BrowserLoader.js\");\n return new BrowserLoader(dicPath);\n }\n}\n\nfunction isNodeEnvironment(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n","/**\n * Node in the Viterbi lattice.\n */\n\nimport type { TokenType } from \"../types/token.js\";\n\nexport class ViterbiNode {\n /** Word ID in the dictionary */\n wordId: number;\n /** Word cost from the dictionary */\n wordCost: number;\n /** Start position in the input string */\n startPos: number;\n /** Length of the surface form */\n length: number;\n /** Left context ID for connection cost lookup */\n leftId: number;\n /** Right context ID for connection cost lookup */\n rightId: number;\n /** Token type */\n type: TokenType;\n /** Surface form */\n surface: string;\n\n /** Shortest path cost from BOS to this node */\n shortestCost: number;\n /** Previous node in the shortest path */\n prev: ViterbiNode | null;\n\n constructor(\n wordId: number,\n wordCost: number,\n startPos: number,\n length: number,\n leftId: number,\n rightId: number,\n type: TokenType,\n surface: string\n ) {\n this.wordId = wordId;\n this.wordCost = wordCost;\n this.startPos = startPos;\n this.length = length;\n this.leftId = leftId;\n this.rightId = rightId;\n this.type = type;\n this.surface = surface;\n this.shortestCost = Number.MAX_SAFE_INTEGER;\n this.prev = null;\n }\n\n static createBOS(): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n 0, // startPos\n 0, // length\n 0, // leftId (BOS/EOS left ID)\n 0, // rightId (BOS/EOS right ID)\n \"BOS\",\n \"\"\n );\n }\n\n static createEOS(inputLength: number): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n inputLength, // startPos\n 0, // length\n 0, // leftId\n 0, // rightId\n \"EOS\",\n \"\"\n );\n }\n}\n","/**\n * Viterbi lattice structure.\n * Organizes nodes by their starting position in the input string.\n */\n\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiLattice {\n /** Nodes indexed by end position (position after the last character) */\n private nodesEndAt: ViterbiNode[][];\n /** Length of the input string */\n private readonly inputLength: number;\n\n /** BOS node */\n readonly bos: ViterbiNode;\n /** EOS node */\n readonly eos: ViterbiNode;\n\n constructor(inputLength: number) {\n this.inputLength = inputLength;\n // nodesEndAt[i] = nodes whose surface ends at position i\n // Index 0 is for BOS, index inputLength+1 is for EOS\n this.nodesEndAt = new Array(inputLength + 2);\n for (let i = 0; i < this.nodesEndAt.length; i++) {\n this.nodesEndAt[i] = [];\n }\n\n this.bos = ViterbiNode.createBOS();\n this.bos.shortestCost = 0;\n this.nodesEndAt[0].push(this.bos);\n\n this.eos = ViterbiNode.createEOS(inputLength);\n }\n\n /**\n * Add a node to the lattice.\n * Node is indexed by its end position (startPos + length).\n */\n addNode(node: ViterbiNode): void {\n const endPos = node.startPos + node.length;\n if (endPos >= 0 && endPos < this.nodesEndAt.length) {\n this.nodesEndAt[endPos].push(node);\n }\n }\n\n /**\n * Get all nodes that end at the given position.\n */\n getNodesEndAt(pos: number): ViterbiNode[] {\n return this.nodesEndAt[pos] ?? [];\n }\n\n getInputLength(): number {\n return this.inputLength;\n }\n}\n","/**\n * Builds a Viterbi lattice from input text using the trie and dictionaries.\n */\n\nimport type { DoubleArray } from \"../trie/DoubleArray.js\";\nimport type { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport type { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\nimport { ViterbiLattice } from \"./ViterbiLattice.js\";\n\nexport class ViterbiBuilder {\n private readonly trie: DoubleArray;\n private readonly tokenInfoDictionary: TokenInfoDictionary;\n private readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.unknownDictionary = unknownDictionary;\n }\n\n /**\n * Build a Viterbi lattice for the given input text.\n */\n build(text: string): ViterbiLattice {\n const lattice = new ViterbiLattice(text.length);\n const charDef = this.unknownDictionary.getCharacterDefinition();\n\n for (let i = 0; i < text.length; i++) {\n const suffix = text.substring(i);\n\n // Search known words using trie\n const matches = this.trie.commonPrefixSearch(suffix);\n let hasKnownWord = false;\n\n for (const match of matches) {\n if (match.length === 0) continue;\n hasKnownWord = true;\n const wordId = match.value;\n const surface = text.substring(i, i + match.length);\n\n const node = new ViterbiNode(\n wordId,\n this.tokenInfoDictionary.getWordCost(wordId),\n i,\n match.length,\n this.tokenInfoDictionary.getLeftId(wordId),\n this.tokenInfoDictionary.getRightId(wordId),\n \"KNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n\n // Process unknown words\n const charCode = text.charCodeAt(i);\n const isInvoke = charDef.isInvoke(charCode);\n\n // Add unknown word nodes if:\n // 1. No known word was found, OR\n // 2. The character class has invoke=true\n if (!hasKnownWord || isInvoke) {\n this.addUnknownNodes(lattice, text, i, charDef);\n }\n }\n\n return lattice;\n }\n\n private addUnknownNodes(\n lattice: ViterbiLattice,\n text: string,\n pos: number,\n charDef: import(\"../dict/CharacterDefinition.js\").CharacterDefinition\n ): void {\n const charCode = text.charCodeAt(pos);\n const classId = charDef.getCharacterClass(charCode);\n const isGroup = charDef.isGroup(charCode);\n const maxLength = charDef.getMaxLength(charCode);\n\n // Get unknown word entries for this character class\n const wordIds = this.unknownDictionary.lookup(charCode);\n\n if (wordIds.length === 0) return;\n\n // If group flag is set, try to group consecutive same-class characters\n if (isGroup) {\n let endPos = pos + 1;\n while (endPos < text.length) {\n const nextClass = charDef.getCharacterClass(text.charCodeAt(endPos));\n if (nextClass !== classId) break;\n endPos++;\n }\n\n const surface = text.substring(pos, endPos);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n surface.length,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // Also try individual character lengths up to maxLength\n const limit = maxLength > 0 ? Math.min(maxLength, text.length - pos) : 1;\n for (let len = 1; len <= limit; len++) {\n if (len > 1) {\n const nextClass = charDef.getCharacterClass(\n text.charCodeAt(pos + len - 1)\n );\n if (nextClass !== classId) break;\n }\n\n const surface = text.substring(pos, pos + len);\n for (const wordId of wordIds) {\n // Avoid duplicating the grouped entry\n if (isGroup && len === 1) continue;\n\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n len,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // If no nodes were added (non-group, maxLength=0), add single character\n if (!isGroup && maxLength === 0) {\n const surface = text.substring(pos, pos + 1);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n 1,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n }\n}\n","/**\n * Viterbi algorithm searcher.\n * Finds the optimal path through the lattice using dynamic programming.\n */\n\nimport type { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport type { ViterbiLattice } from \"./ViterbiLattice.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiSearcher {\n private readonly connectionCosts: ConnectionCosts;\n\n constructor(connectionCosts: ConnectionCosts) {\n this.connectionCosts = connectionCosts;\n }\n\n /**\n * Find the optimal (lowest cost) path through the lattice.\n * Returns the path as an array of ViterbiNodes from first token to last (excluding BOS/EOS).\n */\n search(lattice: ViterbiLattice): ViterbiNode[] {\n // Forward pass: compute shortest cost to each node\n this.forward(lattice);\n\n // Backward pass: trace back from EOS to BOS\n return this.backward(lattice);\n }\n\n /**\n * Forward pass: for each position, find the shortest path cost to each node.\n */\n private forward(lattice: ViterbiLattice): void {\n const inputLength = lattice.getInputLength();\n\n for (let endPos = 1; endPos <= inputLength; endPos++) {\n const nodes = lattice.getNodesEndAt(endPos);\n\n for (const node of nodes) {\n // Find the best previous node\n const prevNodes = lattice.getNodesEndAt(node.startPos);\n\n for (const prevNode of prevNodes) {\n if (prevNode.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(\n prevNode.rightId,\n node.leftId\n );\n const totalCost =\n prevNode.shortestCost + connectionCost + node.wordCost;\n\n if (totalCost < node.shortestCost) {\n node.shortestCost = totalCost;\n node.prev = prevNode;\n }\n }\n }\n }\n\n // Connect EOS\n const eos = lattice.eos;\n const lastNodes = lattice.getNodesEndAt(inputLength);\n for (const node of lastNodes) {\n if (node.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(node.rightId, eos.leftId);\n const totalCost = node.shortestCost + connectionCost + eos.wordCost;\n\n if (totalCost < eos.shortestCost) {\n eos.shortestCost = totalCost;\n eos.prev = node;\n }\n }\n }\n\n /**\n * Backward pass: trace back from EOS to BOS to get the optimal path.\n */\n private backward(lattice: ViterbiLattice): ViterbiNode[] {\n const path: ViterbiNode[] = [];\n let node: ViterbiNode | null = lattice.eos.prev;\n\n while (node !== null && node.type !== \"BOS\") {\n path.unshift(node);\n node = node.prev;\n }\n\n return path;\n }\n}\n","/**\n * Main tokenizer class.\n * Performs Japanese morphological analysis using Viterbi algorithm.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { ViterbiBuilder } from \"../viterbi/ViterbiBuilder.js\";\nimport { ViterbiSearcher } from \"../viterbi/ViterbiSearcher.js\";\n\nexport class Tokenizer<T extends BaseToken = BaseToken> {\n private readonly viterbiBuilder: ViterbiBuilder;\n private readonly viterbiSearcher: ViterbiSearcher;\n private readonly dictionary: DictionaryContainer;\n private readonly format: DictionaryFormat<T>;\n\n constructor(dictionary: DictionaryContainer, format: DictionaryFormat<T>) {\n this.dictionary = dictionary;\n this.format = format;\n\n this.viterbiBuilder = new ViterbiBuilder(\n dictionary.trie,\n dictionary.tokenInfoDictionary,\n dictionary.unknownDictionary\n );\n\n this.viterbiSearcher = new ViterbiSearcher(dictionary.connectionCosts);\n }\n\n /**\n * Tokenize input text into morphemes.\n */\n tokenize(text: string): T[] {\n if (text.length === 0) {\n return [];\n }\n\n // Build lattice\n const lattice = this.viterbiBuilder.build(text);\n\n // Find optimal path\n const path = this.viterbiSearcher.search(lattice);\n\n // Convert path nodes to typed tokens\n return path.map((node) => {\n const dict =\n node.type === \"UNKNOWN\"\n ? this.dictionary.unknownDictionary\n : this.dictionary.tokenInfoDictionary;\n const features = dict.getFeatures(node.wordId);\n\n return this.format.parseToken(\n {\n wordId: node.wordId,\n type: node.type,\n surface: node.surface,\n offset: node.startPos,\n length: node.length,\n cost: node.shortestCost,\n },\n features\n );\n });\n }\n\n /**\n * Get the dictionary format handler.\n */\n getFormat(): DictionaryFormat<T> {\n return this.format;\n }\n}\n","/**\n * Dictionary-related type definitions.\n */\n\n/** Character class definition entry */\nexport interface CharacterClass {\n /** Class name (e.g., DEFAULT, SPACE, KANJI) */\n name: string;\n /** Whether to invoke unknown word processing */\n invoke: boolean;\n /** Whether to group consecutive same-class chars */\n group: boolean;\n /** Maximum unknown word length (0 = unlimited) */\n length: number;\n}\n\n/** Character-to-class mapping */\nexport interface CharacterMapping {\n /** Character class index */\n classId: number;\n /** Compatible classes */\n compatibleClasses: number[];\n}\n\n/** Unknown word dictionary entry */\nexport interface UnknownEntry {\n /** Character class name */\n className: string;\n /** Left context ID */\n leftId: number;\n /** Right context ID */\n rightId: number;\n /** Word cost */\n cost: number;\n /** Token info features */\n features: string[];\n}\n\n/** Dictionary file names */\nexport const DICT_FILES = {\n trie: \"base.dat.gz\",\n tid: \"tid.dat.gz\",\n tidPos: \"tid_pos.dat.gz\",\n tidMap: \"tid_map.dat.gz\",\n cc: \"cc.dat.gz\",\n unk: \"unk.dat.gz\",\n unkPos: \"unk_pos.dat.gz\",\n unkMap: \"unk_map.dat.gz\",\n unkChar: \"unk_char.dat.gz\",\n unkCompat: \"unk_compat.dat.gz\",\n unkInvoke: \"unk_invoke.dat.gz\",\n} as const;\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Double Array Trie for efficient prefix matching.\n * Supports exact lookup and common prefix search.\n */\n\nimport { DoubleArrayBuilder } from \"./DoubleArrayBuilder.js\";\n\nexport interface KeyValue {\n /** The value associated with the key */\n value: number;\n /** Length of the matched key (in code units) */\n length: number;\n}\n\nexport class DoubleArray {\n private base: Int32Array;\n private check: Int32Array;\n\n constructor(base?: Int32Array, check?: Int32Array) {\n this.base = base ?? new Int32Array(0);\n this.check = check ?? new Int32Array(0);\n }\n\n /**\n * Build a DoubleArray from sorted string keys.\n * Keys must be sorted lexicographically.\n */\n static build(keys: { key: string; value: number }[]): DoubleArray {\n const encoded = keys.map(({ key, value }) => ({\n key: Array.from(key).map((ch) => ch.charCodeAt(0)),\n value,\n }));\n const { base, check } = DoubleArrayBuilder.build(encoded);\n return new DoubleArray(base, check);\n }\n\n /**\n * Exact lookup of a key string.\n * Returns the associated value, or -1 if not found.\n */\n lookup(key: string): number {\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next >= this.check.length || this.check[next] !== pos + 1) {\n return -1;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal (code 0)\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n return -v - 1;\n }\n }\n return -1;\n }\n\n /**\n * Find all keys that are prefixes of the given string.\n * Returns values and their matched lengths.\n */\n commonPrefixSearch(key: string): KeyValue[] {\n const results: KeyValue[] = [];\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n // Check for terminal at current position\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: i });\n }\n }\n\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next < 0 || next >= this.check.length || this.check[next] !== pos + 1) {\n return results;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal at the end\n const termPos = baseVal;\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: key.length });\n }\n }\n\n return results;\n }\n\n /**\n * Check if any key exists that starts with the given prefix.\n */\n contain(key: string): boolean {\n return this.lookup(key) !== -1;\n }\n\n /**\n * Get the raw base array (for serialization).\n */\n getBase(): Int32Array {\n return this.base;\n }\n\n /**\n * Get the raw check array (for serialization).\n */\n getCheck(): Int32Array {\n return this.check;\n }\n\n /**\n * Create a DoubleArray from raw base and check arrays (for deserialization).\n */\n static fromArrays(base: Int32Array, check: Int32Array): DoubleArray {\n return new DoubleArray(base, check);\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const src = arg.buffer instanceof SharedArrayBuffer\n ? new ArrayBuffer(arg.byteLength)\n : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (arg.buffer instanceof SharedArrayBuffer) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Token information dictionary.\n * Stores morpheme features (POS, reading, pronunciation, etc.)\n * indexed by word ID.\n */\nimport { ByteBuffer } from \"../util/ByteBuffer.js\";\n\nexport class TokenInfoDictionary {\n /** Feature data for each word, stored as concatenated strings */\n private dictionary: ByteBuffer;\n\n /** Mapping from word ID to position in features buffer */\n private targetMap: Record<number, number>;\n\n constructor() {\n this.dictionary = new ByteBuffer(1024 * 1024);\n this.targetMap = {};\n }\n\n buildDictionary(entries: { wordId: number; leftId: number; rightId: number; cost: number }[]): {\n wordId: number;\n leftId: number;\n rightId: number;\n cost: number;\n }[] {\n return entries;\n }\n\n /**\n * Add a token entry to the dictionary.\n */\n put(wordId: number, leftId: number, rightId: number, cost: number, features: string): void {\n const pos = this.dictionary.getPosition();\n this.targetMap[wordId] = pos;\n\n // Store: leftId(2) + rightId(2) + cost(2) + features_length(2) + features\n this.dictionary.putInt16(leftId);\n this.dictionary.putInt16(rightId);\n this.dictionary.putInt16(cost);\n this.dictionary.putInt16(features.length);\n this.dictionary.putString(features);\n }\n\n /**\n * Add a mapping from word ID to buffer position.\n */\n addMapping(wordId: number, position: number): void {\n this.targetMap[wordId] = position;\n }\n\n /**\n * Get left context ID for a word.\n */\n getLeftId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos);\n }\n\n /**\n * Get right context ID for a word.\n */\n getRightId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 2);\n }\n\n /**\n * Get word cost for a word.\n */\n getWordCost(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 4);\n }\n\n /**\n * Get feature string for a word.\n */\n getFeatures(wordId: number): string {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return \"\";\n const len = this.dictionary.getInt16(pos + 6);\n const saved = this.dictionary.getPosition();\n this.dictionary.setPosition(pos + 8);\n const str = this.dictionary.readString(len);\n this.dictionary.setPosition(saved);\n return str;\n }\n\n /**\n * Load the dictionary data buffer.\n */\n loadDictionary(data: Uint8Array): this {\n this.dictionary = new ByteBuffer(data);\n return this;\n }\n\n /**\n * Load the position data buffer.\n */\n loadPosVector(_data: Uint8Array): this {\n // POS vector data reserved for future use\n return this;\n }\n\n /**\n * Load the target map buffer.\n * Format: sequence of int32 pairs [wordId, position]\n */\n loadTargetMap(data: Uint8Array): this {\n const view = new DataView(\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n this.targetMap = {};\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 4;\n const pos = view.getInt32(offset, true);\n this.targetMap[i] = pos;\n }\n return this;\n }\n\n getDictionary(): ByteBuffer {\n return this.dictionary;\n }\n\n getTargetMap(): Record<number, number> {\n return this.targetMap;\n }\n\n getTargetMapData(): Uint8Array {\n const ids = Object.keys(this.targetMap)\n .map(Number)\n .sort((a, b) => a - b);\n const maxId = ids.length > 0 ? ids[ids.length - 1] : -1;\n const buf = new ByteBuffer(4 + (maxId + 1) * 4);\n buf.putInt32(maxId + 1);\n for (let i = 0; i <= maxId; i++) {\n buf.putInt32(this.targetMap[i] ?? -1);\n }\n return buf.shrink();\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Unknown word dictionary.\n * Handles words not found in the main dictionary by using character type information.\n */\n\nimport { CharacterDefinition } from \"./CharacterDefinition.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\n\nexport class UnknownDictionary extends TokenInfoDictionary {\n private characterDefinition: CharacterDefinition;\n\n constructor() {\n super();\n this.characterDefinition = new CharacterDefinition();\n }\n\n setCharacterDefinition(charDef: CharacterDefinition): void {\n this.characterDefinition = charDef;\n }\n\n getCharacterDefinition(): CharacterDefinition {\n return this.characterDefinition;\n }\n\n /**\n * Lookup unknown word entries for a given character class.\n * Returns word IDs for the given character class index.\n */\n lookup(charCode: number): number[] {\n return this.lookupByCharClass(\n this.characterDefinition.getCharacterClass(charCode)\n );\n }\n\n /**\n * Lookup word IDs by character class index.\n */\n lookupByCharClass(_classId: number): number[] {\n const map = this.getTargetMap();\n const ids: number[] = [];\n for (const key of Object.keys(map)) {\n const wordId = Number(key);\n const features = this.getFeatures(wordId);\n if (features !== \"\") {\n ids.push(wordId);\n }\n }\n return ids;\n }\n\n /**\n * Load from category map and dictionary data.\n */\n loadCharacterDefinition(charDef: CharacterDefinition): this {\n this.characterDefinition = charDef;\n return this;\n }\n}\n","/**\n * Container that holds all dictionary components needed for tokenization.\n */\n\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"./ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"./UnknownDictionary.js\";\n\nexport class DictionaryContainer {\n readonly trie: DoubleArray;\n readonly tokenInfoDictionary: TokenInfoDictionary;\n readonly connectionCosts: ConnectionCosts;\n readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n connectionCosts: ConnectionCosts,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.connectionCosts = connectionCosts;\n this.unknownDictionary = unknownDictionary;\n }\n}\n","/**\n * Asynchronous tokenizer builder.\n * Loads dictionary files and constructs a ready-to-use Tokenizer.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { TokenizerOptions } from \"../types/options.js\";\nimport type { DictionaryLoader } from \"../loader/DictionaryLoader.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { DICT_FILES } from \"../types/dictionary.js\";\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { CharacterDefinition } from \"../dict/CharacterDefinition.js\";\nimport { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport { Tokenizer } from \"./Tokenizer.js\";\n\nexport class TokenizerBuilder {\n /**\n * Build a tokenizer with the given options.\n */\n static async build<T extends BaseToken>(\n _options: TokenizerOptions,\n loader: DictionaryLoader,\n format: DictionaryFormat<T>\n ): Promise<Tokenizer<T>> {\n // Load all dictionary files in parallel\n const [\n trieData,\n tidData,\n tidPosData,\n tidMapData,\n ccData,\n unkData,\n unkPosData,\n unkMapData,\n unkCharData,\n unkCompatData,\n unkInvokeData,\n ] = await Promise.all([\n loader.loadArrayBuffer(DICT_FILES.trie),\n loader.loadArrayBuffer(DICT_FILES.tid),\n loader.loadArrayBuffer(DICT_FILES.tidPos),\n loader.loadArrayBuffer(DICT_FILES.tidMap),\n loader.loadArrayBuffer(DICT_FILES.cc),\n loader.loadArrayBuffer(DICT_FILES.unk),\n loader.loadArrayBuffer(DICT_FILES.unkPos),\n loader.loadArrayBuffer(DICT_FILES.unkMap),\n loader.loadArrayBuffer(DICT_FILES.unkChar),\n loader.loadArrayBuffer(DICT_FILES.unkCompat),\n loader.loadArrayBuffer(DICT_FILES.unkInvoke),\n ]);\n\n // Build trie\n const baseArray = new Int32Array(trieData);\n // The trie data contains base and check arrays concatenated\n // First half is base, second half is check\n const halfLen = baseArray.length / 2;\n const base = baseArray.slice(0, halfLen);\n const check = baseArray.slice(halfLen);\n const trie = DoubleArray.fromArrays(base, check);\n\n // Build connection costs\n const ccArray = new Int16Array(ccData);\n const connectionCosts = ConnectionCosts.fromBuffer(ccArray);\n\n // Build token info dictionary\n const tokenInfoDictionary = new TokenInfoDictionary();\n tokenInfoDictionary.loadDictionary(new Uint8Array(tidData));\n tokenInfoDictionary.loadPosVector(new Uint8Array(tidPosData));\n tokenInfoDictionary.loadTargetMap(new Uint8Array(tidMapData));\n\n // Build character definition\n const charDef = CharacterDefinition.fromBuffers(\n new Uint8Array(unkCharData),\n new Uint32Array(unkCompatData),\n new Uint8Array(unkInvokeData)\n );\n\n // Build unknown dictionary\n const unknownDictionary = new UnknownDictionary();\n unknownDictionary.loadDictionary(new Uint8Array(unkData));\n unknownDictionary.loadPosVector(new Uint8Array(unkPosData));\n unknownDictionary.loadTargetMap(new Uint8Array(unkMapData));\n unknownDictionary.loadCharacterDefinition(charDef);\n\n // Create container\n const container = new DictionaryContainer(\n trie,\n tokenInfoDictionary,\n connectionCosts,\n unknownDictionary\n );\n\n return new Tokenizer<T>(container, format);\n }\n}\n","/**\n * IPAdic dictionary format parser.\n * Parses features in the IPAdic format (MeCab-IPADIC).\n */\n\nimport type { BaseToken, IpadicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class IpadicFormatHandler implements DictionaryFormat<IpadicToken> {\n readonly name: string = \"ipadic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): IpadicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos: parts[0] ?? \"*\",\n posDetail1: parts[1] ?? \"*\",\n posDetail2: parts[2] ?? \"*\",\n posDetail3: parts[3] ?? \"*\",\n conjugationType: parts[4] ?? \"*\",\n conjugationForm: parts[5] ?? \"*\",\n baseForm: parts[6] ?? \"*\",\n reading: parts[7] ?? \"*\",\n pronunciation: parts[8] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 9;\n }\n}\n","/**\n * UniDic dictionary format parser.\n */\n\nimport type { BaseToken, UnidicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class UnidicFormatHandler implements DictionaryFormat<UnidicToken> {\n readonly name = \"unidic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): UnidicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos1: parts[0] ?? \"*\",\n pos2: parts[1] ?? \"*\",\n pos3: parts[2] ?? \"*\",\n pos4: parts[3] ?? \"*\",\n cType: parts[4] ?? \"*\",\n cForm: parts[5] ?? \"*\",\n lForm: parts[6] ?? \"*\",\n lemma: parts[7] ?? \"*\",\n orth: parts[8] ?? \"*\",\n orthBase: parts[9] ?? \"*\",\n pron: parts[10] ?? \"*\",\n pronBase: parts[11] ?? \"*\",\n goshu: parts[12] ?? \"*\",\n iType: parts[13] ?? \"*\",\n iForm: parts[14] ?? \"*\",\n fType: parts[15] ?? \"*\",\n fForm: parts[16] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 17;\n }\n}\n","/**\n * NEologd dictionary format parser.\n * NEologd is based on IPAdic format with the same feature structure.\n */\n\nimport type { IpadicToken } from \"../../types/token.js\";\nimport { IpadicFormatHandler } from \"./IpadicFormat.js\";\n\nexport class NeologdFormatHandler extends IpadicFormatHandler {\n override readonly name: string = \"neologd\";\n}\n\nexport type NeologdToken = IpadicToken;\n","/**\n * tokana - Modern Japanese Morphological Analyzer\n */\n\nexport { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nexport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\n\n// Types\nexport type {\n BaseToken,\n IpadicToken,\n UnidicToken,\n Token,\n TokenType,\n} from \"./types/token.js\";\nexport type { TokenizerOptions, DictionaryFormatType } from \"./types/options.js\";\n\n// Dictionary formats\nexport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nexport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nexport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\nexport type { DictionaryFormat } from \"./dict/format/DictionaryFormat.js\";\n\n// Dictionary components (for advanced use)\nexport { DoubleArray } from \"./trie/DoubleArray.js\";\nexport { DoubleArrayBuilder } from \"./trie/DoubleArrayBuilder.js\";\nexport { ConnectionCosts } from \"./dict/ConnectionCosts.js\";\nexport { TokenInfoDictionary } from \"./dict/TokenInfoDictionary.js\";\nexport { UnknownDictionary } from \"./dict/UnknownDictionary.js\";\nexport { CharacterDefinition } from \"./dict/CharacterDefinition.js\";\nexport { DictionaryContainer } from \"./dict/DictionaryContainer.js\";\n\n// Loaders\nexport type { DictionaryLoader } from \"./loader/DictionaryLoader.js\";\nexport { NodeLoader } from \"./loader/NodeLoader.js\";\nexport { BrowserLoader } from \"./loader/BrowserLoader.js\";\n\n// Utilities\nexport { ByteBuffer } from \"./util/ByteBuffer.js\";\nexport { SurrogateAwareString } from \"./util/SurrogateAwareString.js\";\n\n// Convenience factory\nimport type { IpadicToken, UnidicToken, BaseToken } from \"./types/token.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\nimport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nimport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nimport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\n\n/**\n * Create a tokenizer with the given options.\n *\n * @example\n * ```typescript\n * const tokenizer = await createTokenizer({\n * format: \"ipadic\",\n * dicPath: \"./dict\",\n * });\n * const tokens = tokenizer.tokenize(\"東京都に住んでいる\");\n * ```\n */\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"ipadic\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"unidic\" }\n): Promise<Tokenizer<UnidicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"neologd\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>> {\n const { createLoaderAsync } = await import(\"./loader/LoaderFactory.js\");\n const loader = await createLoaderAsync(options.dicPath);\n\n const format = options.format ?? \"ipadic\";\n switch (format) {\n case \"ipadic\":\n return TokenizerBuilder.build(options, loader, new IpadicFormatHandler());\n case \"unidic\":\n return TokenizerBuilder.build(options, loader, new UnidicFormatHandler());\n case \"neologd\":\n return TokenizerBuilder.build(options, loader, new NeologdFormatHandler());\n default:\n throw new Error(`Unknown dictionary format: ${format}`);\n }\n}\n","/**\n * Unicode-aware string that correctly handles surrogate pairs.\n * Provides character-level indexing that treats surrogate pairs as single characters.\n */\nexport class SurrogateAwareString {\n private readonly codePoints: number[];\n readonly length: number;\n\n constructor(str: string) {\n this.codePoints = [];\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const low = str.charCodeAt(i + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n this.codePoints.push(\n (code - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000\n );\n i++;\n continue;\n }\n }\n this.codePoints.push(code);\n }\n this.length = this.codePoints.length;\n }\n\n charAt(index: number): string {\n if (index < 0 || index >= this.length) return \"\";\n return String.fromCodePoint(this.codePoints[index]);\n }\n\n charCodeAt(index: number): number {\n if (index < 0 || index >= this.length) return NaN;\n return this.codePoints[index];\n }\n\n substring(start: number, end?: number): string {\n const e = end ?? this.length;\n return this.codePoints\n .slice(start, e)\n .map((cp) => String.fromCodePoint(cp))\n .join(\"\");\n }\n\n slice(start: number, end?: number): string {\n return this.substring(start, end);\n }\n\n toString(): string {\n return this.codePoints.map((cp) => String.fromCodePoint(cp)).join(\"\");\n }\n}\n"],"mappings":"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","names":["NodeLoader","BrowserLoader","termPos","createLoaderAsync"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader/NodeLoader.ts","../src/loader/BrowserLoader.ts","../src/loader/LoaderFactory.ts","../src/viterbi/ViterbiNode.ts","../src/viterbi/ViterbiLattice.ts","../src/viterbi/ViterbiBuilder.ts","../src/viterbi/ViterbiSearcher.ts","../src/tokenizer/Tokenizer.ts","../src/types/dictionary.ts","../src/trie/DoubleArrayBuilder.ts","../src/trie/DoubleArray.ts","../src/dict/ConnectionCosts.ts","../src/util/ByteBuffer.ts","../src/dict/TokenInfoDictionary.ts","../src/dict/CharacterDefinition.ts","../src/dict/UnknownDictionary.ts","../src/dict/DictionaryContainer.ts","../src/tokenizer/TokenizerBuilder.ts","../src/dict/format/IpadicFormat.ts","../src/dict/format/UnidicFormat.ts","../src/dict/format/NeologdFormat.ts","../src/index.ts","../src/util/SurrogateAwareString.ts"],"sourcesContent":["/**\n * Dictionary loader for Node.js using native fs and zlib.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class NodeLoader implements DictionaryLoader {\n private readonly basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const path = await import(\"node:path\");\n const fs = await import(\"node:fs/promises\");\n const zlib = await import(\"node:zlib\");\n const { promisify } = await import(\"node:util\");\n\n const gunzip = promisify(zlib.gunzip);\n const filePath = path.join(this.basePath, fileName);\n const compressed = await fs.readFile(filePath);\n const decompressed = await gunzip(compressed);\n return decompressed.buffer.slice(\n decompressed.byteOffset,\n decompressed.byteOffset + decompressed.byteLength\n );\n }\n}\n","/**\n * Dictionary loader for browser using fetch and DecompressionStream.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport class BrowserLoader implements DictionaryLoader {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Ensure trailing slash\n this.baseUrl = baseUrl.endsWith(\"/\") ? baseUrl : baseUrl + \"/\";\n }\n\n async loadArrayBuffer(fileName: string): Promise<ArrayBuffer> {\n const url = this.baseUrl + fileName;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch dictionary file: ${url} (${response.status})`);\n }\n\n if (!response.body) {\n throw new Error(`Response body is null for: ${url}`);\n }\n\n // Use native DecompressionStream for gzip decompression\n const ds = new DecompressionStream(\"gzip\");\n const decompressedStream = response.body.pipeThrough(ds);\n const reader = decompressedStream.getReader();\n\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.byteLength;\n }\n\n // Concatenate chunks\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer;\n }\n}\n","/**\n * Factory for creating the appropriate dictionary loader based on the runtime environment.\n */\n\nimport type { DictionaryLoader } from \"./DictionaryLoader.js\";\n\nexport async function createLoaderAsync(dicPath: string): Promise<DictionaryLoader> {\n if (isNodeEnvironment()) {\n const { NodeLoader } = await import(\"./NodeLoader.js\");\n return new NodeLoader(dicPath);\n } else {\n const { BrowserLoader } = await import(\"./BrowserLoader.js\");\n return new BrowserLoader(dicPath);\n }\n}\n\nfunction isNodeEnvironment(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n}\n","/**\n * Node in the Viterbi lattice.\n */\n\nimport type { TokenType } from \"../types/token.js\";\n\nexport class ViterbiNode {\n /** Word ID in the dictionary */\n wordId: number;\n /** Word cost from the dictionary */\n wordCost: number;\n /** Start position in the input string */\n startPos: number;\n /** Length of the surface form */\n length: number;\n /** Left context ID for connection cost lookup */\n leftId: number;\n /** Right context ID for connection cost lookup */\n rightId: number;\n /** Token type */\n type: TokenType;\n /** Surface form */\n surface: string;\n\n /** Shortest path cost from BOS to this node */\n shortestCost: number;\n /** Previous node in the shortest path */\n prev: ViterbiNode | null;\n\n constructor(\n wordId: number,\n wordCost: number,\n startPos: number,\n length: number,\n leftId: number,\n rightId: number,\n type: TokenType,\n surface: string\n ) {\n this.wordId = wordId;\n this.wordCost = wordCost;\n this.startPos = startPos;\n this.length = length;\n this.leftId = leftId;\n this.rightId = rightId;\n this.type = type;\n this.surface = surface;\n this.shortestCost = Number.MAX_SAFE_INTEGER;\n this.prev = null;\n }\n\n static createBOS(): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n 0, // startPos\n 0, // length\n 0, // leftId (BOS/EOS left ID)\n 0, // rightId (BOS/EOS right ID)\n \"BOS\",\n \"\"\n );\n }\n\n static createEOS(inputLength: number): ViterbiNode {\n return new ViterbiNode(\n -1, // wordId\n 0, // wordCost\n inputLength, // startPos\n 0, // length\n 0, // leftId\n 0, // rightId\n \"EOS\",\n \"\"\n );\n }\n}\n","/**\n * Viterbi lattice structure.\n * Organizes nodes by their starting position in the input string.\n */\n\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiLattice {\n /** Nodes indexed by end position (position after the last character) */\n private nodesEndAt: ViterbiNode[][];\n /** Length of the input string */\n private readonly inputLength: number;\n\n /** BOS node */\n readonly bos: ViterbiNode;\n /** EOS node */\n readonly eos: ViterbiNode;\n\n constructor(inputLength: number) {\n this.inputLength = inputLength;\n // nodesEndAt[i] = nodes whose surface ends at position i\n // Index 0 is for BOS, index inputLength+1 is for EOS\n this.nodesEndAt = new Array(inputLength + 2);\n for (let i = 0; i < this.nodesEndAt.length; i++) {\n this.nodesEndAt[i] = [];\n }\n\n this.bos = ViterbiNode.createBOS();\n this.bos.shortestCost = 0;\n this.nodesEndAt[0].push(this.bos);\n\n this.eos = ViterbiNode.createEOS(inputLength);\n }\n\n /**\n * Add a node to the lattice.\n * Node is indexed by its end position (startPos + length).\n */\n addNode(node: ViterbiNode): void {\n const endPos = node.startPos + node.length;\n if (endPos >= 0 && endPos < this.nodesEndAt.length) {\n this.nodesEndAt[endPos].push(node);\n }\n }\n\n /**\n * Get all nodes that end at the given position.\n */\n getNodesEndAt(pos: number): ViterbiNode[] {\n return this.nodesEndAt[pos] ?? [];\n }\n\n getInputLength(): number {\n return this.inputLength;\n }\n}\n","/**\n * Builds a Viterbi lattice from input text using the trie and dictionaries.\n */\n\nimport type { DoubleArray } from \"../trie/DoubleArray.js\";\nimport type { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport type { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\nimport { ViterbiLattice } from \"./ViterbiLattice.js\";\n\nexport class ViterbiBuilder {\n private readonly trie: DoubleArray;\n private readonly tokenInfoDictionary: TokenInfoDictionary;\n private readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.unknownDictionary = unknownDictionary;\n }\n\n /**\n * Build a Viterbi lattice for the given input text.\n */\n build(text: string): ViterbiLattice {\n const lattice = new ViterbiLattice(text.length);\n const charDef = this.unknownDictionary.getCharacterDefinition();\n\n for (let i = 0; i < text.length; i++) {\n const suffix = text.substring(i);\n\n // Search known words using trie\n const matches = this.trie.commonPrefixSearch(suffix);\n let hasKnownWord = false;\n\n for (const match of matches) {\n if (match.length === 0) continue;\n hasKnownWord = true;\n const wordId = match.value;\n const surface = text.substring(i, i + match.length);\n\n const node = new ViterbiNode(\n wordId,\n this.tokenInfoDictionary.getWordCost(wordId),\n i,\n match.length,\n this.tokenInfoDictionary.getLeftId(wordId),\n this.tokenInfoDictionary.getRightId(wordId),\n \"KNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n\n // Process unknown words\n const charCode = text.charCodeAt(i);\n const isInvoke = charDef.isInvoke(charCode);\n\n // Add unknown word nodes if:\n // 1. No known word was found, OR\n // 2. The character class has invoke=true\n if (!hasKnownWord || isInvoke) {\n this.addUnknownNodes(lattice, text, i, charDef);\n }\n }\n\n return lattice;\n }\n\n private addUnknownNodes(\n lattice: ViterbiLattice,\n text: string,\n pos: number,\n charDef: import(\"../dict/CharacterDefinition.js\").CharacterDefinition\n ): void {\n const charCode = text.charCodeAt(pos);\n const classId = charDef.getCharacterClass(charCode);\n const isGroup = charDef.isGroup(charCode);\n const maxLength = charDef.getMaxLength(charCode);\n\n // Get unknown word entries for this character class\n const wordIds = this.unknownDictionary.lookup(charCode);\n\n if (wordIds.length === 0) return;\n\n // If group flag is set, try to group consecutive same-class characters\n if (isGroup) {\n let endPos = pos + 1;\n while (endPos < text.length) {\n const nextClass = charDef.getCharacterClass(text.charCodeAt(endPos));\n if (nextClass !== classId) break;\n endPos++;\n }\n\n const surface = text.substring(pos, endPos);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n surface.length,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // Also try individual character lengths up to maxLength\n const limit = maxLength > 0 ? Math.min(maxLength, text.length - pos) : 1;\n for (let len = 1; len <= limit; len++) {\n if (len > 1) {\n const nextClass = charDef.getCharacterClass(\n text.charCodeAt(pos + len - 1)\n );\n if (nextClass !== classId) break;\n }\n\n const surface = text.substring(pos, pos + len);\n for (const wordId of wordIds) {\n // Avoid duplicating the grouped entry\n if (isGroup && len === 1) continue;\n\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n len,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n\n // If no nodes were added (non-group, maxLength=0), add single character\n if (!isGroup && maxLength === 0) {\n const surface = text.substring(pos, pos + 1);\n for (const wordId of wordIds) {\n const node = new ViterbiNode(\n wordId,\n this.unknownDictionary.getWordCost(wordId),\n pos,\n 1,\n this.unknownDictionary.getLeftId(wordId),\n this.unknownDictionary.getRightId(wordId),\n \"UNKNOWN\",\n surface\n );\n lattice.addNode(node);\n }\n }\n }\n}\n","/**\n * Viterbi algorithm searcher.\n * Finds the optimal path through the lattice using dynamic programming.\n */\n\nimport type { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport type { ViterbiLattice } from \"./ViterbiLattice.js\";\nimport { ViterbiNode } from \"./ViterbiNode.js\";\n\nexport class ViterbiSearcher {\n private readonly connectionCosts: ConnectionCosts;\n\n constructor(connectionCosts: ConnectionCosts) {\n this.connectionCosts = connectionCosts;\n }\n\n /**\n * Find the optimal (lowest cost) path through the lattice.\n * Returns the path as an array of ViterbiNodes from first token to last (excluding BOS/EOS).\n */\n search(lattice: ViterbiLattice): ViterbiNode[] {\n // Forward pass: compute shortest cost to each node\n this.forward(lattice);\n\n // Backward pass: trace back from EOS to BOS\n return this.backward(lattice);\n }\n\n /**\n * Forward pass: for each position, find the shortest path cost to each node.\n */\n private forward(lattice: ViterbiLattice): void {\n const inputLength = lattice.getInputLength();\n\n for (let endPos = 1; endPos <= inputLength; endPos++) {\n const nodes = lattice.getNodesEndAt(endPos);\n\n for (const node of nodes) {\n // Find the best previous node\n const prevNodes = lattice.getNodesEndAt(node.startPos);\n\n for (const prevNode of prevNodes) {\n if (prevNode.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(\n prevNode.rightId,\n node.leftId\n );\n const totalCost =\n prevNode.shortestCost + connectionCost + node.wordCost;\n\n if (totalCost < node.shortestCost) {\n node.shortestCost = totalCost;\n node.prev = prevNode;\n }\n }\n }\n }\n\n // Connect EOS\n const eos = lattice.eos;\n const lastNodes = lattice.getNodesEndAt(inputLength);\n for (const node of lastNodes) {\n if (node.shortestCost === Number.MAX_SAFE_INTEGER) continue;\n\n const connectionCost = this.connectionCosts.get(node.rightId, eos.leftId);\n const totalCost = node.shortestCost + connectionCost + eos.wordCost;\n\n if (totalCost < eos.shortestCost) {\n eos.shortestCost = totalCost;\n eos.prev = node;\n }\n }\n }\n\n /**\n * Backward pass: trace back from EOS to BOS to get the optimal path.\n */\n private backward(lattice: ViterbiLattice): ViterbiNode[] {\n const path: ViterbiNode[] = [];\n let node: ViterbiNode | null = lattice.eos.prev;\n\n while (node !== null && node.type !== \"BOS\") {\n path.unshift(node);\n node = node.prev;\n }\n\n return path;\n }\n}\n","/**\n * Main tokenizer class.\n * Performs Japanese morphological analysis using Viterbi algorithm.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { ViterbiBuilder } from \"../viterbi/ViterbiBuilder.js\";\nimport { ViterbiSearcher } from \"../viterbi/ViterbiSearcher.js\";\n\nexport class Tokenizer<T extends BaseToken = BaseToken> {\n private readonly viterbiBuilder: ViterbiBuilder;\n private readonly viterbiSearcher: ViterbiSearcher;\n private readonly dictionary: DictionaryContainer;\n private readonly format: DictionaryFormat<T>;\n\n constructor(dictionary: DictionaryContainer, format: DictionaryFormat<T>) {\n this.dictionary = dictionary;\n this.format = format;\n\n this.viterbiBuilder = new ViterbiBuilder(\n dictionary.trie,\n dictionary.tokenInfoDictionary,\n dictionary.unknownDictionary\n );\n\n this.viterbiSearcher = new ViterbiSearcher(dictionary.connectionCosts);\n }\n\n /**\n * Tokenize input text into morphemes.\n */\n tokenize(text: string): T[] {\n if (text.length === 0) {\n return [];\n }\n\n // Build lattice\n const lattice = this.viterbiBuilder.build(text);\n\n // Find optimal path\n const path = this.viterbiSearcher.search(lattice);\n\n // Convert path nodes to typed tokens\n return path.map((node) => {\n const dict =\n node.type === \"UNKNOWN\"\n ? this.dictionary.unknownDictionary\n : this.dictionary.tokenInfoDictionary;\n const features = dict.getFeatures(node.wordId);\n\n return this.format.parseToken(\n {\n wordId: node.wordId,\n type: node.type,\n surface: node.surface,\n offset: node.startPos,\n length: node.length,\n cost: node.shortestCost,\n },\n features\n );\n });\n }\n\n /**\n * Get the dictionary format handler.\n */\n getFormat(): DictionaryFormat<T> {\n return this.format;\n }\n}\n","/**\n * Dictionary-related type definitions.\n */\n\n/** Character class definition entry */\nexport interface CharacterClass {\n /** Class name (e.g., DEFAULT, SPACE, KANJI) */\n name: string;\n /** Whether to invoke unknown word processing */\n invoke: boolean;\n /** Whether to group consecutive same-class chars */\n group: boolean;\n /** Maximum unknown word length (0 = unlimited) */\n length: number;\n}\n\n/** Character-to-class mapping */\nexport interface CharacterMapping {\n /** Character class index */\n classId: number;\n /** Compatible classes */\n compatibleClasses: number[];\n}\n\n/** Unknown word dictionary entry */\nexport interface UnknownEntry {\n /** Character class name */\n className: string;\n /** Left context ID */\n leftId: number;\n /** Right context ID */\n rightId: number;\n /** Word cost */\n cost: number;\n /** Token info features */\n features: string[];\n}\n\n/** Dictionary file names */\nexport const DICT_FILES = {\n trie: \"base.dat.gz\",\n tid: \"tid.dat.gz\",\n tidPos: \"tid_pos.dat.gz\",\n tidMap: \"tid_map.dat.gz\",\n cc: \"cc.dat.gz\",\n unk: \"unk.dat.gz\",\n unkPos: \"unk_pos.dat.gz\",\n unkMap: \"unk_map.dat.gz\",\n unkChar: \"unk_char.dat.gz\",\n unkCompat: \"unk_compat.dat.gz\",\n unkInvoke: \"unk_invoke.dat.gz\",\n} as const;\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Double Array Trie for efficient prefix matching.\n * Supports exact lookup and common prefix search.\n */\n\nimport { DoubleArrayBuilder } from \"./DoubleArrayBuilder.js\";\n\nexport interface KeyValue {\n /** The value associated with the key */\n value: number;\n /** Length of the matched key (in code units) */\n length: number;\n}\n\nexport class DoubleArray {\n private base: Int32Array;\n private check: Int32Array;\n\n constructor(base?: Int32Array, check?: Int32Array) {\n this.base = base ?? new Int32Array(0);\n this.check = check ?? new Int32Array(0);\n }\n\n /**\n * Build a DoubleArray from sorted string keys.\n * Keys must be sorted lexicographically.\n */\n static build(keys: { key: string; value: number }[]): DoubleArray {\n const encoded = keys.map(({ key, value }) => ({\n key: Array.from(key).map((ch) => ch.charCodeAt(0)),\n value,\n }));\n const { base, check } = DoubleArrayBuilder.build(encoded);\n return new DoubleArray(base, check);\n }\n\n /**\n * Exact lookup of a key string.\n * Returns the associated value, or -1 if not found.\n */\n lookup(key: string): number {\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next >= this.check.length || this.check[next] !== pos + 1) {\n return -1;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal (code 0)\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n return -v - 1;\n }\n }\n return -1;\n }\n\n /**\n * Find all keys that are prefixes of the given string.\n * Returns values and their matched lengths.\n */\n commonPrefixSearch(key: string): KeyValue[] {\n const results: KeyValue[] = [];\n let pos = 0;\n let baseVal = this.base[0];\n\n for (let i = 0; i < key.length; i++) {\n // Check for terminal at current position\n const termPos = baseVal; // base + 0\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: i });\n }\n }\n\n const code = key.charCodeAt(i);\n const next = baseVal + code;\n\n if (next < 0 || next >= this.check.length || this.check[next] !== pos + 1) {\n return results;\n }\n pos = next;\n baseVal = this.base[pos];\n }\n\n // Check for terminal at the end\n const termPos = baseVal;\n if (\n termPos >= 0 &&\n termPos < this.check.length &&\n this.check[termPos] === pos + 1\n ) {\n const v = this.base[termPos];\n if (v < 0) {\n results.push({ value: -v - 1, length: key.length });\n }\n }\n\n return results;\n }\n\n /**\n * Check if any key exists that starts with the given prefix.\n */\n contain(key: string): boolean {\n return this.lookup(key) !== -1;\n }\n\n /**\n * Get the raw base array (for serialization).\n */\n getBase(): Int32Array {\n return this.base;\n }\n\n /**\n * Get the raw check array (for serialization).\n */\n getCheck(): Int32Array {\n return this.check;\n }\n\n /**\n * Create a DoubleArray from raw base and check arrays (for deserialization).\n */\n static fromArrays(base: Int32Array, check: Int32Array): DoubleArray {\n return new DoubleArray(base, check);\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const isShared =\n typeof SharedArrayBuffer !== \"undefined\" && arg.buffer instanceof SharedArrayBuffer;\n const src = isShared\n ? new ArrayBuffer(arg.byteLength)\n : (arg.buffer as ArrayBuffer).slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (isShared) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Token information dictionary.\n * Stores morpheme features (POS, reading, pronunciation, etc.)\n * indexed by word ID.\n */\nimport { ByteBuffer } from \"../util/ByteBuffer.js\";\n\nexport class TokenInfoDictionary {\n /** Feature data for each word, stored as concatenated strings */\n private dictionary: ByteBuffer;\n\n /** Mapping from word ID to position in features buffer */\n private targetMap: Record<number, number>;\n\n constructor() {\n this.dictionary = new ByteBuffer(1024 * 1024);\n this.targetMap = {};\n }\n\n buildDictionary(entries: { wordId: number; leftId: number; rightId: number; cost: number }[]): {\n wordId: number;\n leftId: number;\n rightId: number;\n cost: number;\n }[] {\n return entries;\n }\n\n /**\n * Add a token entry to the dictionary.\n */\n put(wordId: number, leftId: number, rightId: number, cost: number, features: string): void {\n const pos = this.dictionary.getPosition();\n this.targetMap[wordId] = pos;\n\n // Store: leftId(2) + rightId(2) + cost(2) + features_length(2) + features\n this.dictionary.putInt16(leftId);\n this.dictionary.putInt16(rightId);\n this.dictionary.putInt16(cost);\n this.dictionary.putInt16(features.length);\n this.dictionary.putString(features);\n }\n\n /**\n * Add a mapping from word ID to buffer position.\n */\n addMapping(wordId: number, position: number): void {\n this.targetMap[wordId] = position;\n }\n\n /**\n * Get left context ID for a word.\n */\n getLeftId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos);\n }\n\n /**\n * Get right context ID for a word.\n */\n getRightId(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 2);\n }\n\n /**\n * Get word cost for a word.\n */\n getWordCost(wordId: number): number {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return -1;\n return this.dictionary.getInt16(pos + 4);\n }\n\n /**\n * Get feature string for a word.\n */\n getFeatures(wordId: number): string {\n const pos = this.targetMap[wordId];\n if (pos === undefined) return \"\";\n const len = this.dictionary.getInt16(pos + 6);\n const saved = this.dictionary.getPosition();\n this.dictionary.setPosition(pos + 8);\n const str = this.dictionary.readString(len);\n this.dictionary.setPosition(saved);\n return str;\n }\n\n /**\n * Load the dictionary data buffer.\n */\n loadDictionary(data: Uint8Array): this {\n this.dictionary = new ByteBuffer(data);\n return this;\n }\n\n /**\n * Load the position data buffer.\n */\n loadPosVector(_data: Uint8Array): this {\n // POS vector data reserved for future use\n return this;\n }\n\n /**\n * Load the target map buffer.\n * Format: sequence of int32 pairs [wordId, position]\n */\n loadTargetMap(data: Uint8Array): this {\n const view = new DataView(\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n this.targetMap = {};\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 4;\n const pos = view.getInt32(offset, true);\n this.targetMap[i] = pos;\n }\n return this;\n }\n\n getDictionary(): ByteBuffer {\n return this.dictionary;\n }\n\n getTargetMap(): Record<number, number> {\n return this.targetMap;\n }\n\n getTargetMapData(): Uint8Array {\n const ids = Object.keys(this.targetMap)\n .map(Number)\n .sort((a, b) => a - b);\n const maxId = ids.length > 0 ? ids[ids.length - 1] : -1;\n const buf = new ByteBuffer(4 + (maxId + 1) * 4);\n buf.putInt32(maxId + 1);\n for (let i = 0; i <= maxId; i++) {\n buf.putInt32(this.targetMap[i] ?? -1);\n }\n return buf.shrink();\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Unknown word dictionary.\n * Handles words not found in the main dictionary by using character type information.\n */\n\nimport { CharacterDefinition } from \"./CharacterDefinition.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\n\nexport class UnknownDictionary extends TokenInfoDictionary {\n private characterDefinition: CharacterDefinition;\n\n constructor() {\n super();\n this.characterDefinition = new CharacterDefinition();\n }\n\n setCharacterDefinition(charDef: CharacterDefinition): void {\n this.characterDefinition = charDef;\n }\n\n getCharacterDefinition(): CharacterDefinition {\n return this.characterDefinition;\n }\n\n /**\n * Lookup unknown word entries for a given character class.\n * Returns word IDs for the given character class index.\n */\n lookup(charCode: number): number[] {\n return this.lookupByCharClass(\n this.characterDefinition.getCharacterClass(charCode)\n );\n }\n\n /**\n * Lookup word IDs by character class index.\n */\n lookupByCharClass(_classId: number): number[] {\n const map = this.getTargetMap();\n const ids: number[] = [];\n for (const key of Object.keys(map)) {\n const wordId = Number(key);\n const features = this.getFeatures(wordId);\n if (features !== \"\") {\n ids.push(wordId);\n }\n }\n return ids;\n }\n\n /**\n * Load from category map and dictionary data.\n */\n loadCharacterDefinition(charDef: CharacterDefinition): this {\n this.characterDefinition = charDef;\n return this;\n }\n}\n","/**\n * Container that holds all dictionary components needed for tokenization.\n */\n\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"./ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"./TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"./UnknownDictionary.js\";\n\nexport class DictionaryContainer {\n readonly trie: DoubleArray;\n readonly tokenInfoDictionary: TokenInfoDictionary;\n readonly connectionCosts: ConnectionCosts;\n readonly unknownDictionary: UnknownDictionary;\n\n constructor(\n trie: DoubleArray,\n tokenInfoDictionary: TokenInfoDictionary,\n connectionCosts: ConnectionCosts,\n unknownDictionary: UnknownDictionary\n ) {\n this.trie = trie;\n this.tokenInfoDictionary = tokenInfoDictionary;\n this.connectionCosts = connectionCosts;\n this.unknownDictionary = unknownDictionary;\n }\n}\n","/**\n * Asynchronous tokenizer builder.\n * Loads dictionary files and constructs a ready-to-use Tokenizer.\n */\n\nimport type { BaseToken } from \"../types/token.js\";\nimport type { TokenizerOptions } from \"../types/options.js\";\nimport type { DictionaryLoader } from \"../loader/DictionaryLoader.js\";\nimport type { DictionaryFormat } from \"../dict/format/DictionaryFormat.js\";\nimport { DICT_FILES } from \"../types/dictionary.js\";\nimport { DoubleArray } from \"../trie/DoubleArray.js\";\nimport { ConnectionCosts } from \"../dict/ConnectionCosts.js\";\nimport { TokenInfoDictionary } from \"../dict/TokenInfoDictionary.js\";\nimport { UnknownDictionary } from \"../dict/UnknownDictionary.js\";\nimport { CharacterDefinition } from \"../dict/CharacterDefinition.js\";\nimport { DictionaryContainer } from \"../dict/DictionaryContainer.js\";\nimport { Tokenizer } from \"./Tokenizer.js\";\n\nexport class TokenizerBuilder {\n /**\n * Build a tokenizer with the given options.\n */\n static async build<T extends BaseToken>(\n _options: TokenizerOptions,\n loader: DictionaryLoader,\n format: DictionaryFormat<T>\n ): Promise<Tokenizer<T>> {\n // Load all dictionary files in parallel\n const [\n trieData,\n tidData,\n tidPosData,\n tidMapData,\n ccData,\n unkData,\n unkPosData,\n unkMapData,\n unkCharData,\n unkCompatData,\n unkInvokeData,\n ] = await Promise.all([\n loader.loadArrayBuffer(DICT_FILES.trie),\n loader.loadArrayBuffer(DICT_FILES.tid),\n loader.loadArrayBuffer(DICT_FILES.tidPos),\n loader.loadArrayBuffer(DICT_FILES.tidMap),\n loader.loadArrayBuffer(DICT_FILES.cc),\n loader.loadArrayBuffer(DICT_FILES.unk),\n loader.loadArrayBuffer(DICT_FILES.unkPos),\n loader.loadArrayBuffer(DICT_FILES.unkMap),\n loader.loadArrayBuffer(DICT_FILES.unkChar),\n loader.loadArrayBuffer(DICT_FILES.unkCompat),\n loader.loadArrayBuffer(DICT_FILES.unkInvoke),\n ]);\n\n // Build trie\n const baseArray = new Int32Array(trieData);\n // The trie data contains base and check arrays concatenated\n // First half is base, second half is check\n const halfLen = baseArray.length / 2;\n const base = baseArray.slice(0, halfLen);\n const check = baseArray.slice(halfLen);\n const trie = DoubleArray.fromArrays(base, check);\n\n // Build connection costs\n const ccArray = new Int16Array(ccData);\n const connectionCosts = ConnectionCosts.fromBuffer(ccArray);\n\n // Build token info dictionary\n const tokenInfoDictionary = new TokenInfoDictionary();\n tokenInfoDictionary.loadDictionary(new Uint8Array(tidData));\n tokenInfoDictionary.loadPosVector(new Uint8Array(tidPosData));\n tokenInfoDictionary.loadTargetMap(new Uint8Array(tidMapData));\n\n // Build character definition\n const charDef = CharacterDefinition.fromBuffers(\n new Uint8Array(unkCharData),\n new Uint32Array(unkCompatData),\n new Uint8Array(unkInvokeData)\n );\n\n // Build unknown dictionary\n const unknownDictionary = new UnknownDictionary();\n unknownDictionary.loadDictionary(new Uint8Array(unkData));\n unknownDictionary.loadPosVector(new Uint8Array(unkPosData));\n unknownDictionary.loadTargetMap(new Uint8Array(unkMapData));\n unknownDictionary.loadCharacterDefinition(charDef);\n\n // Create container\n const container = new DictionaryContainer(\n trie,\n tokenInfoDictionary,\n connectionCosts,\n unknownDictionary\n );\n\n return new Tokenizer<T>(container, format);\n }\n}\n","/**\n * IPAdic dictionary format parser.\n * Parses features in the IPAdic format (MeCab-IPADIC).\n */\n\nimport type { BaseToken, IpadicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class IpadicFormatHandler implements DictionaryFormat<IpadicToken> {\n readonly name: string = \"ipadic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): IpadicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos: parts[0] ?? \"*\",\n posDetail1: parts[1] ?? \"*\",\n posDetail2: parts[2] ?? \"*\",\n posDetail3: parts[3] ?? \"*\",\n conjugationType: parts[4] ?? \"*\",\n conjugationForm: parts[5] ?? \"*\",\n baseForm: parts[6] ?? \"*\",\n reading: parts[7] ?? \"*\",\n pronunciation: parts[8] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 9;\n }\n}\n","/**\n * UniDic dictionary format parser.\n */\n\nimport type { BaseToken, UnidicToken } from \"../../types/token.js\";\nimport type { DictionaryFormat } from \"./DictionaryFormat.js\";\n\nexport class UnidicFormatHandler implements DictionaryFormat<UnidicToken> {\n readonly name = \"unidic\";\n\n parseToken(\n base: Omit<BaseToken, \"cost\"> & { cost: number },\n features: string\n ): UnidicToken {\n const parts = features.split(\",\");\n return {\n ...base,\n pos1: parts[0] ?? \"*\",\n pos2: parts[1] ?? \"*\",\n pos3: parts[2] ?? \"*\",\n pos4: parts[3] ?? \"*\",\n cType: parts[4] ?? \"*\",\n cForm: parts[5] ?? \"*\",\n lForm: parts[6] ?? \"*\",\n lemma: parts[7] ?? \"*\",\n orth: parts[8] ?? \"*\",\n orthBase: parts[9] ?? \"*\",\n pron: parts[10] ?? \"*\",\n pronBase: parts[11] ?? \"*\",\n goshu: parts[12] ?? \"*\",\n iType: parts[13] ?? \"*\",\n iForm: parts[14] ?? \"*\",\n fType: parts[15] ?? \"*\",\n fForm: parts[16] ?? \"*\",\n };\n }\n\n getFeatureCount(): number {\n return 17;\n }\n}\n","/**\n * NEologd dictionary format parser.\n * NEologd is based on IPAdic format with the same feature structure.\n */\n\nimport type { IpadicToken } from \"../../types/token.js\";\nimport { IpadicFormatHandler } from \"./IpadicFormat.js\";\n\nexport class NeologdFormatHandler extends IpadicFormatHandler {\n override readonly name: string = \"neologd\";\n}\n\nexport type NeologdToken = IpadicToken;\n","/**\n * tokana - Modern Japanese Morphological Analyzer\n */\n\nexport { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nexport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\n\n// Types\nexport type {\n BaseToken,\n IpadicToken,\n UnidicToken,\n Token,\n TokenType,\n} from \"./types/token.js\";\nexport type { TokenizerOptions, DictionaryFormatType } from \"./types/options.js\";\n\n// Dictionary formats\nexport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nexport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nexport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\nexport type { DictionaryFormat } from \"./dict/format/DictionaryFormat.js\";\n\n// Dictionary components (for advanced use)\nexport { DoubleArray } from \"./trie/DoubleArray.js\";\nexport { DoubleArrayBuilder } from \"./trie/DoubleArrayBuilder.js\";\nexport { ConnectionCosts } from \"./dict/ConnectionCosts.js\";\nexport { TokenInfoDictionary } from \"./dict/TokenInfoDictionary.js\";\nexport { UnknownDictionary } from \"./dict/UnknownDictionary.js\";\nexport { CharacterDefinition } from \"./dict/CharacterDefinition.js\";\nexport { DictionaryContainer } from \"./dict/DictionaryContainer.js\";\n\n// Loaders\nexport type { DictionaryLoader } from \"./loader/DictionaryLoader.js\";\nexport { NodeLoader } from \"./loader/NodeLoader.js\";\nexport { BrowserLoader } from \"./loader/BrowserLoader.js\";\n\n// Utilities\nexport { ByteBuffer } from \"./util/ByteBuffer.js\";\nexport { SurrogateAwareString } from \"./util/SurrogateAwareString.js\";\n\n// Convenience factory\nimport type { IpadicToken, UnidicToken, BaseToken } from \"./types/token.js\";\nimport type { TokenizerOptions } from \"./types/options.js\";\nimport type { Tokenizer } from \"./tokenizer/Tokenizer.js\";\nimport { TokenizerBuilder } from \"./tokenizer/TokenizerBuilder.js\";\nimport { IpadicFormatHandler } from \"./dict/format/IpadicFormat.js\";\nimport { UnidicFormatHandler } from \"./dict/format/UnidicFormat.js\";\nimport { NeologdFormatHandler } from \"./dict/format/NeologdFormat.js\";\n\n/**\n * Create a tokenizer with the given options.\n *\n * @example\n * ```typescript\n * const tokenizer = await createTokenizer({\n * format: \"ipadic\",\n * dicPath: \"./dict\",\n * });\n * const tokens = tokenizer.tokenize(\"東京都に住んでいる\");\n * ```\n */\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"ipadic\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"unidic\" }\n): Promise<Tokenizer<UnidicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions & { format: \"neologd\" }\n): Promise<Tokenizer<IpadicToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>>;\nexport async function createTokenizer(\n options: TokenizerOptions\n): Promise<Tokenizer<BaseToken>> {\n const { createLoaderAsync } = await import(\"./loader/LoaderFactory.js\");\n const loader = await createLoaderAsync(options.dicPath);\n\n const format = options.format ?? \"ipadic\";\n switch (format) {\n case \"ipadic\":\n return TokenizerBuilder.build(options, loader, new IpadicFormatHandler());\n case \"unidic\":\n return TokenizerBuilder.build(options, loader, new UnidicFormatHandler());\n case \"neologd\":\n return TokenizerBuilder.build(options, loader, new NeologdFormatHandler());\n default:\n throw new Error(`Unknown dictionary format: ${format}`);\n }\n}\n","/**\n * Unicode-aware string that correctly handles surrogate pairs.\n * Provides character-level indexing that treats surrogate pairs as single characters.\n */\nexport class SurrogateAwareString {\n private readonly codePoints: number[];\n readonly length: number;\n\n constructor(str: string) {\n this.codePoints = [];\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const low = str.charCodeAt(i + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n this.codePoints.push(\n (code - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000\n );\n i++;\n continue;\n }\n }\n this.codePoints.push(code);\n }\n this.length = this.codePoints.length;\n }\n\n charAt(index: number): string {\n if (index < 0 || index >= this.length) return \"\";\n return String.fromCodePoint(this.codePoints[index]);\n }\n\n charCodeAt(index: number): number {\n if (index < 0 || index >= this.length) return NaN;\n return this.codePoints[index];\n }\n\n substring(start: number, end?: number): string {\n const e = end ?? this.length;\n return this.codePoints\n .slice(start, e)\n .map((cp) => String.fromCodePoint(cp))\n .join(\"\");\n }\n\n slice(start: number, end?: number): string {\n return this.substring(start, end);\n }\n\n toString(): string {\n return this.codePoints.map((cp) => String.fromCodePoint(cp)).join(\"\");\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,aAAN,MAA6C;AAAA,MACjC;AAAA,MAEjB,YAAY,UAAkB;AAC5B,aAAK,WAAW;AAAA,MAClB;AAAA,MAEA,MAAM,gBAAgB,UAAwC;AAC5D,cAAM,OAAO,MAAM,OAAO,MAAW;AACrC,cAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,cAAM,OAAO,MAAM,OAAO,MAAW;AACrC,cAAM,EAAE,UAAU,IAAI,MAAM,OAAO,MAAW;AAE9C,cAAM,SAAS,UAAU,KAAK,MAAM;AACpC,cAAM,WAAW,KAAK,KAAK,KAAK,UAAU,QAAQ;AAClD,cAAM,aAAa,MAAM,GAAG,SAAS,QAAQ;AAC7C,cAAM,eAAe,MAAM,OAAO,UAAU;AAC5C,eAAO,aAAa,OAAO;AAAA,UACzB,aAAa;AAAA,UACb,aAAa,aAAa,aAAa;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC5BA;AAAA;AAAA;AAAA;AAAA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,gBAAN,MAAgD;AAAA,MACpC;AAAA,MAEjB,YAAY,SAAiB;AAE3B,aAAK,UAAU,QAAQ,SAAS,GAAG,IAAI,UAAU,UAAU;AAAA,MAC7D;AAAA,MAEA,MAAM,gBAAgB,UAAwC;AAC5D,cAAM,MAAM,KAAK,UAAU;AAC3B,cAAM,WAAW,MAAM,MAAM,GAAG;AAChC,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,oCAAoC,GAAG,KAAK,SAAS,MAAM,GAAG;AAAA,QAChF;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,MAAM,8BAA8B,GAAG,EAAE;AAAA,QACrD;AAGA,cAAM,KAAK,IAAI,oBAAoB,MAAM;AACzC,cAAM,qBAAqB,SAAS,KAAK,YAAY,EAAE;AACvD,cAAM,SAAS,mBAAmB,UAAU;AAE5C,cAAM,SAAuB,CAAC;AAC9B,YAAI,cAAc;AAElB,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AACV,iBAAO,KAAK,KAAK;AACjB,yBAAe,MAAM;AAAA,QACvB;AAGA,cAAM,SAAS,IAAI,WAAW,WAAW;AACzC,YAAI,SAAS;AACb,mBAAW,SAAS,QAAQ;AAC1B,iBAAO,IAAI,OAAO,MAAM;AACxB,oBAAU,MAAM;AAAA,QAClB;AAEA,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;AClDA;AAAA;AAAA;AAAA;AAMA,eAAsB,kBAAkB,SAA4C;AAClF,MAAI,kBAAkB,GAAG;AACvB,UAAM,EAAE,YAAAA,YAAW,IAAI,MAAM;AAC7B,WAAO,IAAIA,YAAW,OAAO;AAAA,EAC/B,OAAO;AACL,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,WAAO,IAAIA,eAAc,OAAO;AAAA,EAClC;AACF;AAEA,SAAS,oBAA6B;AACpC,SACE,OAAO,YAAY,eACnB,QAAQ,YAAY,QACpB,QAAQ,SAAS,QAAQ;AAE7B;AAtBA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,cAAN,MAAM,aAAY;AAAA;AAAA,EAEvB;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAGA;AAAA;AAAA,EAEA;AAAA,EAEA,YACE,QACA,UACA,UACA,QACA,QACA,SACA,MACA,SACA;AACA,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,eAAe,OAAO;AAC3B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO,YAAyB;AAC9B,WAAO,IAAI;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,UAAU,aAAkC;AACjD,WAAO,IAAI;AAAA,MACT;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACrEO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAElB;AAAA;AAAA,EAES;AAAA;AAAA,EAGR;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAGnB,SAAK,aAAa,IAAI,MAAM,cAAc,CAAC;AAC3C,aAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC/C,WAAK,WAAW,CAAC,IAAI,CAAC;AAAA,IACxB;AAEA,SAAK,MAAM,YAAY,UAAU;AACjC,SAAK,IAAI,eAAe;AACxB,SAAK,WAAW,CAAC,EAAE,KAAK,KAAK,GAAG;AAEhC,SAAK,MAAM,YAAY,UAAU,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAyB;AAC/B,UAAM,SAAS,KAAK,WAAW,KAAK;AACpC,QAAI,UAAU,KAAK,SAAS,KAAK,WAAW,QAAQ;AAClD,WAAK,WAAW,MAAM,EAAE,KAAK,IAAI;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAA4B;AACxC,WAAO,KAAK,WAAW,GAAG,KAAK,CAAC;AAAA,EAClC;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AACF;;;AC7CO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,MACA,qBACA,mBACA;AACA,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAA8B;AAClC,UAAM,UAAU,IAAI,eAAe,KAAK,MAAM;AAC9C,UAAM,UAAU,KAAK,kBAAkB,uBAAuB;AAE9D,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,SAAS,KAAK,UAAU,CAAC;AAG/B,YAAM,UAAU,KAAK,KAAK,mBAAmB,MAAM;AACnD,UAAI,eAAe;AAEnB,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,WAAW,EAAG;AACxB,uBAAe;AACf,cAAM,SAAS,MAAM;AACrB,cAAM,UAAU,KAAK,UAAU,GAAG,IAAI,MAAM,MAAM;AAElD,cAAM,OAAO,IAAI;AAAA,UACf;AAAA,UACA,KAAK,oBAAoB,YAAY,MAAM;AAAA,UAC3C;AAAA,UACA,MAAM;AAAA,UACN,KAAK,oBAAoB,UAAU,MAAM;AAAA,UACzC,KAAK,oBAAoB,WAAW,MAAM;AAAA,UAC1C;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,QAAQ,IAAI;AAAA,MACtB;AAGA,YAAM,WAAW,KAAK,WAAW,CAAC;AAClC,YAAM,WAAW,QAAQ,SAAS,QAAQ;AAK1C,UAAI,CAAC,gBAAgB,UAAU;AAC7B,aAAK,gBAAgB,SAAS,MAAM,GAAG,OAAO;AAAA,MAChD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACN,SACA,MACA,KACA,SACM;AACN,UAAM,WAAW,KAAK,WAAW,GAAG;AACpC,UAAM,UAAU,QAAQ,kBAAkB,QAAQ;AAClD,UAAM,UAAU,QAAQ,QAAQ,QAAQ;AACxC,UAAM,YAAY,QAAQ,aAAa,QAAQ;AAG/C,UAAM,UAAU,KAAK,kBAAkB,OAAO,QAAQ;AAEtD,QAAI,QAAQ,WAAW,EAAG;AAG1B,QAAI,SAAS;AACX,UAAI,SAAS,MAAM;AACnB,aAAO,SAAS,KAAK,QAAQ;AAC3B,cAAM,YAAY,QAAQ,kBAAkB,KAAK,WAAW,MAAM,CAAC;AACnE,YAAI,cAAc,QAAS;AAC3B;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,UAAU,KAAK,MAAM;AAC1C,iBAAW,UAAU,SAAS;AAC5B,cAAM,OAAO,IAAI;AAAA,UACf;AAAA,UACA,KAAK,kBAAkB,YAAY,MAAM;AAAA,UACzC;AAAA,UACA,QAAQ;AAAA,UACR,KAAK,kBAAkB,UAAU,MAAM;AAAA,UACvC,KAAK,kBAAkB,WAAW,MAAM;AAAA,UACxC;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AAGA,UAAM,QAAQ,YAAY,IAAI,KAAK,IAAI,WAAW,KAAK,SAAS,GAAG,IAAI;AACvE,aAAS,MAAM,GAAG,OAAO,OAAO,OAAO;AACrC,UAAI,MAAM,GAAG;AACX,cAAM,YAAY,QAAQ;AAAA,UACxB,KAAK,WAAW,MAAM,MAAM,CAAC;AAAA,QAC/B;AACA,YAAI,cAAc,QAAS;AAAA,MAC7B;AAEA,YAAM,UAAU,KAAK,UAAU,KAAK,MAAM,GAAG;AAC7C,iBAAW,UAAU,SAAS;AAE5B,YAAI,WAAW,QAAQ,EAAG;AAE1B,cAAM,OAAO,IAAI;AAAA,UACf;AAAA,UACA,KAAK,kBAAkB,YAAY,MAAM;AAAA,UACzC;AAAA,UACA;AAAA,UACA,KAAK,kBAAkB,UAAU,MAAM;AAAA,UACvC,KAAK,kBAAkB,WAAW,MAAM;AAAA,UACxC;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,YAAM,UAAU,KAAK,UAAU,KAAK,MAAM,CAAC;AAC3C,iBAAW,UAAU,SAAS;AAC5B,cAAM,OAAO,IAAI;AAAA,UACf;AAAA,UACA,KAAK,kBAAkB,YAAY,MAAM;AAAA,UACzC;AAAA,UACA;AAAA,UACA,KAAK,kBAAkB,UAAU,MAAM;AAAA,UACvC,KAAK,kBAAkB,WAAW,MAAM;AAAA,UACxC;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACxJO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EAEjB,YAAY,iBAAkC;AAC5C,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAwC;AAE7C,SAAK,QAAQ,OAAO;AAGpB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAQ,SAA+B;AAC7C,UAAM,cAAc,QAAQ,eAAe;AAE3C,aAAS,SAAS,GAAG,UAAU,aAAa,UAAU;AACpD,YAAM,QAAQ,QAAQ,cAAc,MAAM;AAE1C,iBAAW,QAAQ,OAAO;AAExB,cAAM,YAAY,QAAQ,cAAc,KAAK,QAAQ;AAErD,mBAAW,YAAY,WAAW;AAChC,cAAI,SAAS,iBAAiB,OAAO,iBAAkB;AAEvD,gBAAM,iBAAiB,KAAK,gBAAgB;AAAA,YAC1C,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AACA,gBAAM,YACJ,SAAS,eAAe,iBAAiB,KAAK;AAEhD,cAAI,YAAY,KAAK,cAAc;AACjC,iBAAK,eAAe;AACpB,iBAAK,OAAO;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,MAAM,QAAQ;AACpB,UAAM,YAAY,QAAQ,cAAc,WAAW;AACnD,eAAW,QAAQ,WAAW;AAC5B,UAAI,KAAK,iBAAiB,OAAO,iBAAkB;AAEnD,YAAM,iBAAiB,KAAK,gBAAgB,IAAI,KAAK,SAAS,IAAI,MAAM;AACxE,YAAM,YAAY,KAAK,eAAe,iBAAiB,IAAI;AAE3D,UAAI,YAAY,IAAI,cAAc;AAChC,YAAI,eAAe;AACnB,YAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,SAAwC;AACvD,UAAM,OAAsB,CAAC;AAC7B,QAAI,OAA2B,QAAQ,IAAI;AAE3C,WAAO,SAAS,QAAQ,KAAK,SAAS,OAAO;AAC3C,WAAK,QAAQ,IAAI;AACjB,aAAO,KAAK;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AACF;;;AC9EO,IAAM,YAAN,MAAiD;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,YAAiC,QAA6B;AACxE,SAAK,aAAa;AAClB,SAAK,SAAS;AAEd,SAAK,iBAAiB,IAAI;AAAA,MACxB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAEA,SAAK,kBAAkB,IAAI,gBAAgB,WAAW,eAAe;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAmB;AAC1B,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,UAAU,KAAK,eAAe,MAAM,IAAI;AAG9C,UAAM,OAAO,KAAK,gBAAgB,OAAO,OAAO;AAGhD,WAAO,KAAK,IAAI,CAAC,SAAS;AACxB,YAAM,OACJ,KAAK,SAAS,YACV,KAAK,WAAW,oBAChB,KAAK,WAAW;AACtB,YAAM,WAAW,KAAK,YAAY,KAAK,MAAM;AAE7C,aAAO,KAAK,OAAO;AAAA,QACjB;AAAA,UACE,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;;;ACjCO,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AACb;;;AChCA,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,cAAc;AAEb,IAAM,qBAAN,MAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9B,OAAO,MAAM,MAAkE;AAC7E,UAAM,UAAU,IAAI,oBAAmB;AACvC,WAAO,QAAQ,cAAc,IAAI;AAAA,EACnC;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,OAAO,IAAI,WAAW,CAAC;AAC5B,SAAK,QAAQ,IAAI,WAAW,CAAC;AAC7B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,cACN,MACwB;AACxB,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,EAAE,MAAM,IAAI,WAAW,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,EAAE;AAAA,IAC7D;AAGA,UAAM,OAAO,KAAK,UAAU,IAAI;AAGhC,UAAM,cAAc,KAAK,IAAI,KAAK,SAAS,GAAG,IAAI;AAClD,SAAK,OAAO,IAAI,WAAW,WAAW;AACtC,SAAK,QAAQ,IAAI,WAAW,WAAW;AACvC,SAAK,eAAe;AAGpB,SAAK,KAAK,CAAC,IAAI;AAGf,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,SAAS,GAAG;AACvB,WAAK,OAAO,UAAU,CAAC;AAAA,IACzB;AAGA,QAAI,WAAW;AACf,aAAS,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,UAAI,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG;AAC7C,mBAAW,IAAI;AACf;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,IAAI,UAAU,CAAC;AAE/B,WAAO;AAAA,MACL,MAAM,KAAK,KAAK,MAAM,GAAG,QAAQ;AAAA,MACjC,OAAO,KAAK,MAAM,MAAM,GAAG,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAoD;AACpE,UAAM,OAAiB;AAAA,MACrB,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAEA,eAAW,EAAE,KAAK,MAAM,KAAK,MAAM;AACjC,UAAI,OAAO;AACX,iBAAW,QAAQ,KAAK;AACtB,YAAI,QAAQ,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACrD,YAAI,CAAC,OAAO;AACV,kBAAQ;AAAA,YACN;AAAA,YACA,UAAU,CAAC;AAAA,YACX,YAAY;AAAA,YACZ,OAAO;AAAA,UACT;AACA,eAAK,SAAS,KAAK,KAAK;AAAA,QAC1B;AACA,eAAO;AAAA,MACT;AAEA,YAAM,WAAqB;AAAA,QACzB,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,MACF;AAEA,WAAK,SAAS,QAAQ,QAAQ;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,MAAoB;AACrC,QAAI,QAAQ,KAAK,KAAK,OAAQ;AAC9B,QAAI,UAAU,KAAK,KAAK;AACxB,WAAO,UAAU,MAAM;AACrB,gBAAU,KAAK,IAAI,UAAU,GAAG,IAAI;AAAA,IACtC;AACA,UAAM,UAAU,IAAI,WAAW,OAAO;AACtC,UAAM,WAAW,IAAI,WAAW,OAAO;AACvC,YAAQ,IAAI,KAAK,IAAI;AACrB,aAAS,IAAI,KAAK,KAAK;AACvB,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,OAAO,UAAsB,WAAyB;AAE5D,UAAM,QAAQ,SAAS,IAAI,CAAC,MAAO,EAAE,SAAS,YAAY,IAAI,EAAE,IAAK;AAGrE,QAAI,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,YAAY,IAAI,MAAM,CAAC;AAC/D,QAAI,eAAe;AACnB,QAAI,UAAU;AAEd,UAAO,QAAO,MAAM;AAClB;AACA,WAAK,WAAW,QAAQ,MAAM,MAAM,SAAS,CAAC,IAAI,CAAC;AAEnD,UAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,CAAC,MAAM,aAAa;AAChD;AACA;AAAA,MACF;AACA,UAAI,SAAS;AACX,aAAK,eAAe,QAAQ,MAAM,CAAC;AACnC,kBAAU;AAAA,MACZ;AAEA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,CAAC,MAAM,aAAa;AAChD,mBAAS;AAAA,QACX;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,gBAAgB,QAAQ,KAAK,eAAe,MAAM,MAAM;AAC1D,WAAK,eAAe,QAAQ,MAAM,CAAC;AAAA,IACrC;AAEA,SAAK,KAAK,SAAS,IAAI;AAGvB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,QAAQ,MAAM,CAAC;AAC3B,WAAK,WAAW,MAAM,CAAC;AACvB,WAAK,MAAM,GAAG,IAAI,YAAY;AAAA,IAChC;AAGA,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,QAAQ,MAAM,CAAC;AAE3B,UAAI,SAAS,CAAC,EAAE,YAAY;AAE1B,aAAK,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ;AAAA,MACxC,WAAW,SAAS,CAAC,EAAE,SAAS,SAAS,GAAG;AAC1C,aAAK,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;;;ACnLO,IAAM,cAAN,MAAM,aAAY;AAAA,EACf;AAAA,EACA;AAAA,EAER,YAAY,MAAmB,OAAoB;AACjD,SAAK,OAAO,QAAQ,IAAI,WAAW,CAAC;AACpC,SAAK,QAAQ,SAAS,IAAI,WAAW,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,MAAM,MAAqD;AAChE,UAAM,UAAU,KAAK,IAAI,CAAC,EAAE,KAAK,MAAM,OAAO;AAAA,MAC5C,KAAK,MAAM,KAAK,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;AAAA,MACjD;AAAA,IACF,EAAE;AACF,UAAM,EAAE,MAAM,MAAM,IAAI,mBAAmB,MAAM,OAAO;AACxD,WAAO,IAAI,aAAY,MAAM,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAqB;AAC1B,QAAI,MAAM;AACV,QAAI,UAAU,KAAK,KAAK,CAAC;AAEzB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,YAAM,OAAO,UAAU;AAEvB,UAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM,IAAI,MAAM,MAAM,GAAG;AAC7D,eAAO;AAAA,MACT;AACA,YAAM;AACN,gBAAU,KAAK,KAAK,GAAG;AAAA,IACzB;AAGA,UAAM,UAAU;AAChB,QACE,WAAW,KACX,UAAU,KAAK,MAAM,UACrB,KAAK,MAAM,OAAO,MAAM,MAAM,GAC9B;AACA,YAAM,IAAI,KAAK,KAAK,OAAO;AAC3B,UAAI,IAAI,GAAG;AACT,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,KAAyB;AAC1C,UAAM,UAAsB,CAAC;AAC7B,QAAI,MAAM;AACV,QAAI,UAAU,KAAK,KAAK,CAAC;AAEzB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAEnC,YAAMC,WAAU;AAChB,UACEA,YAAW,KACXA,WAAU,KAAK,MAAM,UACrB,KAAK,MAAMA,QAAO,MAAM,MAAM,GAC9B;AACA,cAAM,IAAI,KAAK,KAAKA,QAAO;AAC3B,YAAI,IAAI,GAAG;AACT,kBAAQ,KAAK,EAAE,OAAO,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;AAAA,QAC3C;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,YAAM,OAAO,UAAU;AAEvB,UAAI,OAAO,KAAK,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM,IAAI,MAAM,MAAM,GAAG;AACzE,eAAO;AAAA,MACT;AACA,YAAM;AACN,gBAAU,KAAK,KAAK,GAAG;AAAA,IACzB;AAGA,UAAM,UAAU;AAChB,QACE,WAAW,KACX,UAAU,KAAK,MAAM,UACrB,KAAK,MAAM,OAAO,MAAM,MAAM,GAC9B;AACA,YAAM,IAAI,KAAK,KAAK,OAAO;AAC3B,UAAI,IAAI,GAAG;AACT,gBAAQ,KAAK,EAAE,OAAO,CAAC,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAsB;AAC5B,WAAO,KAAK,OAAO,GAAG,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,MAAkB,OAAgC;AAClE,WAAO,IAAI,aAAY,MAAM,KAAK;AAAA,EACpC;AACF;;;AC7IO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,aAAqB,cAAsB;AACrD,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,QAAQ,IAAI,WAAW,cAAc,YAAY;AAAA,EACxD;AAAA,EAEA,IAAI,WAAmB,YAAoB,MAAoB;AAC7D,SAAK,MAAM,YAAY,KAAK,eAAe,UAAU,IAAI;AAAA,EAC3D;AAAA,EAEA,IAAI,WAAmB,YAA4B;AACjD,WAAO,KAAK,MAAM,YAAY,KAAK,eAAe,UAAU;AAAA,EAC9D;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAW,QAAqC;AACrD,UAAM,cAAc,OAAO,CAAC;AAC5B,UAAM,eAAe,OAAO,CAAC;AAC7B,UAAM,KAAK,IAAI,iBAAgB,aAAa,YAAY;AACxD,OAAG,MAAM,IAAI,OAAO,SAAS,GAAG,IAAI,cAAc,YAAY,CAAC;AAC/D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAuB;AACrB,UAAM,SAAS,IAAI,WAAW,IAAI,KAAK,cAAc,KAAK,YAAY;AACtE,WAAO,CAAC,IAAI,KAAK;AACjB,WAAO,CAAC,IAAI,KAAK;AACjB,WAAO,IAAI,KAAK,OAAO,CAAC;AACxB,WAAO;AAAA,EACT;AACF;;;AClDO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,KAA2B;AACrC,QAAI,eAAe,YAAY;AAC7B,YAAM,WACJ,OAAO,sBAAsB,eAAe,IAAI,kBAAkB;AACpE,YAAM,MAAM,WACR,IAAI,YAAY,IAAI,UAAU,IAC7B,IAAI,OAAuB,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,UAAU;AACrF,UAAI,UAAU;AACZ,YAAI,WAAW,GAAG,EAAE,IAAI,GAAG;AAAA,MAC7B;AACA,WAAK,SAAS;AACd,WAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AACpC,WAAK,WAAW;AAAA,IAClB,OAAO;AACL,YAAM,OAAO,OAAO;AACpB,WAAK,SAAS,IAAI,YAAY,IAAI;AAClC,WAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AACpC,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,eAAe,YAA0B;AAC/C,UAAM,WAAW,KAAK,WAAW;AACjC,QAAI,YAAY,KAAK,OAAO,WAAY;AAExC,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,UAAU,UAAU;AACzB,iBAAW;AAAA,IACb;AACA,UAAM,YAAY,IAAI,YAAY,OAAO;AACzC,QAAI,WAAW,SAAS,EAAE,IAAI,IAAI,WAAW,KAAK,MAAM,CAAC;AACzD,SAAK,SAAS;AACd,SAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AAAA,EACtC;AAAA,EAEA,OAAe;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,KAAmB;AAC7B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAQ,KAAqB;AAC3B,WAAO,KAAK,KAAK,QAAQ,GAAG;AAAA,EAC9B;AAAA,EAEA,SAAS,KAAqB;AAC5B,WAAO,KAAK,KAAK,SAAS,KAAK,IAAI;AAAA,EACrC;AAAA,EAEA,SAAS,KAAqB;AAC5B,WAAO,KAAK,KAAK,SAAS,KAAK,IAAI;AAAA,EACrC;AAAA,EAEA,SAAS,KAAqB;AAC5B,WAAO,KAAK,KAAK,SAAS,GAAG;AAAA,EAC/B;AAAA,EAEA,UAAU,KAAqB;AAC7B,WAAO,KAAK,KAAK,UAAU,KAAK,IAAI;AAAA,EACtC;AAAA,EAEA,UAAU,KAAqB;AAC7B,WAAO,KAAK,KAAK,UAAU,KAAK,IAAI;AAAA,EACtC;AAAA,EAEA,QAAQ,OAAqB;AAC3B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,QAAQ,KAAK,UAAU,KAAK;AACtC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,SAAS,KAAK,UAAU,OAAO,IAAI;AAC7C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,SAAS,KAAK,UAAU,OAAO,IAAI;AAC7C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,SAAS,KAAK,UAAU,KAAK;AACvC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,UAAU,OAAqB;AAC7B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,UAAU,KAAK,UAAU,OAAO,IAAI;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,UAAU,OAAqB;AAC7B,SAAK,eAAe,CAAC;AACrB,SAAK,KAAK,UAAU,KAAK,UAAU,OAAO,IAAI;AAC9C,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAmB;AACjB,UAAM,QAAQ,KAAK,KAAK,QAAQ,KAAK,QAAQ;AAC7C,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,YAAoB;AAClB,UAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,UAAU,IAAI;AACpD,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,YAAoB;AAClB,UAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,UAAU,IAAI;AACpD,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,YAAoB;AAClB,UAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ;AAC9C,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB;AACnB,UAAM,QAAQ,KAAK,KAAK,UAAU,KAAK,UAAU,IAAI;AACrD,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB;AACnB,UAAM,QAAQ,KAAK,KAAK,UAAU,KAAK,UAAU,IAAI;AACrD,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAwB;AACjC,UAAM,QAAQ,IAAI,WAAW,KAAK,QAAQ,KAAK,UAAU,SAAS,CAAC;AACnE,SAAK,YAAY,SAAS;AAC1B,UAAM,QAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAM;AAAA,QACJ,OAAO,aAAa,MAAM,IAAI,CAAC,IAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAE;AAAA,MAC5D;AAAA,IACF;AACA,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AAAA,EAEA,UAAU,KAAmB;AAC3B,SAAK,eAAe,IAAI,SAAS,CAAC;AAClC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,WAAK,KAAK,SAAS,KAAK,YAAY,OAAO,GAAI;AAC/C,WAAK,KAAK,SAAS,KAAK,YAAa,QAAQ,IAAK,GAAI;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,SAAqB;AACnB,WAAO,IAAI,WAAW,KAAK,QAAQ,GAAG,KAAK,QAAQ;AAAA,EACrD;AAAA,EAEA,eAA2B;AACzB,WAAO,IAAI,WAAW,KAAK,QAAQ,GAAG,KAAK,QAAQ;AAAA,EACrD;AAAA,EAEA,iBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACrLO,IAAM,sBAAN,MAA0B;AAAA;AAAA,EAEvB;AAAA;AAAA,EAGA;AAAA,EAER,cAAc;AACZ,SAAK,aAAa,IAAI,WAAW,OAAO,IAAI;AAC5C,SAAK,YAAY,CAAC;AAAA,EACpB;AAAA,EAEA,gBAAgB,SAKZ;AACF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB,QAAgB,SAAiB,MAAc,UAAwB;AACzF,UAAM,MAAM,KAAK,WAAW,YAAY;AACxC,SAAK,UAAU,MAAM,IAAI;AAGzB,SAAK,WAAW,SAAS,MAAM;AAC/B,SAAK,WAAW,SAAS,OAAO;AAChC,SAAK,WAAW,SAAS,IAAI;AAC7B,SAAK,WAAW,SAAS,SAAS,MAAM;AACxC,SAAK,WAAW,UAAU,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAgB,UAAwB;AACjD,SAAK,UAAU,MAAM,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAwB;AAChC,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAI,QAAQ,OAAW,QAAO;AAC9B,WAAO,KAAK,WAAW,SAAS,GAAG;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAwB;AACjC,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAI,QAAQ,OAAW,QAAO;AAC9B,WAAO,KAAK,WAAW,SAAS,MAAM,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAwB;AAClC,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAI,QAAQ,OAAW,QAAO;AAC9B,WAAO,KAAK,WAAW,SAAS,MAAM,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAwB;AAClC,UAAM,MAAM,KAAK,UAAU,MAAM;AACjC,QAAI,QAAQ,OAAW,QAAO;AAC9B,UAAM,MAAM,KAAK,WAAW,SAAS,MAAM,CAAC;AAC5C,UAAM,QAAQ,KAAK,WAAW,YAAY;AAC1C,SAAK,WAAW,YAAY,MAAM,CAAC;AACnC,UAAM,MAAM,KAAK,WAAW,WAAW,GAAG;AAC1C,SAAK,WAAW,YAAY,KAAK;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAwB;AACrC,SAAK,aAAa,IAAI,WAAW,IAAI;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAyB;AAErC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAwB;AACpC,UAAM,OAAO,IAAI;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,SAAK,YAAY,CAAC;AAClB,UAAM,QAAQ,KAAK,SAAS,GAAG,IAAI;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,SAAS,IAAI,IAAI;AACvB,YAAM,MAAM,KAAK,SAAS,QAAQ,IAAI;AACtC,WAAK,UAAU,CAAC,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAA+B;AAC7B,UAAM,MAAM,OAAO,KAAK,KAAK,SAAS,EACnC,IAAI,MAAM,EACV,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvB,UAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI;AACrD,UAAM,MAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,CAAC;AAC9C,QAAI,SAAS,QAAQ,CAAC;AACtB,aAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,UAAI,SAAS,KAAK,UAAU,CAAC,KAAK,EAAE;AAAA,IACtC;AACA,WAAO,IAAI,OAAO;AAAA,EACpB;AACF;;;AC5IA,IAAM,mBAAmB;AAElB,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,sBAAN,MAAM,qBAAoB;AAAA;AAAA,EAEvB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAER,cAAc;AACZ,SAAK,mBAAmB,CAAC;AAEzB,SAAK,uBAAuB,IAAI,WAAW,KAAK;AAChD,SAAK,wBAAwB,IAAI,YAAY,KAAK;AAAA,EACpD;AAAA,EAEA,kBAAkB,WAAmC;AACnD,UAAM,KAAK,KAAK,iBAAiB;AACjC,SAAK,iBAAiB,KAAK,SAAS;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,qBACE,OACA,KACA,SACA,mBACM;AACN,aAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,WAAK,qBAAqB,CAAC,IAAI;AAC/B,UAAI,SAAS;AACb,iBAAW,KAAK,mBAAmB;AACjC,kBAAU,KAAK;AAAA,MACjB;AACA,WAAK,sBAAsB,CAAC,IAAI;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAkC;AACvC,UAAM,UACJ,WAAW,QAAQ,KAAK,qBAAqB,QAAQ,IAAI;AAC3D,WAAO,KAAK,iBAAiB,OAAO,KAAK,KAAK,iBAAiB,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAA0B;AAC1C,WAAO,WAAW,QAAQ,KAAK,qBAAqB,QAAQ,IAAI;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAmB,WAA4B;AAC1D,UAAM,SAAS,KAAK,kBAAkB,SAAS;AAC/C,UAAM,SAAS,KAAK,sBAAsB,SAAS,KAAK;AACxD,YAAQ,SAAU,KAAK,YAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAA2B;AAClC,UAAM,UAAU,KAAK,kBAAkB,QAAQ;AAC/C,UAAM,MAAM,KAAK,iBAAiB,OAAO;AACzC,WAAO,MAAM,IAAI,SAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAA2B;AACjC,UAAM,UAAU,KAAK,kBAAkB,QAAQ;AAC/C,UAAM,MAAM,KAAK,iBAAiB,OAAO;AACzC,WAAO,MAAM,IAAI,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAA0B;AACrC,UAAM,UAAU,KAAK,kBAAkB,QAAQ;AAC/C,UAAM,MAAM,KAAK,iBAAiB,OAAO;AACzC,WAAO,MAAM,IAAI,SAAS;AAAA,EAC5B;AAAA,EAEA,sBAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,2BAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YACL,aACA,WACA,cACqB;AACrB,UAAM,MAAM,IAAI,qBAAoB;AACpC,QAAI,uBAAuB;AAC3B,QAAI,wBAAwB;AAG5B,UAAM,OAAO,IAAI;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AACA,UAAM,QAAQ,KAAK,SAAS,GAAG,IAAI;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,SAAS,IAAI,IAAI;AACvB,YAAM,SAAS,KAAK,SAAS,MAAM,MAAM;AACzC,YAAM,QAAQ,KAAK,SAAS,SAAS,CAAC,MAAM;AAC5C,YAAM,SAAS,KAAK,SAAS,SAAS,GAAG,IAAI;AAC7C,UAAI,iBAAiB,KAAK;AAAA,QACxB,MAAM,yBAAyB,CAAC,KAAK,SAAS,CAAC;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA6B;AAC3B,UAAM,QAAQ,KAAK,iBAAiB;AACpC,UAAM,MAAM,IAAI,WAAW,IAAI,QAAQ,CAAC;AACxC,UAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AACpC,SAAK,SAAS,GAAG,OAAO,IAAI;AAC5B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,KAAK,iBAAiB,CAAC;AACnC,YAAM,SAAS,IAAI,IAAI;AACvB,WAAK,SAAS,QAAQ,IAAI,SAAS,IAAI,CAAC;AACxC,WAAK,SAAS,SAAS,GAAG,IAAI,QAAQ,IAAI,CAAC;AAC3C,WAAK,SAAS,SAAS,GAAG,IAAI,QAAQ,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AACF;;;AC7KO,IAAM,oBAAN,cAAgC,oBAAoB;AAAA,EACjD;AAAA,EAER,cAAc;AACZ,UAAM;AACN,SAAK,sBAAsB,IAAI,oBAAoB;AAAA,EACrD;AAAA,EAEA,uBAAuB,SAAoC;AACzD,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,yBAA8C;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAA4B;AACjC,WAAO,KAAK;AAAA,MACV,KAAK,oBAAoB,kBAAkB,QAAQ;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAA4B;AAC5C,UAAM,MAAM,KAAK,aAAa;AAC9B,UAAM,MAAgB,CAAC;AACvB,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAM,SAAS,OAAO,GAAG;AACzB,YAAM,WAAW,KAAK,YAAY,MAAM;AACxC,UAAI,aAAa,IAAI;AACnB,YAAI,KAAK,MAAM;AAAA,MACjB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,SAAoC;AAC1D,SAAK,sBAAsB;AAC3B,WAAO;AAAA,EACT;AACF;;;AChDO,IAAM,sBAAN,MAA0B;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,qBACA,iBACA,mBACA;AACA,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AAAA,EAC3B;AACF;;;ACRO,IAAM,mBAAN,MAAuB;AAAA;AAAA;AAAA;AAAA,EAI5B,aAAa,MACX,UACA,QACA,QACuB;AAEvB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpB,OAAO,gBAAgB,WAAW,IAAI;AAAA,MACtC,OAAO,gBAAgB,WAAW,GAAG;AAAA,MACrC,OAAO,gBAAgB,WAAW,MAAM;AAAA,MACxC,OAAO,gBAAgB,WAAW,MAAM;AAAA,MACxC,OAAO,gBAAgB,WAAW,EAAE;AAAA,MACpC,OAAO,gBAAgB,WAAW,GAAG;AAAA,MACrC,OAAO,gBAAgB,WAAW,MAAM;AAAA,MACxC,OAAO,gBAAgB,WAAW,MAAM;AAAA,MACxC,OAAO,gBAAgB,WAAW,OAAO;AAAA,MACzC,OAAO,gBAAgB,WAAW,SAAS;AAAA,MAC3C,OAAO,gBAAgB,WAAW,SAAS;AAAA,IAC7C,CAAC;AAGD,UAAM,YAAY,IAAI,WAAW,QAAQ;AAGzC,UAAM,UAAU,UAAU,SAAS;AACnC,UAAM,OAAO,UAAU,MAAM,GAAG,OAAO;AACvC,UAAM,QAAQ,UAAU,MAAM,OAAO;AACrC,UAAM,OAAO,YAAY,WAAW,MAAM,KAAK;AAG/C,UAAM,UAAU,IAAI,WAAW,MAAM;AACrC,UAAM,kBAAkB,gBAAgB,WAAW,OAAO;AAG1D,UAAM,sBAAsB,IAAI,oBAAoB;AACpD,wBAAoB,eAAe,IAAI,WAAW,OAAO,CAAC;AAC1D,wBAAoB,cAAc,IAAI,WAAW,UAAU,CAAC;AAC5D,wBAAoB,cAAc,IAAI,WAAW,UAAU,CAAC;AAG5D,UAAM,UAAU,oBAAoB;AAAA,MAClC,IAAI,WAAW,WAAW;AAAA,MAC1B,IAAI,YAAY,aAAa;AAAA,MAC7B,IAAI,WAAW,aAAa;AAAA,IAC9B;AAGA,UAAM,oBAAoB,IAAI,kBAAkB;AAChD,sBAAkB,eAAe,IAAI,WAAW,OAAO,CAAC;AACxD,sBAAkB,cAAc,IAAI,WAAW,UAAU,CAAC;AAC1D,sBAAkB,cAAc,IAAI,WAAW,UAAU,CAAC;AAC1D,sBAAkB,wBAAwB,OAAO;AAGjD,UAAM,YAAY,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,UAAa,WAAW,MAAM;AAAA,EAC3C;AACF;;;ACzFO,IAAM,sBAAN,MAAmE;AAAA,EAC/D,OAAe;AAAA,EAExB,WACE,MACA,UACa;AACb,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK,MAAM,CAAC,KAAK;AAAA,MACjB,YAAY,MAAM,CAAC,KAAK;AAAA,MACxB,YAAY,MAAM,CAAC,KAAK;AAAA,MACxB,YAAY,MAAM,CAAC,KAAK;AAAA,MACxB,iBAAiB,MAAM,CAAC,KAAK;AAAA,MAC7B,iBAAiB,MAAM,CAAC,KAAK;AAAA,MAC7B,UAAU,MAAM,CAAC,KAAK;AAAA,MACtB,SAAS,MAAM,CAAC,KAAK;AAAA,MACrB,eAAe,MAAM,CAAC,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AACF;;;AC1BO,IAAM,sBAAN,MAAmE;AAAA,EAC/D,OAAO;AAAA,EAEhB,WACE,MACA,UACa;AACb,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,OAAO,MAAM,CAAC,KAAK;AAAA,MACnB,OAAO,MAAM,CAAC,KAAK;AAAA,MACnB,OAAO,MAAM,CAAC,KAAK;AAAA,MACnB,OAAO,MAAM,CAAC,KAAK;AAAA,MACnB,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,UAAU,MAAM,CAAC,KAAK;AAAA,MACtB,MAAM,MAAM,EAAE,KAAK;AAAA,MACnB,UAAU,MAAM,EAAE,KAAK;AAAA,MACvB,OAAO,MAAM,EAAE,KAAK;AAAA,MACpB,OAAO,MAAM,EAAE,KAAK;AAAA,MACpB,OAAO,MAAM,EAAE,KAAK;AAAA,MACpB,OAAO,MAAM,EAAE,KAAK;AAAA,MACpB,OAAO,MAAM,EAAE,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AACF;;;AChCO,IAAM,uBAAN,cAAmC,oBAAoB;AAAA,EAC1C,OAAe;AACnC;;;ACwBA;AACA;;;AC/BO,IAAM,uBAAN,MAA2B;AAAA,EACf;AAAA,EACR;AAAA,EAET,YAAY,KAAa;AACvB,SAAK,aAAa,CAAC;AACnB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,UAAI,QAAQ,SAAU,QAAQ,SAAU,IAAI,IAAI,IAAI,QAAQ;AAC1D,cAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAChC,YAAI,OAAO,SAAU,OAAO,OAAQ;AAClC,eAAK,WAAW;AAAA,aACb,OAAO,SAAU,QAAS,MAAM,SAAU;AAAA,UAC7C;AACA;AACA;AAAA,QACF;AAAA,MACF;AACA,WAAK,WAAW,KAAK,IAAI;AAAA,IAC3B;AACA,SAAK,SAAS,KAAK,WAAW;AAAA,EAChC;AAAA,EAEA,OAAO,OAAuB;AAC5B,QAAI,QAAQ,KAAK,SAAS,KAAK,OAAQ,QAAO;AAC9C,WAAO,OAAO,cAAc,KAAK,WAAW,KAAK,CAAC;AAAA,EACpD;AAAA,EAEA,WAAW,OAAuB;AAChC,QAAI,QAAQ,KAAK,SAAS,KAAK,OAAQ,QAAO;AAC9C,WAAO,KAAK,WAAW,KAAK;AAAA,EAC9B;AAAA,EAEA,UAAU,OAAe,KAAsB;AAC7C,UAAM,IAAI,OAAO,KAAK;AACtB,WAAO,KAAK,WACT,MAAM,OAAO,CAAC,EACd,IAAI,CAAC,OAAO,OAAO,cAAc,EAAE,CAAC,EACpC,KAAK,EAAE;AAAA,EACZ;AAAA,EAEA,MAAM,OAAe,KAAsB;AACzC,WAAO,KAAK,UAAU,OAAO,GAAG;AAAA,EAClC;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK,WAAW,IAAI,CAAC,OAAO,OAAO,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,EACtE;AACF;;;ADsBA,eAAsB,gBACpB,SAC+B;AAC/B,QAAM,EAAE,mBAAAC,mBAAkB,IAAI,MAAM;AACpC,QAAM,SAAS,MAAMA,mBAAkB,QAAQ,OAAO;AAEtD,QAAM,SAAS,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,iBAAiB,MAAM,SAAS,QAAQ,IAAI,oBAAoB,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,iBAAiB,MAAM,SAAS,QAAQ,IAAI,oBAAoB,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,iBAAiB,MAAM,SAAS,QAAQ,IAAI,qBAAqB,CAAC;AAAA,IAC3E;AACE,YAAM,IAAI,MAAM,8BAA8B,MAAM,EAAE;AAAA,EAC1D;AACF;","names":["NodeLoader","BrowserLoader","termPos","createLoaderAsync"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/compile.ts","../src/trie/DoubleArrayBuilder.ts","../src/util/ByteBuffer.ts","../src/dict/ConnectionCosts.ts","../src/dict/CharacterDefinition.ts","../src/util/encoding.ts"],"sourcesContent":["/**\n * Dictionary compilation command.\n * Compiles MeCab source files (CSV, matrix.def, char.def, unk.def) into binary .dat.gz files.\n */\n\nimport { readFile, readdir, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { gzipSync } from \"node:zlib\";\nimport { DoubleArrayBuilder } from \"../../trie/DoubleArrayBuilder.js\";\nimport { ByteBuffer } from \"../../util/ByteBuffer.js\";\nimport { ConnectionCosts } from \"../../dict/ConnectionCosts.js\";\nimport { CharacterDefinition } from \"../../dict/CharacterDefinition.js\";\nimport { decodeAutoDetect } from \"../../util/encoding.js\";\n\nexport async function compile(args: string[]): Promise<void> {\n const sourceDir = args[0];\n const outputDir = args[1];\n // const formatFlag = args.indexOf(\"--format\");\n // const format = formatFlag >= 0 ? args[formatFlag + 1] : \"ipadic\";\n\n if (!sourceDir || !outputDir) {\n console.error(\"Usage: tokana build <source-dir> <output-dir> [--format ipadic|unidic|neologd]\");\n process.exit(1);\n }\n\n console.log(`Compiling dictionary from ${sourceDir} to ${outputDir}`);\n\n await mkdir(outputDir, { recursive: true });\n\n // Step 1: Parse matrix.def → connection costs\n console.log(\" Parsing matrix.def...\");\n const ccBuffer = await parseMatrixDef(join(sourceDir, \"matrix.def\"));\n await writeGzipped(join(outputDir, \"cc.dat.gz\"), ccBuffer);\n\n // Step 2: Parse char.def → character definitions\n console.log(\" Parsing char.def...\");\n const { categoryMap, compatMap, invokeBuf, charDef } = await parseCharDef(\n join(sourceDir, \"char.def\")\n );\n await writeGzipped(join(outputDir, \"unk_char.dat.gz\"), categoryMap);\n await writeGzipped(\n join(outputDir, \"unk_compat.dat.gz\"),\n new Uint8Array(compatMap.buffer)\n );\n await writeGzipped(join(outputDir, \"unk_invoke.dat.gz\"), invokeBuf);\n\n // Step 3: Parse CSV dictionary files → trie + token info\n console.log(\" Parsing CSV dictionary files...\");\n const csvFiles = (await readdir(sourceDir)).filter((f) => f.endsWith(\".csv\"));\n\n interface DictEntry {\n surface: string;\n leftId: number;\n rightId: number;\n cost: number;\n features: string;\n }\n\n const entries: DictEntry[] = [];\n for (const csvFile of csvFiles) {\n const raw = await readFile(join(sourceDir, csvFile));\n const text = decodeAutoDetect(new Uint8Array(raw));\n for (const line of text.split(\"\\n\")) {\n if (line.trim() === \"\") continue;\n // MeCab CSV format: surface,leftId,rightId,cost,features...\n const parts = parseCsvLine(line);\n if (parts.length < 5) continue;\n entries.push({\n surface: parts[0],\n leftId: parseInt(parts[1], 10),\n rightId: parseInt(parts[2], 10),\n cost: parseInt(parts[3], 10),\n features: parts.slice(4).join(\",\"),\n });\n }\n }\n\n // Sort entries by surface for trie construction\n entries.sort((a, b) => (a.surface < b.surface ? -1 : a.surface > b.surface ? 1 : 0));\n\n // Build trie and token info dictionary\n console.log(` Building trie from ${entries.length} entries...`);\n\n // Group entries by surface to handle duplicates\n const surfaceGroups = new Map<string, DictEntry[]>();\n for (const entry of entries) {\n const group = surfaceGroups.get(entry.surface);\n if (group) {\n group.push(entry);\n } else {\n surfaceGroups.set(entry.surface, [entry]);\n }\n }\n\n // Build token info dictionary buffer\n const tidBuffer = new ByteBuffer(entries.length * 64);\n const tidMapEntries: number[] = []; // wordId → position in tidBuffer\n let wordId = 0;\n\n const trieKeys: { key: number[]; value: number }[] = [];\n\n for (const [surface, group] of surfaceGroups) {\n const firstWordId = wordId;\n for (const entry of group) {\n const pos = tidBuffer.getPosition();\n tidMapEntries.push(pos);\n\n tidBuffer.putInt16(entry.leftId);\n tidBuffer.putInt16(entry.rightId);\n tidBuffer.putInt16(entry.cost);\n tidBuffer.putInt16(entry.features.length);\n tidBuffer.putString(entry.features);\n\n wordId++;\n }\n\n // Trie maps surface → first word ID for this surface\n trieKeys.push({\n key: Array.from(surface).map((ch) => ch.charCodeAt(0)),\n value: firstWordId,\n });\n }\n\n // Sort trie keys lexicographically\n trieKeys.sort((a, b) => {\n const len = Math.min(a.key.length, b.key.length);\n for (let i = 0; i < len; i++) {\n if (a.key[i] !== b.key[i]) return a.key[i] - b.key[i];\n }\n return a.key.length - b.key.length;\n });\n\n const { base, check } = DoubleArrayBuilder.build(trieKeys);\n\n // Save trie (base + check concatenated)\n const trieBuffer = new Int32Array(base.length + check.length);\n trieBuffer.set(base, 0);\n trieBuffer.set(check, base.length);\n await writeGzipped(\n join(outputDir, \"base.dat.gz\"),\n new Uint8Array(trieBuffer.buffer)\n );\n\n // Save token info dictionary\n await writeGzipped(join(outputDir, \"tid.dat.gz\"), tidBuffer.shrink());\n\n // Save token info position data (empty for now, features stored inline)\n await writeGzipped(join(outputDir, \"tid_pos.dat.gz\"), new Uint8Array(0));\n\n // Save target map\n const mapBuf = new ByteBuffer(4 + tidMapEntries.length * 4);\n mapBuf.putInt32(tidMapEntries.length);\n for (const pos of tidMapEntries) {\n mapBuf.putInt32(pos);\n }\n await writeGzipped(join(outputDir, \"tid_map.dat.gz\"), mapBuf.shrink());\n\n // Step 4: Parse unk.def → unknown word dictionary\n console.log(\" Parsing unk.def...\");\n const { unkBuf, unkPosBuf, unkMapBuf } = await parseUnkDef(\n join(sourceDir, \"unk.def\"),\n charDef\n );\n await writeGzipped(join(outputDir, \"unk.dat.gz\"), unkBuf);\n await writeGzipped(join(outputDir, \"unk_pos.dat.gz\"), unkPosBuf);\n await writeGzipped(join(outputDir, \"unk_map.dat.gz\"), unkMapBuf);\n\n console.log(\" Done!\");\n}\n\nfunction parseCsvLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') {\n if (inQuotes && i + 1 < line.length && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (ch === \",\" && !inQuotes) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n}\n\nasync function parseMatrixDef(path: string): Promise<Uint8Array> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n // First line: forward_size backward_size\n const [forwardStr, backwardStr] = lines[0].split(/\\s+/);\n const forwardSize = parseInt(forwardStr, 10);\n const backwardSize = parseInt(backwardStr, 10);\n\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n\n for (let i = 1; i < lines.length; i++) {\n const parts = lines[i].trim().split(/\\s+/);\n if (parts.length < 3) continue;\n const fwd = parseInt(parts[0], 10);\n const bwd = parseInt(parts[1], 10);\n const cost = parseInt(parts[2], 10);\n cc.put(fwd, bwd, cost);\n }\n\n const buf = cc.toBuffer();\n return new Uint8Array(buf.buffer);\n}\n\nasync function parseCharDef(\n path: string\n): Promise<{\n categoryMap: Uint8Array;\n compatMap: Uint32Array;\n invokeBuf: Uint8Array;\n charDef: CharacterDefinition;\n}> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n const charDef = new CharacterDefinition();\n\n // First pass: register character classes\n const classNames = new Map<string, number>();\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n\n // Character class definition: CLASSNAME invoke group length\n const match = trimmed.match(\n /^([A-Z_]+)\\s+(0|1)\\s+(0|1)\\s+(\\d+)/\n );\n if (match && !trimmed.startsWith(\"0x\")) {\n const name = match[1];\n if (!classNames.has(name)) {\n const id = charDef.addCharacterClass({\n name,\n invoke: match[2] === \"1\",\n group: match[3] === \"1\",\n length: parseInt(match[4], 10),\n });\n classNames.set(name, id);\n }\n }\n }\n\n // Second pass: character range mappings\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n\n // Range mapping: 0xHHHH [..0xHHHH] CLASSNAME [COMPAT_CLASSES...]\n const match = trimmed.match(\n /^(0x[0-9A-Fa-f]+)(?:\\.\\.(0x[0-9A-Fa-f]+))?\\s+(\\S+)(?:\\s+(.*))?$/\n );\n if (match) {\n const start = parseInt(match[1], 16);\n const end = match[2] ? parseInt(match[2], 16) : start;\n const className = match[3];\n const classId = classNames.get(className);\n if (classId === undefined) continue;\n\n const compatStr = match[4]?.trim() ?? \"\";\n const compatClasses = compatStr\n ? compatStr\n .split(/\\s+/)\n .map((name) => classNames.get(name))\n .filter((id): id is number => id !== undefined)\n : [];\n\n charDef.setCharacterCategory(start, end, classId, [\n classId,\n ...compatClasses,\n ]);\n }\n }\n\n return {\n categoryMap: charDef.getCategoryMap(),\n compatMap: charDef.getCompatibleCategoryMap(),\n invokeBuf: charDef.toInvokeBuffer(),\n charDef,\n };\n}\n\nasync function parseUnkDef(\n path: string,\n _charDef: CharacterDefinition\n): Promise<{ unkBuf: Uint8Array; unkPosBuf: Uint8Array; unkMapBuf: Uint8Array }> {\n const raw = await readFile(path);\n const text = decodeAutoDetect(new Uint8Array(raw));\n const lines = text.trim().split(\"\\n\");\n\n const unkBuffer = new ByteBuffer(1024 * 64);\n const unkMapEntries: number[] = [];\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.startsWith(\"#\")) continue;\n const parts = parseCsvLine(line);\n if (parts.length < 5) continue;\n\n // Format: className,leftId,rightId,cost,features...\n // parts[0] is className\n const leftId = parseInt(parts[1], 10);\n const rightId = parseInt(parts[2], 10);\n const cost = parseInt(parts[3], 10);\n const features = parts.slice(4).join(\",\");\n\n const pos = unkBuffer.getPosition();\n unkMapEntries.push(pos);\n\n unkBuffer.putInt16(leftId);\n unkBuffer.putInt16(rightId);\n unkBuffer.putInt16(cost);\n unkBuffer.putInt16(features.length);\n unkBuffer.putString(features);\n }\n\n // Build map buffer\n const mapBuf = new ByteBuffer(4 + unkMapEntries.length * 4);\n mapBuf.putInt32(unkMapEntries.length);\n for (const pos of unkMapEntries) {\n mapBuf.putInt32(pos);\n }\n\n return {\n unkBuf: unkBuffer.shrink(),\n unkPosBuf: new Uint8Array(0),\n unkMapBuf: mapBuf.shrink(),\n };\n}\n\nasync function writeGzipped(path: string, data: Uint8Array): Promise<void> {\n const compressed = gzipSync(data);\n await writeFile(path, compressed);\n}\n","/**\n * Builds a double array trie from a set of sorted keys.\n *\n * The double array structure uses two parallel arrays (base and check)\n * to represent a trie compactly. This is the standard Aoe algorithm.\n */\n\nexport interface DoubleArrayBuildResult {\n base: Int32Array;\n check: Int32Array;\n}\n\ninterface TrieNode {\n code: number;\n children: TrieNode[];\n isTerminal: boolean;\n value: number;\n}\n\nconst ROOT_CODE = 0;\nconst LEAF_CODE = -1;\nconst BASE_INITIAL = 1;\nconst CHECK_EMPTY = 0;\n\nexport class DoubleArrayBuilder {\n /**\n * Build a double array from sorted key-value pairs.\n * Keys must be sorted in lexicographic order.\n * Each key is an array of character codes (unsigned integers > 0).\n */\n static build(keys: { key: number[]; value: number }[]): DoubleArrayBuildResult {\n const builder = new DoubleArrayBuilder();\n return builder.buildFromKeys(keys);\n }\n\n private base: Int32Array;\n private check: Int32Array;\n private nextCheckPos: number;\n\n constructor() {\n this.base = new Int32Array(0);\n this.check = new Int32Array(0);\n this.nextCheckPos = 0;\n }\n\n private buildFromKeys(\n keys: { key: number[]; value: number }[]\n ): DoubleArrayBuildResult {\n if (keys.length === 0) {\n return { base: new Int32Array(1), check: new Int32Array(1) };\n }\n\n // Build intermediate trie\n const root = this.buildTrie(keys);\n\n // Initial allocation\n const initialSize = Math.max(keys.length * 4, 1024);\n this.base = new Int32Array(initialSize);\n this.check = new Int32Array(initialSize);\n this.nextCheckPos = 0;\n\n // Root node at position 0\n this.base[0] = BASE_INITIAL;\n\n // Recursively insert children\n const children = root.children;\n if (children.length > 0) {\n this.insert(children, 0);\n }\n\n // Trim to used size\n let usedSize = 0;\n for (let i = this.base.length - 1; i >= 0; i--) {\n if (this.base[i] !== 0 || this.check[i] !== 0) {\n usedSize = i + 1;\n break;\n }\n }\n usedSize = Math.max(usedSize, 1);\n\n return {\n base: this.base.slice(0, usedSize),\n check: this.check.slice(0, usedSize),\n };\n }\n\n private buildTrie(keys: { key: number[]; value: number }[]): TrieNode {\n const root: TrieNode = {\n code: ROOT_CODE,\n children: [],\n isTerminal: false,\n value: -1,\n };\n\n for (const { key, value } of keys) {\n let node = root;\n for (const code of key) {\n let child = node.children.find((c) => c.code === code);\n if (!child) {\n child = {\n code,\n children: [],\n isTerminal: false,\n value: -1,\n };\n node.children.push(child);\n }\n node = child;\n }\n // Add terminal marker\n const terminal: TrieNode = {\n code: LEAF_CODE,\n children: [],\n isTerminal: true,\n value,\n };\n // Insert terminal at beginning of children\n node.children.unshift(terminal);\n }\n\n return root;\n }\n\n private ensureSize(size: number): void {\n if (size <= this.base.length) return;\n let newSize = this.base.length;\n while (newSize < size) {\n newSize = Math.max(newSize * 2, 1024);\n }\n const newBase = new Int32Array(newSize);\n const newCheck = new Int32Array(newSize);\n newBase.set(this.base);\n newCheck.set(this.check);\n this.base = newBase;\n this.check = newCheck;\n }\n\n private insert(siblings: TrieNode[], parentIdx: number): void {\n // Find codes for siblings. Terminal nodes use code 0.\n const codes = siblings.map((s) => (s.code === LEAF_CODE ? 0 : s.code));\n\n // Find a base value where all children fit\n let begin = Math.max(codes[0] + 1, this.nextCheckPos) - codes[0];\n let nonZeroCount = 0;\n let isFirst = true;\n\n outer: while (true) {\n begin++;\n this.ensureSize(begin + codes[codes.length - 1] + 1);\n\n if (this.check[begin + codes[0]] !== CHECK_EMPTY) {\n nonZeroCount++;\n continue;\n }\n if (isFirst) {\n this.nextCheckPos = begin + codes[0];\n isFirst = false;\n }\n\n for (let i = 1; i < codes.length; i++) {\n if (this.check[begin + codes[i]] !== CHECK_EMPTY) {\n continue outer;\n }\n }\n break;\n }\n\n // Advance nextCheckPos heuristic\n if (nonZeroCount / (begin - this.nextCheckPos + 1) >= 0.95) {\n this.nextCheckPos = begin + codes[0];\n }\n\n this.base[parentIdx] = begin;\n\n // First pass: set check values for all siblings\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n this.ensureSize(pos + 1);\n this.check[pos] = parentIdx + 1; // check stores parent+1 (0 means empty)\n }\n\n // Second pass: set base values and recurse\n for (let i = 0; i < siblings.length; i++) {\n const pos = begin + codes[i];\n\n if (siblings[i].isTerminal) {\n // Terminal: store negative value - 1 in base\n this.base[pos] = -siblings[i].value - 1;\n } else if (siblings[i].children.length > 0) {\n this.insert(siblings[i].children, pos);\n }\n }\n }\n}\n","/**\n * Growable byte buffer for binary data manipulation.\n * Used for reading/writing dictionary binary data.\n */\nexport class ByteBuffer {\n private buffer: ArrayBuffer;\n private view: DataView;\n private position: number;\n\n constructor(arg?: number | Uint8Array) {\n if (arg instanceof Uint8Array) {\n const src = arg.buffer instanceof SharedArrayBuffer\n ? new ArrayBuffer(arg.byteLength)\n : arg.buffer.slice(arg.byteOffset, arg.byteOffset + arg.byteLength);\n if (arg.buffer instanceof SharedArrayBuffer) {\n new Uint8Array(src).set(arg);\n }\n this.buffer = src;\n this.view = new DataView(this.buffer);\n this.position = 0;\n } else {\n const size = arg ?? 1024;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.position = 0;\n }\n }\n\n private ensureCapacity(additional: number): void {\n const required = this.position + additional;\n if (required <= this.buffer.byteLength) return;\n\n let newSize = this.buffer.byteLength;\n while (newSize < required) {\n newSize *= 2;\n }\n const newBuffer = new ArrayBuffer(newSize);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.view = new DataView(this.buffer);\n }\n\n size(): number {\n return this.position;\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(pos: number): void {\n this.position = pos;\n }\n\n getInt8(pos: number): number {\n return this.view.getInt8(pos);\n }\n\n getInt16(pos: number): number {\n return this.view.getInt16(pos, true);\n }\n\n getInt32(pos: number): number {\n return this.view.getInt32(pos, true);\n }\n\n getUint8(pos: number): number {\n return this.view.getUint8(pos);\n }\n\n getUint16(pos: number): number {\n return this.view.getUint16(pos, true);\n }\n\n getUint32(pos: number): number {\n return this.view.getUint32(pos, true);\n }\n\n putInt8(value: number): void {\n this.ensureCapacity(1);\n this.view.setInt8(this.position, value);\n this.position += 1;\n }\n\n putInt16(value: number): void {\n this.ensureCapacity(2);\n this.view.setInt16(this.position, value, true);\n this.position += 2;\n }\n\n putInt32(value: number): void {\n this.ensureCapacity(4);\n this.view.setInt32(this.position, value, true);\n this.position += 4;\n }\n\n putUint8(value: number): void {\n this.ensureCapacity(1);\n this.view.setUint8(this.position, value);\n this.position += 1;\n }\n\n putUint16(value: number): void {\n this.ensureCapacity(2);\n this.view.setUint16(this.position, value, true);\n this.position += 2;\n }\n\n putUint32(value: number): void {\n this.ensureCapacity(4);\n this.view.setUint32(this.position, value, true);\n this.position += 4;\n }\n\n readInt8(): number {\n const value = this.view.getInt8(this.position);\n this.position += 1;\n return value;\n }\n\n readInt16(): number {\n const value = this.view.getInt16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readInt32(): number {\n const value = this.view.getInt32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readUint8(): number {\n const value = this.view.getUint8(this.position);\n this.position += 1;\n return value;\n }\n\n readUint16(): number {\n const value = this.view.getUint16(this.position, true);\n this.position += 2;\n return value;\n }\n\n readUint32(): number {\n const value = this.view.getUint32(this.position, true);\n this.position += 4;\n return value;\n }\n\n readString(length: number): string {\n const bytes = new Uint8Array(this.buffer, this.position, length * 2);\n this.position += length * 2;\n const chars: string[] = [];\n for (let i = 0; i < length; i++) {\n chars.push(\n String.fromCharCode(bytes[i * 2] | (bytes[i * 2 + 1] << 8))\n );\n }\n return chars.join(\"\");\n }\n\n putString(str: string): void {\n this.ensureCapacity(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n this.view.setUint8(this.position++, code & 0xff);\n this.view.setUint8(this.position++, (code >> 8) & 0xff);\n }\n }\n\n shrink(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.position);\n }\n\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n getDataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Connection cost matrix.\n * Stores the cost of transitioning from one morpheme to the next.\n * Matrix is indexed by [right_id][left_id].\n */\nexport class ConnectionCosts {\n private readonly forwardSize: number;\n private readonly backwardSize: number;\n private readonly costs: Int16Array;\n\n constructor(forwardSize: number, backwardSize: number) {\n this.forwardSize = forwardSize;\n this.backwardSize = backwardSize;\n this.costs = new Int16Array(forwardSize * backwardSize);\n }\n\n put(forwardId: number, backwardId: number, cost: number): void {\n this.costs[forwardId * this.backwardSize + backwardId] = cost;\n }\n\n get(forwardId: number, backwardId: number): number {\n return this.costs[forwardId * this.backwardSize + backwardId];\n }\n\n getForwardSize(): number {\n return this.forwardSize;\n }\n\n getBackwardSize(): number {\n return this.backwardSize;\n }\n\n /**\n * Load from a raw Int16Array buffer.\n * Format: [forwardSize (as int16), backwardSize (as int16), ...costs]\n */\n static fromBuffer(buffer: Int16Array): ConnectionCosts {\n const forwardSize = buffer[0];\n const backwardSize = buffer[1];\n const cc = new ConnectionCosts(forwardSize, backwardSize);\n cc.costs.set(buffer.subarray(2, 2 + forwardSize * backwardSize));\n return cc;\n }\n\n /**\n * Serialize to Int16Array buffer.\n */\n toBuffer(): Int16Array {\n const buffer = new Int16Array(2 + this.forwardSize * this.backwardSize);\n buffer[0] = this.forwardSize;\n buffer[1] = this.backwardSize;\n buffer.set(this.costs, 2);\n return buffer;\n }\n}\n","/**\n * Character type definition for unknown word processing.\n * Maps Unicode characters to character classes used in MeCab's char.def.\n */\n\nimport type { CharacterClass } from \"../types/dictionary.js\";\n\nconst DEFAULT_CATEGORY = 0;\n\nexport const CHARACTER_CATEGORY_NAMES = [\n \"DEFAULT\",\n \"SPACE\",\n \"KANJI\",\n \"SYMBOL\",\n \"NUMERIC\",\n \"ALPHA\",\n \"HIRAGANA\",\n \"KATAKANA\",\n \"KANJINUMERIC\",\n \"GREEK\",\n \"CYRILLIC\",\n] as const;\n\nexport type CharacterCategoryName =\n (typeof CHARACTER_CATEGORY_NAMES)[number];\n\nexport class CharacterDefinition {\n /** Character class definitions */\n private characterClasses: CharacterClass[];\n\n /** Mapping from character code to class index */\n private characterCategoryMap: Uint8Array;\n\n /** Mapping from character code to compatible class bitmask */\n private compatibleCategoryMap: Uint32Array;\n\n constructor() {\n this.characterClasses = [];\n // Support BMP only (0x0000 - 0xFFFF)\n this.characterCategoryMap = new Uint8Array(65536);\n this.compatibleCategoryMap = new Uint32Array(65536);\n }\n\n addCharacterClass(charClass: CharacterClass): number {\n const id = this.characterClasses.length;\n this.characterClasses.push(charClass);\n return id;\n }\n\n setCharacterCategory(\n start: number,\n end: number,\n classId: number,\n compatibleClasses: number[]\n ): void {\n for (let i = start; i <= end; i++) {\n this.characterCategoryMap[i] = classId;\n let compat = 0;\n for (const c of compatibleClasses) {\n compat |= 1 << c;\n }\n this.compatibleCategoryMap[i] = compat;\n }\n }\n\n /**\n * Lookup the character class for a given character code.\n */\n lookup(charCode: number): CharacterClass {\n const classId =\n charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n return this.characterClasses[classId] ?? this.characterClasses[0];\n }\n\n /**\n * Get the character class index for a character code.\n */\n getCharacterClass(charCode: number): number {\n return charCode < 65536 ? this.characterCategoryMap[charCode] : DEFAULT_CATEGORY;\n }\n\n /**\n * Check if two character codes are in compatible classes.\n */\n isCompatible(charCode1: number, charCode2: number): boolean {\n const class2 = this.getCharacterClass(charCode2);\n const compat = this.compatibleCategoryMap[charCode1] ?? 0;\n return (compat & (1 << class2)) !== 0;\n }\n\n /**\n * Get the invoke flag for a character class.\n */\n isInvoke(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.invoke : false;\n }\n\n /**\n * Get the group flag for a character class.\n */\n isGroup(charCode: number): boolean {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.group : false;\n }\n\n /**\n * Get the max length for a character class.\n */\n getMaxLength(charCode: number): number {\n const classId = this.getCharacterClass(charCode);\n const cls = this.characterClasses[classId];\n return cls ? cls.length : 0;\n }\n\n getCharacterClasses(): CharacterClass[] {\n return this.characterClasses;\n }\n\n getCategoryMap(): Uint8Array {\n return this.characterCategoryMap;\n }\n\n getCompatibleCategoryMap(): Uint32Array {\n return this.compatibleCategoryMap;\n }\n\n /**\n * Load from binary buffers.\n */\n static fromBuffers(\n categoryMap: Uint8Array,\n compatMap: Uint32Array,\n invokeDefBuf: Uint8Array\n ): CharacterDefinition {\n const def = new CharacterDefinition();\n def.characterCategoryMap = categoryMap;\n def.compatibleCategoryMap = compatMap;\n\n // invokeDefBuf: [count(4bytes), then for each class: invoke(1), group(1), length(4)]\n const view = new DataView(\n invokeDefBuf.buffer,\n invokeDefBuf.byteOffset,\n invokeDefBuf.byteLength\n );\n const count = view.getInt32(0, true);\n for (let i = 0; i < count; i++) {\n const offset = 4 + i * 6;\n const invoke = view.getUint8(offset) === 1;\n const group = view.getUint8(offset + 1) === 1;\n const length = view.getInt32(offset + 2, true);\n def.characterClasses.push({\n name: CHARACTER_CATEGORY_NAMES[i] ?? `CLASS_${i}`,\n invoke,\n group,\n length,\n });\n }\n\n return def;\n }\n\n /**\n * Serialize invoke definitions to buffer.\n */\n toInvokeBuffer(): Uint8Array {\n const count = this.characterClasses.length;\n const buf = new Uint8Array(4 + count * 6);\n const view = new DataView(buf.buffer);\n view.setInt32(0, count, true);\n for (let i = 0; i < count; i++) {\n const cls = this.characterClasses[i];\n const offset = 4 + i * 6;\n view.setUint8(offset, cls.invoke ? 1 : 0);\n view.setUint8(offset + 1, cls.group ? 1 : 0);\n view.setInt32(offset + 2, cls.length, true);\n }\n return buf;\n }\n}\n","/**\n * Encoding utilities for dictionary compilation.\n * Handles EUC-JP to UTF-8 conversion for MeCab dictionary sources.\n */\n\n/**\n * Decode EUC-JP encoded bytes to a UTF-8 string.\n * Uses the TextDecoder API available in both Node.js and browsers.\n */\nexport function decodeEucJp(data: Uint8Array): string {\n const decoder = new TextDecoder(\"euc-jp\");\n return decoder.decode(data);\n}\n\n/**\n * Detect if data is likely EUC-JP encoded.\n */\nexport function isEucJp(data: Uint8Array): boolean {\n // Check for EUC-JP high-byte patterns\n for (let i = 0; i < Math.min(data.length, 1000); i++) {\n const b = data[i];\n if (b >= 0xa1 && b <= 0xfe) {\n // Likely EUC-JP double-byte character\n if (i + 1 < data.length) {\n const b2 = data[i + 1];\n if (b2 >= 0xa1 && b2 <= 0xfe) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Decode data with automatic encoding detection (UTF-8 or EUC-JP).\n */\nexport function decodeAutoDetect(data: Uint8Array): string {\n // Try UTF-8 first\n try {\n const utf8 = new TextDecoder(\"utf-8\", { fatal: true });\n return utf8.decode(data);\n } catch {\n // Fall back to EUC-JP\n return decodeEucJp(data);\n }\n}\n"],"mappings":"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","names":[]}
|