// 编辑器图片节点操作(docs/30):收集 src、按旧 src 回换、按 DOM 元素反查 src。 import { describe, it, expect } from 'vitest' import { createMarkdownEditor, getMarkdown, collectImageSrcs, replaceImageSrc, imageSrcAtElement } from '../src/editor/editor' const DOC = [ '# 图', '', '![本地](doc.assets/a.png)', '', '![网络](https://cdn.example.com/b.png)', '', '![重复](doc.assets/a.png)', '', ].join('\n') async function makeEditor() { const root = document.createElement('div') document.body.appendChild(root) const editor = createMarkdownEditor(root, DOC) await editor.create() return { root, editor } } describe('editor image ops', () => { it('收集全部图片 src 并去重', async () => { const { root, editor } = await makeEditor() expect(collectImageSrcs(editor)).toEqual(['doc.assets/a.png', 'https://cdn.example.com/b.png']) await editor.destroy() root.remove() }) it('按旧 src 回换全部同名图片节点(含重复引用)', async () => { const { root, editor } = await makeEditor() const n = replaceImageSrc(editor, 'doc.assets/a.png', 'https://s3.example.com/a.png') expect(n).toBe(2) const md = getMarkdown(editor) expect(md).toContain('https://s3.example.com/a.png') expect(md).not.toContain('doc.assets/a.png') expect(collectImageSrcs(editor)).toEqual(['https://s3.example.com/a.png', 'https://cdn.example.com/b.png']) await editor.destroy() root.remove() }) it('按 元素反查节点 src;非图片元素返回 null', async () => { const { root, editor } = await makeEditor() const img = root.querySelector('img') expect(img).not.toBeNull() expect(imageSrcAtElement(editor, img as HTMLElement)).toBe('doc.assets/a.png') expect(imageSrcAtElement(editor, root)).toBeNull() await editor.destroy() root.remove() }) })