diff --git a/src/extensions/RichText.js b/src/extensions/RichText.js index 65d98391432..3b11e059055 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -67,7 +67,16 @@ export default Extension.create({ const defaultExtensions = [ this.options.editing ? Markdown : null, Document, - Text, + Text.extend({ + toMarkdown(state, node) { + const originalEsc = state.esc + state.esc = (text) => { + text = originalEsc.bind(state)(text) + return text.replace(/\\\[/g, '[').replace(/\\\]/g, ']') + } + state.text(node.textContent) + }, + }), Paragraph, HardBreak, Heading, diff --git a/src/tests/markdown.spec.js b/src/tests/markdown.spec.js index cc1686f5c7f..063586357a2 100644 --- a/src/tests/markdown.spec.js +++ b/src/tests/markdown.spec.js @@ -313,6 +313,28 @@ describe('Markdown serializer from html', () => { '
\n**summary**\n```\ncode\n```\n\n
\n', ) }) + + const assertKeepSyntax = (source) => { + const tiptap = createRichEditor() + tiptap.commands.setContent(markdownit.render(source)) + + const end = tiptap.state.doc.content.size - 1 + tiptap.commands.insertContentAt(end, ' editing') + + const serializer = createMarkdownSerializer(tiptap.schema) + const md = serializer.serialize(tiptap.state.doc) + expect(md).toBe(source + ' editing') + } + + test('keep syntax for brackets', () => { + assertKeepSyntax('test [[foo]] bar') + assertKeepSyntax('test ![[foo]] bar') + assertKeepSyntax('test ![[note#^block]] bar') + assertKeepSyntax('test [mytest] foo') + assertKeepSyntax('test [[mytest]] [abc](test) foo') + assertKeepSyntax('test #foo test') + assertKeepSyntax('\\\\[ test') + }) }) describe('Trailing nodes', () => {