diff --git a/packages/super-editor/src/core/Editor.ts b/packages/super-editor/src/core/Editor.ts index 25d2fe0b4..186818d30 100644 --- a/packages/super-editor/src/core/Editor.ts +++ b/packages/super-editor/src/core/Editor.ts @@ -2468,8 +2468,10 @@ export class Editor extends EventEmitter { updatedDocs['word/_rels/footnotes.xml.rels'] = String(footnotesRelsXml); } - if (preparedComments.length) { - const commentsXml = this.converter.schemaToXml(this.converter.convertedXml['word/comments.xml'].elements[0]); + // Check if comment files exist in convertedXml (they're removed when cleaning or empty array) + const commentsFile = this.converter.convertedXml['word/comments.xml']; + if (commentsFile?.elements?.[0]) { + const commentsXml = this.converter.schemaToXml(commentsFile.elements[0]); updatedDocs['word/comments.xml'] = String(commentsXml); const commentsExtended = this.converter.convertedXml['word/commentsExtended.xml']; diff --git a/packages/super-editor/src/core/super-converter/SuperConverter.js b/packages/super-editor/src/core/super-converter/SuperConverter.js index 81da0e830..9a9c52364 100644 --- a/packages/super-editor/src/core/super-converter/SuperConverter.js +++ b/packages/super-editor/src/core/super-converter/SuperConverter.js @@ -998,17 +998,16 @@ class SuperConverter { ); // Update content types and comments files as needed + // Always process comments - empty array means "export with no comments", not "preserve original" let updatedXml = { ...this.convertedXml }; let commentsRels = []; - if (comments.length) { - const { documentXml, relationships } = this.#prepareCommentsXmlFilesForExport({ - defs: params.exportedCommentDefs, - exportType: commentsExportType, - commentsWithParaIds, - }); - updatedXml = { ...documentXml }; - commentsRels = relationships; - } + const { documentXml, relationships } = this.#prepareCommentsXmlFilesForExport({ + defs: params.exportedCommentDefs, + exportType: commentsExportType, + commentsWithParaIds, + }); + updatedXml = { ...documentXml }; + commentsRels = relationships; this.convertedXml = { ...this.convertedXml, ...updatedXml }; diff --git a/packages/super-editor/src/core/super-converter/v2/exporter/commentsExporter.js b/packages/super-editor/src/core/super-converter/v2/exporter/commentsExporter.js index 06a56757b..b5ba84e55 100644 --- a/packages/super-editor/src/core/super-converter/v2/exporter/commentsExporter.js +++ b/packages/super-editor/src/core/super-converter/v2/exporter/commentsExporter.js @@ -354,7 +354,8 @@ export const prepareCommentsXmlFilesForExport = ({ }) => { const relationships = []; - if (exportType === 'clean') { + // Remove comment files if explicitly cleaning OR if no comments to export (empty array) + if (exportType === 'clean' || commentsWithParaIds.length === 0) { const documentXml = removeCommentsFilesFromConvertedXml(convertedXml); return { documentXml, relationships }; } diff --git a/packages/super-editor/src/extensions/search/SearchIndex.js b/packages/super-editor/src/extensions/search/SearchIndex.js index 22e365201..37970bc67 100644 --- a/packages/super-editor/src/extensions/search/SearchIndex.js +++ b/packages/super-editor/src/extensions/search/SearchIndex.js @@ -270,10 +270,10 @@ export class SearchIndex { * @returns {string} Regex pattern string */ static toFlexiblePattern(searchString) { - // Split by whitespace, escape each part, rejoin with \s+ - const parts = searchString.split(/\s+/).filter((part) => part.length > 0); + // Split by whitespace (including non-breaking spaces), escape each part, rejoin with flexible whitespace pattern + const parts = searchString.split(/[\s\u00a0]+/).filter((part) => part.length > 0); if (parts.length === 0) return ''; - return parts.map((part) => SearchIndex.escapeRegex(part)).join('\\s+'); + return parts.map((part) => SearchIndex.escapeRegex(part)).join('[\\s\\u00a0]+'); } /**