Skip to content

Commit 8cbb5ed

Browse files
API: add depth option
1 parent 3a1b077 commit 8cbb5ed

3 files changed

Lines changed: 60 additions & 53 deletions

File tree

bootstrap-toc.css

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,40 @@
88
/* All levels of nav */
99
nav[data-toggle='toc'] .nav > li > a {
1010
display: block;
11-
padding: 4px 20px;
12-
font-size: 13px;
1311
font-weight: 500;
1412
color: #767676;
13+
padding: 5px 10px;
1514
}
15+
1616
nav[data-toggle='toc'] .nav > li > a:hover,
1717
nav[data-toggle='toc'] .nav > li > a:focus {
18-
padding-left: 19px;
1918
color: #563d7c;
2019
text-decoration: none;
2120
background-color: transparent;
2221
border-left: 1px solid #563d7c;
2322
}
24-
nav[data-toggle='toc'] .nav > .active > a,
25-
nav[data-toggle='toc'] .nav > .active:hover > a,
26-
nav[data-toggle='toc'] .nav > .active:focus > a {
27-
padding-left: 18px;
23+
nav[data-toggle='toc'] .nav .active > a,
24+
nav[data-toggle='toc'] .nav .active:hover > a,
25+
nav[data-toggle='toc'] .nav .active:focus > a {
2826
font-weight: bold;
29-
color: #563d7c;
27+
color: #564d7c;
3028
background-color: transparent;
3129
border-left: 2px solid #563d7c;
3230
}
3331

32+
nav[data-toggle='toc'] {
33+
font-size: 18px;
34+
}
35+
36+
nav[data-toggle='toc'] .nav {
37+
position: relative;
38+
padding-left: 7px;
39+
font-size: 90%;
40+
}
41+
3442
/* Nav: second level (shown on .active) */
3543
nav[data-toggle='toc'] .nav .nav {
3644
display: none; /* Hide by default, but at >768px, show it */
37-
padding-bottom: 10px;
38-
}
39-
nav[data-toggle='toc'] .nav .nav > li > a {
40-
padding-top: 1px;
41-
padding-bottom: 1px;
42-
padding-left: 30px;
43-
font-size: 12px;
44-
font-weight: normal;
45-
}
46-
nav[data-toggle='toc'] .nav .nav > li > a:hover,
47-
nav[data-toggle='toc'] .nav .nav > li > a:focus {
48-
padding-left: 29px;
49-
}
50-
nav[data-toggle='toc'] .nav .nav > .active > a,
51-
nav[data-toggle='toc'] .nav .nav > .active:hover > a,
52-
nav[data-toggle='toc'] .nav .nav > .active:focus > a {
53-
padding-left: 28px;
54-
font-weight: 500;
5545
}
5646

5747
/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */

bootstrap-toc.js

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@
6565
return $li;
6666
},
6767

68+
generateEmptyNavEl: function() {
69+
var $li = $('<li></li>');
70+
return $li;
71+
},
72+
6873
generateNavItem: function(headingEl) {
6974
var anchor = this.generateAnchor(headingEl);
7075
var $heading = $(headingEl);
@@ -84,42 +89,52 @@
8489
return 1;
8590
},
8691

87-
// returns the elements for the top level, and the next below it
88-
getHeadings: function($scope, topLevel) {
89-
var topSelector = 'h' + topLevel;
90-
91-
var secondaryLevel = topLevel + 1;
92-
var secondarySelector = 'h' + secondaryLevel;
92+
getHeadings: function($scope, depth, topLevel) {
93+
var selector = '';
94+
for (var i = topLevel; i < topLevel + depth; i++) {
95+
selector += 'h' + i;
96+
if (i < topLevel + depth - 1)
97+
selector += ',';
98+
}
9399

94-
return this.findOrFilter($scope, topSelector + ',' + secondarySelector);
100+
return this.findOrFilter($scope, selector);
95101
},
96102

97103
getNavLevel: function(el) {
98104
return parseInt(el.tagName.charAt(1), 10);
99105
},
100106

101-
populateNav: function($topContext, topLevel, $headings) {
102-
var $context = $topContext;
103-
var $prevNav;
107+
populateNav: function($topContext, depth, topLevel, $headings) {
108+
var $contexts = new Array(depth);
109+
var helpers = this;
110+
111+
$contexts[0] = $topContext;
104112

105-
var helpers = this;
106-
$headings.each(function(i, el) {
107-
var $newNav = helpers.generateNavItem(el);
108-
var navLevel = helpers.getNavLevel(el);
113+
$headings.each(function(i, el) {
114+
var $newNav = helpers.generateNavItem(el);
115+
var navLevel = helpers.getNavLevel(el);
116+
var relLevel = navLevel - topLevel;
109117

110-
// determine the proper $context
111-
if (navLevel === topLevel) {
112-
// use top level
113-
$context = $topContext;
114-
} else if ($prevNav && $context === $topContext) {
115-
// create a new level of the tree and switch to it
116-
$context = helpers.createChildNavList($prevNav);
117-
} // else use the current $context
118+
for (var i = relLevel + 1; i < $contexts.length; i++) {
119+
$contexts[i] = null;
120+
}
118121

119-
$context.append($newNav);
122+
if ($contexts[relLevel] === null) {
123+
for (var i = 0; i < relLevel; i++) {
124+
if (!$contexts[i + 1]) {
125+
if (!$contexts[i].lastNav) {
126+
var $emptyNav = helpers.generateEmptyNavEl();
127+
$contexts[i].append($emptyNav);
128+
$contexts[i].lastNav = $emptyNav;
129+
}
130+
$contexts[i + 1] = helpers.createChildNavList($contexts[i].lastNav);
131+
}
132+
}
133+
}
120134

121-
$prevNav = $newNav;
122-
});
135+
$contexts[relLevel].append($newNav);
136+
$contexts[relLevel].lastNav = $newNav;
137+
});
123138
},
124139

125140
parseOps: function(arg) {
@@ -132,6 +147,7 @@
132147
opts = arg;
133148
}
134149
opts.$scope = opts.$scope || $(document.body);
150+
opts.depth = opts.depth || 2;
135151
return opts;
136152
}
137153
},
@@ -145,8 +161,8 @@
145161

146162
var $topContext = this.helpers.createChildNavList(opts.$nav);
147163
var topLevel = this.helpers.getTopLevel(opts.$scope);
148-
var $headings = this.helpers.getHeadings(opts.$scope, topLevel);
149-
this.helpers.populateNav($topContext, topLevel, $headings);
164+
var $headings = this.helpers.getHeadings(opts.$scope, opts.depth, topLevel);
165+
this.helpers.populateNav($topContext, opts.depth, topLevel, $headings);
150166
}
151167
};
152168

index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ option | type | notes
8383
--- | --- | ---
8484
`$nav` | jQuery Object | (required) The element that the navigation will be created in.
8585
`$scope` | jQuery Object | The element where the search for headings will be limited to, or the list of headings that will be used in the navigation. Defaults to `$(document.body)`.
86+
`depth` | Integer | The number of heading classes to consider, starting from the top level. Defaults to `2`.
8687
{: .table }
8788

8889
## Customization

0 commit comments

Comments
 (0)