@@ -184,6 +184,10 @@ class StructTreeLayerBuilder {
184184
185185 #elementsToAddToTextLayer = null ;
186186
187+ #elementsToHideInTextLayer = null ;
188+
189+ #elementsToStealFromTextLayer = null ;
190+
187191 /**
188192 * @param {StructTreeLayerBuilderOptions } options
189193 */
@@ -304,15 +308,49 @@ class StructTreeLayerBuilder {
304308 return true ;
305309 }
306310
307- addElementsToTextLayer ( ) {
308- if ( ! this . #elementsToAddToTextLayer) {
309- return ;
311+ updateTextLayer ( ) {
312+ if ( this . #elementsToAddToTextLayer) {
313+ for ( const [ id , img ] of this . #elementsToAddToTextLayer) {
314+ document . getElementById ( id ) ?. append ( img ) ;
315+ }
316+ this . #elementsToAddToTextLayer. clear ( ) ;
317+ this . #elementsToAddToTextLayer = null ;
310318 }
311- for ( const [ id , img ] of this . #elementsToAddToTextLayer) {
312- document . getElementById ( id ) ?. append ( img ) ;
319+ if ( this . #elementsToHideInTextLayer) {
320+ for ( const id of this . #elementsToHideInTextLayer) {
321+ const elem = document . getElementById ( id ) ;
322+ if ( elem ) {
323+ elem . ariaHidden = true ;
324+ }
325+ }
326+ this . #elementsToHideInTextLayer. length = 0 ;
327+ this . #elementsToHideInTextLayer = null ;
328+ }
329+ if ( this . #elementsToStealFromTextLayer) {
330+ for (
331+ let i = 0 , ii = this . #elementsToStealFromTextLayer. length ;
332+ i < ii ;
333+ i += 2
334+ ) {
335+ const element = this . #elementsToStealFromTextLayer[ i ] ;
336+ const ids = this . #elementsToStealFromTextLayer[ i + 1 ] ;
337+ let textContent = "" ;
338+ for ( const id of ids ) {
339+ const elem = document . getElementById ( id ) ;
340+ if ( elem ) {
341+ textContent += elem . textContent . trim ( ) || "" ;
342+ // Aria-hide the element in order to avoid duplicate reading of the
343+ // math content by screen readers.
344+ elem . ariaHidden = "true" ;
345+ }
346+ }
347+ if ( textContent ) {
348+ element . textContent = textContent ;
349+ }
350+ }
351+ this . #elementsToStealFromTextLayer. length = 0 ;
352+ this . #elementsToStealFromTextLayer = null ;
313353 }
314- this . #elementsToAddToTextLayer. clear ( ) ;
315- this . #elementsToAddToTextLayer = null ;
316354 }
317355
318356 #walk( node ) {
@@ -325,21 +363,13 @@ class StructTreeLayerBuilder {
325363 const { role } = node ;
326364 if ( MathMLElements . has ( role ) ) {
327365 element = document . createElementNS ( MathMLNamespace , role ) ;
328- let text = "" ;
366+ const ids = [ ] ;
367+ ( this . #elementsToStealFromTextLayer ||= [ ] ) . push ( element , ids ) ;
329368 for ( const { type, id } of node . children || [ ] ) {
330- if ( type !== "content" || ! id ) {
331- continue ;
369+ if ( type === "content" && id ) {
370+ ids . push ( id ) ;
332371 }
333- const elem = document . getElementById ( id ) ;
334- if ( ! elem ) {
335- continue ;
336- }
337- text += elem . textContent . trim ( ) || "" ;
338- // Aria-hide the element in order to avoid duplicate reading of the
339- // math content by screen readers.
340- elem . ariaHidden = "true" ;
341372 }
342- element . textContent = text ;
343373 } else {
344374 element = document . createElement ( "span" ) ;
345375 }
@@ -365,10 +395,7 @@ class StructTreeLayerBuilder {
365395 if ( ! id ) {
366396 continue ;
367397 }
368- const elem = document . getElementById ( id ) ;
369- if ( elem ) {
370- elem . ariaHidden = true ;
371- }
398+ ( this . #elementsToHideInTextLayer ||= [ ] ) . push ( id ) ;
372399 }
373400 // For now, we don't want to keep the alt text if there's valid
374401 // MathML (see https://github.com/w3c/mathml-aam/issues/37).
0 commit comments