/** * @typedef {import('mdast').LinkReference} LinkReference * @typedef {import('mdast').Parents} Parents * @typedef {import('../types.js').Info} Info * @typedef {import('../types.js').State} State */ linkReference.peek = linkReferencePeek /** * @param {LinkReference} node * @param {Parents | undefined} _ * @param {State} state * @param {Info} info * @returns {string} */ export function linkReference(node, _, state, info) { const type = node.referenceType const exit = state.enter('linkReference') let subexit = state.enter('label') const tracker = state.createTracker(info) let value = tracker.move('[') const text = state.containerPhrasing(node, { before: value, after: ']', ...tracker.current() }) value += tracker.move(text + '][') subexit() // Hide the fact that we’re in phrasing, because escapes don’t work. const stack = state.stack state.stack = [] subexit = state.enter('reference') // Note: for proper tracking, we should reset the output positions when we end // up making a `shortcut` reference, because then there is no brace output. // Practically, in that case, there is no content, so it doesn’t matter that // we’ve tracked one too many characters. const reference = state.safe(state.associationId(node), { before: value, after: ']', ...tracker.current() }) subexit() state.stack = stack exit() if (type === 'full' || !text || text !== reference) { value += tracker.move(reference + ']') } else if (type === 'shortcut') { // Remove the unwanted `[`. value = value.slice(0, -1) } else { value += tracker.move(']') } return value } /** * @returns {string} */ function linkReferencePeek() { return '[' }