diff --git a/src/globals.ts b/src/globals.ts
index a9e77fc..49ce0be 100644
--- a/src/globals.ts
+++ b/src/globals.ts
@@ -14,7 +14,7 @@ export const excerptBefore = 100
export const excerptAfter = 300
export const highlightClass = `suggestion-highlight omnisearch-highlight ${
- settings.hightlight ? 'omnisearch-default-highlight' : ''
+ settings.highlight ? 'omnisearch-default-highlight' : ''
}`
export const eventBus = new EventBus()
diff --git a/src/search/omnisearch.ts b/src/search/omnisearch.ts
index 3c97c8e..f621fbf 100644
--- a/src/search/omnisearch.ts
+++ b/src/search/omnisearch.ts
@@ -10,6 +10,7 @@ import { settings } from '../settings'
import {
chunkArray,
removeDiacritics,
+ splitCamelCase,
stringsToRegex,
stripMarkdownCharacters,
} from '../tools/utils'
@@ -25,7 +26,11 @@ const tokenize = (text: string): string[] => {
return tokens.flatMap(word =>
chsRegex.test(word) ? chsSegmenter.cut(word) : [word]
)
- } else return tokens
+ } 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 f3778a0..5a6ca90 100644
--- a/src/settings.ts
+++ b/src/settings.ts
@@ -45,7 +45,8 @@ export interface OmnisearchSettings extends WeightingSettings {
welcomeMessage: string
/** If a query returns 0 result, try again with more relax conditions */
simpleSearch: boolean
- hightlight: 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')
@@ -301,8 +321,8 @@ export class SettingsTab extends PluginSettingTab {
'Will highlight matching results when enabled. See README for more customization options.'
)
.addToggle(toggle =>
- toggle.setValue(settings.hightlight).onChange(async v => {
- settings.hightlight = v
+ toggle.setValue(settings.highlight).onChange(async v => {
+ settings.highlight = v
await saveSettings(this.plugin)
})
)
@@ -379,12 +399,13 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = {
indexedFileTypes: [] as string[],
PDFIndexing: false,
imagesIndexing: false,
+ splitCamelCase: false,
ribbonIcon: true,
showExcerpt: true,
renderLineReturnInExcerpts: true,
showCreateButton: false,
- hightlight: true,
+ highlight: true,
showPreviousQueryResults: true,
simpleSearch: false,
diff --git a/src/tools/utils.ts b/src/tools/utils.ts
index 90e7ca9..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
@@ -313,3 +316,11 @@ export function chunkArray(arr: T[], len: number): T[][] {
return chunks
}
+
+/**
+ * Converts a 'fooBarBAZLorem' into ['foo', 'Bar', 'BAZ', 'Lorem]
+ * @param text
+ */
+export function splitCamelCase(text: string): string[] {
+ return text.replace(/([a-z](?=[A-Z]))/g, '$1 ').split(' ')
+}