/** * @typedef {import('../types.js').FlowParents} FlowParents * @typedef {import('../types.js').FlowChildren} FlowChildren * @typedef {import('../types.js').State} State * @typedef {import('../types.js').TrackFields} TrackFields */ /** * @param {FlowParents} parent * Parent of flow nodes. * @param {State} state * Info passed around about the current state. * @param {TrackFields} info * Info on where we are in the document we are generating. * @returns {string} * Serialized children, joined by (blank) lines. */ export function containerFlow(parent, state, info) { const indexStack = state.indexStack const children = parent.children || [] const tracker = state.createTracker(info) /** @type {Array} */ const results = [] let index = -1 indexStack.push(-1) while (++index < children.length) { const child = children[index] indexStack[indexStack.length - 1] = index results.push( tracker.move( state.handle(child, parent, state, { before: '\n', after: '\n', ...tracker.current() }) ) ) if (child.type !== 'list') { state.bulletLastUsed = undefined } if (index < children.length - 1) { results.push( tracker.move(between(child, children[index + 1], parent, state)) ) } } indexStack.pop() return results.join('') } /** * @param {FlowChildren} left * @param {FlowChildren} right * @param {FlowParents} parent * @param {State} state * @returns {string} */ function between(left, right, parent, state) { let index = state.join.length while (index--) { const result = state.join[index](left, right, parent, state) if (result === true || result === 1) { break } if (typeof result === 'number') { return '\n'.repeat(1 + result) } if (result === false) { return '\n\n\n\n' } } return '\n\n' }