From 6562286c9912dcb28e17f6bdb54a9ede7b6aa306 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 07:17:28 -0700 Subject: [PATCH 1/6] fix(super-editor): preserve per-script font in mark round-trip (SD-2517) decodeRPrFromMarks was flattening all font scripts (ascii, eastAsia, hAnsi, cs) to the ascii font value, ignoring the eastAsiaFontFamily attribute already preserved on the mark during encode. This caused getInlineRunProperties to falsely classify fontFamily as an inline override (mark says eastAsia=Arial, style says eastAsia=Times New Roman), which polluted runPropertiesInlineKeys and made the exporter emit w:rFonts on heading runs that should inherit from the paragraph style. The fix adds an eastAsiaFontFamily case to decodeRPrFromMarks so the per-script font data survives the mark round-trip. With correct data, the existing inline/style comparison works without heuristics. --- .../editors/v1/core/super-converter/styles.js | 9 ++++++ .../v1/core/super-converter/styles.test.js | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/super-editor/src/editors/v1/core/super-converter/styles.js b/packages/super-editor/src/editors/v1/core/super-converter/styles.js index 54305523ad..ec4f659f1a 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/styles.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/styles.js @@ -599,6 +599,15 @@ export function decodeRPrFromMarks(marks) { runProperties.fontFamily = result; } break; + case 'eastAsiaFontFamily': + // Restore per-script East Asian font from the mark attribute preserved + // during encode (styles.js line 117). Without this, decodeRPrFromMarks + // flattens all scripts to the ascii font, causing getInlineRunProperties + // to falsely classify fontFamily as inline. (SD-2517) + if (value != null && runProperties.fontFamily) { + runProperties.fontFamily.eastAsia = value.split(',')[0].trim(); + } + break; case 'vertAlign': if (value != null) { runProperties.vertAlign = value; diff --git a/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js b/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js index e46295acf0..9d33493aee 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js @@ -538,4 +538,35 @@ describe('marks encoding/decoding round-trip', () => { // encodeMarksFromRPr doesn't handle 'caps', so it produces no textTransform mark. expect(marksFromCaps.some((m) => m.type === 'textStyle' && m.attrs.textTransform)).toBe(false); }); + + // SD-2517: eastAsiaFontFamily must survive the mark round-trip + it('preserves eastAsia font through encode → decode round-trip', () => { + const rPr = { + fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'Times New Roman', cs: 'Times New Roman' }, + }; + const marks = encodeMarksFromRPr(rPr, {}); + const textStyleMark = marks.find((m) => m.type === 'textStyle'); + // Encode should set eastAsiaFontFamily when it differs from ascii + expect(textStyleMark.attrs.eastAsiaFontFamily).toMatch(/^Times New Roman/); + + const decoded = decodeRPrFromMarks(marks); + // Decode should restore the eastAsia font, not flatten it to the ascii font + expect(decoded.fontFamily.eastAsia).toMatch(/^Times New Roman/); + expect(decoded.fontFamily.ascii).toMatch(/^Arial/); + expect(decoded.fontFamily.hAnsi).toBe('Arial'); + }); + + it('flattens all scripts to ascii when eastAsia matches ascii', () => { + const rPr = { + fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'Arial', cs: 'Arial' }, + }; + const marks = encodeMarksFromRPr(rPr, {}); + const textStyleMark = marks.find((m) => m.type === 'textStyle'); + // No eastAsiaFontFamily when it matches the ascii font + expect(textStyleMark.attrs.eastAsiaFontFamily).toBeUndefined(); + + const decoded = decodeRPrFromMarks(marks); + // All scripts should be Arial (default flatten behavior) + expect(decoded.fontFamily).toEqual({ ascii: 'Arial', eastAsia: 'Arial', hAnsi: 'Arial', cs: 'Arial' }); + }); }); From 5d17b0985f37c6fdf6ef1cea32784d1bffd0c756 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 08:12:15 -0700 Subject: [PATCH 2/6] fix(super-editor): preserve per-script fonts and inline keys metadata (SD-2517) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zero-edit round-trip was injecting 197 w:rFonts into heading runs. Root cause: decodeRPrFromMarks flattened all font scripts (eastAsia, cs) to the ascii font value. This made getInlineRunProperties falsely classify fontFamily as inline (mark says cs=Arial, style says cs=Times New Roman), polluting runPropertiesInlineKeys and causing the exporter to emit w:rFonts on runs that should inherit from the paragraph style. Two fixes applied together: 1. Mark round-trip fidelity (styles.js): Encode and decode eastAsiaFontFamily and csFontFamily as separate mark attributes so per-script fonts survive the mark round-trip per ECMA-376 §17.3.2.26. 2. Plugin inline keys guard (calculateInlineRunPropertiesPlugin.js): When the importer set runPropertiesInlineKeys to [] (nothing inline), don't add mark-derived keys unless the user genuinely applied new formatting (detected via hasNewInlineProps). This handles remaining edge cases where theme font resolution (hAnsiTheme) still causes false positives. --- .../editors/v1/core/super-converter/styles.js | 35 +++++-- .../v1/core/super-converter/styles.test.js | 39 +++++--- .../v3/handlers/w/r/helpers/helpers.js | 2 + .../v1/extensions/diffing/computeDiff.test.js | 4 +- .../run/calculateInlineRunPropertiesPlugin.js | 60 +++++++++--- ...calculateInlineRunPropertiesPlugin.test.js | 98 +++++++++++++++++++ .../v1/extensions/types/mark-attributes.ts | 4 +- 7 files changed, 209 insertions(+), 33 deletions(-) diff --git a/packages/super-editor/src/editors/v1/core/super-converter/styles.js b/packages/super-editor/src/editors/v1/core/super-converter/styles.js index ec4f659f1a..3bd7c1408e 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/styles.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/styles.js @@ -109,12 +109,24 @@ export function encodeMarksFromRPr(runProperties, docx) { const fontFamily = resolveDocxFontFamily(value, docx, getToCssFontFamily()); textStyleAttrs[key] = fontFamily; // value can be a string (from resolveRunPropertiesFromParagraphStyle) or an object - const eastAsiaFamily = typeof value === 'object' && value !== null ? value['eastAsia'] : undefined; - - if (eastAsiaFamily) { - const eastAsiaCss = getFontFamilyValue({ 'w:ascii': eastAsiaFamily }, docx); - if (!fontFamily || eastAsiaCss !== textStyleAttrs.fontFamily) { - textStyleAttrs.eastAsiaFontFamily = eastAsiaCss; + // Preserve per-script fonts when they differ from ascii (ECMA-376 §17.3.2.26: + // ascii, hAnsi, eastAsia, cs are independent font slots). Without this, the mark + // round-trip flattens all scripts to the ascii font, causing false-positive inline + // detection and w:rFonts injection on export. (SD-2517) + if (typeof value === 'object' && value !== null) { + const eastAsiaFamily = value['eastAsia']; + if (eastAsiaFamily) { + const eastAsiaCss = getFontFamilyValue({ 'w:ascii': eastAsiaFamily }, docx); + if (!fontFamily || eastAsiaCss !== textStyleAttrs.fontFamily) { + textStyleAttrs.eastAsiaFontFamily = eastAsiaCss; + } + } + const csFamily = value['cs']; + if (csFamily) { + const csCss = getFontFamilyValue({ 'w:ascii': csFamily }, docx); + if (!fontFamily || csCss !== textStyleAttrs.fontFamily) { + textStyleAttrs.csFontFamily = csCss; + } } } break; @@ -601,13 +613,18 @@ export function decodeRPrFromMarks(marks) { break; case 'eastAsiaFontFamily': // Restore per-script East Asian font from the mark attribute preserved - // during encode (styles.js line 117). Without this, decodeRPrFromMarks - // flattens all scripts to the ascii font, causing getInlineRunProperties - // to falsely classify fontFamily as inline. (SD-2517) + // during encode. Without this, decodeRPrFromMarks flattens all scripts + // to the ascii font, causing false-positive inline detection. (SD-2517) if (value != null && runProperties.fontFamily) { runProperties.fontFamily.eastAsia = value.split(',')[0].trim(); } break; + case 'csFontFamily': + // Restore per-script Complex Script font (same pattern as eastAsia). + if (value != null && runProperties.fontFamily) { + runProperties.fontFamily.cs = value.split(',')[0].trim(); + } + break; case 'vertAlign': if (value != null) { runProperties.vertAlign = value; diff --git a/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js b/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js index 9d33493aee..1bda851e23 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/styles.test.js @@ -539,34 +539,51 @@ describe('marks encoding/decoding round-trip', () => { expect(marksFromCaps.some((m) => m.type === 'textStyle' && m.attrs.textTransform)).toBe(false); }); - // SD-2517: eastAsiaFontFamily must survive the mark round-trip - it('preserves eastAsia font through encode → decode round-trip', () => { + // SD-2517: per-script fonts (eastAsia, cs) must survive the mark round-trip. + // ECMA-376 §17.3.2.26 defines 4 independent font slots: ascii, hAnsi, eastAsia, cs. + it('preserves per-script fonts (eastAsia, cs) through encode → decode round-trip', () => { const rPr = { - fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'Times New Roman', cs: 'Times New Roman' }, + fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'MS Mincho', cs: 'Times New Roman' }, }; const marks = encodeMarksFromRPr(rPr, {}); const textStyleMark = marks.find((m) => m.type === 'textStyle'); - // Encode should set eastAsiaFontFamily when it differs from ascii - expect(textStyleMark.attrs.eastAsiaFontFamily).toMatch(/^Times New Roman/); + // Encode should preserve per-script fonts as separate mark attributes + expect(textStyleMark.attrs.eastAsiaFontFamily).toMatch(/^MS Mincho/); + expect(textStyleMark.attrs.csFontFamily).toMatch(/^Times New Roman/); const decoded = decodeRPrFromMarks(marks); - // Decode should restore the eastAsia font, not flatten it to the ascii font - expect(decoded.fontFamily.eastAsia).toMatch(/^Times New Roman/); + // Decode should restore per-script fonts, not flatten to ascii expect(decoded.fontFamily.ascii).toMatch(/^Arial/); - expect(decoded.fontFamily.hAnsi).toBe('Arial'); + expect(decoded.fontFamily.hAnsi).toMatch(/^Arial/); + expect(decoded.fontFamily.eastAsia).toMatch(/^MS Mincho/); + expect(decoded.fontFamily.cs).toMatch(/^Times New Roman/); }); - it('flattens all scripts to ascii when eastAsia matches ascii', () => { + it('omits per-script mark attrs when all scripts match ascii', () => { const rPr = { fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'Arial', cs: 'Arial' }, }; const marks = encodeMarksFromRPr(rPr, {}); const textStyleMark = marks.find((m) => m.type === 'textStyle'); - // No eastAsiaFontFamily when it matches the ascii font expect(textStyleMark.attrs.eastAsiaFontFamily).toBeUndefined(); + expect(textStyleMark.attrs.csFontFamily).toBeUndefined(); const decoded = decodeRPrFromMarks(marks); - // All scripts should be Arial (default flatten behavior) expect(decoded.fontFamily).toEqual({ ascii: 'Arial', eastAsia: 'Arial', hAnsi: 'Arial', cs: 'Arial' }); }); + + it('preserves cs font when only cs differs from ascii', () => { + const rPr = { + fontFamily: { ascii: 'Arial', hAnsi: 'Arial', eastAsia: 'Arial', cs: 'Times New Roman' }, + }; + const marks = encodeMarksFromRPr(rPr, {}); + const textStyleMark = marks.find((m) => m.type === 'textStyle'); + expect(textStyleMark.attrs.eastAsiaFontFamily).toBeUndefined(); + expect(textStyleMark.attrs.csFontFamily).toMatch(/^Times New Roman/); + + const decoded = decodeRPrFromMarks(marks); + expect(decoded.fontFamily.ascii).toMatch(/^Arial/); + expect(decoded.fontFamily.cs).toMatch(/^Times New Roman/); + expect(decoded.fontFamily.eastAsia).toMatch(/^Arial/); + }); }); diff --git a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js index 347d587076..8815ff3e9c 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js @@ -9,6 +9,8 @@ export const resolveFontFamily = (textStyleAttrs, text) => { if (!eastAsiaFont) return textStyleAttrs; const normalized = { ...textStyleAttrs }; delete normalized.eastAsiaFontFamily; + // Note: csFontFamily is deliberately preserved — it's round-trip metadata + // consumed by decodeRPrFromMarks to restore per-script fonts. (SD-2517) const shouldUseEastAsia = typeof text === 'string' && containsEastAsianCharacters(text); if (!shouldUseEastAsia) return normalized; return { ...normalized, fontFamily: eastAsiaFont }; diff --git a/packages/super-editor/src/editors/v1/extensions/diffing/computeDiff.test.js b/packages/super-editor/src/editors/v1/extensions/diffing/computeDiff.test.js index ac9718e1e1..c33c514fa2 100644 --- a/packages/super-editor/src/editors/v1/extensions/diffing/computeDiff.test.js +++ b/packages/super-editor/src/editors/v1/extensions/diffing/computeDiff.test.js @@ -243,8 +243,10 @@ describe('Diff', () => { 'runProperties.boldCs': true, }); expect(formattingRunAttrsDiff.deleted).toEqual({}); + // SD-2517: importer now preserves [] for runs with no inline w:rPr. + // When user adds bold (diff_after7), hasNewInlineProps triggers mark key addition. expect(formattingRunAttrsDiff.modified?.runPropertiesInlineKeys).toEqual({ - from: ['fontFamily', 'fontSize'], + from: [], to: ['bold', 'boldCs', 'fontFamily', 'fontSize'], }); expect(formattingRunAttrsDiff.modified?.rsidRPr).toMatchObject({ diff --git a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js index 97c304c729..8358013d1c 100644 --- a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js +++ b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js @@ -102,43 +102,81 @@ export const calculateInlineRunPropertiesPlugin = (editor) => const runProperties = firstInlineProps ?? null; const existingInlineKeys = runNode.attrs?.runPropertiesInlineKeys || []; + // [] means "importer explicitly found nothing inline"; null means "no metadata" (legacy). + // The exporter treats null as "export all keys" for backward compat, so [] must be preserved. + const hadInlineKeysMetadata = Array.isArray(runNode.attrs?.runPropertiesInlineKeys); const styleKeys = runNode.attrs?.runPropertiesStyleKeys || []; const keysFromMarks = (segment) => { const textNode = segment.content?.find((n) => n.isText); return Object.keys(decodeRPrFromMarks(textNode?.marks || [])); }; const overrideKeysFromInlineProps = (inlineProps) => styleKeys.filter((k) => inlineProps && k in inlineProps); + + // When the importer set an empty inline keys list ([]), it means the original run + // had no inline w:rPr — all properties are style-inherited. Preserve that decision + // unless the user has genuinely added new formatting (detected by new keys appearing + // in computed inline props that weren't in the previous run properties). + // + // Without this guard, mark-derived keys (e.g. fontFamily from paragraph style) get + // added to the allow-list. Marks lose per-script fidelity through the round-trip + // (eastAsia/cs get flattened to the ascii font), causing the exporter to emit inline + // w:rPr that breaks style inheritance in Word. (SD-2517 / IT-907) + const existingRunPropsKeys = new Set( + runNode.attrs?.runProperties ? Object.keys(runNode.attrs.runProperties) : [], + ); + + /** + * Compute inline keys for a segment, respecting the [] vs null distinction. + * @param {Record|null} segmentInlineProps - Computed inline props for this segment + * @param {{ content: import('prosemirror-model').Node[] }} segment - The segment to extract mark keys from + * @returns {{ inlineKeys: string[]|null, overrideKeys: string[]|null }} + */ + const computeSegmentKeys = (segmentInlineProps, segment) => { + // Detect genuinely new inline properties (user-applied formatting, not just + // recomputation artifacts from mark round-trip fidelity loss). + const hasNewInlineProps = + segmentInlineProps != null && Object.keys(segmentInlineProps).some((k) => !existingRunPropsKeys.has(k)); + const shouldAddMarkKeys = !hadInlineKeysMetadata || existingInlineKeys.length > 0 || hasNewInlineProps; + const markKeysToAdd = shouldAddMarkKeys ? keysFromMarks(segment) : []; + const keys = [...new Set([...existingInlineKeys, ...markKeysToAdd])]; + return { + inlineKeys: keys.length ? keys : hadInlineKeysMetadata ? [] : null, + overrideKeys: (() => { + const ok = overrideKeysFromInlineProps(segmentInlineProps); + return ok?.length ? ok : null; + })(), + }; + }; + if (segments.length === 1) { const hadInlineKeys = Array.isArray(runNode.attrs?.runPropertiesInlineKeys) && runNode.attrs.runPropertiesInlineKeys.length > 0; if (JSON.stringify(runProperties) === JSON.stringify(runNode.attrs.runProperties) && hadInlineKeys) return; - // Allow-list = prior inline keys ∪ mark keys only. Do not union Object.keys(runProperties): runs often - // carry resolved paragraph-style noise in runProperties; listing every key would re-export it on w:rPr - // and bloat document.xml. Importer / plan-engine must seed runPropertiesInlineKeys for true OOXML keys. - const newInlineKeys = [...new Set([...existingInlineKeys, ...keysFromMarks(segments[0])])]; - const newOverrideKeys = overrideKeysFromInlineProps(runProperties); + const { inlineKeys: newInlineKeys, overrideKeys: newOverrideKeys } = computeSegmentKeys( + runProperties, + segments[0], + ); tr.setNodeMarkup( mappedPos, runNode.type, { ...runNode.attrs, runProperties, - runPropertiesInlineKeys: newInlineKeys.length ? newInlineKeys : null, - runPropertiesOverrideKeys: newOverrideKeys.length ? newOverrideKeys : null, + runPropertiesInlineKeys: newInlineKeys, + runPropertiesOverrideKeys: newOverrideKeys, }, runNode.marks, ); } else { const newRuns = segments.map((segment) => { const props = segment.inlineProps ?? null; - const segmentInlineKeys = [...new Set([...existingInlineKeys, ...keysFromMarks(segment)])]; - const segmentOverrideKeys = overrideKeysFromInlineProps(props); + const { inlineKeys: segInlineKeys, overrideKeys: segOverrideKeys } = computeSegmentKeys(props, segment); return runType.create( { ...(runNode.attrs ?? {}), runProperties: props, - runPropertiesInlineKeys: segmentInlineKeys.length ? segmentInlineKeys : null, - runPropertiesOverrideKeys: segmentOverrideKeys.length ? segmentOverrideKeys : null, + runPropertiesInlineKeys: segInlineKeys, + runPropertiesOverrideKeys: segOverrideKeys, }, Fragment.fromArray(segment.content), runNode.marks, diff --git a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.test.js b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.test.js index a8b7ba5c06..5b510c94e4 100644 --- a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.test.js +++ b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.test.js @@ -759,4 +759,102 @@ describe('calculateInlineRunPropertiesPlugin', () => { const boldRun = finalState.doc.nodeAt(runs[1]); expect(boldRun?.attrs.runProperties).toEqual({ bold: true }); }); + + // SD-2517: empty inline keys metadata preservation + describe('SD-2517: empty inline keys [] vs null semantics', () => { + it('preserves runPropertiesInlineKeys: [] when no user edits occur (zero-edit round-trip)', () => { + // Simulate a run imported with no inline w:rPr ([] from importer). + // The plugin should not pollute the allow-list with mark-derived keys. + decodeRPrFromMarksMock.mockImplementation(() => ({ fontFamily: { ascii: 'Arial' } })); + resolveRunPropertiesMock.mockImplementation(() => ({ fontFamily: { ascii: 'Arial' } })); + + const schema = makeSchema(); + const doc = paragraphDoc( + schema, + { + runProperties: { fontFamily: { ascii: 'Arial' }, lang: { val: 'pt-BR' } }, + runPropertiesInlineKeys: [], + runPropertiesStyleKeys: null, + runPropertiesOverrideKeys: null, + }, + [], + 'Heading text', + ); + const state = createState(schema, doc); + + // Trigger a doc change so the plugin fires (simulates another plugin changing the doc) + const textPos = runPos(state.doc) + 1; + const tr = state.tr.insertText('X', textPos).delete(textPos, textPos + 1); + const { state: nextState } = state.applyTransaction(tr); + + const runNode = nextState.doc.nodeAt(runPos(nextState.doc) ?? 0); + // The inline keys should remain [] (or at most not contain fontFamily) + const inlineKeys = runNode?.attrs.runPropertiesInlineKeys; + expect(inlineKeys === null || (Array.isArray(inlineKeys) && !inlineKeys.includes('fontFamily'))).toBe(true); + }); + + it('adds mark keys when user applies new formatting to a run with empty inline keys', () => { + // A run imported with [] gets user-applied bold → bold should appear in inline keys. + decodeRPrFromMarksMock.mockImplementation((marks) => ({ + bold: marks.some((mark) => mark.type.name === 'bold'), + fontFamily: { ascii: 'Arial' }, + })); + // resolveRunProperties returns style-resolved props WITHOUT bold (style doesn't define bold) + resolveRunPropertiesMock.mockImplementation(() => ({ fontFamily: { ascii: 'Arial' } })); + + const schema = makeSchema(); + const doc = paragraphDoc( + schema, + { + runProperties: { lang: { val: 'pt-BR' } }, + runPropertiesInlineKeys: [], + runPropertiesStyleKeys: null, + runPropertiesOverrideKeys: null, + }, + [], + 'Hello', + ); + const state = createState(schema, doc); + const { from, to } = runTextRange(state.doc, 0, 5); + + const tr = state.tr.addMark(from, to, schema.marks.bold.create()); + const { state: nextState } = state.applyTransaction(tr); + + const runNode = nextState.doc.nodeAt(runPos(nextState.doc) ?? 0); + // bold should be in inline keys (it's a genuine user edit) + expect(runNode?.attrs.runPropertiesInlineKeys).toContain('bold'); + }); + + it('preserves null inline keys for legacy runs (backward compatibility)', () => { + // Legacy collab payloads have runPropertiesInlineKeys: null. + // The plugin should keep null (not convert to []). + decodeRPrFromMarksMock.mockImplementation(() => ({ bold: false })); + resolveRunPropertiesMock.mockImplementation(() => ({ bold: false })); + + const schema = makeSchema(); + const doc = paragraphDoc( + schema, + { + runProperties: { lang: { val: 'en-US' } }, + runPropertiesInlineKeys: null, + runPropertiesStyleKeys: null, + runPropertiesOverrideKeys: null, + }, + [], + 'Hello', + ); + const state = createState(schema, doc); + const textPos = runPos(state.doc) + 1; + const tr = state.tr.insertText('X', textPos).delete(textPos, textPos + 1); + const { state: nextState } = state.applyTransaction(tr); + + const runNode = nextState.doc.nodeAt(runPos(nextState.doc) ?? 0); + // With null metadata (legacy), the plugin adds mark-derived keys (backward compat). + // The key invariant: it must NOT become [] (that would mean "importer said nothing inline"). + const inlineKeys = runNode?.attrs.runPropertiesInlineKeys; + if (inlineKeys !== null) { + expect(Array.isArray(inlineKeys) && inlineKeys.length > 0).toBe(true); + } + }); + }); }); diff --git a/packages/super-editor/src/editors/v1/extensions/types/mark-attributes.ts b/packages/super-editor/src/editors/v1/extensions/types/mark-attributes.ts index 4ad6e3e311..5a2d93f8c5 100644 --- a/packages/super-editor/src/editors/v1/extensions/types/mark-attributes.ts +++ b/packages/super-editor/src/editors/v1/extensions/types/mark-attributes.ts @@ -148,8 +148,10 @@ export interface TextStyleAttrs { position?: string | null; /** Font family (CSS font-family string) */ fontFamily?: string | null; - /** East Asian font family override */ + /** East Asian font family override (per-script font, ECMA-376 §17.3.2.26) */ eastAsiaFontFamily?: string | null; + /** Complex Script font family override (per-script font, ECMA-376 §17.3.2.26) */ + csFontFamily?: string | null; /** Text color (hex/CSS color) */ color?: string | null; /** Background color (CSS color) */ From 1c99a6e94ad71ca65657e9595cdefe70781b438a Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 08:35:04 -0700 Subject: [PATCH 3/6] fix(super-editor): register per-script font attrs on textStyle mark (SD-2517) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address review findings: - Register eastAsiaFontFamily and csFontFamily as global attributes on the textStyle mark via FontFamily extension. Without schema registration, ProseMirror dropped these attrs during Mark.fromJSON(), making the per-script font decode paths unreachable (Codex review finding). - Strip csFontFamily from visual mark attrs in resolveFontFamily alongside eastAsiaFontFamily. Both are round-trip metadata, not CSS properties (Opus review finding: csFontFamily leaked to DOM). - Replace IIFE with plain const for overrideKeys in computeSegmentKeys (DX finding from both reviewers). Result: 468 → 153 rFonts (vs 183 without schema registration). --- .../v3/handlers/w/r/helpers/helpers.js | 8 +++++--- .../editors/v1/extensions/font-family/font-family.js | 12 ++++++++++++ .../run/calculateInlineRunPropertiesPlugin.js | 6 ++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js index 8815ff3e9c..84fe3011fe 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.js @@ -6,11 +6,13 @@ const containsEastAsianCharacters = (text) => EAST_ASIAN_CHARACTER_REGEX.test(te export const resolveFontFamily = (textStyleAttrs, text) => { if (!text) return textStyleAttrs; const eastAsiaFont = textStyleAttrs?.eastAsiaFontFamily; - if (!eastAsiaFont) return textStyleAttrs; + const hasPerScriptAttrs = eastAsiaFont || textStyleAttrs?.csFontFamily; + if (!hasPerScriptAttrs) return textStyleAttrs; + // Strip per-script font attrs from the visual mark — they're round-trip metadata + // preserved on the ProseMirror mark attrs, not CSS properties. (SD-2517) const normalized = { ...textStyleAttrs }; delete normalized.eastAsiaFontFamily; - // Note: csFontFamily is deliberately preserved — it's round-trip metadata - // consumed by decodeRPrFromMarks to restore per-script fonts. (SD-2517) + delete normalized.csFontFamily; const shouldUseEastAsia = typeof text === 'string' && containsEastAsianCharacters(text); if (!shouldUseEastAsia) return normalized; return { ...normalized, fontFamily: eastAsiaFont }; diff --git a/packages/super-editor/src/editors/v1/extensions/font-family/font-family.js b/packages/super-editor/src/editors/v1/extensions/font-family/font-family.js index 55618fc684..a7408c593e 100644 --- a/packages/super-editor/src/editors/v1/extensions/font-family/font-family.js +++ b/packages/super-editor/src/editors/v1/extensions/font-family/font-family.js @@ -57,6 +57,18 @@ export const FontFamily = Extension.create({ return { style: `font-family: ${attrs.fontFamily}` }; }, }, + // Per-script font overrides (ECMA-376 §17.3.2.26). These are round-trip + // metadata — not rendered to DOM. They preserve per-script font data through + // the mark round-trip so the inline/style comparison doesn't produce false + // positives that inject w:rFonts on export. (SD-2517) + eastAsiaFontFamily: { + default: null, + rendered: false, + }, + csFontFamily: { + default: null, + rendered: false, + }, }, }, ]; diff --git a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js index 8358013d1c..d0c806b765 100644 --- a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js +++ b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js @@ -139,12 +139,10 @@ export const calculateInlineRunPropertiesPlugin = (editor) => const shouldAddMarkKeys = !hadInlineKeysMetadata || existingInlineKeys.length > 0 || hasNewInlineProps; const markKeysToAdd = shouldAddMarkKeys ? keysFromMarks(segment) : []; const keys = [...new Set([...existingInlineKeys, ...markKeysToAdd])]; + const ok = overrideKeysFromInlineProps(segmentInlineProps); return { inlineKeys: keys.length ? keys : hadInlineKeysMetadata ? [] : null, - overrideKeys: (() => { - const ok = overrideKeysFromInlineProps(segmentInlineProps); - return ok?.length ? ok : null; - })(), + overrideKeys: ok?.length ? ok : null, }; }; From ee396ce983e768bb1ff6274647a9dd722665006b Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 08:38:01 -0700 Subject: [PATCH 4/6] test(super-editor): add resolveFontFamily tests for csFontFamily stripping (SD-2517) Cover the new csFontFamily handling in resolveFontFamily: - csFontFamily stripped from visual attrs for non-EA text - both eastAsiaFontFamily and csFontFamily stripped together - attrs returned unchanged when no per-script fonts present --- .../v3/handlers/w/r/helpers/helpers.test.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.test.js b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.test.js index 1390107223..5299c2b9f8 100644 --- a/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.test.js +++ b/packages/super-editor/src/editors/v1/core/super-converter/v3/handlers/w/r/helpers/helpers.test.js @@ -21,6 +21,27 @@ describe('w:r helper utilities', () => { const attrs = { eastAsiaFontFamily: 'Meiryo, sans-serif' }; expect(resolveFontFamily(attrs, '')).toEqual(attrs); }); + + // SD-2517: csFontFamily must be stripped from visual attrs (not a CSS property) + it('strips csFontFamily from visual attrs for non-EA text', () => { + const attrs = { fontFamily: 'Arial', csFontFamily: 'Times New Roman' }; + const result = resolveFontFamily(attrs, 'Hello'); + expect(result.csFontFamily).toBeUndefined(); + expect(result.fontFamily).toBe('Arial'); + }); + + it('strips both eastAsiaFontFamily and csFontFamily for non-EA text', () => { + const attrs = { fontFamily: 'Arial', eastAsiaFontFamily: 'MS Mincho', csFontFamily: 'Times New Roman' }; + const result = resolveFontFamily(attrs, 'Hello'); + expect(result.eastAsiaFontFamily).toBeUndefined(); + expect(result.csFontFamily).toBeUndefined(); + expect(result.fontFamily).toBe('Arial'); + }); + + it('returns attrs unchanged when no per-script fonts are present', () => { + const attrs = { fontFamily: 'Arial', fontSize: '12pt' }; + expect(resolveFontFamily(attrs, 'Hello')).toBe(attrs); + }); }); describe('merge helpers', () => { From 55089323086b0bdba240b59463dfa6dbedc06e08 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 08:48:30 -0700 Subject: [PATCH 5/6] fix(super-editor): preserve importer-set inline keys when plugin drops them (SD-2517) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The calculateInlineRunPropertiesPlugin was dropping inline keys that the importer explicitly set (e.g. fontFamily from w:rPr) when the plugin's getInlineRunProperties comparison falsely classified them as matching the style. This caused 118 runs to lose their explicit w:rFonts on export. When the importer set non-empty runPropertiesInlineKeys, restore any keys the plugin dropped back into runProperties from the original node attrs. The importer saw explicit w:rPr in the XML — that decision is authoritative over the plugin's mark-based recomputation. Result: INPUT 271 rFonts → BEFORE 468 → AFTER 275 (near-perfect, +4 from per-script encode edge cases, 0 injection). --- .../run/calculateInlineRunPropertiesPlugin.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js index d0c806b765..f419569ad7 100644 --- a/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js +++ b/packages/super-editor/src/editors/v1/extensions/run/calculateInlineRunPropertiesPlugin.js @@ -99,7 +99,7 @@ export const calculateInlineRunPropertiesPlugin = (editor) => preservedDerivedKeys, preferExistingKeys, ); - const runProperties = firstInlineProps ?? null; + let runProperties = firstInlineProps ?? null; const existingInlineKeys = runNode.attrs?.runPropertiesInlineKeys || []; // [] means "importer explicitly found nothing inline"; null means "no metadata" (legacy). @@ -150,6 +150,22 @@ export const calculateInlineRunPropertiesPlugin = (editor) => const hadInlineKeys = Array.isArray(runNode.attrs?.runPropertiesInlineKeys) && runNode.attrs.runPropertiesInlineKeys.length > 0; if (JSON.stringify(runProperties) === JSON.stringify(runNode.attrs.runProperties) && hadInlineKeys) return; + // When the importer set non-empty inline keys and the computed inline props + // dropped some of those keys (e.g. fontFamily "matches" the style due to + // mark round-trip comparison), preserve the original keys. The importer saw + // explicit w:rPr in the XML and that decision is authoritative. (SD-2517) + if (hadInlineKeys) { + const computedKeys = new Set(runProperties ? Object.keys(runProperties) : []); + const lostKeys = existingInlineKeys.filter((k) => !computedKeys.has(k)); + if (lostKeys.length > 0) { + if (!runProperties) runProperties = {}; + lostKeys.forEach((k) => { + if (runNode.attrs?.runProperties?.[k] !== undefined) { + runProperties[k] = runNode.attrs.runProperties[k]; + } + }); + } + } const { inlineKeys: newInlineKeys, overrideKeys: newOverrideKeys } = computeSegmentKeys( runProperties, segments[0], From 24c4130df7241b66b9d5abd3aaa43069b4ee701e Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 10 Apr 2026 09:17:56 -0700 Subject: [PATCH 6/6] test(behavior): add SD-2517 round-trip regression test End-to-end behavior test that loads a DOCX with localized Portuguese heading styles, exports without edits, and verifies the rFonts count didn't increase (the 197-injection regression). --- .../sd-2517-localized-heading-styles.docx | Bin 0 -> 103145 bytes .../sd-2517-rfonts-roundtrip.spec.ts | 48 ++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/behavior/tests/exporting/fixtures/sd-2517-localized-heading-styles.docx create mode 100644 tests/behavior/tests/exporting/sd-2517-rfonts-roundtrip.spec.ts diff --git a/tests/behavior/tests/exporting/fixtures/sd-2517-localized-heading-styles.docx b/tests/behavior/tests/exporting/fixtures/sd-2517-localized-heading-styles.docx new file mode 100644 index 0000000000000000000000000000000000000000..3f0f75e7e79382b6cc14171be0e7c1e25c6b9246 GIT binary patch literal 103145 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 literal 0 HcmV?d00001 diff --git a/tests/behavior/tests/exporting/sd-2517-rfonts-roundtrip.spec.ts b/tests/behavior/tests/exporting/sd-2517-rfonts-roundtrip.spec.ts new file mode 100644 index 0000000000..2448b6afc3 --- /dev/null +++ b/tests/behavior/tests/exporting/sd-2517-rfonts-roundtrip.spec.ts @@ -0,0 +1,48 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { test, expect } from '../../fixtures/superdoc.js'; +import JSZip from 'jszip'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const DOC_PATH = path.resolve(__dirname, 'fixtures/sd-2517-localized-heading-styles.docx'); + +test.use({ config: { toolbar: 'none' } }); + +/** + * SD-2517: Zero-edit round-trip must not inject w:rFonts into heading runs. + * + * The reproduction document uses localized Portuguese heading styles (Ttulo1, + * Ttulo2) with per-script fonts (ascii=Arial, cs=Times New Roman). Heading + * runs have no inline w:rPr — they inherit from the paragraph style. + * + * Before the fix, the round-trip injected 197 extra w:rFonts elements. + */ +test('@behavior SD-2517: zero-edit round-trip does not inject w:rFonts into heading runs', async ({ superdoc }) => { + await superdoc.loadDocument(DOC_PATH); + await superdoc.waitForStable(); + + // Count rFonts in the INPUT document + const inputZip = await JSZip.loadAsync(fs.readFileSync(DOC_PATH)); + const inputDocXml = await inputZip.file('word/document.xml')!.async('string'); + const inputRFonts = (inputDocXml.match(/ { + const blob: Blob = await (window as any).editor.exportDocx(); + const buffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(buffer)); + }); + + // Parse the exported DOCX + const outputZip = await JSZip.loadAsync(Buffer.from(bytes)); + const outputDocXml = await outputZip.file('word/document.xml')!.async('string'); + const outputRFonts = (outputDocXml.match(/