From 6c0cf3d2f869704929f76dc58a254a0e0a254881 Mon Sep 17 00:00:00 2001 From: Daniel Bauer Date: Wed, 11 Dec 2024 00:36:43 +0100 Subject: [PATCH] feat: add some trigger tests --- src/DataviewSuggester.ts | 27 ++++++++++----------------- src/mytest.test.js | 5 ----- src/trigger.test.ts | 19 +++++++++++++++++++ src/trigger.ts | 17 +++++++++++++++++ 4 files changed, 46 insertions(+), 22 deletions(-) delete mode 100644 src/mytest.test.js create mode 100644 src/trigger.test.ts create mode 100644 src/trigger.ts diff --git a/src/DataviewSuggester.ts b/src/DataviewSuggester.ts index 9d4a0d7..39d7664 100644 --- a/src/DataviewSuggester.ts +++ b/src/DataviewSuggester.ts @@ -1,4 +1,5 @@ import { App, Editor, Plugin, EditorPosition, EditorSuggest, EditorSuggestContext, EditorSuggestTriggerInfo, TFile } from 'obsidian'; +import { getTriggerText } from './trigger'; export class DataviewSuggester extends EditorSuggest { @@ -12,24 +13,16 @@ export class DataviewSuggester extends EditorSuggest { file: TFile, ): EditorSuggestTriggerInfo | null { const line = editor.getLine(cursor.line); - const regex = /\((.*?)\)/g // todo min characters for match? -> research on best practices - - let match - while((match = regex.exec(line)) !== null) { - - // check if cursor is positioned inside the match - const cursorInMatch = cursor.ch > match.index && cursor.ch <= match.index + match[1].length + 1 - if (cursorInMatch) { - - return { - start: { line: cursor.line, ch: match.index+1 }, - end: { line: cursor.line, ch: match.index + match[1].length+1 }, - query: match[1], - }; + + let trigger = getTriggerText(line, cursor.ch) + if (trigger !== null) { + return { + query: trigger[0], + start: { line: cursor.line, ch: trigger[1] }, + end: { line: cursor.line, ch: trigger[2] }, } - - } - return null; + } + return null } getSuggestions(context: EditorSuggestContext): string[] | Promise { diff --git a/src/mytest.test.js b/src/mytest.test.js deleted file mode 100644 index b171889..0000000 --- a/src/mytest.test.js +++ /dev/null @@ -1,5 +0,0 @@ -describe("testing setup", () => { - test("testing setup", () => { - expect(1).toBe(1) - }) -}) \ No newline at end of file diff --git a/src/trigger.test.ts b/src/trigger.test.ts new file mode 100644 index 0000000..021c3e9 --- /dev/null +++ b/src/trigger.test.ts @@ -0,0 +1,19 @@ +import { getTriggerText } from "./trigger" + +describe("test trigger", () => { + test("testing trigger regex on braces", () => { + expect(getTriggerText("test string () testing", 13)).toEqual(["", 13, 13]) + expect(getTriggerText("test string (person) testing", 16)).toEqual(["person", 13, 19]) + expect(getTriggerText("test string (person:) testing", 16)).toEqual(["person:", 13, 20]) + expect(getTriggerText("test string (person::) testing", 16)).toEqual(["person::", 13, 21]) + expect(getTriggerText("test string (person::Bob) testing", 16)).toEqual(["person::Bob", 13, 24]) + expect(getTriggerText("test string (person:: Bob) testing", 16)).toEqual(["person:: Bob", 13, 25]) + expect(getTriggerText("test string (person:: Bob) testing", 16)).toEqual(["person:: Bob", 13, 27]) + }) + + test("test multiple regex matches in trigger", () => { + expect(getTriggerText("test() string () testing", 5)).toEqual(["", 5, 5]) + expect(getTriggerText("test() string () testing", 15)).toEqual(["", 15, 15]) + expect(getTriggerText("test() string () testing", 17)).toEqual(null) + }) +}) \ No newline at end of file diff --git a/src/trigger.ts b/src/trigger.ts new file mode 100644 index 0000000..150f1d0 --- /dev/null +++ b/src/trigger.ts @@ -0,0 +1,17 @@ +const triggerRegex = /\((.*?)\)/g + +export function getTriggerText(line: string, cursorPos: number): [string, number, number] | null { + triggerRegex.lastIndex = 0 // resetting global regex + + let match = null + while ((match = triggerRegex.exec(line)) !== null) { + const cursorInMatch = cursorPos > match.index && cursorPos <= match.index + match[1].length + 1 + + if (cursorInMatch) { + return [match[1], match.index+1, match.index + match[1].length + 1] + } + + } + return null + +} \ No newline at end of file