add option to exclude fields

This commit is contained in:
Daniel Bauer
2024-12-14 13:53:00 +01:00
parent 14ac0c7a16
commit 3f7ec183c6
3 changed files with 62 additions and 7 deletions

View File

@@ -1,7 +1,6 @@
import { import {
App, App,
Editor, Editor,
Plugin,
EditorPosition, EditorPosition,
EditorSuggest, EditorSuggest,
EditorSuggestContext, EditorSuggestContext,
@@ -11,8 +10,11 @@ import {
import { getTriggerText } from "./trigger"; import { getTriggerText } from "./trigger";
import uFuzzy from "@leeoniya/ufuzzy"; import uFuzzy from "@leeoniya/ufuzzy";
import { getAPI, DataviewApi } from "obsidian-dataview"; import { getAPI, DataviewApi } from "obsidian-dataview";
import DataviewAutocompletePlugin from "./main";
export class DataviewSuggester extends EditorSuggest<String> { export class DataviewSuggester extends EditorSuggest<String> {
plugin: DataviewAutocompletePlugin;
maxSuggestions: number; maxSuggestions: number;
searcher: uFuzzy; searcher: uFuzzy;
@@ -22,12 +24,13 @@ export class DataviewSuggester extends EditorSuggest<String> {
suggestionsRefCount: { [key: string]: number } = {}; // maps suggestions to number of files including them suggestionsRefCount: { [key: string]: number } = {}; // maps suggestions to number of files including them
constructor( constructor(
plugin: Plugin, plugin: DataviewAutocompletePlugin,
maxSuggestions: number = 10, maxSuggestions: number = 10,
singleErrorMode: boolean = false, singleErrorMode: boolean = false,
allowExtraChars: boolean = false, allowExtraChars: boolean = false,
) { ) {
super(plugin.app); super(plugin.app);
this.plugin = plugin;
this.maxSuggestions = maxSuggestions; this.maxSuggestions = maxSuggestions;
this.searcher = new uFuzzy({ this.searcher = new uFuzzy({
intraMode: singleErrorMode ? 1 : 0, intraMode: singleErrorMode ? 1 : 0,
@@ -50,15 +53,26 @@ export class DataviewSuggester extends EditorSuggest<String> {
} }
getSuggestions(context: EditorSuggestContext): string[] | Promise<string[]> { getSuggestions(context: EditorSuggestContext): string[] | Promise<string[]> {
let idxs = this.searcher.filter(this.suggestionsList, context.query); // TODO: add filter at index-time?
let filtered = this.suggestionsList;
for (const filterPattern of this.plugin.settings.ignoredFields) {
const regex = new RegExp(`^(${filterPattern})::.*`);
const ignoredSuggestions = filtered.filter((suggestion) => regex.test(suggestion));
// minimatch.match(filtered, filterPattern + ":: *", { partial: true })
for (const ignoredSuggestion of ignoredSuggestions) {
filtered = filtered.slice(filtered.indexOf(ignoredSuggestion) + 1);
}
}
const idxs = this.searcher.filter(filtered, context.query);
if (idxs != null && idxs.length > 0) { if (idxs != null && idxs.length > 0) {
let info = this.searcher.info(idxs, this.suggestionsList, context.query); let info = this.searcher.info(idxs, filtered, context.query);
let order = this.searcher.sort(info, this.suggestionsList, context.query); let order = this.searcher.sort(info, filtered, context.query);
// return top N suggestions with marks // return top N suggestions with marks
return order return order
.slice(0, this.maxSuggestions) .slice(0, this.maxSuggestions)
.map((idx) => [idx, this.suggestionsList[info.idx[idx]]]) .map((idx) => [idx, filtered[info.idx[idx]]])
.map((suggestion: [number, string]) => uFuzzy.highlight(suggestion[1], info.ranges[suggestion[0]])); .map((suggestion: [number, string]) => uFuzzy.highlight(suggestion[1], info.ranges[suggestion[0]]));
} }
return []; return [];

39
src/SettingsTab.ts Normal file
View File

@@ -0,0 +1,39 @@
import { App, PluginSettingTab, Setting } from "obsidian";
import DataviewAutocompletePlugin from "./main";
export class SettingsTab extends PluginSettingTab {
plugin: DataviewAutocompletePlugin;
constructor(app: App, plugin: DataviewAutocompletePlugin) {
super(app, plugin);
this.plugin = plugin;
}
display(): void {
let { containerEl } = this;
containerEl.empty();
const excludeDesc = document.createDocumentFragment();
const link = document.createElement("a");
link.href = "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions";
link.text = "Regex patterns";
excludeDesc.append(link);
excludeDesc.append(" to exclude field names from suggestions. One pattern per line.");
new Setting(containerEl)
.setName("Exclude fields")
.setDesc(excludeDesc)
.addTextArea((textArea) => {
textArea.inputEl.setAttribute("rows", "5");
textArea
.setPlaceholder("created.*\nmodified.*\ndate")
.setValue(this.plugin.settings.ignoredFields.join("\n"))
.onChange(async (value) => {
this.plugin.settings.ignoredFields = value
.split("\n")
.map((val) => val.trim())
.filter((val) => val.length > 0);
await this.plugin.saveSettings();
});
});
}
}

View File

@@ -1,13 +1,14 @@
import { App, Plugin, PluginSettingTab, Setting, TFile } from "obsidian"; import { App, Plugin, PluginSettingTab, Setting, TFile } from "obsidian";
import { DataviewSuggester } from "./DataviewSuggester"; import { DataviewSuggester } from "./DataviewSuggester";
import { getAPI } from "obsidian-dataview"; import { getAPI } from "obsidian-dataview";
import { SettingsTab } from "./SettingsTab";
interface DataviewAutocompleteSettings { interface DataviewAutocompleteSettings {
ignoredFields: string[]; ignoredFields: string[];
} }
const DEFAULT_SETTINGS: DataviewAutocompleteSettings = { const DEFAULT_SETTINGS: DataviewAutocompleteSettings = {
ignoredFields: [], ignoredFields: ["created.*", "modified.*", "date"],
}; };
export default class DataviewAutocompletePlugin extends Plugin { export default class DataviewAutocompletePlugin extends Plugin {
@@ -16,6 +17,7 @@ export default class DataviewAutocompletePlugin extends Plugin {
async onload() { async onload() {
await this.loadSettings(); await this.loadSettings();
this.addSettingTab(new SettingsTab(this.app, this));
this.registerEvent( this.registerEvent(
// @ts-ignore // @ts-ignore