Skip to content

fix(export): prevent DOCX corruption from entity encoding and orphaned delInstrText (SD-1943)#2102

Merged
harbournick merged 3 commits intomainfrom
caio/sd-1943-fix-entity-encoding-loss-in-docx-style-name-export
Feb 18, 2026
Merged

fix(export): prevent DOCX corruption from entity encoding and orphaned delInstrText (SD-1943)#2102
harbournick merged 3 commits intomainfrom
caio/sd-1943-fix-entity-encoding-loss-in-docx-style-name-export

Conversation

@caio-pizzol
Copy link
Contributor

Two sources of Word "unreadable content" error on exported files:

  1. Revert #replaceSpecialCharacters regex to simple .replace(/&/g, '&'). The negative lookahead from PR bug: superdoc webpage misrendered text (SD-1819) #1988 incorrectly treated decoded entity-like text (e.g. literal ") as already-encoded, collapsing distinct style names into duplicates in styles.xml.

  2. Normalize w:delInstrText → w:instrText in the exporter. During round-trip, w:del wrappers around field char runs lose their trackDelete marks (only text content gets marked), leaving w:delInstrText orphaned outside w:del — which violates ECMA-376 §17.16.13.

…d delInstrText

Two sources of Word "unreadable content" error on exported files:

1. Revert #replaceSpecialCharacters regex to simple .replace(/&/g, '&').
   The negative lookahead from PR #1988 incorrectly treated decoded entity-like
   text (e.g. literal ") as already-encoded, collapsing distinct style names
   into duplicates in styles.xml.

2. Normalize w:delInstrText → w:instrText in the exporter. During round-trip,
   w:del wrappers around field char runs lose their trackDelete marks (only text
   content gets marked), leaving w:delInstrText orphaned outside w:del — which
   violates ECMA-376 §17.16.13.

SD-1943
@linear
Copy link

linear bot commented Feb 18, 2026

@chatgpt-codex-connector
Copy link

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

Copy link
Collaborator

@harbournick harbournick left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@harbournick harbournick merged commit 56e917f into main Feb 18, 2026
3 checks passed
@harbournick harbournick deleted the caio/sd-1943-fix-entity-encoding-loss-in-docx-style-name-export branch February 18, 2026 21:31
@superdoc-bot
Copy link
Contributor

superdoc-bot bot commented Feb 18, 2026

🎉 This PR is included in superdoc v1.15.0-next.14

The release is available on GitHub release

harbournick pushed a commit that referenced this pull request Feb 20, 2026
# [1.15.0](v1.14.0...v1.15.0) (2026-02-20)

### Bug Fixes

* **ai-actions:** preserve html/markdown insertion and prevent repeated formatted replacement ([#2117](#2117)) ([9f685e9](9f685e9))
* **ai:** support headless mode in EditorAdapter.applyPatch ([#1859](#1859)) ([cf9275d](cf9275d))
* **collaboration:** memory leaks, Vue stack overflow, and Liveblocks stability (SD-1924) ([#2030](#2030)) ([a6827fd](a6827fd)), closes [#prepareDocumentForExport](https://github.com/superdoc-dev/superdoc/issues/prepareDocumentForExport)
* **collab:** prevent stale view when remote Y.js changes bypass sdBlockRev increment ([#2099](#2099)) ([0895a93](0895a93))
* **converter:** handle null list lvlText and always clear numbering cache ([#2113](#2113)) ([336958c](336958c))
* **document-api:** remove search match cap and validate moveComment bounds ([6d3de67](6d3de67))
* export docx blobs with docx mime type ([#1849](#1849)) ([1bc466d](1bc466d))
* **export:** prevent DOCX corruption from entity encoding and orphaned delInstrText (SD-1943) ([#2102](#2102)) ([56e917f](56e917f)), closes [#replaceSpecialCharacters](https://github.com/superdoc-dev/superdoc/issues/replaceSpecialCharacters) [#1988](#1988)
* **layout-bridge:** correct cell selection for tables with rowspan ([#1839](#1839)) ([0b782be](0b782be))
* **layout,converter:** text box rendering and page-relative anchor positioning (SD-1331, SD-1838) ([#2034](#2034)) ([3947f39](3947f39))
* **layout:** route list text-start calculations through resolveListTextStartPx ([02b14b8](02b14b8))
* **painter-dom:** use absolute page Y for page-relative anchors in header/footer decorations ([0b9bc72](0b9bc72))
* preserve selection highlight when opening toolbar dropdowns ([#2097](#2097)) ([a33568e](a33568e))
* structured content renders correct on hover and select ([#1843](#1843)) ([dab3f04](dab3f04))
* **super-editor:** add unsupported-content reporting across HTML/Markdown import paths ([#2115](#2115)) ([84880b7](84880b7))
* **super-editor:** handle partial comment file-sets and clean up stale parts on export ([#2123](#2123)) ([f63ae0a](f63ae0a))
* **super-editor:** restore <hr> contentBlock parsing and harden VML HR export fallback ([#2118](#2118)) ([da51b1f](da51b1f))
* table headers are incorrectly imported from html ([#2112](#2112)) ([e8d1480](e8d1480))
* table resizing regression ([#2091](#2091)) ([20ed24e](20ed24e))
* table resizing regression ([#2091](#2091)) ([9a07f1c](9a07f1c))
* **tables:** align tableHeader attrs with tableCell to fix oversized DOCX export widths ([#2114](#2114)) ([38f0430](38f0430))
* **tables:** fix autofit column scaling, cell width overflow, and page break splitting ([#1987](#1987)) ([61a3f6f](61a3f6f))
* **tables:** prevent tblInd double-shrink when using tblGrid widths (SD-1494) ([8750ece](8750ece))
* track changes comment text for formatting changes ([#2013](#2013)) ([b2a43ff](b2a43ff))
* wire DocumentApi to Editor.doc with lifecycle-safe caching ([57326ea](57326ea))

### Features

* cropped images ([#1940](#1940)) ([3767a49](3767a49))
* extend document-api with format, examples, create.heading ([#2092](#2092)) ([fdf8c7c](fdf8c7c))
* **lists:** support hidden list indicators via w:vanish ([#2069](#2069)) ([#2080](#2080)) ([0bed0fd](0bed0fd))
* the document API limited alpha ([#2087](#2087)) ([091c24c](091c24c))
@harbournick
Copy link
Collaborator

🎉 This PR is included in superdoc v1.15.0

The release is available on GitHub release

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants