diff --git a/README.md b/README.md index ab556cf..fa5fe00 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Yields: map: { type: 'list', ordered: false, - children: [ { type: 'listItem', loose: true, children: [Object] } ] } } + children: [ { type: 'listItem', loose: true, children: [Array] } ] } } ``` ## API diff --git a/lib/index.js b/lib/index.js index 91d5aad..d90616e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -27,7 +27,7 @@ function toc(node, options) { var result = search(node, heading, settings.maxDepth || 6); var map = result.map; - result.map = map.length ? contents(map, settings.tight) : null; + result.map = map.length === 0 ? null : contents(map, settings.tight); /* No given heading */ if (!heading) { diff --git a/lib/insert.js b/lib/insert.js index 53bb399..98dac03 100644 --- a/lib/insert.js +++ b/lib/insert.js @@ -82,6 +82,21 @@ function insert(node, parent, tight) { * Properly style list-items with new lines. */ + parent.spread = !tight; + + if (parent.type === LIST && parent.spread) { + parent.spread = false; + index = -1; + + while (++index < length) { + if (children[index].children.length > 1) { + parent.spread = true; + break; + } + } + } + + // To do: remove `loose` in next major release. if (parent.type === LIST_ITEM) { parent.loose = tight ? false : children.length > 1; } else { diff --git a/lib/list-item.js b/lib/list-item.js index 42dd30e..f2a81ac 100644 --- a/lib/list-item.js +++ b/lib/list-item.js @@ -20,7 +20,9 @@ var LIST_ITEM = 'listItem'; function listItem() { return { type: LIST_ITEM, + // To do: remove `loose` in next major. loose: false, + spread: false, children: [] }; } diff --git a/lib/list.js b/lib/list.js index 6708fd3..5d22e78 100644 --- a/lib/list.js +++ b/lib/list.js @@ -21,6 +21,7 @@ function list() { return { type: LIST, ordered: false, + spread: false, children: [] }; } diff --git a/package.json b/package.json index d878900..d3fd76d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "browserify": "^16.2.1", "esmangle": "^1.0.1", "istanbul": "^0.4.4", - "remark-attr": "^0.6.2", + "remark-attr": "^0.7.0", "remark": "^10.0.0", "remark-cli": "^6.0.0", "remark-comment-config": "^5.0.0", @@ -52,7 +52,7 @@ "remark-usage": "^6.0.0", "remark-validate-links": "^7.0.0", "tape": "^4.6.0", - "xo": "^0.21.1" + "xo": "^0.23.0" }, "xo": { "space": 4, diff --git a/test/fixtures/custom-heading/output.json b/test/fixtures/custom-heading/output.json index bbf2d32..791c20f 100644 --- a/test/fixtures/custom-heading/output.json +++ b/test/fixtures/custom-heading/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/deep-headings/output.json b/test/fixtures/deep-headings/output.json index e493807..b4a3080 100644 --- a/test/fixtures/deep-headings/output.json +++ b/test/fixtures/deep-headings/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -58,6 +62,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/image-in-link-in-heading/output.json b/test/fixtures/image-in-link-in-heading/output.json index 51696d6..b7e732b 100644 --- a/test/fixtures/image-in-link-in-heading/output.json +++ b/test/fixtures/image-in-link-in-heading/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/maximum-depth-1/output.json b/test/fixtures/maximum-depth-1/output.json index d3c9174..206df3b 100644 --- a/test/fixtures/maximum-depth-1/output.json +++ b/test/fixtures/maximum-depth-1/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/maximum-depth-3/output.json b/test/fixtures/maximum-depth-3/output.json index dec6535..b0ec00a 100644 --- a/test/fixtures/maximum-depth-3/output.json +++ b/test/fixtures/maximum-depth-3/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -52,10 +56,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/maximum-depth-6/output.json b/test/fixtures/maximum-depth-6/output.json index 77b8a13..aa6c241 100644 --- a/test/fixtures/maximum-depth-6/output.json +++ b/test/fixtures/maximum-depth-6/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -52,10 +56,12 @@ { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -76,10 +82,12 @@ { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -100,10 +108,12 @@ { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -124,10 +134,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal-attr/output.json b/test/fixtures/normal-attr/output.json index 088b573..749acb6 100644 --- a/test/fixtures/normal-attr/output.json +++ b/test/fixtures/normal-attr/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal-literal-dashes/output.json b/test/fixtures/normal-literal-dashes/output.json index 234e1b9..faf74ff 100644 --- a/test/fixtures/normal-literal-dashes/output.json +++ b/test/fixtures/normal-literal-dashes/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -58,6 +62,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal-nesting-inverted/output.json b/test/fixtures/normal-nesting-inverted/output.json index 485139f..24f4531 100644 --- a/test/fixtures/normal-nesting-inverted/output.json +++ b/test/fixtures/normal-nesting-inverted/output.json @@ -4,18 +4,22 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -42,6 +46,7 @@ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -62,10 +67,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -92,6 +99,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal-singular/output.json b/test/fixtures/normal-singular/output.json index 51696d6..b7e732b 100644 --- a/test/fixtures/normal-singular/output.json +++ b/test/fixtures/normal-singular/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal-toc/output.json b/test/fixtures/normal-toc/output.json index 51696d6..b7e732b 100644 --- a/test/fixtures/normal-toc/output.json +++ b/test/fixtures/normal-toc/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/normal/output.json b/test/fixtures/normal/output.json index 51696d6..b7e732b 100644 --- a/test/fixtures/normal/output.json +++ b/test/fixtures/normal/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/slug-for-images-and-links/output.json b/test/fixtures/slug-for-images-and-links/output.json index b5d1555..c6a96f0 100644 --- a/test/fixtures/slug-for-images-and-links/output.json +++ b/test/fixtures/slug-for-images-and-links/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": true, "children": [ { "type": "listItem", "loose": true, + "spread": true, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -80,6 +85,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/tight/output.json b/test/fixtures/tight/output.json index c333471..274c9a5 100644 --- a/test/fixtures/tight/output.json +++ b/test/fixtures/tight/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -28,10 +30,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -54,6 +58,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -74,10 +79,12 @@ { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -100,6 +107,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", @@ -130,6 +138,7 @@ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph", diff --git a/test/fixtures/unicode/output.json b/test/fixtures/unicode/output.json index 346c047..b639289 100644 --- a/test/fixtures/unicode/output.json +++ b/test/fixtures/unicode/output.json @@ -4,10 +4,12 @@ "map": { "type": "list", "ordered": false, + "spread": false, "children": [ { "type": "listItem", "loose": false, + "spread": false, "children": [ { "type": "paragraph",