5 Commits
0.9.0 ... 0.9.1

Author SHA1 Message Date
daniel
b10656c2c3 chore: fix code formatting 2024-12-23 11:05:34 +01:00
daniel
cc078fae6a bump version 2024-12-23 11:04:24 +01:00
daniel
b6cdf6cb47 chore: update preview gif 2024-12-23 11:04:24 +01:00
daniel
5bfb3116bc feat: render suggestions similar to dataview render 2024-12-23 10:02:02 +01:00
daniel
dac07242cd chore: remove unused import 2024-12-23 09:09:54 +01:00
6 changed files with 40 additions and 35 deletions

View File

@@ -5,7 +5,7 @@ This is a plugin for Obsidian (https://obsidian.md).
Obsidian Dataview Autocomplete enhances the functionality of the popular [Dataview plugin](https://github.com/blacksmithgu/obsidian-dataview) Obsidian Dataview Autocomplete enhances the functionality of the popular [Dataview plugin](https://github.com/blacksmithgu/obsidian-dataview)
by providing autocomplete suggestions for metadata fields in the editor. This makes it easy to reuse existing fields and reduces typing errors. by providing autocomplete suggestions for metadata fields in the editor. This makes it easy to reuse existing fields and reduces typing errors.
![Demo](./assets/demo.gif) <img src="./assets/demo.gif" alt="Demo" width="400" >
## Features ## Features

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -1,7 +1,7 @@
{ {
"id": "dataview-autocompletion", "id": "dataview-autocompletion",
"name": "Dataview Autocompletion", "name": "Dataview Autocompletion",
"version": "0.9.0", "version": "0.9.1",
"minAppVersion": "0.15.0", "minAppVersion": "0.15.0",
"description": "Adds autocompletion to Dataview metadata fields", "description": "Adds autocompletion to Dataview metadata fields",
"author": "Daniel Bauer", "author": "Daniel Bauer",

View File

@@ -1,6 +1,6 @@
{ {
"name": "obsidian-dataview-autocompletion", "name": "obsidian-dataview-autocompletion",
"version": "0.9.0", "version": "0.9.1",
"description": "This is a plugin for Obsidian that provides autocompletion for Dataview metadata fields", "description": "This is a plugin for Obsidian that provides autocompletion for Dataview metadata fields",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {

View File

@@ -14,7 +14,6 @@ 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"; import DataviewAutocompletePlugin from "./main";
import { parentPort } from "worker_threads";
export class DataviewSuggester extends EditorSuggest<String> { export class DataviewSuggester extends EditorSuggest<String> {
plugin: DataviewAutocompletePlugin; plugin: DataviewAutocompletePlugin;
@@ -71,52 +70,57 @@ export class DataviewSuggester extends EditorSuggest<String> {
return []; return [];
} }
renderSuggestion(value: string, el: HTMLElement): void { renderMarkdownSuggestion(value: string, el: HTMLElement): void {
// Split the value into parts based on the <mark> tags and their content // render markdown preview of inline dataview metadata field
let suggestionText = this.context!.editor.getLine(this.context!.start.line).slice(
this.context!.start.ch - 1,
this.context!.start.ch,
)!;
suggestionText += value.replace(/<mark>(.*?)<\/mark>/g, "$1");
suggestionText += suggestionText.startsWith("(") ? ")" : "]";
MarkdownRenderer.render(
this.app,
htmlToMarkdown(suggestionText),
el,
this.context!.file.path,
this.app.workspace.getActiveViewOfType(MarkdownView)!,
);
}
renderSourceSuggestion(value: string, el: HTMLElement): void {
// render source text with highlights
// replaces <mark>...</mark> with <span>...</span>
const parts = value.split(/(<mark>.*?<\/mark>)/g); const parts = value.split(/(<mark>.*?<\/mark>)/g);
const container = el.createDiv("dataview-suggestion-content");
const titleDiv = container.createDiv("dataview-suggestion-title");
parts.forEach((textPart) => { parts.forEach((textPart) => {
if (textPart.startsWith("<mark>") && textPart.endsWith("</mark>")) { if (textPart.startsWith("<mark>") && textPart.endsWith("</mark>")) {
const text = textPart.slice(6, -7); // Remove <mark> and </mark> const text = textPart.slice(6, -7); // Remove <mark> and </mark>
titleDiv.createEl("span", { text, cls: "dataview-suggestion-highlight" }); el.createEl("span", { text, cls: "dataview-suggestion-highlight" });
} else { } else {
titleDiv.appendText(textPart); el.appendText(textPart);
} }
}); });
}
if (value.indexOf("[[") !== -1 || value.indexOf("]]") !== -1 || value.indexOf("](") !== -1) { renderSuggestion(value: string, el: HTMLElement): void {
const noteDiv = container.createDiv("dataview-suggestion-note"); const container = el.createDiv("dataview-suggestion-content");
let suggestionText = ""; const titleDiv = container.createDiv("dataview-suggestion-title");
parts.forEach((textPart) => { const noteDiv = container.createDiv("dataview-suggestion-note");
if (textPart.startsWith("<mark>") && textPart.endsWith("</mark>")) {
const text = textPart.slice(6, -7); // Remove <mark> and </mark> this.renderMarkdownSuggestion(value, titleDiv);
suggestionText += text; this.renderSourceSuggestion(value, noteDiv);
} else {
suggestionText += textPart;
}
});
MarkdownRenderer.render(
this.app,
htmlToMarkdown(suggestionText),
noteDiv,
this.context!.file.path,
this.app.workspace.getActiveViewOfType(MarkdownView)!,
);
}
} }
selectSuggestion(value: string, evt: MouseEvent | KeyboardEvent): void { selectSuggestion(value: string, evt: MouseEvent | KeyboardEvent): void {
const { editor, start, end } = this.context!;
// remove marks from selection // remove marks from selection
value = value.replace(/<mark>(.*?)<\/mark>/g, "$1"); value = value.replace(/<mark>(.*?)<\/mark>/g, "$1");
const { editor, start, end } = this.context!;
editor.replaceRange(value, start, end); editor.replaceRange(value, start, end);
const newCursorPos = { const newCursorPos = {
line: end.line + 1, line: end.line,
ch: 0, ch: start.ch + value.length + 1,
}; };
editor.setCursor(newCursorPos); editor.setCursor(newCursorPos);
} }

View File

@@ -10,7 +10,7 @@ div.dataview-suggestion-title {
overflow-wrap: break-word; overflow-wrap: break-word;
} }
div.dataview-suggestion-note p { div.dataview-suggestion-title p {
margin-block: 0px; margin-block: 0px;
} }
@@ -20,6 +20,7 @@ div.dataview-suggestion-note{
width: 100%; width: 100%;
flex-basis: 100%; flex-basis: 100%;
overflow-wrap: break-word; overflow-wrap: break-word;
padding-left: 8px;
} }
span.dataview-suggestion-highlight { span.dataview-suggestion-highlight {