diff --git a/src/__tests__/utils-tests.ts b/src/__tests__/utils-tests.ts new file mode 100644 index 0000000..4333720 --- /dev/null +++ b/src/__tests__/utils-tests.ts @@ -0,0 +1,41 @@ +import type { CachedMetadata } from 'obsidian' +import { getAliasesFromMetadata } from '../utils' + +describe('Utils', () => { + describe('getAliasesFromMetadata', () => { + it('should return an empty string if no metadata is provided', () => { + // Act + const actual = getAliasesFromMetadata(null) + // Assert + expect(actual).toBe('') + }) + it('should return an empty string if no aliases are provided', () => { + // Arrange + const metadata = {} as CachedMetadata + // Act + const actual = getAliasesFromMetadata(metadata) + // Assert + expect(actual).toBe('') + }) + it('should join aliases with a comma', () => { + // Arrange + const metadata = { + frontmatter: { aliases: ['foo', 'bar'] }, + } as CachedMetadata + // Act + const actual = getAliasesFromMetadata(metadata) + // Assert + expect(actual).toBe('foo, bar') + }) + it('should return a single alias if only one is provided', () => { + // Arrange + const metadata = { + frontmatter: { aliases: 'foo, bar' }, + } as CachedMetadata + // Act + const actual = getAliasesFromMetadata(metadata) + // Assert + expect(actual).toBe('foo, bar') + }) + }) +}) diff --git a/src/globals.ts b/src/globals.ts index f1c65e1..d4637dd 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -24,6 +24,7 @@ export type IndexedNote = { path: string basename: string content: string + aliases: string headings1: string headings2: string headings3: string diff --git a/src/search.ts b/src/search.ts index f0f7993..133ef01 100644 --- a/src/search.ts +++ b/src/search.ts @@ -9,6 +9,7 @@ import { } from './globals' import { extractHeadingsFromCache, + getAliasesFromMetadata, stringsToRegex, stripMarkdownCharacters, wait, @@ -40,7 +41,14 @@ export async function initGlobalSearchIndex(): Promise { minisearchInstance = new MiniSearch({ tokenize, idField: 'path', - fields: ['basename', 'content', 'headings1', 'headings2', 'headings3'], + fields: [ + 'basename', + 'aliases', + 'content', + 'headings1', + 'headings2', + 'headings3', + ], }) // Index files that are already present @@ -84,6 +92,7 @@ async function search(query: Query): Promise { combineWith: 'AND', boost: { basename: settings.weightBasename, + aliases: settings.weightBasename, headings1: settings.weightH1, headings2: settings.weightH2, headings3: settings.weightH3, @@ -208,7 +217,7 @@ export async function addToIndex(file: TAbstractFile): Promise { } try { // console.log(`Omnisearch - adding ${file.path} to index`) - const fileCache = app.metadataCache.getFileCache(file) + const metadata = app.metadataCache.getFileCache(file) if (indexedNotes[file.path]) { throw new Error(`${file.basename} is already indexed`) @@ -222,14 +231,15 @@ export async function addToIndex(file: TAbstractFile): Promise { basename: file.basename, content, path: file.path, - headings1: fileCache - ? extractHeadingsFromCache(fileCache, 1).join(' ') + aliases: getAliasesFromMetadata(metadata), + headings1: metadata + ? extractHeadingsFromCache(metadata, 1).join(' ') : '', - headings2: fileCache - ? extractHeadingsFromCache(fileCache, 2).join(' ') + headings2: metadata + ? extractHeadingsFromCache(metadata, 2).join(' ') : '', - headings3: fileCache - ? extractHeadingsFromCache(fileCache, 3).join(' ') + headings3: metadata + ? extractHeadingsFromCache(metadata, 3).join(' ') : '', } minisearchInstance.add(note) diff --git a/src/settings.ts b/src/settings.ts index 26c9a67..6ca5dcb 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -55,7 +55,7 @@ export class SettingsTab extends PluginSettingTab { new Setting(containerEl).setName('Results weighting').setHeading() new Setting(containerEl) - .setName(`File name (default: ${DEFAULT_SETTINGS.weightBasename})`) + .setName(`File name & declared aliases (default: ${DEFAULT_SETTINGS.weightBasename})`) .addSlider(cb => this.weightSlider(cb, 'weightBasename')) new Setting(containerEl) diff --git a/src/types.d.ts b/src/types.d.ts index 1c3ff4c..cccea5a 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -4,4 +4,8 @@ declare module 'obsidian' { interface MetadataCache { isUserIgnored?(path: string): boolean } + + interface FrontMatterCache { + aliases?: string[] | string + } } diff --git a/src/utils.ts b/src/utils.ts index 0fd1940..a4866bf 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -147,3 +147,10 @@ export async function filterAsync( export function stripMarkdownCharacters(text: string): string { return text.replace(/(\*|_)+(.+?)(\*|_)+/g, (match, p1, p2) => p2) } + +export function getAliasesFromMetadata( + metadata: CachedMetadata | null, +): string { + const arrOrString = metadata?.frontmatter?.aliases ?? [] + return Array.isArray(arrOrString) ? arrOrString.join(', ') : arrOrString +}