/** * @typedef {import('hast').Element} Element * @typedef {import('mdast').FootnoteReference} FootnoteReference * @typedef {import('../state.js').State} State */ import {normalizeUri} from 'micromark-util-sanitize-uri' /** * Turn an mdast `footnoteReference` node into hast. * * @param {State} state * Info passed around. * @param {FootnoteReference} node * mdast node. * @returns {Element} * hast node. */ export function footnoteReference(state, node) { const clobberPrefix = typeof state.options.clobberPrefix === 'string' ? state.options.clobberPrefix : 'user-content-' const id = String(node.identifier).toUpperCase() const safeId = normalizeUri(id.toLowerCase()) const index = state.footnoteOrder.indexOf(id) /** @type {number} */ let counter let reuseCounter = state.footnoteCounts.get(id) if (reuseCounter === undefined) { reuseCounter = 0 state.footnoteOrder.push(id) counter = state.footnoteOrder.length } else { counter = index + 1 } reuseCounter += 1 state.footnoteCounts.set(id, reuseCounter) /** @type {Element} */ const link = { type: 'element', tagName: 'a', properties: { href: '#' + clobberPrefix + 'fn-' + safeId, id: clobberPrefix + 'fnref-' + safeId + (reuseCounter > 1 ? '-' + reuseCounter : ''), dataFootnoteRef: true, ariaDescribedBy: ['footnote-label'] }, children: [{type: 'text', value: String(counter)}] } state.patch(node, link) /** @type {Element} */ const sup = { type: 'element', tagName: 'sup', properties: {}, children: [link] } state.patch(node, sup) return state.applyData(node, sup) }