From 0f02d1f839a2d109477696bf74cca3af470189d1 Mon Sep 17 00:00:00 2001 From: "julia.kirschenheuter" Date: Thu, 23 Jan 2025 16:03:48 +0100 Subject: [PATCH] fix(files): add `tiptap-text-direction` extension to support RTL Signed-off-by: julia.kirschenheuter --- package-lock.json | 17 +++++++++++++++++ package.json | 1 + src/css/prosemirror.scss | 8 ++++++++ src/extensions/RichText.js | 4 ++++ src/tests/tiptap.spec.js | 6 +++--- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1bbf42fe428..b9755459d45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,6 +78,7 @@ "proxy-polyfill": "^0.3.2", "slug": "^10.0.0", "tippy.js": "^6.3.7", + "tiptap-text-direction": "^0.3.2", "uuid": "^11.0.5", "vue": "^2.7.16", "vue-click-outside": "^1.1.0", @@ -23397,6 +23398,16 @@ "@popperjs/core": "^2.9.0" } }, + "node_modules/tiptap-text-direction": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tiptap-text-direction/-/tiptap-text-direction-0.3.2.tgz", + "integrity": "sha512-EBiJq4urei+joaBqhPUwaZ7bfmsSf62Lzd4KXm3T0kjtDC8pj3EFoXdi/9MEvbTsiY8iqx3S/kfRInRCMiN7ng==", + "license": "MIT", + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, "node_modules/tldts": { "version": "6.1.76", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.76.tgz", @@ -41687,6 +41698,12 @@ "@popperjs/core": "^2.9.0" } }, + "tiptap-text-direction": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tiptap-text-direction/-/tiptap-text-direction-0.3.2.tgz", + "integrity": "sha512-EBiJq4urei+joaBqhPUwaZ7bfmsSf62Lzd4KXm3T0kjtDC8pj3EFoXdi/9MEvbTsiY8iqx3S/kfRInRCMiN7ng==", + "requires": {} + }, "tldts": { "version": "6.1.76", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.76.tgz", diff --git a/package.json b/package.json index 999df552f24..645f8aa080d 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@tiptap/extension-collaboration-cursor": "^2.9.1", "@tiptap/extension-document": "^2.9.1", "@tiptap/extension-dropcursor": "^2.9.1", + "tiptap-text-direction": "^0.3.2", "@tiptap/extension-gapcursor": "^2.9.1", "@tiptap/extension-hard-break": "^2.9.1", "@tiptap/extension-heading": "^2.9.1", diff --git a/src/css/prosemirror.scss b/src/css/prosemirror.scss index 344c2fa996d..d69d7094976 100644 --- a/src/css/prosemirror.scss +++ b/src/css/prosemirror.scss @@ -284,6 +284,14 @@ div.ProseMirror { } } + li [dir="rtl"] { + text-align: right; + } + + li [dir="ltr"] { + text-align: left; + } + ul, ol { padding-left: 10px; margin-left: 10px; diff --git a/src/extensions/RichText.js b/src/extensions/RichText.js index bcacc24879f..9f6a688bf75 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -41,6 +41,7 @@ import TaskItem from './../nodes/TaskItem.js' import TaskList from './../nodes/TaskList.js' import Text from '@tiptap/extension-text' import TrailingNode from './../nodes/TrailingNode.js' +import TextDirection from 'tiptap-text-direction' /* eslint-enable import/no-named-as-default */ import { Strong, Italic, Strike, Link, Underline } from './../marks/index.js' @@ -111,6 +112,9 @@ export default Extension.create({ }), LinkBubble, TrailingNode, + TextDirection.configure({ + types: ['heading', 'paragraph', 'listItem', 'orderedList'], + }), ] const additionalExtensionNames = this.options.extensions.map(e => e.name) return [ diff --git a/src/tests/tiptap.spec.js b/src/tests/tiptap.spec.js index 2b8b5a6898a..c02f4b37aa0 100644 --- a/src/tests/tiptap.spec.js +++ b/src/tests/tiptap.spec.js @@ -16,16 +16,16 @@ const renderedHTML = (markdown) => { describe('TipTap', () => { it('render softbreaks', () => { const markdown = 'This\nis\none\nparagraph' - expect(renderedHTML(markdown)).toEqual(`

${markdown}

`) + expect(renderedHTML(markdown)).toEqual(`

${markdown}

`) }) it('render hardbreak', () => { const markdown = 'Hard line break \nNext Paragraph' - expect(renderedHTML(markdown)).toEqual('

Hard line break
Next Paragraph

') + expect(renderedHTML(markdown)).toEqual('

Hard line break
Next Paragraph

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