1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /**
- * @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<string>} */
- 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'
- }
|