mirror of
https://github.com/dnlbauer/obsidian-dataview-autocompletion.git
synced 2026-09-10 22:25:29 +00:00
refactor: buildIndex and updateIndex share code
This commit is contained in:
@@ -12,7 +12,7 @@ import {
|
|||||||
} from "obsidian";
|
} from "obsidian";
|
||||||
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, DataObject } from "obsidian-dataview";
|
||||||
import DataviewAutocompletePlugin from "./main";
|
import DataviewAutocompletePlugin from "./main";
|
||||||
|
|
||||||
export class DataviewSuggester extends EditorSuggest<String> {
|
export class DataviewSuggester extends EditorSuggest<String> {
|
||||||
@@ -164,6 +164,10 @@ export class DataviewSuggester extends EditorSuggest<String> {
|
|||||||
return `${key}:: ${stringValue}`;
|
return `${key}:: ${stringValue}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters out composite values from suggestions that match any of the ignored fields.
|
||||||
|
* @returns true if the value should be shown in suggestions, false otherwise
|
||||||
|
*/
|
||||||
filterCompositeValue(compositeValue: string): boolean {
|
filterCompositeValue(compositeValue: string): boolean {
|
||||||
for (const filterPattern of this.plugin.settings.ignoredFields) {
|
for (const filterPattern of this.plugin.settings.ignoredFields) {
|
||||||
const regex = new RegExp(`^(${filterPattern})::.*`);
|
const regex = new RegExp(`^(${filterPattern})::.*`);
|
||||||
@@ -184,6 +188,36 @@ export class DataviewSuggester extends EditorSuggest<String> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extractCompositeValuesFromPage(page: DataObject): string[] {
|
||||||
|
const fields = Object.keys(page)
|
||||||
|
.filter((k) => k !== "file")
|
||||||
|
.map((k) => [k, page[k]]);
|
||||||
|
|
||||||
|
const compositeValues: string[] = [];
|
||||||
|
|
||||||
|
for (let [key, val] of fields) {
|
||||||
|
// fields can be a single value or a dict, so we need to handle both
|
||||||
|
let arrayVal;
|
||||||
|
if (!Array.isArray(val)) {
|
||||||
|
arrayVal = [val];
|
||||||
|
} else {
|
||||||
|
arrayVal = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add composite value "key:: value" to suggestions list
|
||||||
|
for (const value of arrayVal) {
|
||||||
|
if (value === null || value === undefined) continue; // skip empty fields
|
||||||
|
|
||||||
|
let compositeValue = this.formatCompositeValue(key, value);
|
||||||
|
compositeValues.push(compositeValue);
|
||||||
|
if (!this.filterCompositeValue(compositeValue)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return compositeValues;
|
||||||
|
}
|
||||||
|
|
||||||
buildNewIndex() {
|
buildNewIndex() {
|
||||||
console.log("Begin Rebuilding dataview suggestion index");
|
console.log("Begin Rebuilding dataview suggestion index");
|
||||||
const startTime = performance.now();
|
const startTime = performance.now();
|
||||||
@@ -202,40 +236,19 @@ export class DataviewSuggester extends EditorSuggest<String> {
|
|||||||
const page = dataviewApi.page(file.path);
|
const page = dataviewApi.page(file.path);
|
||||||
if (page === undefined) continue; // not a markdown file
|
if (page === undefined) continue; // not a markdown file
|
||||||
|
|
||||||
const fields = Object.keys(page)
|
const compositeValues = this.extractCompositeValuesFromPage(page);
|
||||||
.filter((k) => k !== "file")
|
|
||||||
.map((k) => [k, page[k]]);
|
|
||||||
|
|
||||||
const pageRefs = [];
|
const pageRefs = [];
|
||||||
|
|
||||||
for (let [key, val] of fields) {
|
for (let compositeValue of compositeValues) {
|
||||||
// fields can be a single value or a dict, so we need to handle both
|
if (newSuggestions.indexOf(compositeValue) === -1) {
|
||||||
let arrayVal;
|
// suggestion not seen on any page yet
|
||||||
if (!Array.isArray(val)) {
|
pageRefs.push(compositeValue);
|
||||||
arrayVal = [val];
|
newSuggestionsRefCount.set(compositeValue, 1);
|
||||||
} else {
|
newSuggestions.push(compositeValue);
|
||||||
arrayVal = val;
|
} else if (pageRefs.indexOf(compositeValue) === -1) {
|
||||||
}
|
// suggestion not seen on this page, but on another
|
||||||
|
pageRefs.push(compositeValue);
|
||||||
// Add composite value "key:: value" to suggestions list
|
newSuggestionsRefCount.set(compositeValue, newSuggestionsRefCount.get(compositeValue)! - 1);
|
||||||
for (const value of arrayVal) {
|
|
||||||
if (value === null || value === undefined) continue; // skip empty fields
|
|
||||||
|
|
||||||
let compositeValue = this.formatCompositeValue(key, value);
|
|
||||||
if (!this.filterCompositeValue(compositeValue)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newSuggestions.indexOf(compositeValue) === -1) {
|
|
||||||
// suggestion not seen on any page yet
|
|
||||||
pageRefs.push(compositeValue);
|
|
||||||
newSuggestionsRefCount.set(compositeValue, 1);
|
|
||||||
newSuggestions.push(compositeValue);
|
|
||||||
} else if (pageRefs.indexOf(compositeValue) === -1) {
|
|
||||||
// suggestion not seen on this page, but on another
|
|
||||||
pageRefs.push(compositeValue);
|
|
||||||
newSuggestionsRefCount.set(compositeValue, newSuggestionsRefCount.get(compositeValue)! - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
newSuggestionsRefs.set(file.path, pageRefs);
|
newSuggestionsRefs.set(file.path, pageRefs);
|
||||||
@@ -258,35 +271,10 @@ export class DataviewSuggester extends EditorSuggest<String> {
|
|||||||
if (!this.filterFile(file.path)) {
|
if (!this.filterFile(file.path)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const updateCompositeValues = [];
|
|
||||||
|
|
||||||
const page = getAPI(this.app).page(file.path);
|
const page = getAPI(this.app).page(file.path);
|
||||||
if (page === undefined) return; // not a markdown file
|
if (page === undefined) return; // not a markdown file
|
||||||
|
const updateCompositeValues = this.extractCompositeValuesFromPage(page);
|
||||||
const fields = Object.keys(page)
|
|
||||||
.filter((k) => k !== "file")
|
|
||||||
.map((k) => [k, page[k]]);
|
|
||||||
for (let [key, val] of fields) {
|
|
||||||
// fields can be a single value or a dict, so we need to handle both
|
|
||||||
let arrayVal;
|
|
||||||
if (!Array.isArray(val)) {
|
|
||||||
arrayVal = [val];
|
|
||||||
} else {
|
|
||||||
arrayVal = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const value of arrayVal) {
|
|
||||||
if (value === null || value === undefined) continue; // skip empty fields
|
|
||||||
|
|
||||||
let compositeValue = this.formatCompositeValue(key, value);
|
|
||||||
if (!this.filterCompositeValue(compositeValue)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (updateCompositeValues.indexOf(compositeValue) === -1) {
|
|
||||||
updateCompositeValues.push(compositeValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const oldCompositeValues = this.suggestionsRefs.get(file.path) || [];
|
const oldCompositeValues = this.suggestionsRefs.get(file.path) || [];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user