## 対応方法
[[chinese-tokenizer]]を使う。
```ts
const tokenize = require("chinese-tokenizer").loadFile("./cedict_ts.u8");
console.log(
JSON.stringify(tokenize("我认为 Obsidian 是编写文档的好工具。"), null, " ")
);
```
`cedict_ts.u8`は[[CC-CEDICT]]からダウンロード。
https://www.mdbg.net/chinese/dictionary?page=cc-cedict
Vaultのrootに配置する。
## [[chinese-tokenizer]]のインストール
```console
npm i chinese-tokenizer
```
## [[Obsidian]]で動作させる
型定義がないので、`require`しかできないがエラーになる。
```
app.js:1 Plugin failure: various-complements Error: Cannot find module 'chinese-tokenizer'
Require stack:
- electron/js2c/renderer_init
```
[[module (tsconfig)|module]]が`esnext`のため、`require`を認識しないから。
### 型定義を追加
`import`が使えるよう、`chinese-tokenizer.d.ts`を作成して型定義する。
```ts
declare module "chinese-tokenizer" {
export const loadFile: (path: string) => any;
export const load: (content: string) => any;
}
```
`loadFile`だと`cedict_ts.u8`のパスが解決しないので、`cedict_ts.u8`は[[Obsidian API]]で読み込み、その結果を`load`する。
```ts
import chineseTokenizer from "chinese-tokenizer";
const dict = await this.app.vault.adapter.read("./cedict_ts.u8");
const tokenize = chineseTokenizer.load(dict);
console.log(tokenize("我是中国人。"));
console.log(tokenize("我认为 Obsidian 是编写文档的好工具。"));
```
### モバイル対応
[[chinese-tokenizer]]が[[Node.js]]に依存しているため、[[Obsidian Mobile]]でインストールに失敗する。[[chinese-tokenizer]]をforkして`loadFile`関数を削除する。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/chinese-tokenizer: Tokenizes Chinese texts into words.</p>
</div>
<div class="link-card-description">
Tokenizes Chinese texts into words. Contribute to tadashi-aikawa/chinese-tokenizer development by cr...
</div>
</div>
<img src="https://opengraph.githubassets.com/293b95fe83ccbb65b8d6c904b9aa6a88d3e13d425df24b568595876e0a4f94f5/tadashi-aikawa/chinese-tokenizer" class="link-card-image" />
</div>
<a href="https://github.com/tadashi-aikawa/chinese-tokenizer"></a>
</div>
[[Prettier]]のフォーマットがかかっているため差分が大量に出ているが、他の変更はない。
`chinese-tokenizer.d.ts`の型定義も変更。
```ts
declare module "chinese-tokenizer" {
export interface TokenizedResult {
text: string;
traditional: string;
simplified: string;
position: {
offset: number;
line: number;
column: number;
};
matches: unknown[];
}
export const load: (
content: string
) => (content: string) => TokenizedResult[];
}
```
あとは[[Obsidian API]]を使って辞書データを読み込み、それを使う。
```ts
import chineseTokenizer from "chinese-tokenizer";
// Vault rootにcedict_ts.u8がある前提
const dict = await this.app.vault.adapter.read("./cedict_ts.u8");
const tokenize = chineseTokenizer.load(dict);
tokenize("我认为 Obsidian 是编写文档的好工具。")
```
## 動作確認
```txt
談到貿易戰的長遠影響,林行止表示貿易戰促使在中國的工廠搬遷到越南、寮國、印度、台灣甚至是馬來西亞,以避開關稅。當工廠搬遷完成後,關稅導致進口貨加價的浪潮很快就過去,由於上述地方的生產成本比中國低,屆時貨物零售價可能會比在內地生產便宜。
```