From 5bfb3116bc933ba8a13f09a025104cb2335d763f Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 23 Dec 2024 10:02:02 +0100 Subject: [PATCH] feat: render suggestions similar to dataview render --- src/DataviewSuggester.ts | 62 +++++++++++++++++++++------------------- styles.css | 3 +- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/DataviewSuggester.ts b/src/DataviewSuggester.ts index c768455..1eefcbe 100644 --- a/src/DataviewSuggester.ts +++ b/src/DataviewSuggester.ts @@ -70,52 +70,54 @@ export class DataviewSuggester extends EditorSuggest { return []; } - renderSuggestion(value: string, el: HTMLElement): void { - // Split the value into parts based on the tags and their content + renderMarkdownSuggestion(value: string, el: HTMLElement): void { + // 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>/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 ... with ... const parts = value.split(/(.*?<\/mark>)/g); - - const container = el.createDiv("dataview-suggestion-content"); - const titleDiv = container.createDiv("dataview-suggestion-title"); - parts.forEach((textPart) => { if (textPart.startsWith("") && textPart.endsWith("")) { const text = textPart.slice(6, -7); // Remove and - titleDiv.createEl("span", { text, cls: "dataview-suggestion-highlight" }); + el.createEl("span", { text, cls: "dataview-suggestion-highlight" }); } else { - titleDiv.appendText(textPart); + el.appendText(textPart); } }); + } - if (value.indexOf("[[") !== -1 || value.indexOf("]]") !== -1 || value.indexOf("](") !== -1) { - const noteDiv = container.createDiv("dataview-suggestion-note"); - let suggestionText = ""; - parts.forEach((textPart) => { - if (textPart.startsWith("") && textPart.endsWith("")) { - const text = textPart.slice(6, -7); // Remove and - suggestionText += text; - } else { - suggestionText += textPart; - } - }); - MarkdownRenderer.render( - this.app, - htmlToMarkdown(suggestionText), - noteDiv, - this.context!.file.path, - this.app.workspace.getActiveViewOfType(MarkdownView)!, - ); - } + renderSuggestion(value: string, el: HTMLElement): void { + const container = el.createDiv("dataview-suggestion-content"); + const titleDiv = container.createDiv("dataview-suggestion-title"); + const noteDiv = container.createDiv("dataview-suggestion-note"); + + this.renderMarkdownSuggestion(value, titleDiv); + this.renderSourceSuggestion(value, noteDiv); } selectSuggestion(value: string, evt: MouseEvent | KeyboardEvent): void { - const { editor, start, end } = this.context!; // remove marks from selection value = value.replace(/(.*?)<\/mark>/g, "$1"); + + const { editor, start, end } = this.context!; editor.replaceRange(value, start, end); const newCursorPos = { - line: end.line + 1, - ch: 0, + line: end.line, + ch: start.ch + value.length + 1, }; editor.setCursor(newCursorPos); } diff --git a/styles.css b/styles.css index dd74563..ad9776c 100644 --- a/styles.css +++ b/styles.css @@ -10,7 +10,7 @@ div.dataview-suggestion-title { overflow-wrap: break-word; } -div.dataview-suggestion-note p { +div.dataview-suggestion-title p { margin-block: 0px; } @@ -20,6 +20,7 @@ div.dataview-suggestion-note{ width: 100%; flex-basis: 100%; overflow-wrap: break-word; + padding-left: 8px; } span.dataview-suggestion-highlight {