| import { walker } from '../walker.js' |
|
|
| export function mmultiscripts(element, targetParent, previousSibling, nextSibling, ancestors) { |
| if (element.children.length === 0) { |
| |
| return |
| } |
|
|
| const base = element.children[0] |
| const postSubs = [] |
| const postSupers = [] |
| const preSubs = [] |
| const preSupers = [] |
| const children = element.children.slice(1) |
| let dividerFound = false |
| children.forEach((child, index) => { |
| if (child.name === 'mprescripts') { |
| dividerFound = true |
| } else if (child.name !== 'none') { |
| if (index % 2) { |
| if (dividerFound) { |
| preSubs.push(child) |
| } else { |
| postSupers.push(child) |
| } |
| } else { |
| if (dividerFound) { |
| preSupers.push(child) |
| } else { |
| postSubs.push(child) |
| } |
| } |
| } |
| }) |
| ancestors = [...ancestors] |
| ancestors.unshift(element) |
| const tempTarget = { |
| children: [] |
| } |
| walker(base, tempTarget, false, false, ancestors) |
| let topTarget = tempTarget.children[0] |
|
|
| if (postSubs.length || postSupers.length) { |
| const subscriptTarget = { |
| name: 'm:sub', |
| type: 'tag', |
| attribs: {}, |
| children: [] |
| } |
| postSubs.forEach((subscript) => walker(subscript, subscriptTarget, false, false, ancestors)) |
|
|
| const superscriptTarget = { |
| name: 'm:sup', |
| type: 'tag', |
| attribs: {}, |
| children: [] |
| } |
|
|
| postSupers.forEach((superscript) => |
| walker(superscript, superscriptTarget, false, false, ancestors) |
| ) |
|
|
| const topPostTarget = { |
| type: 'tag', |
| attribs: {}, |
| children: [ |
| { |
| type: 'tag', |
| name: 'm:e', |
| attribs: {}, |
| children: [topTarget] |
| } |
| ] |
| } |
| if (postSubs.length && postSupers.length) { |
| topPostTarget.name = 'm:sSubSup' |
| topPostTarget.children.push(subscriptTarget) |
| topPostTarget.children.push(superscriptTarget) |
| } else if (postSubs.length) { |
| topPostTarget.name = 'm:sSub' |
| topPostTarget.children.push(subscriptTarget) |
| } else { |
| topPostTarget.name = 'm:sSup' |
| topPostTarget.children.push(superscriptTarget) |
| } |
| topTarget = topPostTarget |
| } |
|
|
| if (preSubs.length || preSupers.length) { |
| const preSubscriptTarget = { |
| name: 'm:sub', |
| type: 'tag', |
| attribs: {}, |
| children: [] |
| } |
| preSubs.forEach((subscript) => walker(subscript, preSubscriptTarget, false, false, ancestors)) |
|
|
| const preSuperscriptTarget = { |
| name: 'm:sup', |
| type: 'tag', |
| attribs: {}, |
| children: [] |
| } |
|
|
| preSupers.forEach((superscript) => |
| walker(superscript, preSuperscriptTarget, false, false, ancestors) |
| ) |
| const topPreTarget = { |
| name: 'm:sPre', |
| type: 'tag', |
| attribs: {}, |
| children: [ |
| { |
| name: 'm:e', |
| type: 'tag', |
| attribs: {}, |
| children: [topTarget] |
| }, |
| preSubscriptTarget, |
| preSuperscriptTarget |
| ] |
| } |
| topTarget = topPreTarget |
| } |
| targetParent.children.push(topTarget) |
| |
| } |
|
|