diff --git a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts index 7530a59fa4f..a35b5223198 100644 --- a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts @@ -389,6 +389,24 @@ describe('stringify static html', () => { ]) }) + test('should stringify mathML', () => { + const math = `` + const repeated = `1` + const { ast } = compileWithStringify( + `
${math}${repeat( + repeated, + StringifyThresholds.NODE_COUNT, + )}
`, + ) + + expect(ast.cached).toMatchObject([ + cachedArrayStaticNodeMatcher( + `${math}${repeat(repeated, StringifyThresholds.NODE_COUNT)}`, + 1, + ), + ]) + }) + // #5439 test('stringify v-html', () => { const { code } = compileWithStringify(` diff --git a/packages/compiler-dom/src/transforms/stringifyStatic.ts b/packages/compiler-dom/src/transforms/stringifyStatic.ts index bb3d26e817b..a608ea3c4b3 100644 --- a/packages/compiler-dom/src/transforms/stringifyStatic.ts +++ b/packages/compiler-dom/src/transforms/stringifyStatic.ts @@ -24,6 +24,7 @@ import { isArray, isBooleanAttr, isKnownHtmlAttr, + isKnownMathMLAttr, isKnownSvgAttr, isString, isSymbol, @@ -190,7 +191,9 @@ const isStringifiableAttr = (name: string, ns: Namespaces) => { ? isKnownHtmlAttr(name) : ns === Namespaces.SVG ? isKnownSvgAttr(name) - : false) || dataAriaRE.test(name) + : ns === Namespaces.MATH_ML + ? isKnownMathMLAttr(name) + : false) || dataAriaRE.test(name) ) } diff --git a/packages/shared/src/domAttrConfig.ts b/packages/shared/src/domAttrConfig.ts index e62a3c2ef49..b5f0166327f 100644 --- a/packages/shared/src/domAttrConfig.ts +++ b/packages/shared/src/domAttrConfig.ts @@ -123,6 +123,25 @@ export const isKnownSvgAttr: (key: string) => boolean = /*@__PURE__*/ makeMap( `xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`, ) +/** + * Generated from https://developer.mozilla.org/en-US/docs/Web/MathML/Attribute + */ +export const isKnownMathMLAttr: (key: string) => boolean = + /*@__PURE__*/ makeMap( + `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,` + + `altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,` + + `columnspan,denomalign,depth,dir,display,displaystyle,encoding,` + + `equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,` + + `groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,` + + `indentshift,indentshiftfirst,indentshiftlast,indextype,justify,` + + `largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,` + + `mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,` + + `rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,` + + `scriptsizemultiplier,selection,separator,separators,shift,side,` + + `src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,` + + `voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`, + ) + /** * Shared between server-renderer and runtime-core hydration logic */