Compare commits

...

6 Commits

Author SHA1 Message Date
921a72b015 buggy Arabic diacritics removal 2025-07-11 18:57:07 +02:00
92a7af6ec5 useless var 2025-07-11 18:56:24 +02:00
52ada90150 useless file 2025-07-11 18:55:56 +02:00
d3c7e7ea8e Fixed date "bug" 2025-07-11 18:22:44 +02:00
99fd363c22 database down to dbVersion 1
no need it to keep it at 10 like Omnisearch, this is a v1
2025-07-11 18:22:30 +02:00
dd7d7a367d readme 2025-07-11 18:22:05 +02:00
6 changed files with 16 additions and 43 deletions

View File

@ -1,10 +1,13 @@
> [!CAUTION]
> This project is a heavy work-in-progress, there are bugs, and features may change or disappear.
# Locator for Obsidian # Locator for Obsidian
[![Sponsor me](https://img.shields.io/badge/%E2%9D%A4%20Like%20this%20plugin%3F-Sponsor%20me!-ff69b4)](https://github.com/sponsors/scambier) [![Sponsor me](https://img.shields.io/badge/%E2%9D%A4%20Like%20this%20plugin%3F-Sponsor%20me!-ff69b4)](https://github.com/sponsors/scambier)
--- ---
**Locator** is an Obsidian plugin that lets you locate your files in a few keystrokes. It is a lightweight, experimental version of Omnisearch. **Locator** is an Obsidian plugin that lets you locate your files in a few keystrokes. It is an experimental fork of Omnisearch.
It always instantly shows you the most relevant results, thanks to its smart weighting algorithm. It always instantly shows you the most relevant results, thanks to its smart weighting algorithm.
@ -39,15 +42,13 @@ You can check the [CHANGELOG](./CHANGELOG.md) for more information on the differ
- Directly Insert a `[[link]]` from the search results - Directly Insert a `[[link]]` from the search results
- Supports Vim navigation keys - Supports Vim navigation keys
**Note:** support of Chinese depends
on [this additional plugin](https://github.com/aidenlx/cm-chs-patch) (also you may need to clear search cache data to apply new Chinese index). Please read its documentation for more
information.
## Issues & Feature Requests ## Issues & Feature Requests
If you're reading this README from the [repository's page](https://git.scambier.xyz/scambier/obsidian-locator), you'll notice it is hosted on a private forge without account registration.
Locator is a personal hobby project, tailored for my own needs. It is publicly available because you may find it useful too, but I'm not interested in your issues or pull requests. Locator is a personal hobby project, tailored for my own needs. It is publicly available because you may find it useful too, but I'm not interested in your issues or pull requests.
If you'd like to participate in a similar project (thank you!), I'll be glad to review your pull requests for [**Omnisearch**](https://github.com/scambier/obsidian-omnisearch)
Thank you for your understanding. Thank you for your understanding.
## LICENSE ## LICENSE

View File

@ -1,24 +0,0 @@
<script lang="ts">
import type { ResultNote } from '../globals'
import ResultItemContainer from './ResultItemContainer.svelte'
import type LocatorPlugin from '../main'
export let plugin: LocatorPlugin
export let offset: number
export let note: ResultNote
export let index = 0
export let selected = false
$: cleanedContent = plugin.textProcessor.makeExcerpt(note?.content ?? '', offset)
</script>
<ResultItemContainer
id="{index.toString()}"
on:auxclick
on:click
on:mousemove
selected="{selected}">
<div class="omnisearch-result__body">
{@html plugin.textProcessor.highlightText(cleanedContent, note.matches)}
</div>
</ResultItemContainer>

View File

@ -5,7 +5,7 @@ import { Notice } from 'obsidian'
import type LocatorPlugin from './main' import type LocatorPlugin from './main'
export class Database extends Dexie { export class Database extends Dexie {
public static readonly dbVersion = 10 public static readonly dbVersion = 1
searchHistory!: Dexie.Table<{ id?: number; query: string }, number> searchHistory!: Dexie.Table<{ id?: number; query: string }, number>
minisearch!: Dexie.Table< minisearch!: Dexie.Table<
{ {

View File

@ -190,15 +190,16 @@ export class SearchEngine {
} }
const mtime = storedFields?.mtime as number const mtime = storedFields?.mtime as number
const now = new Date().valueOf() const now = new Date().valueOf()
const daysElapsed = (now - mtime) / (24 * 3600) const daysElapsed = (now - mtime) / (24 * 3600_000)
// Documents boost // Documents boost
const cutoff = { const cutoff = {
[RecencyCutoff.Day]: -3, [RecencyCutoff.Day]: -3,
[RecencyCutoff.Week]: -0.3, [RecencyCutoff.Week]: -0.3,
[RecencyCutoff.Month]: -0.1, [RecencyCutoff.Month]: -0.1,
} as const } as const
return 1 + Math.exp(cutoff[settings.recencyBoost] * daysElapsed) return (
1 + Math.exp(cutoff[settings.recencyBoost] * (daysElapsed / 1000))
)
}, },
}) })

View File

@ -2,7 +2,6 @@
import { App, Plugin, PluginSettingTab, Setting } from 'obsidian' import { App, Plugin, PluginSettingTab, Setting } from 'obsidian'
import { RecencyCutoff } from '../globals' import { RecencyCutoff } from '../globals'
import type LocatorPlugin from '../main' import type LocatorPlugin from '../main'
import { enableVerboseLogging } from '../tools/utils'
import { injectSettingsBehavior } from './settings-behavior' import { injectSettingsBehavior } from './settings-behavior'
import { injectSettingsDanger } from './settings-danger' import { injectSettingsDanger } from './settings-danger'
import { injectSettingsHttp } from './settings-http' import { injectSettingsHttp } from './settings-http'
@ -64,7 +63,6 @@ export class SettingsTab extends PluginSettingTab {
.addToggle(toggle => .addToggle(toggle =>
toggle.setValue(settings.verboseLogging).onChange(async v => { toggle.setValue(settings.verboseLogging).onChange(async v => {
settings.verboseLogging = v settings.verboseLogging = v
enableVerboseLogging(v)
await saveSettings(this.plugin) await saveSettings(this.plugin)
}) })
) )
@ -137,6 +135,5 @@ export async function loadSettings(plugin: Plugin): Promise<LocatorSettings> {
await plugin.loadData() await plugin.loadData()
) )
showExcerpt.set(settings.showExcerpt) showExcerpt.set(settings.showExcerpt)
enableVerboseLogging(settings.verboseLogging)
return settings return settings
} }

View File

@ -9,6 +9,7 @@ import {
import { md5 } from 'pure-md5' import { md5 } from 'pure-md5'
import { eng, fra } from 'stopword' import { eng, fra } from 'stopword'
import { isSearchMatch, type SearchMatch } from '../globals' import { isSearchMatch, type SearchMatch } from '../globals'
import { settings } from 'src/settings'
export function pathWithoutFilename(path: string): string { export function pathWithoutFilename(path: string): string {
const split = path.split('/') const split = path.split('/')
@ -121,11 +122,12 @@ export function removeDiacritics(str: string, arabic = true): string {
return '' return ''
} }
// TODO: add a global setting to toggle this, this impacts performances
if (arabic) { if (arabic) {
// Arabic diacritics // Arabic diacritics
// https://stackoverflow.com/a/40959537 // https://stackoverflow.com/a/40959537
str = str str = str
.replace(/([^\u0621-\u063A\u0641-\u064A\u0660-\u0669a-zA-Z 0-9])/g, '') // .replace(/([^\u0621-\u063A\u0641-\u064A\u0660-\u0669a-zA-Z 0-9])/g, '')
.replace(/(آ|إ|أ)/g, 'ا') .replace(/(آ|إ|أ)/g, 'ا')
.replace(/(ة)/g, 'ه') .replace(/(ة)/g, 'ه')
.replace(/(ئ|ؤ)/g, 'ء') .replace(/(ئ|ؤ)/g, 'ء')
@ -144,6 +146,7 @@ export function removeDiacritics(str: string, arabic = true): string {
str = str.normalize('NFD').replace(diacriticsRegex, '').normalize('NFC') str = str.normalize('NFD').replace(diacriticsRegex, '').normalize('NFC')
str = str.replaceAll('[__locator__backtick__]', '`') str = str.replaceAll('[__locator__backtick__]', '`')
str = str.replaceAll('[__locator__caret__]', '^') str = str.replaceAll('[__locator__caret__]', '^')
return str return str
} }
@ -250,13 +253,8 @@ export function warnVerbose(...args: any[]): void {
printVerbose(console.warn, ...args) printVerbose(console.warn, ...args)
} }
let verboseLoggingEnabled = false
export function enableVerboseLogging(enable: boolean): void {
verboseLoggingEnabled = enable
}
function printVerbose(fn: (...args: any[]) => any, ...args: any[]): void { function printVerbose(fn: (...args: any[]) => any, ...args: any[]): void {
if (verboseLoggingEnabled) { if (settings.verboseLogging) {
fn(...args) fn(...args)
} }
} }