From 305bca59de233f715948418520c4164d4bfc1c44 Mon Sep 17 00:00:00 2001 From: Antonella Sgarlatta Date: Thu, 25 Sep 2025 11:28:46 -0300 Subject: [PATCH] fix: Fixes pasting from Google Docs always uses bold font --- .../Components/SuperEditor/BlocksEditor.tsx | 2 + .../GoogleDocsPastePlugin.tsx | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 packages/web/src/javascripts/Components/SuperEditor/Plugins/GoogleDocsPastePlugin/GoogleDocsPastePlugin.tsx diff --git a/packages/web/src/javascripts/Components/SuperEditor/BlocksEditor.tsx b/packages/web/src/javascripts/Components/SuperEditor/BlocksEditor.tsx index 003a99d5e13..7b5b01f0eb1 100644 --- a/packages/web/src/javascripts/Components/SuperEditor/BlocksEditor.tsx +++ b/packages/web/src/javascripts/Components/SuperEditor/BlocksEditor.tsx @@ -31,6 +31,7 @@ import AutoLinkPlugin from './Plugins/AutoLinkPlugin/AutoLinkPlugin' import DatetimePlugin from './Plugins/DateTimePlugin/DateTimePlugin' import PasswordPlugin from './Plugins/PasswordPlugin/PasswordPlugin' import { CheckListPlugin } from './Plugins/CheckListPlugin' +import GoogleDocsPastePlugin from './Plugins/GoogleDocsPastePlugin/GoogleDocsPastePlugin' type BlocksEditorProps = { onChange?: (value: string, preview: string) => void @@ -131,6 +132,7 @@ export const BlocksEditor: FunctionComponent = ({ + {!readonly && floatingAnchorElem && ( <> diff --git a/packages/web/src/javascripts/Components/SuperEditor/Plugins/GoogleDocsPastePlugin/GoogleDocsPastePlugin.tsx b/packages/web/src/javascripts/Components/SuperEditor/Plugins/GoogleDocsPastePlugin/GoogleDocsPastePlugin.tsx new file mode 100644 index 00000000000..8c8fb3afcc5 --- /dev/null +++ b/packages/web/src/javascripts/Components/SuperEditor/Plugins/GoogleDocsPastePlugin/GoogleDocsPastePlugin.tsx @@ -0,0 +1,50 @@ +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { useEffect } from 'react' +import { $getSelection, COMMAND_PRIORITY_NORMAL, PASTE_COMMAND } from 'lexical' +import { $insertDataTransferForRichText } from '@lexical/clipboard' + +export default function GoogleDocsPastePlugin(): JSX.Element | null { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + return editor.registerCommand( + PASTE_COMMAND, + (event) => { + if (!(event instanceof ClipboardEvent)) { + return false + } + + const html = event.clipboardData?.getData('text/html') + if (!html) { + return false + } + + const selection = $getSelection() + if (!selection) { + return false + } + + const googleDocRegex = //i + if (!googleDocRegex.test(html)) { + return false + } + + let cleaned = html.replace(googleDocRegex, '') + cleaned = cleaned.replace('', '') + + const plain = event.clipboardData?.getData('text/plain') ?? '' + const dataTransferShim = { + getData: (type: string) => (type === 'text/html' ? cleaned : plain), + types: ['text/html', 'text/plain'], + } as unknown as DataTransfer + + event.preventDefault() + $insertDataTransferForRichText(dataTransferShim, selection, editor) + return true + }, + COMMAND_PRIORITY_NORMAL, + ) + }, [editor]) + + return null +}