From d000c8f29076af14250dee10d466a8ef33d3a9cd Mon Sep 17 00:00:00 2001 From: Jonas Date: Fri, 6 Sep 2024 14:28:43 +0200 Subject: [PATCH] fix(TaskList): Add class name to rendered HTML The upstream Tiptap tasklist implementation uses data-type attributes to identify task lists and task items. We use class names instead as we depend on the markdown-it-task-lists plugin. This fixes copy & paste of task lists. Fixes: #5237 Signed-off-by: Jonas --- src/nodes/TaskItem.js | 4 ++-- src/nodes/TaskList.js | 5 +++++ src/tests/tiptap.spec.js | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/nodes/TaskItem.js b/src/nodes/TaskItem.js index 7e6305abf8a..de927c35842 100644 --- a/src/nodes/TaskItem.js +++ b/src/nodes/TaskItem.js @@ -42,7 +42,7 @@ const TaskItem = TipTapTaskItem.extend({ ], renderHTML({ node, HTMLAttributes }) { - const listAttributes = { class: 'checkbox-item' } + const listAttributes = { class: 'task-list-item checkbox-item' } const checkboxAttributes = { type: 'checkbox', class: '', contenteditable: false } if (node.attrs.checked) { checkboxAttributes.checked = true @@ -70,7 +70,7 @@ const TaskItem = TipTapTaskItem.extend({ state.renderContent(node) }, - addInputRules() { + addInputRules() { return [ ...this.parent(), wrappingInputRule({ diff --git a/src/nodes/TaskList.js b/src/nodes/TaskList.js index 38f1faac0fd..c02e960fddf 100644 --- a/src/nodes/TaskList.js +++ b/src/nodes/TaskList.js @@ -4,6 +4,7 @@ */ import TiptapTaskList from '@tiptap/extension-task-list' +import { mergeAttributes } from '@tiptap/core' const TaskList = TiptapTaskList.extend({ @@ -14,6 +15,10 @@ const TaskList = TiptapTaskList.extend({ }, ], + renderHTML({ HTMLAttributes }) { + return ['ul', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { class: 'contains-task-list' }), 0] + }, + addAttributes() { return { ...this.parent?.(), diff --git a/src/tests/tiptap.spec.js b/src/tests/tiptap.spec.js index dd3018ce349..4b6f4244496 100644 --- a/src/tests/tiptap.spec.js +++ b/src/tests/tiptap.spec.js @@ -25,4 +25,9 @@ describe('TipTap', () => { const markdown = 'Hard line break \nNext Paragraph' expect(renderedHTML(markdown)).toEqual('

Hard line break
Next Paragraph

') }) + + it('render taskList', () => { + const markdown = '* [ ] item 1\n' + expect(renderedHTML(markdown)).toEqual('') + }) })