/** * @typedef {import('mdast').ImageReference} ImageReference * @typedef {import('mdast').Parents} Parents * @typedef {import('../types.js').Info} Info * @typedef {import('../types.js').State} State */ imageReference.peek = imageReferencePeek /** * @param {ImageReference} node * @param {Parents | undefined} _ * @param {State} state * @param {Info} info * @returns {string} */ export function imageReference(node, _, state, info) { const type = node.referenceType const exit = state.enter('imageReference') let subexit = state.enter('label') const tracker = state.createTracker(info) let value = tracker.move('![') const alt = state.safe(node.alt, { before: value, after: ']', ...tracker.current() }) value += tracker.move(alt + '][') 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' || !alt || alt !== 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 imageReferencePeek() { return '!' }