mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 08:02:28 +00:00
test(editor): cover mounted markdown clipboard slices
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
// @vitest-environment happy-dom
|
||||
import { Editor } from '@tiptap/core'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { encodeRawMarkdownHtmlForRichEditor } from './raw-markdown-html'
|
||||
import { createRichMarkdownExtensions } from './rich-markdown-extensions'
|
||||
import { serializeRichMarkdownSliceAsMarkdown } from './rich-markdown-clipboard-serialization'
|
||||
import {
|
||||
serializeRichMarkdownSliceAsMarkdown,
|
||||
serializeRichMarkdownSliceForClipboard
|
||||
} from './rich-markdown-clipboard-serialization'
|
||||
import { createRichMarkdownEditorCodec } from './rich-markdown-source-transport'
|
||||
|
||||
describe('rich Markdown clipboard serialization', () => {
|
||||
@@ -19,8 +23,9 @@ describe('rich Markdown clipboard serialization', () => {
|
||||
})
|
||||
try {
|
||||
const slice = editor.state.doc.slice(0, editor.state.doc.content.size)
|
||||
const markdown = serializeRichMarkdownSliceAsMarkdown(slice, (content) =>
|
||||
editor.markdown!.serialize(content)
|
||||
const markdown = serializeRichMarkdownSliceAsMarkdown(
|
||||
slice,
|
||||
(content) => editor.markdown?.serialize(content) ?? ''
|
||||
)
|
||||
expect(markdown).toContain('# Heading')
|
||||
expect(markdown).toContain('**bold**')
|
||||
@@ -30,4 +35,53 @@ describe('rich Markdown clipboard serialization', () => {
|
||||
editor.destroy()
|
||||
}
|
||||
})
|
||||
|
||||
it('serializes mounted partial selections without flattening structure', () => {
|
||||
const codec = createRichMarkdownEditorCodec()
|
||||
const editor = new Editor({
|
||||
element: document.createElement('div'),
|
||||
extensions: createRichMarkdownExtensions({ codec }),
|
||||
content: encodeRawMarkdownHtmlForRichEditor(
|
||||
'- first item\n- second item\n\n```ts\nconst value = 1\n```\n',
|
||||
codec
|
||||
),
|
||||
contentType: 'markdown',
|
||||
editorProps: {
|
||||
clipboardTextSerializer: (slice) => {
|
||||
const markdown = editor.markdown
|
||||
return markdown
|
||||
? serializeRichMarkdownSliceAsMarkdown(slice, (content) => markdown.serialize(content))
|
||||
: ''
|
||||
}
|
||||
}
|
||||
})
|
||||
try {
|
||||
const { doc } = editor.state
|
||||
const list = doc.firstChild
|
||||
expect(list?.type.name).toBe('bulletList')
|
||||
if (!list?.firstChild) {
|
||||
throw new Error('expected a list item')
|
||||
}
|
||||
const firstItemStart = 2
|
||||
const firstItemEnd = firstItemStart + list.firstChild.nodeSize
|
||||
const listSlice = doc.slice(firstItemStart, firstItemEnd)
|
||||
const markdown = editor.view.someProp('clipboardTextSerializer', (serializer) =>
|
||||
serializer(listSlice, editor.view)
|
||||
)
|
||||
expect(markdown).toContain('- first item')
|
||||
expect(markdown).not.toContain('second item')
|
||||
|
||||
const codeBlock = doc.lastChild
|
||||
if (!codeBlock) {
|
||||
throw new Error('expected a code block')
|
||||
}
|
||||
const codeStart = doc.content.size - codeBlock.nodeSize
|
||||
const codeSlice = doc.slice(codeStart, doc.content.size)
|
||||
const codeClipboard = serializeRichMarkdownSliceForClipboard(editor.view, codeSlice)
|
||||
expect(codeClipboard.html).toContain('<pre')
|
||||
expect(codeClipboard.html).toContain('const value = 1')
|
||||
} finally {
|
||||
editor.destroy()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user