mirror of
https://github.com/dnlbauer/obsidian-dataview-autocompletion.git
synced 2026-09-10 14:15:29 +00:00
add option to exclude fields
This commit is contained in:
@@ -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
39
src/SettingsTab.ts
Normal 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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user