import { createEditor, defineBaseCommands, defineMarkSpec, elementFromNode, union, type Editor } from '@prosekit/core' import type { ProseMirrorNode } from '@prosekit/pm/model' import { describe, expect, it } from 'vitest' import { defineDoc } from '../doc/index.ts' import { defineParagraph } from '../paragraph/index.ts' import { defineText } from '../text/index.ts' import { defineMarkRule } from './index.ts' describe('defineMarkRule', () => { const editor = createEditor({ extension: union( defineDoc(), defineText(), defineParagraph(), defineBaseCommands(), defineMarkSpec({ name: 'tag' as const, toDOM: () => { return ['mark-tag', 0] }, }), defineMarkRule({ regex: /#\d+/g, type: 'tag', }), defineMarkSpec({ name: 'link' as const, toDOM: () => { return ['mark-link', 0] }, }), defineMarkRule({ regex: /example\.com(#\d+)?/g, type: 'link', }), defineMarkSpec({ name: 'email' as const, toDOM: () => { return ['mark-email', 0] }, }), defineMarkRule({ regex: /[a-z]+@example\.com/g, type: 'email', }), ), }) const triggerMarkRule = (doc: ProseMirrorNode): string => { setDoc(editor, doc) editor.commands.insertText({ from: 1, text: ' ' }) return elementFromNode(editor.state.doc).innerHTML } const n = { ...editor.nodes, p: editor.nodes.paragraph } it('can match tag', () => { const doc = n.doc(n.p('#12345')) const html = triggerMarkRule(doc) expect(html).toMatchInlineSnapshot(`"