From da8150a674701a6b4440d382eeb898ae25c185af Mon Sep 17 00:00:00 2001 From: lazyloong <2950449004@qq.com> Date: Thu, 30 Nov 2023 21:32:40 +0800 Subject: [PATCH] feat: api --- manifest.json | 2 +- src/fuzzyCommandModal.ts | 15 ++++++--------- src/fuzzyFolderModal.ts | 2 +- src/main.ts | 9 +++++++-- src/search.ts | 41 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 src/search.ts diff --git a/manifest.json b/manifest.json index 7a3efe6..c28126d 100644 --- a/manifest.json +++ b/manifest.json @@ -5,5 +5,5 @@ "author": "lazyloong", "minAppVersion": "1.0.0", - "version": "2.8.2" + "version": "2.9.1" } diff --git a/src/fuzzyCommandModal.ts b/src/fuzzyCommandModal.ts index 31eacc6..b6aba56 100644 --- a/src/fuzzyCommandModal.ts +++ b/src/fuzzyCommandModal.ts @@ -5,7 +5,7 @@ import FuzzyChinesePinyinPlugin from "./main"; type Item = { name: string; - pinyin: Pinyin; + pinyin: Pinyin; command: any; }; @@ -126,14 +126,11 @@ class PinyinIndex extends PI { initEvent() {} initIndex() { let commands = app.commands.listCommands(); - this.items = commands.map((command) => { - let item = { - name: command.name, - pinyin: new Pinyin(command.name, this.plugin), - command: command, - }; - return item; - }); + this.items = commands.map((command) => ({ + name: command.name, + pinyin: new Pinyin(command.name, this.plugin), + command: command, + })); } update() { let commands = app.commands.listCommands(); diff --git a/src/fuzzyFolderModal.ts b/src/fuzzyFolderModal.ts index e3fd3db..81a0e65 100644 --- a/src/fuzzyFolderModal.ts +++ b/src/fuzzyFolderModal.ts @@ -75,7 +75,7 @@ class PinyinIndex extends PI { } initIndex() { let root = app.vault.getRoot(); - let iterate = (node: TFolder, nodePinyin: Pinyin) => { + let iterate = (node: TFolder, nodePinyin: Pinyin) => { let children = node.children; for (let child of children) { if (child instanceof TFolder) { diff --git a/src/main.ts b/src/main.ts index f1a7f39..3c9cf0a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,5 @@ import { App, Notice, Plugin, PluginSettingTab, Setting, EditorSuggest } from "obsidian"; -import { Pinyin, PinyinIndex, runOnLayoutReady } from "./utils"; +import { Item, PinyinIndex, runOnLayoutReady } from "./utils"; import FuzzyModal from "./fuzzyModal"; import FuzzyFileModal from "./fuzzyFileModal"; import FuzzyFolderModal from "./fuzzyFolderModal"; @@ -12,6 +12,7 @@ import SimplifiedDict from "./simplified_dict"; import TraditionalDict from "./traditional_dict"; import DoublePinyinDict from "./double_pinyin"; +import { fuzzyPinyinSearch, stringArray2Items } from "./search"; interface FuzyyChinesePinyinSettings { global: { @@ -181,7 +182,11 @@ export default class FuzzyChinesePinyinPlugin extends Plugin { return false; }); this.addSettingTab(new SettingTab(this.app, this)); - this.api = { suggester: this.suggester }; + this.api = { + suggester: this.suggester, + search: (query: string, items: string[] | Item[]) => fuzzyPinyinSearch(query, items, this), + stringArray2Items: stringArray2Items, + }; } onunload() { this.editorSuggests.forEach((editorSuggest) => this.app.workspace.editorSuggest.removeSuggest(editorSuggest)); diff --git a/src/search.ts b/src/search.ts new file mode 100644 index 0000000..67bb56e --- /dev/null +++ b/src/search.ts @@ -0,0 +1,41 @@ +import FuzzyChinesePinyinPlugin from "./main"; +import { Pinyin, Item, MatchData } from "./utils"; + +export function fuzzyPinyinSearch(query: string, items: string[] | Item[], plugin: FuzzyChinesePinyinPlugin): MatchData[] { + if (items.length == 0) return null; + if (isStringArray(items)) { + items = stringArray2Items(items, plugin); + } + return search(query, items); +} + +function isStringArray(arr: string[] | Item[]): arr is string[] { + return typeof arr[0] == "string"; +} + +function search(query: string, items: Item[]): MatchData[] { + if (query == "") { + return items.map((p) => ({ + item: p, + score: 0, + range: [[0, p.name.length - 1]], + })); + } + + let matchData: MatchData[] = []; + let smathCase = /[A-Z]/.test(query); + for (let p of items) { + let d = p.pinyin.match(query, p, smathCase); + if (d) matchData.push(d); + } + + matchData = matchData.sort((a, b) => b.score - a.score); + return matchData; +} + +export function stringArray2Items(items: string[], plugin: FuzzyChinesePinyinPlugin): Item[] { + return items.map((item) => ({ + name: item, + pinyin: new Pinyin(item, plugin), + })); +}