| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /**
- * @import {Element} from 'hast'
- * @import {FootnoteReference} from 'mdast'
- * @import {State} from '../state.js'
- */
- 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)
- }
|