definition.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * @import {Info, State} from 'mdast-util-to-markdown'
  3. * @import {Definition, Parents} from 'mdast'
  4. */
  5. import {checkQuote} from '../util/check-quote.js'
  6. /**
  7. * @param {Definition} node
  8. * @param {Parents | undefined} _
  9. * @param {State} state
  10. * @param {Info} info
  11. * @returns {string}
  12. */
  13. export function definition(node, _, state, info) {
  14. const quote = checkQuote(state)
  15. const suffix = quote === '"' ? 'Quote' : 'Apostrophe'
  16. const exit = state.enter('definition')
  17. let subexit = state.enter('label')
  18. const tracker = state.createTracker(info)
  19. let value = tracker.move('[')
  20. value += tracker.move(
  21. state.safe(state.associationId(node), {
  22. before: value,
  23. after: ']',
  24. ...tracker.current()
  25. })
  26. )
  27. value += tracker.move(']: ')
  28. subexit()
  29. if (
  30. // If there’s no url, or…
  31. !node.url ||
  32. // If there are control characters or whitespace.
  33. /[\0- \u007F]/.test(node.url)
  34. ) {
  35. subexit = state.enter('destinationLiteral')
  36. value += tracker.move('<')
  37. value += tracker.move(
  38. state.safe(node.url, {before: value, after: '>', ...tracker.current()})
  39. )
  40. value += tracker.move('>')
  41. } else {
  42. // No whitespace, raw is prettier.
  43. subexit = state.enter('destinationRaw')
  44. value += tracker.move(
  45. state.safe(node.url, {
  46. before: value,
  47. after: node.title ? ' ' : '\n',
  48. ...tracker.current()
  49. })
  50. )
  51. }
  52. subexit()
  53. if (node.title) {
  54. subexit = state.enter(`title${suffix}`)
  55. value += tracker.move(' ' + quote)
  56. value += tracker.move(
  57. state.safe(node.title, {
  58. before: value,
  59. after: quote,
  60. ...tracker.current()
  61. })
  62. )
  63. value += tracker.move(quote)
  64. subexit()
  65. }
  66. exit()
  67. return value
  68. }