import { Extension } from "@tiptap/vue-3"; import { Plugin, PluginKey } from "@tiptap/pm/state"; import { Decoration, DecorationSet } from "@tiptap/pm/view"; const WIKILINK_RE = /\[\[([^\]]+)\]\]/g; export const WikilinkDecoration = Extension.create({ name: "wikilinkDecoration", addProseMirrorPlugins() { return [ new Plugin({ key: new PluginKey("wikilinkDecoration"), props: { decorations(state) { const decorations: Decoration[] = []; state.doc.descendants((node, pos) => { if (!node.isText || !node.text) return; WIKILINK_RE.lastIndex = 0; let match: RegExpExecArray | null; while ((match = WIKILINK_RE.exec(node.text)) !== null) { const from = pos + match.index; const to = from + match[0].length; decorations.push( Decoration.inline(from, to, { class: "wikilink" }) ); } }); return DecorationSet.create(state.doc, decorations); }, }, }), ]; }, });