1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /**
- * @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 '['
- }
|