87 lines
1.9 KiB
JavaScript
87 lines
1.9 KiB
JavaScript
|
/**
|
||
|
* @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'
|
||
|
}
|