list-item.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * @import {Info, Map, State} from 'mdast-util-to-markdown'
  3. * @import {ListItem, Parents} from 'mdast'
  4. */
  5. import {checkBullet} from '../util/check-bullet.js'
  6. import {checkListItemIndent} from '../util/check-list-item-indent.js'
  7. /**
  8. * @param {ListItem} node
  9. * @param {Parents | undefined} parent
  10. * @param {State} state
  11. * @param {Info} info
  12. * @returns {string}
  13. */
  14. export function listItem(node, parent, state, info) {
  15. const listItemIndent = checkListItemIndent(state)
  16. let bullet = state.bulletCurrent || checkBullet(state)
  17. // Add the marker value for ordered lists.
  18. if (parent && parent.type === 'list' && parent.ordered) {
  19. bullet =
  20. (typeof parent.start === 'number' && parent.start > -1
  21. ? parent.start
  22. : 1) +
  23. (state.options.incrementListMarker === false
  24. ? 0
  25. : parent.children.indexOf(node)) +
  26. bullet
  27. }
  28. let size = bullet.length + 1
  29. if (
  30. listItemIndent === 'tab' ||
  31. (listItemIndent === 'mixed' &&
  32. ((parent && parent.type === 'list' && parent.spread) || node.spread))
  33. ) {
  34. size = Math.ceil(size / 4) * 4
  35. }
  36. const tracker = state.createTracker(info)
  37. tracker.move(bullet + ' '.repeat(size - bullet.length))
  38. tracker.shift(size)
  39. const exit = state.enter('listItem')
  40. const value = state.indentLines(
  41. state.containerFlow(node, tracker.current()),
  42. map
  43. )
  44. exit()
  45. return value
  46. /** @type {Map} */
  47. function map(line, index, blank) {
  48. if (index) {
  49. return (blank ? '' : ' '.repeat(size)) + line
  50. }
  51. return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line
  52. }
  53. }