/** * @typedef {import('hast').Element} Element * @typedef {import('hast').ElementContent} ElementContent */ import { htmlToHast } from './html-transform-node.js'; /** * Create new footnote section node based on footnoteArray mappings * * @param {{int: string}} citationDict * @param {{type: 'citation' | 'existing', oldId: string}[]} footnoteArray * @param {Element | undefined} footnoteSection * @return {Element} */ export const genFootnoteSection = (citationDict, footnoteArray, footnoteSection) => { /** @type {Element} */ const list = { type: 'element', tagName: 'ol', properties: {}, children: [{ type: 'text', value: '\n' }], }; let oldFootnoteList; if (footnoteSection) { /** @type {Element} */ // @ts-ignore - for some reason, the type does not narrow even after filtering oldFootnoteList = footnoteSection.children.filter(n => (n.type == "element")).find((n) => (n.tagName === 'ol')); } for (const [idx, item] of footnoteArray.entries()) { const { type, oldId } = item; if (type === 'citation') { list.children.push({ type: 'element', tagName: 'li', properties: { id: `user-content-fn-${idx + 1}` }, children: [ { type: 'element', tagName: 'p', properties: {}, children: [ htmlToHast(`${citationDict[oldId]}`), { type: 'element', tagName: 'a', properties: { href: `#user-content-fnref-${idx + 1}`, dataFootnoteBackref: true, className: ['data-footnote-backref'], ariaLabel: 'Back to content', }, children: [{ type: 'text', value: '↩' }], }, ], }, { type: 'text', value: '\n' }, ], }); } else if (type === 'existing') { // @ts-ignore const liNode = oldFootnoteList.children.find((n) => n.tagName === 'li' && n.properties.id === `user-content-fn-${oldId}`); liNode.properties.id = `user-content-fn-${idx + 1}`; const aNode = liNode.children[1].children.find((n) => n.tagName === 'a'); aNode.properties.href = `#user-content-fnref-${idx + 1}`; list.children.push(liNode); } } /** @type {Element} */ const newfootnoteSection = { type: 'element', tagName: 'section', properties: { dataFootnotes: true, className: ['footnotes'] }, children: [ { type: 'element', tagName: 'h2', properties: { className: ['sr-only'], id: 'footnote-label' }, children: [{ type: 'text', value: 'Footnotes' }], }, { type: 'text', value: '\n' }, list, ], }; return newfootnoteSection; };