From a550f02fdae37d5e4104155be05fb59026ed8c7b 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 a1fea168836..a2744054adb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,6 +77,7 @@ "proxy-polyfill": "^0.3.2", "slug": "^9.1.0", "tippy.js": "^6.3.7", + "tiptap-text-direction": "^0.3.2", "uuid": "^9.0.1", "vue": "^2.7.16", "vue-click-outside": "^1.1.0", @@ -28427,6 +28428,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/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -51384,6 +51395,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": {} + }, "tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", diff --git a/package.json b/package.json index 62138828f32..fa8b237344b 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@tiptap/extension-collaboration-cursor": "^2.3.2", "@tiptap/extension-document": "^2.3.2", "@tiptap/extension-dropcursor": "^2.3.2", + "tiptap-text-direction": "^0.3.2", "@tiptap/extension-gapcursor": "^2.3.2", "@tiptap/extension-hard-break": "^2.3.2", "@tiptap/extension-heading": "^2.3.2", diff --git a/src/css/prosemirror.scss b/src/css/prosemirror.scss index 3ef1271ebef..b5c8c5a9a7d 100644 --- a/src/css/prosemirror.scss +++ b/src/css/prosemirror.scss @@ -277,6 +277,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 9a6e6c04f65..713da1b7800 100644 --- a/src/extensions/RichText.js +++ b/src/extensions/RichText.js @@ -57,6 +57,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' @@ -132,6 +133,9 @@ export default Extension.create({ }) : null, 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 f8312312489..d8b2a466b22 100644 --- a/src/tests/tiptap.spec.js +++ b/src/tests/tiptap.spec.js @@ -13,16 +13,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('') }) })