46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
'use strict';
|
|
|
|
module.exports = block;
|
|
|
|
/* Stringify a block node with block children (e.g., `root`
|
|
* or `blockquote`).
|
|
* Knows about code following a list, or adjacent lists
|
|
* with similar bullets, and places an extra newline
|
|
* between them. */
|
|
function block(node) {
|
|
var self = this;
|
|
var values = [];
|
|
var children = node.children;
|
|
var length = children.length;
|
|
var index = -1;
|
|
var child;
|
|
var prev;
|
|
|
|
while (++index < length) {
|
|
child = children[index];
|
|
|
|
if (prev) {
|
|
/* Duplicate nodes, such as a list
|
|
* directly following another list,
|
|
* often need multiple new lines.
|
|
*
|
|
* Additionally, code blocks following a list
|
|
* might easily be mistaken for a paragraph
|
|
* in the list itself. */
|
|
if (child.type === prev.type && prev.type === 'list') {
|
|
values.push(prev.ordered === child.ordered ? '\n\n\n' : '\n\n');
|
|
} else if (prev.type === 'list' && child.type === 'code' && !child.lang) {
|
|
values.push('\n\n\n');
|
|
} else {
|
|
values.push('\n\n');
|
|
}
|
|
}
|
|
|
|
values.push(self.visit(child, node));
|
|
|
|
prev = child;
|
|
}
|
|
|
|
return values.join('');
|
|
}
|