diff --git a/dist/bootstrap-toc.js b/dist/bootstrap-toc.js index 2ce99ad..7d4d2bf 100644 --- a/dist/bootstrap-toc.js +++ b/dist/bootstrap-toc.js @@ -86,6 +86,11 @@ return $li; }, + generateEmptyNavEl: function() { + var $li = $('
'); + return $li; + }, + generateNavItem: function(headingEl) { var anchor = this.generateAnchor(headingEl); var $heading = $(headingEl); @@ -105,41 +110,55 @@ return 1; }, - // returns the elements for the top level, and the next below it - getHeadings: function($scope, topLevel) { - var topSelector = "h" + topLevel; - - var secondaryLevel = topLevel + 1; - var secondarySelector = "h" + secondaryLevel; + // Returns the headings by depth defined in the settings. + getHeadings: function($scope, depth, topLevel) { + var selector = ''; + for (var i = topLevel; i < topLevel + depth; i++) { + selector += 'h' + i; + if (i < topLevel + depth - 1) + selector += ','; + } - return this.findOrFilter($scope, topSelector + "," + secondarySelector); + return this.findOrFilter($scope, selector); }, getNavLevel: function(el) { return parseInt(el.tagName.charAt(1), 10); }, - populateNav: function($topContext, topLevel, $headings) { - var $context = $topContext; - var $prevNav; + populateNav: function($topContext, depth, topLevel, $headings) { + var $contexts = new Array(depth); + var helpers = this; + + $contexts[0] = $topContext; + $topContext.lastNav = null; - var helpers = this; $headings.each(function(i, el) { var $newNav = helpers.generateNavItem(el); var navLevel = helpers.getNavLevel(el); + var relLevel = navLevel - topLevel; + var j; - // determine the proper $context - if (navLevel === topLevel) { - // use top level - $context = $topContext; - } else if ($prevNav && $context === $topContext) { - // create a new level of the tree and switch to it - $context = helpers.createChildNavList($prevNav); - } // else use the current $context + for (j = relLevel + 1; j < $contexts.length; j++) { + $contexts[j] = null; + } - $context.append($newNav); + if (!$contexts[relLevel]) { + for (j = 0; j < relLevel; j++) { + if (!$contexts[j + 1]) { + if (!$contexts[j].lastNav) { + var $emptyNav = helpers.generateEmptyNavEl(); + $contexts[j].append($emptyNav); + $contexts[j].lastNav = $emptyNav; + } + $contexts[j + 1] = helpers.createChildNavList($contexts[j].lastNav); + $contexts[j + 1].lastNav = null; + } + } + } - $prevNav = $newNav; + $contexts[relLevel].append($newNav); + $contexts[relLevel].lastNav = $newNav; }); }, @@ -153,6 +172,7 @@ opts = arg; } opts.$scope = opts.$scope || $(document.body); + opts.depth = opts.depth || opts.$nav.attr('data-toc-depth') || 2; return opts; } }, @@ -166,8 +186,8 @@ var $topContext = this.helpers.createChildNavList(opts.$nav); var topLevel = this.helpers.getTopLevel(opts.$scope); - var $headings = this.helpers.getHeadings(opts.$scope, topLevel); - this.helpers.populateNav($topContext, topLevel, $headings); + var $headings = this.helpers.getHeadings(opts.$scope, opts.depth, topLevel); + this.helpers.populateNav($topContext, opts.depth, topLevel, $headings); } }; diff --git a/dist/bootstrap-toc.min.js b/dist/bootstrap-toc.min.js index c628326..58ce94f 100644 --- a/dist/bootstrap-toc.min.js +++ b/dist/bootstrap-toc.min.js @@ -2,4 +2,4 @@ * Bootstrap Table of Contents v1.0.1 (http://afeld.github.io/bootstrap-toc/) * Copyright 2015 Aidan Feldman * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ -!function(a){"use strict";window.Toc={helpers:{findOrFilter:function(e,t){var n=e.find(t);return e.filter(t).add(n).filter(":not([data-toc-skip])")},generateUniqueIdBase:function(e){return a(e).text().trim().replace(/\'/gi,"").replace(/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,64).replace(/^-+|-+$/gm,"").toLowerCase()||e.tagName.toLowerCase()},generateUniqueId:function(e){for(var t=this.generateUniqueIdBase(e),n=0;;n++){var r=t;if(0