From e5a62c8d06715077c03c8802bdadeac5779b8289 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Tue, 21 Oct 2025 19:36:27 +0200 Subject: [PATCH] Make MathML elements visible in the struct tree (bug 1937438) It'll help to make math equations "visible" for screen readers. MS Office has a specific way to add some MathML code to struc tree leaf and this patch handles it. --- src/core/struct_tree.js | 51 ++ src/shared/util.js | 9 + test/integration/accessibility_spec.mjs | 68 ++ test/pdfs/.gitignore | 3 + test/pdfs/bug1937438_af_from_latex.pdf | 965 ++++++++++++++++++++++++ test/pdfs/bug1937438_from_word.pdf | Bin 0 -> 46285 bytes test/pdfs/bug1937438_mml_from_latex.pdf | Bin 0 -> 43610 bytes test/unit/struct_tree_spec.js | 151 ++++ web/struct_tree_layer_builder.js | 114 ++- 9 files changed, 1360 insertions(+), 1 deletion(-) create mode 100755 test/pdfs/bug1937438_af_from_latex.pdf create mode 100755 test/pdfs/bug1937438_from_word.pdf create mode 100755 test/pdfs/bug1937438_mml_from_latex.pdf diff --git a/src/core/struct_tree.js b/src/core/struct_tree.js index 6ed379e3b..539ae008f 100644 --- a/src/core/struct_tree.js +++ b/src/core/struct_tree.js @@ -16,6 +16,7 @@ import { AnnotationPrefix, stringToPDFString, warn } from "../shared/util.js"; import { Dict, isName, Name, Ref, RefSetCache } from "./primitives.js"; import { lookupNormalRect, stringToAsciiOrUTF16BE } from "./core_utils.js"; +import { BaseStream } from "./base_stream.js"; import { NumberTree } from "./name_number_tree.js"; const MAX_DEPTH = 40; @@ -579,6 +580,50 @@ class StructElementNode { return root.roleMap.get(name) ?? name; } + get mathML() { + let AFs = this.dict.get("AF") || []; + if (!Array.isArray(AFs)) { + AFs = [AFs]; + } + for (let af of AFs) { + af = this.xref.fetchIfRef(af); + if (!(af instanceof Dict)) { + continue; + } + if (!isName(af.get("Type"), "Filespec")) { + continue; + } + if (!isName(af.get("AFRelationship"), "Supplement")) { + continue; + } + const ef = af.get("EF"); + if (!(ef instanceof Dict)) { + continue; + } + const fileStream = ef.get("UF") || ef.get("F"); + if (!(fileStream instanceof BaseStream)) { + continue; + } + if (!isName(fileStream.dict.get("Type"), "EmbeddedFile")) { + continue; + } + if (!isName(fileStream.dict.get("Subtype"), "application/mathml+xml")) { + continue; + } + return fileStream.getString(); + } + const A = this.dict.get("A"); + if (A instanceof Dict) { + // This stuff isn't in the spec, but MS Office seems to use it. + const O = A.get("O"); + if (isName(O, "MSFT_Office")) { + const mathml = A.get("MSFT_MathML"); + return mathml ? stringToPDFString(mathml) : null; + } + } + return null; + } + parseKids() { let pageObjId = null; const objRef = this.dict.getRaw("Pg"); @@ -842,6 +887,12 @@ class StructTreePage { if (typeof alt === "string") { obj.alt = stringToPDFString(alt); } + if (obj.role === "Formula") { + const { mathML } = node; + if (mathML) { + obj.mathML = mathML; + } + } const a = node.dict.get("A"); if (a instanceof Dict) { diff --git a/src/shared/util.js b/src/shared/util.js index ffc010129..b50819976 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -658,6 +658,15 @@ class FeatureTest { ); } + static get isSanitizerSupported() { + return shadow( + this, + "isSanitizerSupported", + // eslint-disable-next-line no-undef + typeof Sanitizer !== "undefined" + ); + } + static get platform() { const { platform, userAgent } = navigator; diff --git a/test/integration/accessibility_spec.mjs b/test/integration/accessibility_spec.mjs index 5dfca3785..5bb2c7915 100644 --- a/test/integration/accessibility_spec.mjs +++ b/test/integration/accessibility_spec.mjs @@ -305,4 +305,72 @@ describe("accessibility", () => { ); }); }); + + describe("MathML in AF entry from LaTeX", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1937438_af_from_latex.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the MathML is correctly inserted", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + if (isSanitizerSupported) { + const mathML = await page.$eval( + "span.structTree span[aria-owns='p58R_mc13'] > math", + el => el?.innerHTML ?? "" + ); + expect(mathML) + .withContext(`In ${browserName}`) + .toEqual( + " x2 = |x| " + ); + } else { + pending(`Sanitizer API (in ${browserName}) is not supported`); + } + }) + ); + }); + }); + + describe("MathML tags in the struct tree", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1937438_mml_from_latex.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the MathML is correctly inserted", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const mathML = await page.$eval( + "span.structTree span[role='group'] span[role='group']:last-child > span math", + el => el?.innerHTML ?? "" + ); + expect(mathML) + .withContext(`In ${browserName}`) + .toEqual( + `` + ); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index b59617d45..75b11be7d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -749,3 +749,6 @@ !issue20319_1.pdf !issue20319_2.pdf !bug1992868.pdf +!bug1937438_af_from_latex.pdf +!bug1937438_from_word.pdf +!bug1937438_mml_from_latex.pdf diff --git a/test/pdfs/bug1937438_af_from_latex.pdf b/test/pdfs/bug1937438_af_from_latex.pdf new file mode 100755 index 000000000..b9e897358 --- /dev/null +++ b/test/pdfs/bug1937438_af_from_latex.pdf @@ -0,0 +1,965 @@ +%PDF-2.0 +% +22 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 25 >> +stream + x +endstream +endobj +23 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-1) /F /UF /EF<> >> +endobj +24 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 25 >> +stream + y +endstream +endobj +25 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-2) /F /UF /EF<> >> +endobj +26 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 50 >> +stream + x > y +endstream +endobj +27 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-3) /F /UF /EF<> >> +endobj +28 0 obj +<< /Type /EmbeddedFile /Subtype /application#2Fmathml+xml /Params<> /Length 154 >> +stream + x2 = |x| +endstream +endobj +29 0 obj +<< /Type /Filespec /AFRelationship /Supplement /Desc (mathml-4) /F /UF /EF<> >> +endobj +43 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 3 >> +stream +$x$ +endstream +endobj +44 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F /UF /EF<> >> +endobj +46 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 3 >> +stream +$y$ +endstream +endobj +47 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F /UF /EF<> >> +endobj +49 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 5 >> +stream +$x>y$ +endstream +endobj +50 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F /UF /EF<> >> +endobj +54 0 obj +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<> /Length 61 >> +stream +\begin {equation*}\sqrt {x^2}=\lvert x\rvert \end {equation*} +endstream +endobj +55 0 obj +<< /Type /Filespec /AFRelationship /Source /Desc (TeX source) /F /UF /EF<> >> +endobj +56 0 obj +<< /Type /Metadata /Subtype /XML /Length 11660 >> +stream + + + + + + + + + XMP Media Management Schema + xmpMM + http://ns.adobe.com/xap/1.0/mm/ + + + + OriginalDocumentID + URI + internal + The common identifier for all versions and renditions of a document. + + + + + + PDF/A Identification Schema + pdfaid + http://www.aiim.org/pdfa/ns/id/ + + + + year + Integer + internal + Year of standard + + + + + + PDF/UA Universal Accessibility Schema + pdfuaid + http://www.aiim.org/pdfua/ns/id/ + + + + part + Integer + internal + Part of ISO 14289 standard + + + rev + Integer + internal + Revision of ISO 14289 standard + + + + + + PDF/X ID Schema + pdfxid + http://www.npes.org/pdfx/ns/id/ + + + + GTS_PDFXVersion + Text + internal + ID of PDF/X standard + + + + + + PRISM Basic Metadata + prism + http://prismstandard.org/namespaces/basic/3.0/ + + + + complianceProfile + Text + internal + PRISM specification compliance profile to which this document adheres + + + publicationName + Text + external + Publication name + + + aggregationType + Text + external + Publication type + + + bookEdition + Text + external + Edition of the book in which the document was published + + + volume + Text + external + Publication volume number + + + number + Text + external + Publication issue number within a volume + + + pageRange + Text + external + Page range for the document within the print version of its publication + + + issn + Text + external + ISSN for the printed publication in which the document was published + + + eIssn + Text + external + ISSN for the electronic publication in which the document was published + + + isbn + Text + external + ISBN for the publication in which the document was published + + + doi + Text + external + Digital Object Identifier for the document + + + url + URL + external + URL at which the document can be found + + + byteCount + Integer + internal + Approximate file size in octets + + + pageCount + Integer + internal + Number of pages in the print version of the document + + + subtitle + Text + external + Document's subtitle + + + + + + + luahbtex-1.17.0 + 2.0 + 2 + 2024 + + + David + + + + + Math Test One + + + + + Text + + + + + en-US + + + + + 2024-02-23T21:38:22Z + + + application/pdf + mathml-AF-ex1.tex + LaTeX + 2024-02-23T21:38:22Z + 2024-02-23T21:38:22Z + 2024-02-23T21:38:22Z + uuid:9b73c2b4-65f6-4897-89df-cb965cd08a00 + uuid:220f5099-def3-4191-8b9d-00a07a988b2e + three + 1 + + + + + + + + + + + + + + +endstream +endobj +59 0 obj +<< /Length 2090 >> +stream +/opacity1 gs +/Artifact BMC +EMC +/text<> BDC +BT +/F54 17.21544 Tf +1 0 0 1 252.247 615.392 Tm [<000F00FF011301060001>20<0016>70<01030112011300010011010D0103>]TJ +ET +EMC +/text<> BDC +BT +/F54 11.95517 Tf +1 0 0 1 290.74 582.516 Tm [<0001>235<000600FF>25<011501070102>]TJ +ET +EMC +/text<> BDC +BT +/F54 11.95517 Tf +1 0 0 1 260.72 554.947 Tm [<0008>40<010301000111011400FF0111011800010788078907210001078807860788078A>]TJ +ET +EMC +/Lbl<> BDC +BT +/F69 14.3462 Tf +1 0 0 1 133.768 510.558 Tm [<07870001>]TJ +ET +EMC +/section<> BDC +BT +/F69 14.3462 Tf +1 0 0 1 155.216 510.558 Tm [<000F00FF011301060001>20<0016>70<0103011201130112>]TJ +ET +EMC +/Artifact BMC +EMC +/text<> BDC +BT +/F54 9.96264 Tf +1 0 0 1 133.768 487.765 Tm [<0015010E010C010300010107010D010B0107010D01030001010C00FF0113010607210001010B010301130001>]TJ +ET +EMC +/Formula<> BDC +BT +/F42 9.96264 Tf +1 0 0 1 226.162 487.765 Tm [<0D1A>]TJ +ET +EMC +/text<> BDC +BT +/F54 9.96264 Tf +1 0 0 1 231.731 487.765 Tm [<000100FF010D01020001>]TJ +ET +EMC +/Formula<> BDC +BT +/F42 9.96264 Tf +1 0 0 1 252.304 487.765 Tm [<0D1B>]TJ +ET +EMC +/text<> BDC +BT +/F54 9.96264 Tf +1 0 0 1 257.385 487.765 Tm [<0001011200FF011301070112010401180001>]TJ +ET +EMC +/Formula<> BDC +BT +/F42 9.96264 Tf +1 0 0 1 288.568 487.765 Tm [<0D1A>-287<04B4>-278<0D1B>]TJ +ET +EMC +/text<> BDC +BT +/F54 9.96264 Tf +1 0 0 1 312.025 487.765 Tm [<0725>]TJ +ET +EMC +/text<> BDC +BT +/F54 9.96264 Tf +1 0 0 1 148.712 475.81 Tm [<0015010E010C010300010113>5<0103>10<011701130721000100FF010D0102000100FF010D000101030110011400FF01130107010E010D0725>]TJ +ET +EMC +/Formula<> BDC +BT +/F42 9.96264 Tf +1 0 0 1 284.96 452.696 Tm [<0679>]TJ +ET +q +1 0 0 1 292.87 461.543 cm +[] 0 d 0 J 0.677 w 0 0 m 9.722 0 l S +Q +BT +/F42 9.96264 Tf +1 0 0 1 292.87 451.238 Tm [<0D1A>]TJ +/F43 6.97385 Tf +1 0 0 1 298.539 453.749 Tm [<10B3>]TJ +/F42 9.96264 Tf +1 0 0 1 305.359 451.238 Tm [<04B2>-277<04260D1A>-10<0426>]TJ +ET +EMC +/Artifact BMC +EMC +/Artifact BMC +BT +/F54 9.96264 Tf +1 0 0 1 303.158 89.365 Tm [<0787>]TJ +ET +EMC +/Artifact BMC +EMC + +endstream +endobj +58 0 obj +<< /Type /Page /Contents 59 0 R /Resources 57 0 R /MediaBox [ 0 0 612 792 ] /StructParents 0/Tabs /S /Parent 64 0 R >> +endobj +57 0 obj +<< /ExtGState 1 0 R /Font << /F54 60 0 R /F69 61 0 R /F42 62 0 R /F43 63 0 R >> >> +endobj +1 0 obj +<< /opacity1 <> >> +endobj +65 0 obj +<< /Marked true >> +endobj +66 0 obj +<< /DisplayDocTitle true >> +endobj +67 0 obj +<< /Names[(l3ef0001) 23 0 R (l3ef0002) 25 0 R (l3ef0003) 27 0 R (l3ef0004) 29 0 R] >> +endobj +6 0 obj +<< /Nums [0 [ 34 0 R 35 0 R 36 0 R 39 0 R 38 0 R 41 0 R 42 0 R 41 0 R 45 0 R 41 0 R 48 0 R 41 0 R 52 0 R 53 0 R] +] >> +endobj +68 0 obj +<< /Limits [(ID.001) (ID.019)]/Names [(ID.001) 21 0 R (ID.002) 30 0 R (ID.003) 31 0 R (ID.004) 32 0 R (ID.005) 33 0 R (ID.006) 34 0 R (ID.007) 35 0 R (ID.008) 36 0 R (ID.009) 37 0 R (ID.010) 38 0 R (ID.011) 39 0 R (ID.012) 40 0 R (ID.013) 41 0 R (ID.014) 42 0 R (ID.015) 45 0 R (ID.016) 48 0 R (ID.017) 51 0 R (ID.018) 52 0 R (ID.019) 53 0 R ] >> +endobj +69 0 obj +<< /Kids [68 0 R] >> +endobj +7 0 obj +<< /Artifact /NonStruct /DocumentFragment /Art /Aside /Note /H7 /H6 /H8 /H6 /H9 /H6 /H10 /H6 /Title /P /FENote /Note /Sub /Span /Em /Span /Strong /Span /title /P /part /P /section /H1 /subsection /H2 /subsubsection /H3 /paragraph /H4 /subparagraph /H5 /list /L /itemize /L /enumerate /L /description /L /quote /BlockQuote /quotation /BlockQuote /verbatim /P /item /LI /itemlabel /Lbl /itembody /LBody /footnote /Note /footnotemark /Lbl /footnotelabel /Lbl /text-unit /Part /text /P /theorem-like /Sect /codeline /Span /float /Note /figures /Sect /tables /Sect >> +endobj +70 0 obj +<< /display <> +/justify <> +/inline <> +/center <> +/TH-both <> +/TH-row <> +/TH-col <> >> +endobj +9 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf/ssn) >> +endobj +11 0 obj +<< /Type /Namespace /NS (http://iso.org/pdf2/ssn) >> +endobj +13 0 obj +<< /Type /Namespace /NS (http://www.w3.org/1998/Math/MathML) >> +endobj +16 0 obj +<< /title [/Title 11 0 R] /part [/Title 11 0 R] /section [/H1 11 0 R] /subsection [/H2 11 0 R] /subsubsection [/H3 11 0 R] /paragraph [/H4 11 0 R] /subparagraph [/H5 11 0 R] /list [/L 11 0 R] /itemize [/L 11 0 R] /enumerate [/L 11 0 R] /description [/L 11 0 R] /quote [/BlockQuote 9 0 R] /quotation [/BlockQuote 9 0 R] /verbatim [/P 11 0 R] /item [/LI 11 0 R] /itemlabel [/Lbl 11 0 R] /itembody [/LBody 11 0 R] /footnote [/FENote 11 0 R] /footnotemark [/Lbl 11 0 R] /footnotelabel [/Lbl 11 0 R] /text-unit [/Part 11 0 R] /text [/P 11 0 R] /theorem-like [/Sect 11 0 R] /codeline [/Sub 11 0 R] /float [/Aside 11 0 R] /figures [/Sect 11 0 R] /tables [/Sect 11 0 R] >> +endobj +15 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/dflt/2022) /RoleMapNS 16 0 R >> +endobj +18 0 obj +<< /chapter [/H1 11 0 R] /section [/H2 11 0 R] /subsection [/H3 11 0 R] /subsubsection [/H4 11 0 R] /paragraph [/H5 11 0 R] /subparagraph [/H6 11 0 R] >> +endobj +17 0 obj +<< /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> +endobj +19 0 obj +<< /Type /Namespace /NS (data:,173E68E4-F47F-6026-897D-257CC7127A46) >> +endobj +8 0 obj +[ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] +endobj +21 0 obj +<< /Type /StructElem /S /Document /P 5 0 R /K [32 0 R 37 0 R] /NS 11 0 R /ID (ID.001) >> +endobj +30 0 obj +<< /Type /StructElem /S /Artifact /P 5 0 R /NS 15 0 R /ID (ID.002) >> +endobj +31 0 obj +<< /Type /StructElem /S /Artifact /P 5 0 R /NS 15 0 R /ID (ID.003) >> +endobj +32 0 obj +<< /Type /StructElem /S /text-unit /P 21 0 R /K [33 0 R 35 0 R 36 0 R] /NS 15 0 R /ID (ID.004) >> +endobj +33 0 obj +<< /Type /StructElem /S /Title /P 32 0 R /K 34 0 R /NS 11 0 R /ID (ID.005) >> +endobj +34 0 obj +<< /Type /StructElem /S /text /P 33 0 R /K <> /C /center /NS 15 0 R /ID (ID.006) >> +endobj +35 0 obj +<< /Type /StructElem /S /text /P 32 0 R /K <> /C /center /NS 15 0 R /ID (ID.007) >> +endobj +36 0 obj +<< /Type /StructElem /S /text /P 32 0 R /K <> /C /center /NS 15 0 R /ID (ID.008) >> +endobj +37 0 obj +<< /Type /StructElem /S /Sect /P 21 0 R /K [38 0 R 40 0 R 51 0 R] /NS 11 0 R /ID (ID.009) >> +endobj +38 0 obj +<< /Type /StructElem /S /section /P 37 0 R /K [39 0 R <> ] /NS 15 0 R /ID (ID.010) >> +endobj +39 0 obj +<< /Type /StructElem /S /Lbl /P 38 0 R /K [<> ] /NS 11 0 R /ID (ID.011) >> +endobj +40 0 obj +<< /Type /StructElem /S /text-unit /P 37 0 R /K 41 0 R /NS 15 0 R /ID (ID.012) >> +endobj +41 0 obj +<< /Type /StructElem /S /text /P 40 0 R /K [<> 42 0 R <> 45 0 R <> 48 0 R <> ] /C /justify /NS 15 0 R /ID (ID.013) >> +endobj +42 0 obj +<< /Type /StructElem /S /Formula /P 41 0 R /K <> /C /inline /T /AF [23 0 R 44 0 R] /NS 11 0 R /ID (ID.014) >> +endobj +45 0 obj +<< /Type /StructElem /S /Formula /P 41 0 R /K <> /C /inline /T /AF [25 0 R 47 0 R] /NS 11 0 R /ID (ID.015) >> +endobj +48 0 obj +<< /Type /StructElem /S /Formula /P 41 0 R /K <> /C /inline /T /AF [27 0 R 50 0 R] /NS 11 0 R /ID (ID.016) >> +endobj +51 0 obj +<< /Type /StructElem /S /text-unit /P 37 0 R /K [52 0 R 53 0 R] /NS 15 0 R /ID (ID.017) >> +endobj +52 0 obj +<< /Type /StructElem /S /text /P 51 0 R /K <> /C /justify /NS 15 0 R /ID (ID.018) >> +endobj +53 0 obj +<< /Type /StructElem /S /Formula /P 51 0 R /K <> /C /display /T /AF [29 0 R 55 0 R] /NS 11 0 R /ID (ID.019) >> +endobj +5 0 obj +<< /Type /StructTreeRoot /K 21 0 R /IDTree 69 0 R /ParentTree 6 0 R /RoleMap 7 0 R /ClassMap 70 0 R /Namespaces 8 0 R >> +endobj +71 0 obj +[ 4275 [ 524 ] ] +endobj +73 0 obj +<< /Subtype /CIDFontType0C /Length 692 >> +stream +XVNRED+STIXTwoMath-RegularL!"   =  f  +Cw "w $z % XVNRED+STIXTwoMath-Regular2.120STIX Fonts and STIX Two are trademarks of The Institute of Electrical and Electronics Engineers, Inc.Copyright 2001-2021 The STIX Fonts Project Authors https:github.comstipubstixfontsSTIX Two MathNormalAdobeIdentity=̾XS@@=ɿp=NNvvs5'4)&FR:\tppv˳h<.fqvhfupkjtTFw]}BhJquR= 6 $DR.j~̰ٹXDVO"$Z. &)|iԘ + + ޔ d +endstream +endobj +72 0 obj +<< /Type /FontDescriptor /FontName /XVNRED+STIXTwoMath-Regular /Flags 4 /FontBBox [ -978 -1641 3072 2627 ] /Ascent 762 /CapHeight 703 /Descent -238 /ItalicAngle 0 /StemV 98 /XHeight 473 /FontFile3 73 0 R >> +endobj +74 0 obj +<< /Length 702 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-XVNRED-STIXTwoMath-Regular-0) +%%Title: (TeX-XVNRED-STIXTwoMath-Regular-0 TeX XVNRED-STIXTwoMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (XVNRED-STIXTwoMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-XVNRED-STIXTwoMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +1 beginbfchar +<10B3> <0032> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + +endstream +endobj +63 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /XVNRED+STIXTwoMath-Regular /DescendantFonts [ 75 0 R ] /ToUnicode 74 0 R >> +endobj +75 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /XVNRED+STIXTwoMath-Regular /FontDescriptor 72 0 R /W 71 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +76 0 obj +[ 1062 [ 267 ] 1202 [ 720 ] 1204 [ 720 ] 1657 [ 794 ] 3354 [ 559 510 ] ] +endobj +78 0 obj +<< /Subtype /CIDFontType0C /Length 1046 >> +stream +ETRRWY+STIXTwoMath-RegularL!"   =  f  +Cw  " $ % ETRRWY+STIXTwoMath-Regular2.120STIX Fonts and STIX Two are trademarks of The Institute of Electrical and Electronics Engineers, Inc.Copyright 2001-2021 The STIX Fonts Project Authors https:github.comstipubstixfontsSTIX Two MathNormalAdobeIdentity&y  #;=̾XS@@=ɿp=NNvvs5'4)&FR:\tppv˳h<.fqvhfupkjt[v2w6p2R2&G`HrFNnNnHk/.Zw3o}wD=w}xs|{m͌p70LC"Sdy,zsus|uwrsǬ&JeϵϷvgpxwqlwovePcZ[pFpEvRwJۄu|"nȐZ^`o;xuet{~mfoثqfn|yveoqsssdM &)|iԘ + + ޔ d +endstream +endobj +77 0 obj +<< /Type /FontDescriptor /FontName /ETRRWY+STIXTwoMath-Regular /Flags 4 /FontBBox [ -978 -1641 3072 2627 ] /Ascent 762 /CapHeight 657 /Descent -238 /ItalicAngle 0 /StemV 82 /XHeight 473 /FontFile3 78 0 R >> +endobj +79 0 obj +<< /Length 780 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-ETRRWY-STIXTwoMath-Regular-0) +%%Title: (TeX-ETRRWY-STIXTwoMath-Regular-0 TeX ETRRWY-STIXTwoMath-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (ETRRWY-STIXTwoMath-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-ETRRWY-STIXTwoMath-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +6 beginbfchar +<0426> <007C> +<04B2> <003D> +<04B4> <003E> +<0679> <221A> +<0D1A> +<0D1B> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + +endstream +endobj +62 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ETRRWY+STIXTwoMath-Regular /DescendantFonts [ 80 0 R ] /ToUnicode 79 0 R >> +endobj +80 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ETRRWY+STIXTwoMath-Regular /FontDescriptor 77 0 R /W 76 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +81 0 obj +[ 1 [ 235 ] 15 [ 996 ] 22 [ 659 ] 255 [ 528 ] 259 [ 515 ] 262 [ 640 ] 274 [ 440 382 ] 1927 [ 495 ] ] +endobj +83 0 obj +<< /Subtype /CIDFontType0C /Length 1432 >> +stream +OSVLMY+STIXTwoText-BoldG!"   =  HF "^ $ %OSVLMY+STIXTwoText-Bold2.120STIX Fonts and STIX Two are trademarks of The Institute of Electrical and Electronics Engineers, Inc.Copyright 2001-2021 The STIX Fonts Project Authors https:github.comstipubstixfontsSTIX Two Text BoldSTIX Two TextAdobeIdentity + +P;5t=̾XS@@=ɿp=NNvv5'4)&FR:\tppv˳h<.fqFvhfupkjt6϶ +(@~pm"H}?`׶Fy"՜OcPc`יy@%;`܋4ZS)6\iZЀZ\04`YEץv^vR# #3С]z֭9u[||z{vmFBWO^uĖy6[=,o;v:jonyql|ִ٣L4&&''1(ٵqbjcq=5_ +8<@35&;뎟T9ɋqw#C#PKS$NdpRTM2lbhT{UcGՎI?YxMc7e iaRC*}}M5Ecn+Ȁ7b|rygPLW73kb_xkejy\Cjx_X}#wsz~de'Pc7X[Siah8wF(a/`IrTZ}hYcz-` &&rwMa ;H& +)  +endstream +endobj +82 0 obj +<< /Type /FontDescriptor /FontName /OSVLMY+STIXTwoText-Bold /Flags 4 /FontBBox [ -948 -434 1429 1047 ] /Ascent 762 /CapHeight 657 /Descent -238 /ItalicAngle 0 /StemV 92 /XHeight 473 /FontFile3 83 0 R >> +endobj +84 0 obj +<< /Length 799 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OSVLMY-STIXTwoText-Bold-0) +%%Title: (TeX-OSVLMY-STIXTwoText-Bold-0 TeX OSVLMY-STIXTwoText-Bold 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OSVLMY-STIXTwoText-Bold) +/Supplement 0 +>> def +/CMapName /TeX-Identity-OSVLMY-STIXTwoText-Bold def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +9 beginbfchar +<0001> <0020> +<000F> <004D> +<0016> <0054> +<00FF> <0061> +<0103> <0065> +<0106> <0068> +<0112> <0073> +<0113> <0074> +<0787> <0031> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + +endstream +endobj +61 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /OSVLMY+STIXTwoText-Bold /DescendantFonts [ 85 0 R ] /ToUnicode 84 0 R >> +endobj +85 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /OSVLMY+STIXTwoText-Bold /FontDescriptor 82 0 R /W 81 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +86 0 obj +[ 1 [ 235 ] 6 [ 730 ] 8 [ 588 ] 15 [ 895 ] 17 [ 737 ] 21 [ 504 603 ] 255 [ 480 522 ] 258 [ 539 464 307 ] 262 [ 577 285 ] 267 [ 283 852 576 514 ] 272 [ 521 380 395 315 570 481 ] 279 [ 479 483 ] 1825 [ 245 ] 1829 [ 245 ] 1926 [ 495 495 495 495 495 ] ] +endobj +88 0 obj +<< /Subtype /CIDFontType0C /Length 3959 >> +stream +CVHPXV+STIXTwoText-RegularG!"   =  H  "@ $ % CVHPXV+STIXTwoText-Regular2.120STIX Fonts and STIX Two are trademarks of The Institute of Electrical and Electronics Engineers, Inc.Copyright 2001-2021 The STIX Fonts Project Authors https:github.comstipubstixfontsSTIX Two Text RegularSTIX Two TextAdobeIdentity   !%""\3(I^  N +4 + f / #=̾XS@@=ɿp=NNvv5'4)&FR:\tppv˳h<.fqFvhfupkjt;mִmll#z6dm֢B7:~3lmwxwc$RuOJ8^mtƨ=qf +~:|i:wy5 +3s,ׅ8mӤ}F@A{:m?|'}CB{>mC{5՛Rfg`mڙz@$}~:mB?Y !eZ [Z _h [$D PKH]E#"Pqvlw'#qKj|m (2@CɲV\qv{su0#5S""[]\h3?\m@%XhljlSH^S5~uqHЀHu0}7m8V#G1?1˯r_tl||}}xvwbHUSj|Ǖǩj4_5pEqK[$oig{j`nߦb4ww}Vho^~pGG(HW`ah1+g2,Vmxs[v$4ww;`@;W@FW7vf~pho_mlk#&9(6]ɨdbshp~\(]";rׯxaklg:9B C -;;54 撱ҬGA!d8xߖyxxw\JEgp]ptad0?a=Bn4wwlL[xV]tPLphohSyWnwFܖF9A[wFnZw'Hqon`R{HouhhuqmlqwCrhpbS{Inˈw;a]Cu0TNqGnvF` X=VXnUTwiRG]f\UsnngOLnxM~u6ZEzDnˈwPiHb`0L_g[UtnngSzHoyCx ISzDoZ5<(62)%61 5Z387_[9apLwpSfpjaia("42̶DMz:o}'knYtom|ZK?Mw:@xxėixd[mhAXsmoygSInG'[s |o˜VhckrXWeu|oU_\99vV~ggCC + +hd2Cnu{5vvNx6sgnM) 73o;.keJ9vf|oB9o|{|pf\GsiyʧknY) 0djyin;j +h*zhn;B۩nj >-0.>nw*~)pjn~t'pa~nOg\}niqw~me}ғ!߭pYcupknr:]sf{҃  udftniirGۭ11?b1 %>RE.5;_VZݶ-_T^-<Gwe>/fnVTj}h;Yhz-oG0wD4nOt~vVE<*GS*lְػ[@"YL(%,,iG~y`?~&H;ʳP%9M]4f~ɳiP:DTGxeP2)NnLXZcq~tvqnGv26wr2%6N<L2r{nr &#T|Oa ;Hӝ +  +endstream +endobj +87 0 obj +<< /Type /FontDescriptor /FontName /CVHPXV+STIXTwoText-Regular /Flags 4 /FontBBox [ -948 -373 1297 1047 ] /Ascent 762 /CapHeight 657 /Descent -238 /ItalicAngle 0 /StemV 82 /XHeight 473 /FontFile3 88 0 R >> +endobj +89 0 obj +<< /Length 1151 >> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-CVHPXV-STIXTwoText-Regular-0) +%%Title: (TeX-CVHPXV-STIXTwoText-Regular-0 TeX CVHPXV-STIXTwoText-Regular 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (CVHPXV-STIXTwoText-Regular) +/Supplement 0 +>> def +/CMapName /TeX-Identity-CVHPXV-STIXTwoText-Regular def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +0 beginbfrange +endbfrange +33 beginbfchar +<0001> <0020> +<0006> <0044> +<0008> <0046> +<000F> <004D> +<0011> <004F> +<0015> <0053> +<0016> <0054> +<00FF> <0061> +<0100> <0062> +<0102> <0064> +<0103> <0065> +<0104> <0066> +<0106> <0068> +<0107> <0069> +<010B> <006C> +<010C> <006D> +<010D> <006E> +<010E> <006F> +<0110> <0071> +<0111> <0072> +<0112> <0073> +<0113> <0074> +<0114> <0075> +<0115> <0076> +<0117> <0078> +<0118> <0079> +<0721> <002C> +<0725> <002E> +<0786> <0030> +<0787> <0031> +<0788> <0032> +<0789> <0033> +<078A> <0034> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + +endstream +endobj +60 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /CVHPXV+STIXTwoText-Regular /DescendantFonts [ 90 0 R ] /ToUnicode 89 0 R >> +endobj +90 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CVHPXV+STIXTwoText-Regular /FontDescriptor 87 0 R /W 86 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +endobj +64 0 obj +<< /Type /Pages /Count 1 /Kids [ 58 0 R ] >> +endobj +91 0 obj +<< /EmbeddedFiles 67 0 R >> +endobj +92 0 obj +<< /Type /Catalog /Pages 64 0 R /Names 91 0 R /MarkInfo 65 0 R/ViewerPreferences 66 0 R/Lang (en-US)/StructTreeRoot 5 0 R/Metadata 56 0 R >> +endobj +93 0 obj +<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/Title /Author /CreationDate (D:20240223213822Z)/ModDate (D:20240223213822Z) /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >> +endobj +xref +0 94 +0000000002 65535 f +0000017552 00000 n +0000000003 00000 f +0000000004 00000 f +0000000010 00000 f +0000023241 00000 n +0000017782 00000 n +0000018316 00000 n +0000020548 00000 n +0000019173 00000 n +0000000012 00000 f +0000019241 00000 n +0000000014 00000 f +0000019311 00000 n +0000000020 00000 f +0000020074 00000 n +0000019392 00000 n +0000020352 00000 n +0000020181 00000 n +0000020459 00000 n +0000000000 00000 f +0000020609 00000 n +0000000020 00000 n +0000000194 00000 n +0000000421 00000 n +0000000595 00000 n +0000000822 00000 n +0000001021 00000 n +0000001248 00000 n +0000001551 00000 n +0000020716 00000 n +0000020804 00000 n +0000020892 00000 n +0000021008 00000 n +0000021104 00000 n +0000021238 00000 n +0000021372 00000 n +0000021506 00000 n +0000021617 00000 n +0000021752 00000 n +0000021877 00000 n +0000021977 00000 n +0000022241 00000 n +0000001778 00000 n +0000001924 00000 n +0000022424 00000 n +0000002173 00000 n +0000002319 00000 n +0000022607 00000 n +0000002568 00000 n +0000002716 00000 n +0000022791 00000 n +0000022900 00000 n +0000023036 00000 n +0000002965 00000 n +0000003169 00000 n +0000003418 00000 n +0000017453 00000 n +0000017318 00000 n +0000015168 00000 n +0000036975 00000 n +0000030881 00000 n +0000027812 00000 n +0000025172 00000 n +0000037333 00000 n +0000017599 00000 n +0000017635 00000 n +0000017680 00000 n +0000017916 00000 n +0000018279 00000 n +0000018895 00000 n +0000023378 00000 n +0000024187 00000 n +0000023411 00000 n +0000024410 00000 n +0000025328 00000 n +0000025530 00000 n +0000026749 00000 n +0000025619 00000 n +0000026972 00000 n +0000027968 00000 n +0000028170 00000 n +0000029803 00000 n +0000028287 00000 n +0000030022 00000 n +0000031034 00000 n +0000031233 00000 n +0000035542 00000 n +0000031499 00000 n +0000035764 00000 n +0000037131 00000 n +0000037395 00000 n +0000037439 00000 n +0000037596 00000 n +trailer +<< /Size 94 /Root 92 0 R /Info 93 0 R /ID [ ] >> +startxref +37906 +%%EOF diff --git a/test/pdfs/bug1937438_from_word.pdf b/test/pdfs/bug1937438_from_word.pdf new file mode 100755 index 0000000000000000000000000000000000000000..8e6c88fc2a025ba00af008eba0e56c5716ec3b03 GIT binary patch literal 46285 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 O``Kw>;`Z^U)Bg)fmxP%B literal 0 HcmV?d00001 diff --git a/test/pdfs/bug1937438_mml_from_latex.pdf b/test/pdfs/bug1937438_mml_from_latex.pdf new file mode 100755 index 0000000000000000000000000000000000000000..2082e4df6b003a18ecc52aca588acd0e231263f0 GIT binary patch literal 43610 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 literal 0 HcmV?d00001 diff --git a/test/unit/struct_tree_spec.js b/test/unit/struct_tree_spec.js index 055156559..ca722b854 100644 --- a/test/unit/struct_tree_spec.js +++ b/test/unit/struct_tree_spec.js @@ -21,6 +21,7 @@ function equalTrees(rootA, rootB) { expect(a.role).toEqual(b.role); expect(a.lang).toEqual(b.lang); expect(a.type).toEqual(b.type); + expect(a.mathML).toEqual(b.mathML); expect("children" in a).toEqual("children" in b); if (!a.children) { return; @@ -151,4 +152,154 @@ describe("struct tree", function () { ); await loadingTask.destroy(); }); + + it("parses structure with some MathML in AF dictionary", async function () { + const filename = "bug1937438_af_from_latex.pdf"; + const params = buildGetDocumentParams(filename); + const loadingTask = getDocument(params); + const doc = await loadingTask.promise; + const page = await doc.getPage(1); + const struct = await page.getStructTree(); + equalTrees( + { + children: [ + { + role: "Document", + children: [ + { + role: "Part", + children: [ + { + role: "P", + children: [ + { + role: "P", + children: [{ type: "content", id: "p58R_mc0" }], + }, + ], + }, + { + role: "P", + children: [{ type: "content", id: "p58R_mc1" }], + }, + { + role: "P", + children: [{ type: "content", id: "p58R_mc2" }], + }, + ], + }, + { + role: "Sect", + children: [ + { + role: "H1", + children: [ + { + role: "Lbl", + children: [{ type: "content", id: "p58R_mc3" }], + }, + { type: "content", id: "p58R_mc4" }, + ], + }, + { + role: "Part", + children: [ + { + role: "P", + children: [ + { type: "content", id: "p58R_mc5" }, + { + role: "Formula", + children: [{ type: "content", id: "p58R_mc6" }], + mathML: " x ", + }, + { type: "content", id: "p58R_mc7" }, + { + role: "Formula", + children: [{ type: "content", id: "p58R_mc8" }], + mathML: " y ", + }, + { type: "content", id: "p58R_mc9" }, + { + role: "Formula", + children: [{ type: "content", id: "p58R_mc10" }], + mathML: + " x > y ", + }, + { type: "content", id: "p58R_mc11" }, + ], + }, + ], + }, + { + role: "Part", + children: [ + { + role: "P", + children: [{ type: "content", id: "p58R_mc12" }], + }, + { + role: "Formula", + children: [{ type: "content", id: "p58R_mc13" }], + mathML: + ' x2 = |x| ', + }, + ], + }, + ], + }, + ], + }, + ], + role: "Root", + }, + struct + ); + await loadingTask.destroy(); + }); + + it("parses structure with some MathML in MS Office specific entry", async function () { + const filename = "bug1937438_from_word.pdf"; + const params = buildGetDocumentParams(filename); + const loadingTask = getDocument(params); + const doc = await loadingTask.promise; + const page = await doc.getPage(1); + const struct = await page.getStructTree(); + equalTrees( + { + children: [ + { + role: "Document", + children: [ + { + role: "P", + children: [ + { type: "content", id: "p3R_mc0" }, + { + role: "Formula", + children: [{ type: "content", id: "p3R_mc1" }], + alt: "pi", + mathML: '𝜋', + }, + { type: "content", id: "p3R_mc2" }, + ], + }, + { + role: "Formula", + children: [{ type: "content", id: "p3R_mc3" }], + alt: "6 sum from n equals 1 to infinity of 1 over n squared , equals pi squared", + mathML: + '6n=11n2=𝜋2', + }, + { role: "P", children: [{ type: "content", id: "p3R_mc4" }] }, + { role: "P", children: [{ type: "content", id: "p3R_mc5" }] }, + ], + }, + ], + role: "Root", + }, + struct + ); + await loadingTask.destroy(); + }); }); diff --git a/web/struct_tree_layer_builder.js b/web/struct_tree_layer_builder.js index dbc9d7ee4..66e1f98cb 100644 --- a/web/struct_tree_layer_builder.js +++ b/web/struct_tree_layer_builder.js @@ -15,6 +15,7 @@ /** @typedef {import("../src/display/api").PDFPageProxy} PDFPageProxy */ +import { FeatureTest, shadow } from "pdfjs-lib"; import { removeNullCharacters } from "./ui_utils.js"; const PDF_ROLE_TO_HTML_ROLE = { @@ -73,6 +74,98 @@ const PDF_ROLE_TO_HTML_ROLE = { Artifact: null, }; +const MathMLElements = new Set([ + "math", + "merror", + "mfrac", + "mi", + "mmultiscripts", + "mn", + "mo", + "mover", + "mpadded", + "mprescripts", + "mroot", + "mrow", + "ms", + "mspace", + "msqrt", + "mstyle", + "msub", + "msubsup", + "msup", + "mtable", + "mtd", + "mtext", + "mtr", + "munder", + "munderover", + "semantics", +]); +const MathMLNamespace = "http://www.w3.org/1998/Math/MathML"; + +class MathMLSanitizer { + static get sanitizer() { + // From https://w3c.github.io/mathml-docs/mathml-safe-list. + + return shadow( + this, + "sanitizer", + FeatureTest.isSanitizerSupported + ? // eslint-disable-next-line no-undef + new Sanitizer({ + elements: [...MathMLElements].map(name => ({ + name, + namespace: MathMLNamespace, + })), + replaceWithChildrenElements: [ + { + name: "maction", + namespace: MathMLNamespace, + }, + ], + attributes: [ + "dir", + "displaystyle", + "mathbackground", + "mathcolor", + "mathsize", + "scriptlevel", + "encoding", + "display", + "linethickness", + "intent", + "arg", + "form", + "fence", + "separator", + "lspace", + "rspace", + "stretchy", + "symmetric", + "maxsize", + "minsize", + "largeop", + "movablelimits", + "width", + "height", + "depth", + "voffset", + "accent", + "accentunder", + "columnspan", + "rowspan", + ].map(name => ({ + name, + namespace: MathMLNamespace, + })), + comments: false, + }) + : null + ); + } +} + const HEADING_PATTERN = /^H(\d+)$/; /** @@ -230,9 +323,12 @@ class StructTreeLayerBuilder { return null; } - const element = document.createElement("span"); + let element; if ("role" in node) { const { role } = node; + element = MathMLElements.has(role) + ? document.createElementNS(MathMLNamespace, role) + : document.createElement("span"); const match = role.match(HEADING_PATTERN); if (match) { element.setAttribute("role", "heading"); @@ -243,8 +339,24 @@ class StructTreeLayerBuilder { if (role === "Figure" && this.#addImageInTextLayer(node, element)) { return element; } + if (role === "Formula") { + if (node.mathML && MathMLSanitizer.sanitizer) { + element.setHTML(node.mathML, { + sanitizer: MathMLSanitizer.sanitizer, + }); + } + if ( + !node.mathML && + node.children.length === 1 && + node.children[0].role !== "math" + ) { + element = document.createElementNS(MathMLNamespace, "math"); + } + } } + element ||= document.createElement("span"); + this.#setAttributes(node, element); if (node.children) {