136 lines
4.2 KiB
TypeScript
136 lines
4.2 KiB
TypeScript
import { Setting, SliderComponent } from 'obsidian'
|
|
import { getDefaultSettings } from 'src/settings'
|
|
import type { OmnisearchSettings } from './utils'
|
|
import { saveSettings } from './utils'
|
|
import type { WeightingSettings } from './utils'
|
|
import type OmnisearchPlugin from 'src/main'
|
|
import { RecencyCutoff } from 'src/globals'
|
|
|
|
export function injectSettingsWeighting(
|
|
plugin: OmnisearchPlugin,
|
|
settings: OmnisearchSettings,
|
|
containerEl: HTMLElement,
|
|
refreshDisplay: () => void
|
|
) {
|
|
function weightSlider(
|
|
cb: SliderComponent,
|
|
key: keyof WeightingSettings
|
|
): void {
|
|
cb.setLimits(1, 10, 0.5)
|
|
.setValue(settings[key])
|
|
.setDynamicTooltip()
|
|
.onChange(async v => {
|
|
settings[key] = v
|
|
await saveSettings(plugin)
|
|
})
|
|
}
|
|
|
|
const defaultSettings = getDefaultSettings(plugin.app)
|
|
|
|
new Setting(containerEl).setName('Results weighting').setHeading()
|
|
|
|
new Setting(containerEl)
|
|
.setName(
|
|
`File name & declared aliases (default: ${defaultSettings.weightBasename})`
|
|
)
|
|
.addSlider(cb => weightSlider(cb, 'weightBasename'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`File directory (default: ${defaultSettings.weightDirectory})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightDirectory'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Headings level 1 (default: ${defaultSettings.weightH1})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightH1'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Headings level 2 (default: ${defaultSettings.weightH2})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightH2'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Headings level 3 (default: ${defaultSettings.weightH3})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightH3'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Headings level 4 (default: ${defaultSettings.weightH4})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightH4'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Colon headings (default: ${defaultSettings.weightColonHeadings})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightColonHeadings'))
|
|
|
|
new Setting(containerEl)
|
|
.setName(`Tags (default: ${defaultSettings.weightUnmarkedTags})`)
|
|
.addSlider(cb => weightSlider(cb, 'weightUnmarkedTags'))
|
|
|
|
new Setting(containerEl)
|
|
.setName('Header properties fields')
|
|
.setDesc(
|
|
'You can set custom weights for values of header properties (e.g. "keywords"). Weights under 1.0 will downrank the results.'
|
|
)
|
|
|
|
for (let i = 0; i < settings.weightCustomProperties.length; i++) {
|
|
const item = settings.weightCustomProperties[i]
|
|
const el = new Setting(containerEl).setName((i + 1).toString() + '.')
|
|
el.settingEl.style.paddingLeft = '2em'
|
|
|
|
// TODO: add autocompletion from app.metadataCache.getAllPropertyInfos()
|
|
el.addText(text => {
|
|
text
|
|
.setPlaceholder('Property name')
|
|
.setValue(item.name)
|
|
.onChange(async v => {
|
|
item.name = v
|
|
await saveSettings(plugin)
|
|
})
|
|
})
|
|
.addSlider(cb => {
|
|
cb.setLimits(0.1, 5, 0.1)
|
|
.setValue(item.weight)
|
|
.setDynamicTooltip()
|
|
.onChange(async v => {
|
|
item.weight = v
|
|
await saveSettings(plugin)
|
|
})
|
|
})
|
|
// Remove the tag
|
|
.addButton(btn => {
|
|
btn.setButtonText('Remove')
|
|
btn.onClick(async () => {
|
|
settings.weightCustomProperties.splice(i, 1)
|
|
await saveSettings(plugin)
|
|
refreshDisplay()
|
|
})
|
|
})
|
|
}
|
|
|
|
// Add a new custom tag
|
|
new Setting(containerEl).addButton(btn => {
|
|
btn.setButtonText('Add a new property')
|
|
btn.onClick(_cb => {
|
|
settings.weightCustomProperties.push({ name: '', weight: 1 })
|
|
refreshDisplay()
|
|
})
|
|
})
|
|
|
|
new Setting(containerEl)
|
|
.setName('Recency boost (experimental)')
|
|
.setDesc(
|
|
'Files that have been modified more recently than [selected cutoff] are given a higher rank.'
|
|
)
|
|
.addDropdown(dropdown =>
|
|
dropdown
|
|
.addOptions({
|
|
[RecencyCutoff.Disabled]: 'Disabled',
|
|
[RecencyCutoff.Day]: '24 hours',
|
|
[RecencyCutoff.Week]: '7 days',
|
|
[RecencyCutoff.Month]: '30 days',
|
|
})
|
|
.setValue(settings.recencyBoost)
|
|
.onChange(async v => {
|
|
settings.recencyBoost = v as RecencyCutoff
|
|
await saveSettings(plugin)
|
|
})
|
|
)
|
|
}
|