Compare commits
6 Commits
282fd1be13
...
921a72b015
Author | SHA1 | Date | |
---|---|---|---|
921a72b015 | |||
92a7af6ec5 | |||
52ada90150 | |||
d3c7e7ea8e | |||
99fd363c22 | |||
dd7d7a367d |
11
README.md
11
README.md
|
@ -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
|
||||||
|
|
||||||
[](https://github.com/sponsors/scambier)
|
[](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
|
||||||
|
|
|
@ -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>
|
|
|
@ -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<
|
||||||
{
|
{
|
||||||
|
|
|
@ -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))
|
||||||
|
)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user