diff options
author | Horus Lugo <horusgoul@gmail.com> | 2024-11-23 18:34:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-23 17:34:16 +0000 |
commit | 4dd62e24ea6e2fc3904678ca7af1236972e067e0 (patch) | |
tree | e5b17132f9cdf3f99d177f624edd6216855258eb /src | |
parent | d29599fa6cc2c402ae38417e114c0aee4db5d55b (diff) | |
download | voidsky-4dd62e24ea6e2fc3904678ca7af1236972e067e0.tar.zst |
Fix Newline handling in Web's Composer (#6658)
Diffstat (limited to 'src')
-rw-r--r-- | src/view/com/composer/text-input/TextInput.web.tsx | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/view/com/composer/text-input/TextInput.web.tsx b/src/view/com/composer/text-input/TextInput.web.tsx index 34d19e14c..5c56e34c4 100644 --- a/src/view/com/composer/text-input/TextInput.web.tsx +++ b/src/view/com/composer/text-input/TextInput.web.tsx @@ -11,6 +11,7 @@ import {Paragraph} from '@tiptap/extension-paragraph' import {Placeholder} from '@tiptap/extension-placeholder' import {Text as TiptapText} from '@tiptap/extension-text' import {generateJSON} from '@tiptap/html' +import {Fragment, Node, Slice} from '@tiptap/pm/model' import {EditorContent, JSONContent, useEditor} from '@tiptap/react' import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' @@ -166,6 +167,11 @@ export const TextInput = React.forwardRef(function TextInputImpl( const editor = useEditor( { extensions, + coreExtensionOptions: { + clipboardTextSerializer: { + blockSeparator: '\n', + }, + }, onFocus() { onFocus?.() }, @@ -173,6 +179,20 @@ export const TextInput = React.forwardRef(function TextInputImpl( attributes: { class: modeClass, }, + clipboardTextParser: (text, context) => { + const blocks = text.split(/(?:\r\n?|\n)/) + const nodes: Node[] = blocks.map(line => { + return Node.fromJSON( + context.doc.type.schema, + line.length > 0 + ? {type: 'paragraph', content: [{type: 'text', text: line}]} + : {type: 'paragraph', content: []}, + ) + }) + + const fragment = Fragment.fromArray(nodes) + return Slice.maxOpen(fragment) + }, handlePaste: (view, event) => { const clipboardData = event.clipboardData let preventDefault = false |