From e6ab3af30a8dfa2dc81e2e02caf9290b6e93e421 Mon Sep 17 00:00:00 2001 From: Felix Feng Date: Wed, 15 Jan 2025 18:35:48 +0800 Subject: [PATCH] fix --- .../deserializer/htmlDeserializerCodeBlock.ts | 8 ----- .../htmlDeserializerCodeBlockStatic.ts | 34 ------------------- .../code-block/src/lib/deserializer/index.ts | 1 - .../plugins/html/utils/deserializeHtmlNode.ts | 7 +++- .../html/utils/deserializeHtmlNodeChildren.ts | 17 +++++++--- .../html/utils/htmlElementToElement.ts | 5 +-- .../src/lib/static/deserialize/checkUtils.ts | 9 +++-- packages/table/src/lib/BaseTablePlugin.ts | 14 -------- 8 files changed, 28 insertions(+), 67 deletions(-) delete mode 100644 packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlockStatic.ts diff --git a/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlock.ts b/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlock.ts index 8d466da76b..a851fe83e1 100644 --- a/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlock.ts +++ b/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlock.ts @@ -4,7 +4,6 @@ import { BaseCodeBlockPlugin, BaseCodeLinePlugin, } from '../BaseCodeBlockPlugin'; -import { htmlDeserializerCodeBlockStatic } from './htmlDeserializerCodeBlockStatic'; export const htmlDeserializerCodeBlock: HtmlDeserializer = { parse: ({ element }) => { @@ -43,11 +42,4 @@ export const htmlDeserializerCodeBlock: HtmlDeserializer = { }, }, ], - toNodeProps({ element }) { - const staticCodeBlock = htmlDeserializerCodeBlockStatic(element); - - if (staticCodeBlock) { - return staticCodeBlock; - } - }, }; diff --git a/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlockStatic.ts b/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlockStatic.ts deleted file mode 100644 index a8559070c0..0000000000 --- a/packages/code-block/src/lib/deserializer/htmlDeserializerCodeBlockStatic.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { getSlateElements, isSlatePluginElement } from '@udecode/plate'; - -import { - BaseCodeBlockPlugin, - BaseCodeLinePlugin, -} from '../BaseCodeBlockPlugin'; - -export const htmlDeserializerCodeBlockStatic = (element: HTMLElement) => { - if (isSlatePluginElement(element, BaseCodeBlockPlugin.key)) { - const staticCodeLines = getSlateElements(element).filter((el) => - isSlatePluginElement(el, BaseCodeLinePlugin.key) - ); - - if (staticCodeLines) { - const codeLines = staticCodeLines.map((line) => { - const node: any = { - children: [{ text: line.textContent }], - type: BaseCodeLinePlugin.key, - }; - - if (line.dataset.slateId) { - node.id = line.dataset.slateId; - } - - return node; - }); - - return { - children: codeLines, - type: BaseCodeBlockPlugin.key, - }; - } - } -}; diff --git a/packages/code-block/src/lib/deserializer/index.ts b/packages/code-block/src/lib/deserializer/index.ts index 7b8d56f8f0..98d5afe51f 100644 --- a/packages/code-block/src/lib/deserializer/index.ts +++ b/packages/code-block/src/lib/deserializer/index.ts @@ -3,4 +3,3 @@ */ export * from './htmlDeserializerCodeBlock'; -export * from './htmlDeserializerCodeBlockStatic'; diff --git a/packages/core/src/lib/plugins/html/utils/deserializeHtmlNode.ts b/packages/core/src/lib/plugins/html/utils/deserializeHtmlNode.ts index 2d9116f343..10edc1a586 100644 --- a/packages/core/src/lib/plugins/html/utils/deserializeHtmlNode.ts +++ b/packages/core/src/lib/plugins/html/utils/deserializeHtmlNode.ts @@ -1,6 +1,7 @@ import type { SlateEditor } from '../../../editor'; import type { DeserializeHtmlNodeReturnType } from '../types'; +import { isSlateNode } from '../../../static'; import { htmlBodyToFragment } from './htmlBodyToFragment'; import { htmlBrToNewLine } from './htmlBrToNewLine'; import { htmlElementToElement } from './htmlElementToElement'; @@ -28,7 +29,11 @@ export const deserializeHtmlNode = if (fragment) return fragment; // element - const element = htmlElementToElement(editor, node as HTMLElement); + const element = htmlElementToElement( + editor, + node as HTMLElement, + isSlateNode(node as HTMLElement) + ); if (element) return element; diff --git a/packages/core/src/lib/plugins/html/utils/deserializeHtmlNodeChildren.ts b/packages/core/src/lib/plugins/html/utils/deserializeHtmlNodeChildren.ts index 014f70b2fa..b5be4dd807 100644 --- a/packages/core/src/lib/plugins/html/utils/deserializeHtmlNodeChildren.ts +++ b/packages/core/src/lib/plugins/html/utils/deserializeHtmlNodeChildren.ts @@ -1,12 +1,19 @@ import type { SlateEditor } from '../../../editor'; import type { DeserializeHtmlChildren } from '../types'; +import { isSlateNode } from '../../../static'; import { deserializeHtmlNode } from './deserializeHtmlNode'; export const deserializeHtmlNodeChildren = ( editor: SlateEditor, - node: ChildNode | HTMLElement -) => - Array.from(node.childNodes).flatMap( - deserializeHtmlNode(editor) - ) as DeserializeHtmlChildren[]; + node: ChildNode | HTMLElement, + isSlate = false +): DeserializeHtmlChildren[] => { + return Array.from(node.childNodes).flatMap((child) => { + if (child.nodeType === 1 && !isSlateNode(child as HTMLElement) && isSlate) { + return deserializeHtmlNodeChildren(editor, child as HTMLElement, isSlate); + } + + return deserializeHtmlNode(editor)(child); + }) as DeserializeHtmlChildren[]; +}; diff --git a/packages/core/src/lib/plugins/html/utils/htmlElementToElement.ts b/packages/core/src/lib/plugins/html/utils/htmlElementToElement.ts index 2ecb5aab2a..2612c717af 100644 --- a/packages/core/src/lib/plugins/html/utils/htmlElementToElement.ts +++ b/packages/core/src/lib/plugins/html/utils/htmlElementToElement.ts @@ -11,7 +11,8 @@ import { pipeDeserializeHtmlElement } from './pipeDeserializeHtmlElement'; /** Deserialize HTML to Element. */ export const htmlElementToElement = ( editor: SlateEditor, - element: HTMLElement + element: HTMLElement, + isSlate = false ) => { const deserialized = pipeDeserializeHtmlElement(editor, element); @@ -20,7 +21,7 @@ export const htmlElementToElement = ( let descendants = node.children ?? - (deserializeHtmlNodeChildren(editor, element) as Descendant[]); + (deserializeHtmlNodeChildren(editor, element, isSlate) as Descendant[]); if (descendants.length === 0 || withoutChildren || isSlateVoid(element)) { descendants = [{ text: '' }]; diff --git a/packages/core/src/lib/static/deserialize/checkUtils.ts b/packages/core/src/lib/static/deserialize/checkUtils.ts index 23549f5de5..860d68ec8d 100644 --- a/packages/core/src/lib/static/deserialize/checkUtils.ts +++ b/packages/core/src/lib/static/deserialize/checkUtils.ts @@ -6,10 +6,14 @@ export const isSlateElement = (element: HTMLElement) => { return element.dataset.slateNode === 'element'; }; -export const isSlateString = (element: HTMLElement) => { +export const isSlateText = (element: HTMLElement) => { return element.dataset.slateNode === 'text'; }; +export const isSlateString = (element: HTMLElement) => { + return element.dataset.slateString === 'true'; +}; + export const isSlateLeaf = (element: HTMLElement) => { return element.dataset.slateLeaf === 'true'; }; @@ -19,7 +23,8 @@ export const isSlateNode = (element: HTMLElement) => { isSlateLeaf(element) || isSlateElement(element) || isSlateVoid(element) || - isSlateString(element) + isSlateString(element) || + isSlateText(element) ); }; diff --git a/packages/table/src/lib/BaseTablePlugin.ts b/packages/table/src/lib/BaseTablePlugin.ts index 7ddeb920b5..2e660bccac 100644 --- a/packages/table/src/lib/BaseTablePlugin.ts +++ b/packages/table/src/lib/BaseTablePlugin.ts @@ -6,7 +6,6 @@ import { bindFirst, createSlatePlugin, createTSlatePlugin, - isSlatePluginElement, } from '@udecode/plate'; import type { TTableCellElement } from './types'; @@ -187,19 +186,6 @@ export const BaseTablePlugin = createTSlatePlugin({ parsers: { html: { deserializer: { - parse: ({ element, type }) => { - const parent = element.parentNode?.parentNode; - - if ( - parent && - element.tagName === 'TABLE' && - isSlatePluginElement(parent as HTMLElement, type) - ) { - return; - } - - return { type }; - }, rules: [{ validNodeName: 'TABLE' }], }, },