|
65 | 65 | return $li; |
66 | 66 | }, |
67 | 67 |
|
| 68 | + generateEmptyNavEl: function() { |
| 69 | + var $li = $('<li></li>'); |
| 70 | + return $li; |
| 71 | + }, |
| 72 | + |
68 | 73 | generateNavItem: function(headingEl) { |
69 | 74 | var anchor = this.generateAnchor(headingEl); |
70 | 75 | var $heading = $(headingEl); |
|
84 | 89 | return 1; |
85 | 90 | }, |
86 | 91 |
|
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 | + } |
93 | 99 |
|
94 | | - return this.findOrFilter($scope, topSelector + ',' + secondarySelector); |
| 100 | + return this.findOrFilter($scope, selector); |
95 | 101 | }, |
96 | 102 |
|
97 | 103 | getNavLevel: function(el) { |
98 | 104 | return parseInt(el.tagName.charAt(1), 10); |
99 | 105 | }, |
100 | 106 |
|
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; |
104 | 112 |
|
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; |
109 | 117 |
|
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 | + } |
118 | 121 |
|
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 | + } |
120 | 134 |
|
121 | | - $prevNav = $newNav; |
122 | | - }); |
| 135 | + $contexts[relLevel].append($newNav); |
| 136 | + $contexts[relLevel].lastNav = $newNav; |
| 137 | + }); |
123 | 138 | }, |
124 | 139 |
|
125 | 140 | parseOps: function(arg) { |
|
132 | 147 | opts = arg; |
133 | 148 | } |
134 | 149 | opts.$scope = opts.$scope || $(document.body); |
| 150 | + opts.depth = opts.depth || 2; |
135 | 151 | return opts; |
136 | 152 | } |
137 | 153 | }, |
|
145 | 161 |
|
146 | 162 | var $topContext = this.helpers.createChildNavList(opts.$nav); |
147 | 163 | 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); |
150 | 166 | } |
151 | 167 | }; |
152 | 168 |
|
|
0 commit comments