diff --git a/packages/super-editor/src/core/super-converter/exporter.js b/packages/super-editor/src/core/super-converter/exporter.js index aa012ebf87..8a235ae464 100644 --- a/packages/super-editor/src/core/super-converter/exporter.js +++ b/packages/super-editor/src/core/super-converter/exporter.js @@ -95,6 +95,7 @@ export function exportSchemaToJson(params) { shapeTextbox: translateShapeTextbox, contentBlock: translateContentBlock, structuredContent: translateStructuredContent, + structuredContentBlock: translateStructuredContent, documentSection: translateDocumentSection, 'page-number': translatePageNumberNode, 'total-page-number': translateTotalPageNumberNode, diff --git a/packages/super-editor/src/core/super-converter/v2/importer/structuredDocumentNodeImporter.js b/packages/super-editor/src/core/super-converter/v2/importer/structuredDocumentNodeImporter.js index 075edc98e7..520614b8d9 100644 --- a/packages/super-editor/src/core/super-converter/v2/importer/structuredDocumentNodeImporter.js +++ b/packages/super-editor/src/core/super-converter/v2/importer/structuredDocumentNodeImporter.js @@ -28,12 +28,19 @@ export const handleSdtNode = (params) => { } catch {} const sdtContent = node.elements.find((el) => el.name === 'w:sdtContent'); + const par = sdtContent?.elements?.find((el) => el.name === 'w:p'); const { marks } = parseAnnotationMarks(sdtContent); const translatedContent = nodeListHandler.handler({ ...params, nodes: sdtContent?.elements }); + let structuredContentType = 'structuredContent'; + if (par) { + // If a paragraph or potentially another block node is found. + structuredContentType = 'structuredContentBlock'; + } + let result = { - type: 'structuredContent', + type: structuredContentType, content: translatedContent, marks, attrs: { diff --git a/packages/super-editor/src/extensions/index.js b/packages/super-editor/src/extensions/index.js index f38fbea6d4..975656b7a0 100644 --- a/packages/super-editor/src/extensions/index.js +++ b/packages/super-editor/src/extensions/index.js @@ -38,7 +38,7 @@ import { PageNumber, TotalPageCount } from './page-number/index.js'; import { ShapeContainer } from './shape-container/index.js'; import { ShapeTextbox } from './shape-textbox/index.js'; import { ContentBlock } from './content-block/index.js'; -import { StructuredContent, DocumentSection } from './structured-content/index.js'; +import { StructuredContent, StructuredContentBlock, DocumentSection } from './structured-content/index.js'; import { BlockNode } from './block-node/index.js'; // Marks extensions @@ -174,6 +174,7 @@ const getStarterExtensions = () => { ContentBlock, Search, StructuredContent, + StructuredContentBlock, DocumentSection, NodeResizer, CustomSelection, @@ -241,6 +242,7 @@ export { AiPlugin, Search, StructuredContent, + StructuredContentBlock, DocumentSection, NodeResizer, CustomSelection, diff --git a/packages/super-editor/src/extensions/structured-content/index.js b/packages/super-editor/src/extensions/structured-content/index.js index ac7b028935..4936aad54b 100644 --- a/packages/super-editor/src/extensions/structured-content/index.js +++ b/packages/super-editor/src/extensions/structured-content/index.js @@ -1,2 +1,3 @@ export * from './structured-content.js'; +export * from './structured-content-block.js'; export * from './document-section.js'; diff --git a/packages/super-editor/src/extensions/structured-content/structured-content-block.js b/packages/super-editor/src/extensions/structured-content/structured-content-block.js new file mode 100644 index 0000000000..a6e9427e51 --- /dev/null +++ b/packages/super-editor/src/extensions/structured-content/structured-content-block.js @@ -0,0 +1,34 @@ +import { Node, Attribute } from '@core/index.js'; + +export const StructuredContentBlock = Node.create({ + name: 'structuredContentBlock', + + group: 'block', + + content: 'block*', + + addOptions() { + return { + structuredContentClass: 'sd-structured-content-tag', + htmlAttributes: { + 'aria-label': 'Structured content block node', + }, + }; + }, + + parseDOM() { + return [{ tag: `div.${this.options.structuredContentClass}` }]; + }, + + renderDOM({ htmlAttributes }) { + return ['div', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0]; + }, + + addAttributes() { + return { + sdtPr: { + rendered: false, + }, + }; + }, +}); diff --git a/packages/super-editor/src/extensions/structured-content/structured-content.js b/packages/super-editor/src/extensions/structured-content/structured-content.js index 0a9a9d5516..badd8d435a 100644 --- a/packages/super-editor/src/extensions/structured-content/structured-content.js +++ b/packages/super-editor/src/extensions/structured-content/structured-content.js @@ -2,13 +2,16 @@ import { Node, Attribute } from '@core/index.js'; export const StructuredContent = Node.create({ name: 'structuredContent', + group: 'inline', + inline: true, + content: 'inline*', addOptions() { return { - annotationClass: 'sd-structured-content-tag', + structuredContentClass: 'sd-structured-content-tag', htmlAttributes: { 'aria-label': 'Structured content node', }, @@ -16,12 +19,7 @@ export const StructuredContent = Node.create({ }, parseDOM() { - return [ - { - tag: `span.${this.options.annotationClass}`, - priority: 60, - }, - ]; + return [{ tag: `span.${this.options.structuredContentClass}` }]; }, renderDOM({ htmlAttributes }) { diff --git a/packages/superdoc/src/stores/comments-store.js b/packages/superdoc/src/stores/comments-store.js index 8e3305e450..866a3afc41 100644 --- a/packages/superdoc/src/stores/comments-store.js +++ b/packages/superdoc/src/stores/comments-store.js @@ -467,11 +467,6 @@ export const useCommentsStore = defineStore('comments', () => { const createCommentForTrackChanges = (editor) => { let trackedChanges = trackChangesHelpers.getTrackChanges(editor.state); - let isLargeDoc = editor.state.doc.nodeSize >= 100_000; - - if (isLargeDoc && trackedChanges.length) { - trackedChanges = trackedChanges.slice(0, 100); - } const groupedChanges = groupChanges(trackedChanges);