| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /**
- * @import {Info, Map, State} from 'mdast-util-to-markdown'
- * @import {ListItem, Parents} from 'mdast'
- */
- import {checkBullet} from '../util/check-bullet.js'
- import {checkListItemIndent} from '../util/check-list-item-indent.js'
- /**
- * @param {ListItem} node
- * @param {Parents | undefined} parent
- * @param {State} state
- * @param {Info} info
- * @returns {string}
- */
- export function listItem(node, parent, state, info) {
- const listItemIndent = checkListItemIndent(state)
- let bullet = state.bulletCurrent || checkBullet(state)
- // Add the marker value for ordered lists.
- if (parent && parent.type === 'list' && parent.ordered) {
- bullet =
- (typeof parent.start === 'number' && parent.start > -1
- ? parent.start
- : 1) +
- (state.options.incrementListMarker === false
- ? 0
- : parent.children.indexOf(node)) +
- bullet
- }
- let size = bullet.length + 1
- if (
- listItemIndent === 'tab' ||
- (listItemIndent === 'mixed' &&
- ((parent && parent.type === 'list' && parent.spread) || node.spread))
- ) {
- size = Math.ceil(size / 4) * 4
- }
- const tracker = state.createTracker(info)
- tracker.move(bullet + ' '.repeat(size - bullet.length))
- tracker.shift(size)
- const exit = state.enter('listItem')
- const value = state.indentLines(
- state.containerFlow(node, tracker.current()),
- map
- )
- exit()
- return value
- /** @type {Map} */
- function map(line, index, blank) {
- if (index) {
- return (blank ? '' : ' '.repeat(size)) + line
- }
- return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line
- }
- }
|