File size: 2,424 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | import { getNary, getNaryTarget } from '../ooml/index.js'
import { walker } from '../walker.js'
export function munderover(element, targetParent, previousSibling, nextSibling, ancestors) {
// Munderover
if (element.children.length !== 3) {
// treat as mrow
return targetParent
}
ancestors = [...ancestors]
ancestors.unshift(element)
const base = element.children[0]
const underscript = element.children[1]
const overscript = element.children[2]
//
// m:nAry
//
// Conditions:
// 1. base text must be nary operator
// 2. no accents
const naryChar = getNary(base)
if (
naryChar &&
element.attributes?.accent?.toLowerCase() !== 'true' &&
element.attributes?.accentunder?.toLowerCase() !== 'true'
) {
const topTarget = getNaryTarget(naryChar, element, 'undOvr')
element.isNary = true
const subscriptTarget = {
name: 'm:sub',
type: 'tag',
attribs: {},
children: []
}
const superscriptTarget = {
name: 'm:sup',
type: 'tag',
attribs: {},
children: []
}
walker(underscript, subscriptTarget, false, false, ancestors)
walker(overscript, superscriptTarget, false, false, ancestors)
topTarget.children.push(subscriptTarget)
topTarget.children.push(superscriptTarget)
topTarget.children.push({ type: 'tag', name: 'm:e', attribs: {}, children: [] })
targetParent.children.push(topTarget)
return
}
// Fallback: m:limUpp()m:limlow
const baseTarget = {
name: 'm:e',
type: 'tag',
attribs: {},
children: []
}
walker(base, baseTarget, false, false, ancestors)
const underscriptTarget = {
name: 'm:lim',
type: 'tag',
attribs: {},
children: []
}
const overscriptTarget = {
name: 'm:lim',
type: 'tag',
attribs: {},
children: []
}
walker(underscript, underscriptTarget, false, false, ancestors)
walker(overscript, overscriptTarget, false, false, ancestors)
targetParent.children.push({
type: 'tag',
name: 'm:limUpp',
attribs: {},
children: [
{
type: 'tag',
name: 'm:e',
attribs: {},
children: [
{
type: 'tag',
name: 'm:limLow',
attribs: {},
children: [baseTarget, underscriptTarget]
}
]
},
overscriptTarget
]
})
// Don't iterate over children in the usual way.
}
|