From e8582f95b1611a147e45fcb85df16d4ff59b3253 Mon Sep 17 00:00:00 2001 From: Matthias Bilger Date: Tue, 15 Nov 2022 21:16:40 +0100 Subject: [PATCH] added stamp --- plugins/monaco-wikitext/completion.js | 66 ++++++++++++++++++++++++- plugins/monaco-wikitext/plugin.info | 2 +- plugins/monaco-wikitext/stampprefix.tid | 3 ++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 plugins/monaco-wikitext/stampprefix.tid diff --git a/plugins/monaco-wikitext/completion.js b/plugins/monaco-wikitext/completion.js index cccb53b..c0d6c28 100644 --- a/plugins/monaco-wikitext/completion.js +++ b/plugins/monaco-wikitext/completion.js @@ -11,12 +11,15 @@ Wikitext completion support const { monaco } = require("$:/plugins/smilyorg/monaco/monaco.js"); const { LANGUAGE_ID } = require("$:/plugins/smilyorg/monaco-wikitext/language.js"); + + const STAMP_PREFIX = $tw.wiki.getTiddlerText('$:/config/smilyorg/monaco-wikitext/stampPrefix'); const MATCH_LINK = /(\[\[)([^\|\]]*)(\|?)([^\]]*)(\]?\]?)/; + const MATCH_STAMP = new RegExp(`(${STAMP_PREFIX}${STAMP_PREFIX})([A-Za-z0-9_-]*)`, "");; const MATCH_TRANSCLUSION = /({{)([^}]*)(}?}?)/; monaco.languages.registerCompletionItemProvider(LANGUAGE_ID, { - triggerCharacters: ["[", "|", "{"], + triggerCharacters: ["[", "|", "{", STAMP_PREFIX], resolveCompletionItem(item) { const title = item.label; const tiddler = $tw.wiki.getTiddler(title); @@ -82,6 +85,27 @@ Wikitext completion support }; } } + let templateStart = findNearestDoubleChar(text, textPos, ";"); + if (context.triggerKind == monaco.languages.CompletionTriggerKind.TriggerCharacter) { + switch (context.triggerCharacter) { + case ";": + // When triggered by [, ignore if not double [ + if (templateStart == -1 || templateStart != textPos-2) { + return null; + } + break; + } + } + + if (templateStart != -1) { + const templateSuggestions = getTemplateSuggestions(text, templateStart, textPos, range); + if (templateSuggestions) { + return { + incomplete: true, + suggestions: templateSuggestions, + }; + } + } let transStart = findNearestDoubleChar(text, textPos, "{"); // When triggered by {, ignore if not double { @@ -177,10 +201,48 @@ Wikitext completion support return suggestions; } + function getTemplateSuggestions(text, start, cursor, range) { + const contents = text.substr(start); + const link = MATCH_STAMP.exec(contents); + if (!link || link.length == 0) { + return null; + } + + const end = start + link[0].length; + if (cursor > end) { + return null; + } + + let title = link[2]; + + let titles = $tw.wiki.getTagMap()["$:/stamp"].filter(word => word.includes(title)); + const suggestions = []; + for (let i = 0; i < titles.length; i++) { + let title = titles[i]; + if (title.lastIndexOf('/') >= 0){ + title = title.substr(title.lastIndexOf('/')+1); + } + const insertText = `${title}`; + suggestions.push({ + kind: monaco.languages.CompletionItemKind.Field, + label: insertText, + filterText: `;;${title}`, + range: { + startLineNumber: range.startLineNumber, + endLineNumber: range.endLineNumber, + startColumn: range.startColumn + start, + endColumn: range.startColumn + end, + }, + insertText: $tw.wiki.getTiddlerText(titles[i]), + }) + } + + return suggestions; + } + function getTransclusionSuggestions(text, start, cursor, range) { const contents = text.substr(start); const trans = MATCH_TRANSCLUSION.exec(contents); - console.log(MATCH_TRANSCLUSION, text, start, contents); if (!trans || trans.length == 0) { return null; } diff --git a/plugins/monaco-wikitext/plugin.info b/plugins/monaco-wikitext/plugin.info index 0f4aa69..65ba585 100644 --- a/plugins/monaco-wikitext/plugin.info +++ b/plugins/monaco-wikitext/plugin.info @@ -8,5 +8,5 @@ "source": "https://github.com/smilyorg/tw5-monaco", "plugin-type": "plugin", "parent-plugin": "$:/plugins/smilyorg/monaco", - "list": "readme license" + "list": "readme license stampprefix" } diff --git a/plugins/monaco-wikitext/stampprefix.tid b/plugins/monaco-wikitext/stampprefix.tid new file mode 100644 index 0000000..9f4ad47 --- /dev/null +++ b/plugins/monaco-wikitext/stampprefix.tid @@ -0,0 +1,3 @@ +title: $:/config/smilyorg/monaco-wikitext/stampPrefix + +;