Files
30-seconds-of-code/node_modules/mdast-util-toc/lib/insert.js
2019-08-20 15:52:05 +02:00

109 lines
2.4 KiB
JavaScript

/**
* @author Titus Wormer
* @copyright 2015 Titus Wormer
* @license MIT
* @module mdast:toc
* @fileoverview Generate a Table of Contents (TOC) from a given Markdown file.
*/
/* Expose. */
module.exports = insert;
/* Dependencies */
var listItem = require('./list-item');
var list = require('./list');
/* Constants */
var LIST = 'list';
var LIST_ITEM = 'listItem';
var PARAGRAPH = 'paragraph';
var LINK = 'link';
var TEXT = 'text';
/**
* Insert a `node` into a `parent`.
*
* @param {Object} node - `node` to insert.
* @param {Object} parent - Parent of `node`.
* @param {boolean?} [tight] - Prefer tight list-items.
* @return {undefined}
*/
function insert(node, parent, tight) {
var children = parent.children;
var length = children.length;
var last = children[length - 1];
var isLoose = false;
var index;
var item;
if (node.depth === 1) {
item = listItem();
item.children.push({
type: PARAGRAPH,
children: [
{
type: LINK,
title: null,
url: '#' + node.id,
children: [
{
type: TEXT,
value: node.value
}
]
}
]
});
children.push(item);
} else if (last && last.type === LIST_ITEM) {
insert(node, last, tight);
} else if (last && last.type === LIST) {
node.depth--;
insert(node, last, tight);
} else if (parent.type === LIST) {
item = listItem();
insert(node, item, tight);
children.push(item);
} else {
item = list();
node.depth--;
insert(node, item, tight);
children.push(item);
}
/*
* Properly style list-items with new lines.
*/
if (parent.type === LIST_ITEM) {
parent.loose = tight ? false : children.length > 1;
} else {
if (tight) {
isLoose = false;
} else {
index = -1;
while (++index < length) {
if (children[index].loose) {
isLoose = true;
break;
}
}
}
index = -1;
while (++index < length) {
children[index].loose = isLoose;
}
}
}