From 9ddab5a1348d8016c81baa5f7c558726d734a33e Mon Sep 17 00:00:00 2001 From: fantasticit Date: Tue, 22 Mar 2022 20:31:21 +0800 Subject: [PATCH] feat: improve copy paste --- .../tiptap/components/katex/index.module.scss | 2 +- .../tiptap/components/katex/index.tsx | 11 +- .../components/tiptap/extensions/banner.ts | 2 +- .../tiptap/extensions/horizontalRule.ts | 8 +- .../src/components/tiptap/extensions/katex.ts | 20 +- .../src/components/tiptap/extensions/paste.ts | 10 +- .../tiptap/menus/components/paragraph.tsx | 2 + .../markdown/htmlToProsemirror/README.md | 1 + .../markdown/htmlToProsemirror/index.ts | 7 + .../marks/bold.ts} | 2 +- .../marks/code.ts} | 3 +- .../marks/italic.ts} | 2 +- .../marks/link.ts} | 2 +- .../marks/mark.ts} | 3 + .../nodes}/blockQuote.ts | 2 +- .../nodes/bulletList.ts} | 8 +- .../htmlToProsemirror/nodes/codeBlock.ts | 9 + .../nodes/codeBlockWrapper.ts} | 3 +- .../nodes/hardBreak.ts} | 2 +- .../nodes/heading.ts} | 18 +- .../htmlToProsemirror/nodes/horizontalRule.ts | 9 + .../nodes/image.ts} | 2 +- .../markdown/htmlToProsemirror/nodes/katex.ts | 9 + .../htmlToProsemirror/nodes/listItem.ts | 16 ++ .../nodes/node.ts} | 4 +- .../nodes/orderedList.ts} | 2 +- .../nodes/paragraph.ts} | 2 +- .../nodes}/table.ts | 2 +- .../nodes}/tableCell.ts | 2 +- .../nodes}/tableHeader.ts | 2 +- .../nodes}/tableRow.ts | 2 +- .../nodes}/taskList.ts | 2 +- .../nodes}/taskListItem.ts | 2 +- .../nodes/text.ts} | 3 +- .../renderer.ts} | 67 +++--- .../markdown/htmlToProsemirror/utils.ts | 60 +++++ .../markdown/{ => markdownToHTML}/index.ts | 11 +- .../{ => markdownToHTML}/markdownBanner.ts | 0 .../markdown/markdownToHTML/markdownKatex.ts | 225 ++++++++++++++++++ .../{ => markdownToHTML}/markdownTable.ts | 0 .../{ => markdownToHTML}/markdownTaskList.ts | 0 .../{ => markdownToHTML}/markdownUnderline.ts | 0 .../markedownSplitMixedList.ts | 2 +- .../tiptap/services/markdown/serializer.ts | 37 +-- .../services/markdown/src/Nodes/CodeBlock.js | 29 --- .../services/markdown/src/Nodes/ListItem.js | 21 -- .../tiptap/services/markdown/src/utils.ts | 47 ---- packages/client/src/hooks/useTheme.tsx | 19 +- packages/client/src/styles/prosemirror.scss | 4 +- .../server/src/entities/document.entity.ts | 2 +- 50 files changed, 473 insertions(+), 227 deletions(-) create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/README.md create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/index.ts rename packages/client/src/components/tiptap/services/markdown/{src/Marks/Bold.js => htmlToProsemirror/marks/bold.ts} (83%) rename packages/client/src/components/tiptap/services/markdown/{src/Marks/Code.js => htmlToProsemirror/marks/code.ts} (88%) rename packages/client/src/components/tiptap/services/markdown/{src/Marks/Italic.js => htmlToProsemirror/marks/italic.ts} (83%) rename packages/client/src/components/tiptap/services/markdown/{src/Marks/Link.js => htmlToProsemirror/marks/link.ts} (87%) rename packages/client/src/components/tiptap/services/markdown/{src/Marks/Mark.js => htmlToProsemirror/marks/mark.ts} (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/blockQuote.ts (87%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/BulletList.js => htmlToProsemirror/nodes/bulletList.ts} (52%) create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/nodes/codeBlock.ts rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/CodeBlockWrapper.js => htmlToProsemirror/nodes/codeBlockWrapper.ts} (81%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/HardBreak.js => htmlToProsemirror/nodes/hardBreak.ts} (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/Heading.js => htmlToProsemirror/nodes/heading.ts} (56%) create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/nodes/horizontalRule.ts rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/Image.js => htmlToProsemirror/nodes/image.ts} (93%) create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/nodes/katex.ts create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/nodes/listItem.ts rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/Node.ts => htmlToProsemirror/nodes/node.ts} (85%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/OrderedList.js => htmlToProsemirror/nodes/orderedList.ts} (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/Paragraph.js => htmlToProsemirror/nodes/paragraph.ts} (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/table.ts (84%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/tableCell.ts (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/tableHeader.ts (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/tableRow.ts (80%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/taskList.ts (84%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes => htmlToProsemirror/nodes}/taskListItem.ts (85%) rename packages/client/src/components/tiptap/services/markdown/{src/Nodes/Text.js => htmlToProsemirror/nodes/text.ts} (89%) rename packages/client/src/components/tiptap/services/markdown/{src/Renderer.js => htmlToProsemirror/renderer.ts} (69%) create mode 100644 packages/client/src/components/tiptap/services/markdown/htmlToProsemirror/utils.ts rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/index.ts (74%) rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/markdownBanner.ts (100%) create mode 100644 packages/client/src/components/tiptap/services/markdown/markdownToHTML/markdownKatex.ts rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/markdownTable.ts (100%) rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/markdownTaskList.ts (100%) rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/markdownUnderline.ts (100%) rename packages/client/src/components/tiptap/services/markdown/{ => markdownToHTML}/markedownSplitMixedList.ts (97%) delete mode 100644 packages/client/src/components/tiptap/services/markdown/src/Nodes/CodeBlock.js delete mode 100644 packages/client/src/components/tiptap/services/markdown/src/Nodes/ListItem.js delete mode 100644 packages/client/src/components/tiptap/services/markdown/src/utils.ts diff --git a/packages/client/src/components/tiptap/components/katex/index.module.scss b/packages/client/src/components/tiptap/components/katex/index.module.scss index 9796867f..a77831f1 100644 --- a/packages/client/src/components/tiptap/components/katex/index.module.scss +++ b/packages/client/src/components/tiptap/components/katex/index.module.scss @@ -1,5 +1,5 @@ .wrap { margin: 8px 0; - display: flex; + display: inline-flex; justify-content: center; } diff --git a/packages/client/src/components/tiptap/components/katex/index.tsx b/packages/client/src/components/tiptap/components/katex/index.tsx index bf7371b3..47d74585 100644 --- a/packages/client/src/components/tiptap/components/katex/index.tsx +++ b/packages/client/src/components/tiptap/components/katex/index.tsx @@ -1,5 +1,5 @@ import { NodeViewWrapper, NodeViewContent } from '@tiptap/react'; -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import { Popover, TextArea, Typography, Space } from '@douyinfe/semi-ui'; import { IconHelpCircle } from '@douyinfe/semi-icons'; import katex from 'katex'; @@ -10,6 +10,9 @@ const { Text } = Typography; export const KatexWrapper = ({ editor, node, updateAttributes }) => { const isEditable = editor.isEditable; const { text } = node.attrs; + + console.log(node.attrs); + const formatText = useMemo(() => { try { return katex.renderToString(`${text}`); @@ -24,8 +27,12 @@ export const KatexWrapper = ({ editor, node, updateAttributes }) => { 点击输入公式 ); + // useEffect(() => { + // updateAttributes(node.attrs); + // }, []); + return ( - + {isEditable ? ( { diff --git a/packages/client/src/components/tiptap/extensions/horizontalRule.ts b/packages/client/src/components/tiptap/extensions/horizontalRule.ts index a39e38a2..f9c37438 100644 --- a/packages/client/src/components/tiptap/extensions/horizontalRule.ts +++ b/packages/client/src/components/tiptap/extensions/horizontalRule.ts @@ -19,18 +19,16 @@ export const HorizontalRule = Node.create({ addOptions() { return { - HTMLAttributes: { - class: 'hr-line', - }, + HTMLAttributes: {}, }; }, parseHTML() { - return [{ tag: 'div[class=hr-line]' }]; + return [{ tag: 'hr' }]; }, renderHTML({ HTMLAttributes }) { - return ['div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; + return ['hr', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; }, addCommands() { diff --git a/packages/client/src/components/tiptap/extensions/katex.ts b/packages/client/src/components/tiptap/extensions/katex.ts index 0df0480f..91b992ce 100644 --- a/packages/client/src/components/tiptap/extensions/katex.ts +++ b/packages/client/src/components/tiptap/extensions/katex.ts @@ -14,26 +14,36 @@ export const KatexInputRegex = /^\$\$(.+)?\$\$$/; export const Katex = Node.create({ name: 'katex', - group: 'block', - defining: true, - draggable: true, + group: 'inline', + inline: true, selectable: true, atom: true, + addOptions() { + return { + HTMLAttributes: { + class: 'katex', + }, + }; + }, + addAttributes() { return { text: { default: '', + parseHTML: (element) => { + return element.getAttribute('data-text'); + }, }, }; }, parseHTML() { - return [{ tag: 'div[data-type=katex]' }]; + return [{ tag: 'span.katex' }]; }, renderHTML({ HTMLAttributes }) { - return ['div', mergeAttributes((this.options && this.options.HTMLAttributes) || {}, HTMLAttributes)]; + return ['span', mergeAttributes((this.options && this.options.HTMLAttributes) || {}, HTMLAttributes)]; }, // @ts-ignore diff --git a/packages/client/src/components/tiptap/extensions/paste.ts b/packages/client/src/components/tiptap/extensions/paste.ts index b6f65658..e10401ac 100644 --- a/packages/client/src/components/tiptap/extensions/paste.ts +++ b/packages/client/src/components/tiptap/extensions/paste.ts @@ -1,6 +1,6 @@ import { Extension } from '@tiptap/core'; import { Plugin, PluginKey } from 'prosemirror-state'; -import { markdownSerializer } from '../services/markdown'; +import { markdownSerializer } from '../services/markdown/serializer'; import { EXTENSION_PRIORITY_HIGHEST } from '../constants'; import { handleFileEvent } from '../services/upload'; import { isInCode, LANGUAGES } from '../services/code'; @@ -63,16 +63,14 @@ export const Paste = Extension.create({ // 处理 markdown if (isMarkdown(text) || html.length === 0 || pasteCodeLanguage === 'markdown') { event.preventDefault(); - // FIXME: 由于 title schema 的存在导致反序列化必有 title 节点存在 const firstNode = view.props.state.doc.content.firstChild; const hasTitle = isTitleNode(firstNode) && firstNode.content.size > 0; - let schema = view.props.state.schema; - const doc = markdownSerializer.deserialize({ + const schema = view.props.state.schema; + const doc = markdownSerializer.markdownToProsemirror({ schema, content: normalizePastedMarkdown(text), hasTitle, }); - // @ts-ignore const transaction = view.state.tr.insert(view.state.selection.head, view.state.schema.nodeFromJSON(doc)); view.dispatch(transaction); @@ -113,7 +111,7 @@ export const Paste = Extension.create({ if (!doc) { return ''; } - const content = markdownSerializer.serialize({ + const content = markdownSerializer.proseMirrorToMarkdown({ schema: this.editor.schema, content: doc, }); diff --git a/packages/client/src/components/tiptap/menus/components/paragraph.tsx b/packages/client/src/components/tiptap/menus/components/paragraph.tsx index e45e9600..c42f5564 100644 --- a/packages/client/src/components/tiptap/menus/components/paragraph.tsx +++ b/packages/client/src/components/tiptap/menus/components/paragraph.tsx @@ -21,6 +21,8 @@ export const Paragraph = ({ editor }) => { } }, []); + console.log(getCurrentCaretTitle(editor)); + return (