Spaces:
No application file
No application file
| import { getNary, getNaryTarget } from '../ooml/index.js' | |
| import { walker } from '../walker.js' | |
| export function msub(element, targetParent, previousSibling, nextSibling, ancestors) { | |
| // Subscript | |
| if (element.children.length !== 2) { | |
| // treat as mrow | |
| return targetParent | |
| } | |
| ancestors = [...ancestors] | |
| ancestors.unshift(element) | |
| const base = element.children[0] | |
| const subscript = element.children[1] | |
| let topTarget | |
| // | |
| // m:nAry | |
| // | |
| // Conditions: | |
| // 1. base text must be nary operator | |
| // 2. no accents | |
| const naryChar = getNary(base) | |
| if ( | |
| naryChar && | |
| element.attribs?.accent?.toLowerCase() !== 'true' && | |
| element.attribs?.accentunder?.toLowerCase() !== 'true' | |
| ) { | |
| topTarget = getNaryTarget(naryChar, element, 'subSup', false, true) | |
| element.isNary = true | |
| } else { | |
| // Check for empty base → prescript pattern (LaTeX {}_{sub}X) | |
| const isEmptyBase = base.name === 'mrow' && (!base.children || base.children.length === 0) | |
| if (isEmptyBase) { | |
| topTarget = { | |
| type: 'tag', | |
| name: 'm:sPre', | |
| attribs: {}, | |
| children: [ | |
| { | |
| type: 'tag', | |
| name: 'm:sPrePr', | |
| attribs: {}, | |
| children: [ | |
| { | |
| type: 'tag', | |
| name: 'm:ctrlPr', | |
| attribs: {}, | |
| children: [] | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| element.isPrescript = true | |
| } else { | |
| const baseTarget = { | |
| name: 'm:e', | |
| type: 'tag', | |
| attribs: {}, | |
| children: [] | |
| } | |
| walker(base, baseTarget, false, false, ancestors) | |
| topTarget = { | |
| type: 'tag', | |
| name: 'm:sSub', | |
| attribs: {}, | |
| children: [ | |
| { | |
| type: 'tag', | |
| name: 'm:sSubPr', | |
| attribs: {}, | |
| children: [ | |
| { | |
| type: 'tag', | |
| name: 'm:ctrlPr', | |
| attribs: {}, | |
| children: [] | |
| } | |
| ] | |
| }, | |
| baseTarget | |
| ] | |
| } | |
| } | |
| } | |
| const subscriptTarget = { | |
| name: 'm:sub', | |
| type: 'tag', | |
| attribs: {}, | |
| children: [] | |
| } | |
| walker(subscript, subscriptTarget, false, false, ancestors) | |
| topTarget.children.push(subscriptTarget) | |
| if (element.isNary) { | |
| topTarget.children.push({ type: 'tag', name: 'm:sup', attribs: {}, children: [] }) | |
| topTarget.children.push({ type: 'tag', name: 'm:e', attribs: {}, children: [] }) | |
| } | |
| // For prescript, add empty m:sup and m:e (base filled by walker redirect) | |
| if (element.isPrescript) { | |
| topTarget.children.push({ type: 'tag', name: 'm:sup', attribs: {}, children: [] }) | |
| topTarget.children.push({ type: 'tag', name: 'm:e', attribs: {}, children: [] }) | |
| } | |
| targetParent.children.push(topTarget) | |
| // Don't iterate over children in the usual way. | |
| } | |