From 36ccb52982fd55d74850a3f4851f7a94409fcf6b Mon Sep 17 00:00:00 2001 From: Simon Cambier Date: Thu, 2 Mar 2023 21:32:37 +0100 Subject: [PATCH] #176 - Option to index CamelCaseWords --- src/search/omnisearch.ts | 6 +++++- src/settings.ts | 21 +++++++++++++++++++++ src/tools/utils.ts | 13 ++++++++----- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/search/omnisearch.ts b/src/search/omnisearch.ts index 902607d..f621fbf 100644 --- a/src/search/omnisearch.ts +++ b/src/search/omnisearch.ts @@ -26,7 +26,11 @@ const tokenize = (text: string): string[] => { return tokens.flatMap(word => chsRegex.test(word) ? chsSegmenter.cut(word) : [word] ) - } else return tokens.flatMap(splitCamelCase) + } else { + if (settings.splitCamelCase) + return [...tokens, ...tokens.flatMap(splitCamelCase)] + return tokens + } } export class Omnisearch { diff --git a/src/settings.ts b/src/settings.ts index b0a7e58..5a6ca90 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -46,6 +46,7 @@ export interface OmnisearchSettings extends WeightingSettings { /** If a query returns 0 result, try again with more relax conditions */ simpleSearch: boolean highlight: boolean + splitCamelCase: boolean } /** @@ -204,6 +205,25 @@ export class SettingsTab extends PluginSettingTab { }) ) + // Split CamelCaseWords + const camelCaseDesc = new DocumentFragment() + camelCaseDesc.createSpan({}, span => { + span.innerHTML = `Enable this if you want to be able to search for CamelCaseWords as separate words.
+ ⚠️ Changing this setting will clear the cache.
+ Needs a restart to fully take effect. + ` + }) + new Setting(containerEl) + .setName('Split CamelCaseWords') + .setDesc(camelCaseDesc) + .addToggle(toggle => + toggle.setValue(settings.splitCamelCase).onChange(async v => { + await database.clearCache() + settings.splitCamelCase = v + await saveSettings(this.plugin) + }) + ) + // Simpler search new Setting(containerEl) .setName('Simpler search') @@ -379,6 +399,7 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = { indexedFileTypes: [] as string[], PDFIndexing: false, imagesIndexing: false, + splitCamelCase: false, ribbonIcon: true, showExcerpt: true, diff --git a/src/tools/utils.ts b/src/tools/utils.ts index 73eed56..035ae57 100644 --- a/src/tools/utils.ts +++ b/src/tools/utils.ts @@ -91,14 +91,17 @@ export function getAllIndices(text: string, regex: RegExp): SearchMatch[] { */ export function stringsToRegex(strings: string[]): RegExp { if (!strings.length) return /^$/g - // Default word split is not applied if the user uses the cm-chs-patch plugin const joined = '(' + - (getChsSegmenter() ? '' : `^|${SPACE_OR_PUNCTUATION.source}`) + + // Default word split is not applied if the user uses the cm-chs-patch plugin + (getChsSegmenter() + ? '' + : // Split on start of line, spaces, punctuation, or capital letters (for camelCase) + settings.splitCamelCase + ? `^|${SPACE_OR_PUNCTUATION.source}|[A-Z]` + : `^|${SPACE_OR_PUNCTUATION.source}`) + ')' + - '(' + - strings.map(s => escapeRegex(s)).join('|') + - ')' + `(${strings.map(s => escapeRegex(s)).join('|')})` const reg = new RegExp(`${joined}`, 'giu') return reg