Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle table of contents not on top level #19

Open
wants to merge 2 commits into
base: 0.4.4
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 32 additions & 15 deletions markdown-include.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,30 @@ this.customTags = [];
* @return {String} String for markdown navigation item
*/
exports.buildContentItem = function (obj) {
var headingTag = obj.headingTag;
var count = obj.count;
var item = headingTag.substring(count + 1);
var index = headingTag.indexOf(item);
var headingTrimmed = this.buildLinkString(headingTag.substring(index));
var item = obj.item;
var itemLink = this.buildLinkString(item);
var lead = this.options.tableOfContents.lead && this.options.tableOfContents.lead === 'number' ? '1.' : '*';
var navItem;

switch (obj.count) {
switch (count) {
case 1:
navItem = lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = lead + ' ' + this.buildLink(item, itemLink);
break;
case 2:
navItem = ' ' + lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = ' ' + lead + ' ' + this.buildLink(item, itemLink);
break;
case 3:
navItem = ' ' + lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = ' ' + lead + ' ' + this.buildLink(item, itemLink);
break;
case 4:
navItem = ' ' + lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = ' ' + lead + ' ' + this.buildLink(item, itemLink);
break;
case 5:
navItem = ' ' + lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = ' ' + lead + ' ' + this.buildLink(item, itemLink);
break;
case 6:
navItem = ' ' + lead + ' ' + this.buildLink(item, headingTrimmed);
navItem = ' ' + lead + ' ' + this.buildLink(item, itemLink);
break;
}

Expand Down Expand Up @@ -167,13 +165,18 @@ exports.compileFiles = function (path) {
exports.compileHeadingTags = function (file) {
var headingTags = this.findHeadingTags(this.build[file].parsedData);
var replacedHeadingTag;
var parsedHeading;
var parsedHeadings = [];
var i;

for (i = 0; i < headingTags.length; i += 1) {
replacedHeadingTag = headingTags[i].replace(this.headingTag, '');
parsedHeading = this.parseHeadingTag(replacedHeadingTag);
this.tableOfContents += this.buildContentItem(parsedHeading);
parsedHeadings.push(this.parseHeadingTag(replacedHeadingTag));
}
var minCount = this.getMinCount(parsedHeadings);

for (i = 0; i < parsedHeadings.length; i += 1) {
parsedHeadings[i].count = parsedHeadings[i].count - minCount + 1;
this.tableOfContents += this.buildContentItem(parsedHeadings[i]);
}

this.build[file].parsedData = this.stripTagsInFile({
Expand All @@ -183,6 +186,17 @@ exports.compileHeadingTags = function (file) {
});
};

exports.getMinCount = function getMinCount(parsedHeadings) {
var minCount = 0;
for (var i = 0; i < parsedHeadings.length; i += 1) {
var count = parsedHeadings[i].count;
if (minCount === 0 || count < minCount) {
minCount = count;
}
}
return minCount;
}

/**
* Finding heading tags that have !heading
* @param {String} parsedData Parsed data from includes
Expand Down Expand Up @@ -228,21 +242,24 @@ exports.findIncludeTags = function (rawData) {
*/
exports.parseHeadingTag = function (headingTag) {
var count = 0;
var item;
var i;

for (i = 0; i < headingTag.length; i += 1) {
if (headingTag[i] === '#') {
count += 1;
}
else {
item = headingTag.slice(count + 1);
break;
}
}

// Do we need to return the heading tag??
return {
count: count,
headingTag: headingTag
headingTag: headingTag,
item: item
};
};

Expand Down
1 change: 1 addition & 0 deletions tests/all.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* eslint-env amd */
define([
'./unit/buildContentItem',
'./unit/buildTableOfContents',
'./unit/buildLinkString',
'./unit/compileFiles',
'./unit/compileHeadingTags',
Expand Down
6 changes: 6 additions & 0 deletions tests/data/docs/has_heading_tags_on_lower_levels.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# First Test Heading
## Second Test Heading
### Third Test Heading !heading
#### Fourth Test Heading !heading
##### Fifth Test Heading !heading
###### Sixth Test Heading !heading
6 changes: 4 additions & 2 deletions tests/unit/buildContentItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ define([

var contentItem = markdownInclude.buildContentItem({
count: 1,
headingTag: '# My Heading To Link'
headingTag: '# My Heading To Link',
item: 'My Heading To Link'
});

assert.equal(contentItem, '1. [My Heading To Link](#my-heading-to-link)\n', 'Content items match');
Expand All @@ -32,7 +33,8 @@ define([

var contentItem = markdownInclude.buildContentItem({
count: 1,
headingTag: '# My Heading To Link'
headingTag: '# My Heading To Link',
item: 'My Heading To Link'
});

assert.equal(contentItem, '* [My Heading To Link](#my-heading-to-link)\n', 'Content items match');
Expand Down
34 changes: 34 additions & 0 deletions tests/unit/buildTableOfContents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
define([
'intern!bdd',
'intern/chai!assert',
'intern/dojo/node!../../markdown-include'
], function (bdd, assert, markdownInclude) {
bdd.describe('markdownInclude.buildTableOfContents', function () {
bdd.after(function () {
markdownInclude.options = markdownInclude.build = {};
markdownInclude.tableOfContents = '';
});

bdd.beforeEach(function () {
markdownInclude.options = {
tableOfContents: {
lead: 'number'
}
};
markdownInclude.tableOfContents = '';

markdownInclude.processFile('tests/data/docs/has_heading_tags_on_lower_levels.md');
});

bdd.it('should create a table of contents with correct level', function () {
markdownInclude.compileHeadingTags('tests/data/docs/has_heading_tags_on_lower_levels.md');

assert.equal(markdownInclude.tableOfContents,
'1. [Third Test Heading](#third-test-heading)\n' +
' 1. [Fourth Test Heading](#fourth-test-heading)\n' +
' 1. [Fifth Test Heading](#fifth-test-heading)\n' +
' 1. [Sixth Test Heading](#sixth-test-heading)\n',
'Data matches');
});
});
});
4 changes: 4 additions & 0 deletions tests/unit/parseHeadingTag.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ define([
var count = markdownInclude.parseHeadingTag('### heading').count;
assert.equal(count, 3, 'Counts match');
});
bdd.it('should return the item string from a heading tag', function () {
var item = markdownInclude.parseHeadingTag('### heading').item;
assert.equal(item, 'heading', 'Item match');
});
});
});