image-reference.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * @import {Info, State} from 'mdast-util-to-markdown'
  3. * @import {ImageReference, Parents} from 'mdast'
  4. */
  5. imageReference.peek = imageReferencePeek
  6. /**
  7. * @param {ImageReference} node
  8. * @param {Parents | undefined} _
  9. * @param {State} state
  10. * @param {Info} info
  11. * @returns {string}
  12. */
  13. export function imageReference(node, _, state, info) {
  14. const type = node.referenceType
  15. const exit = state.enter('imageReference')
  16. let subexit = state.enter('label')
  17. const tracker = state.createTracker(info)
  18. let value = tracker.move('![')
  19. const alt = state.safe(node.alt, {
  20. before: value,
  21. after: ']',
  22. ...tracker.current()
  23. })
  24. value += tracker.move(alt + '][')
  25. subexit()
  26. // Hide the fact that we’re in phrasing, because escapes don’t work.
  27. const stack = state.stack
  28. state.stack = []
  29. subexit = state.enter('reference')
  30. // Note: for proper tracking, we should reset the output positions when we end
  31. // up making a `shortcut` reference, because then there is no brace output.
  32. // Practically, in that case, there is no content, so it doesn’t matter that
  33. // we’ve tracked one too many characters.
  34. const reference = state.safe(state.associationId(node), {
  35. before: value,
  36. after: ']',
  37. ...tracker.current()
  38. })
  39. subexit()
  40. state.stack = stack
  41. exit()
  42. if (type === 'full' || !alt || alt !== reference) {
  43. value += tracker.move(reference + ']')
  44. } else if (type === 'shortcut') {
  45. // Remove the unwanted `[`.
  46. value = value.slice(0, -1)
  47. } else {
  48. value += tracker.move(']')
  49. }
  50. return value
  51. }
  52. /**
  53. * @returns {string}
  54. */
  55. function imageReferencePeek() {
  56. return '!'
  57. }