You've already forked bilibili-subtitle
66 lines
1.4 KiB
TypeScript
66 lines
1.4 KiB
TypeScript
import * as JsSearch from 'js-search'
|
|
import {uniq} from 'lodash-es'
|
|
import {getWords, getWordsPinyin} from './pinyin_util'
|
|
|
|
const tokenize = (maxLength: number, content: string, options?: SearchOptions) => {
|
|
const result: string[] = []
|
|
|
|
// 最大长度
|
|
if (content.length > maxLength) {
|
|
content = content.substring(0, maxLength)
|
|
}
|
|
result.push(...getWords(content))
|
|
// check cn
|
|
if (options?.cnSearchEnabled) {
|
|
result.push(...getWordsPinyin(content))
|
|
}
|
|
|
|
// console.debug('[Search] tokenize:', str, '=>', result)
|
|
|
|
return uniq(result)
|
|
}
|
|
|
|
export interface SearchOptions {
|
|
cnSearchEnabled?: boolean
|
|
}
|
|
|
|
export const Search = (uidFieldName: string, index: string, maxLength: number, options?: SearchOptions) => {
|
|
let searchRef: JsSearch.Search | undefined// 搜索器
|
|
|
|
/**
|
|
* 重置索引
|
|
*/
|
|
const reset = (documents?: Object[]) => {
|
|
// 搜索器
|
|
searchRef = new JsSearch.Search(uidFieldName)
|
|
searchRef.tokenizer = {
|
|
tokenize: (str) => {
|
|
return tokenize(maxLength, str, options)
|
|
}
|
|
}
|
|
searchRef.addIndex(index)
|
|
|
|
// 检测添加文档
|
|
if (documents != null) {
|
|
searchRef.addDocuments(documents)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 添加文档
|
|
*/
|
|
const add = (document: Object) => {
|
|
searchRef?.addDocument(document)
|
|
}
|
|
|
|
/**
|
|
* 搜索
|
|
* @return 未去重
|
|
*/
|
|
const search = (text: string) => {
|
|
return searchRef?.search(text.toLowerCase())
|
|
}
|
|
|
|
return {reset, add, search}
|
|
}
|