import { describe, it, expect } from 'vitest' import { editorViewCtx } from '@milkdown/kit/core' import { NodeSelection } from '@milkdown/kit/prose/state' import { createMarkdownEditor, getMarkdown } from '../src/editor/editor' describe('图片选中时按 Enter(docs/31)', () => { it('在图片段落后新建空段落并把光标移入,图片保留', async () => { const root = document.createElement('div') document.body.appendChild(root) const editor = createMarkdownEditor(root, '前文\n\n![图](a.png)\n\n后文\n') await editor.create() const after = editor.action((ctx) => { const view = ctx.get(editorViewCtx) let pos = -1 view.state.doc.descendants((n, p) => { if (n.type.name === 'image') pos = p; return true }) view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, pos))) view.dom.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true })) const blocks: string[] = [] view.state.doc.forEach((n) => blocks.push(n.type.name + ':' + n.textContent + (n.content.size && n.firstChild?.type.name === 'image' ? '[img]' : ''))) return { blocks, selType: view.state.selection.constructor.name, selFrom: view.state.selection.from } }) expect(after.blocks).toEqual(['paragraph:前文', 'paragraph:[img]', 'paragraph:', 'paragraph:后文']) expect(after.selType).toContain('TextSelection') expect(getMarkdown(editor)).toContain('![图](a.png)') await editor.destroy(); root.remove() }) it('普通文本处按 Enter 不被接管(仍是原有分段行为)', async () => { const root = document.createElement('div') document.body.appendChild(root) const editor = createMarkdownEditor(root, '你好世界\n') await editor.create() editor.action((ctx) => { const view = ctx.get(editorViewCtx) // 光标放文本中间(非图片选区),捕获监听应放行——这里只断言监听不误伤: // jsdom 里默认 Enter 链未必完整执行,至少文档不能被插入多余段落到图片逻辑位置 view.dom.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true })) return null }) // 不抛错、编辑器仍可用即可(默认链行为由无头浏览器实测覆盖) expect(getMarkdown(editor)).toContain('你好世界') await editor.destroy(); root.remove() }) })