/** * @typedef {import('mdast').ListItem} ListItem * @typedef {import('mdast').Parents} Parents * @typedef {import('../types.js').Info} Info * @typedef {import('../types.js').Map} Map * @typedef {import('../types.js').State} State */ 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 } }