feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(math): implement m:phant phantom converter - #2749

Merged
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter
Apr 13, 2026
Merged

feat(math): implement m:phant phantom converter#2749
caio-pizzol merged 4 commits into
superdoc:mainfrom
Abdeltoto:feat/math-phantom-converter

Conversation

@Abdeltoto

Copy link
Copy Markdown

Closes#2608

Summary

  • Implements the m:phant OMML-to-MathML converter (invisible spacing placeholder)
  • Full phantom maps to <mphantom>; partial dimension control maps to <mpadded> with zeroed width/height/depth
  • Supports m:show, m:zeroWid, m:zeroAsc, and m:zeroDesc property flags
  • Registers the converter in MATH_OBJECT_REGISTRY
  • Adds 3 unit tests covering full phantom, visible with zeroed width, and invisible with zeroed height

Spec reference

ECMA-376 Section 22.1.2.81

Test plan

  • vitest run passes for omml-to-mathml.test.ts
  • Linter and formatter pass (lefthook pre-commit)

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:566fc42ea0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@Abdeltoto
Abdeltotoforce-pushed the feat/math-phantom-converter branch from 3e7e2c0 to c6b8cc6CompareApril 8, 2026 03:03

@caio-pizzolcaio-pizzol left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@Abdeltoto thanks for contributing this! the phantom converter is a nice addition and the code is clean β€” matches Word perfectly on 7 out of 10 test cases.

one thing to fix: when <m:show> is missing, content renders invisible but should be visible. this affects the most common phantom pattern (zeroing a dimension without explicitly setting show). left an inline comment with a one-line fix, comparison screenshots, and 10 Word-native test files.

Comment threadpackages/layout-engine/painters/dom/src/features/math/converters/phantom.ts Outdated
@caio-pizzolcaio-pizzol self-assigned this Apr 9, 2026
Abdeltotoand others added 4 commits April 13, 2026 16:08
Per ECMA-376 Β§22.1.2.96, when <m:show> is absent from <m:phantPr> the
base content should be shown. The previous check only handled bare and
truthy-val variants, so a missing element was treated as hidden β€”
breaking the most common phantom pattern (zeroing a dimension without
hiding content).
Adds unit coverage for the explicit-hide case and zeroed-dimension-only
case, plus a behavior test loading a 12-case fixture that walks every
m:phantPr configuration in the spec (show absent/bare/val=0/1/true/false,
each zero flag alone and combined, m:transp passthrough).
@caio-pizzol
caio-pizzolforce-pushed the feat/math-phantom-converter branch from c6b8cc6 to 6b0cb18CompareApril 13, 2026 23:13
@caio-pizzol

Copy link
Copy Markdown
Contributor

hey @Abdeltoto β€” didn't want to block this any longer so I pushed the last fix myself, hope that's cool.

your two fixes from round 1 look great. the one still open was the "no m:show" case β€” the spec says content should show when m:show isn't there, but the old check was hiding it. one-line change and it matches Word now.

while I was in there I went through every phantom setup the spec describes (12 in total) and they all render right. added a few more unit tests for the gaps, plus a browser test that loads all 12 in one doc. the doc is in our visual test set too, so we'll catch any future breakage.

also rebased on main β€” a bunch of other math converters landed since you opened this, so there were some conflicts to untangle.

thanks for picking this up, the code is clean. merging once CI's green.

@caio-pizzol
caio-pizzol added this pull request to the merge queue Apr 13, 2026
Merged via the queue into superdoc:main with commit 47f92bcApr 13, 2026
47 of 50 checks passed
@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0-next.8

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0-next.11

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in template-builder v1.5.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in esign v2.3.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.26.0-next.11

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0-next.12

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0-next.9

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-cli v0.7.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc v1.27.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in @superdoc-dev/react v1.2.0

The release is available on GitHub release

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in superdoc-sdk v1.6.0

@superdoc-bot

Copy link
Copy Markdown
Contributor

πŸŽ‰ This PR is included in vscode-ext v2.3.0

Sign up for freeto 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.

Math: implement m:phant phantom converter (community)

2 participants

@Abdeltoto@caio-pizzol