2
2
( function ( $ ) {
3
3
$ . fn . toc = function ( options ) {
4
4
var defaults = {
5
- noBackToTopLinks : false ,
6
5
title : '<i>Jump to...</i>' ,
7
6
minimumHeaders : 3 ,
8
7
headers : 'h1, h2, h3, h4, h5, h6' ,
16
15
toc : ''
17
16
}
18
17
} ,
19
- settings = $ . extend ( defaults , options ) ;
18
+ settings = $ . extend ( defaults , options ) ;
20
19
21
20
function fixedEncodeURIComponent ( str ) {
22
21
return encodeURIComponent ( str ) . replace ( / [ ! ' ( ) * ] / g, function ( c ) {
25
24
}
26
25
27
26
function createLink ( header ) {
28
- var innerText = ( header . textContent === undefined ) ? header . innerText : header . textContent ;
27
+ var innerText = header . textContent || header . innerText ;
29
28
return "<a class='" + settings . classes . link + "' href='#" + fixedEncodeURIComponent ( header . id ) + "'>" + innerText + "</a>" ;
30
29
}
31
30
32
31
var headers = $ ( settings . headers ) . filter ( function ( ) {
33
- // get all headers with an ID
34
- var previousSiblingName = $ ( this ) . prev ( ) . attr ( "name" ) ;
35
- if ( ! this . id && previousSiblingName ) {
36
- this . id = $ ( this ) . attr ( "id" , previousSiblingName . replace ( / \. / g, "-" ) ) ;
32
+ // Ensure headers have IDs
33
+ if ( ! this . id ) {
34
+ this . id = $ ( this ) . text ( ) . trim ( ) . replace ( / \s + / g, '-' ) . toLowerCase ( ) ;
37
35
}
38
36
return this . id ;
39
- } ) , output = $ ( this ) ;
37
+ } ) ;
38
+
39
+ var output = $ ( this ) ;
40
40
41
41
// Check if there are any headers
42
42
if ( ! headers . length || headers . length < settings . minimumHeaders || ! output . length ) {
43
-
44
43
$ ( '#main' ) . removeClass ( "add-grid" ) ;
45
44
$ ( "#toc" ) . hide ( ) ;
46
45
return ; // Exit early if there are no headers
47
46
}
48
47
49
- if ( 0 === settings . showSpeed ) {
48
+ if ( settings . showSpeed === 0 ) {
50
49
settings . showEffect = 'none' ;
51
50
}
52
51
53
- $ ( this ) . addClass ( settings . classes . toc )
52
+ $ ( this ) . addClass ( settings . classes . toc ) ;
54
53
55
54
var render = {
56
55
show : function ( ) { output . hide ( ) . html ( html ) . show ( settings . showSpeed ) ; } ,
61
60
62
61
var get_level = function ( ele ) { return parseInt ( ele . nodeName . replace ( "H" , "" ) , 10 ) ; } ;
63
62
var highest_level = headers . map ( function ( _ , ele ) { return get_level ( ele ) ; } ) . get ( ) . sort ( ) [ 0 ] ;
64
- var return_to_top = '<i class="icon-arrow-up back-to-top"> </i>' ;
63
+ var level = get_level ( headers [ 0 ] ) , this_level ;
64
+ var html = settings . title + " <" + settings . listType + " class=\"" + settings . classes . list + "\">" ;
65
65
66
- var level = get_level ( headers [ 0 ] ) ,
67
- this_level ,
68
- html = settings . title + " <" + settings . listType + " class=\"" + settings . classes . list + "\">" ;
69
- headers . on ( 'click' , function ( ) {
70
- if ( ! settings . noBackToTopLinks ) {
71
- window . location . hash = this . id ;
72
- }
73
- } )
74
- . addClass ( 'clickable-header' )
75
- . each ( function ( _ , header ) {
76
- this_level = get_level ( header ) ;
77
- if ( ! settings . noBackToTopLinks && this_level === highest_level ) {
78
- $ ( header ) . addClass ( 'top-level-header' ) . after ( return_to_top ) ;
66
+ headers . each ( function ( _ , header ) {
67
+ this_level = get_level ( header ) ;
68
+ if ( this_level === level ) { // same level as before; same indenting
69
+ html += "<li class=\"" + settings . classes . item + "\">" + createLink ( header ) ;
70
+ } else if ( this_level <= level ) { // higher level than before; end parent ol
71
+ for ( var i = this_level ; i < level ; i ++ ) {
72
+ html += "</li></" + settings . listType + ">"
79
73
}
80
- if ( this_level === level ) // same level as before; same indenting
81
- html += "<li class=\"" + settings . classes . item + "\">" + createLink ( header ) ;
82
- else if ( this_level <= level ) { // higher level than before; end parent ol
83
- for ( var i = this_level ; i < level ; i ++ ) {
84
- html += "</li></" + settings . listType + ">"
85
- }
86
- html += "<li class=\"" + settings . classes . item + "\">" + createLink ( header ) ;
74
+ html += "<li class=\"" + settings . classes . item + "\">" + createLink ( header ) ;
75
+ } else if ( this_level > level ) { // lower level than before; expand the previous to contain a ol
76
+ for ( i = this_level ; i > level ; i -- ) {
77
+ html += "<" + settings . listType + " class=\"" + settings . classes . list + "\">" +
78
+ "<li class=\"" + settings . classes . item + "\">"
87
79
}
88
- else if ( this_level > level ) { // lower level than before; expand the previous to contain a ol
89
- for ( i = this_level ; i > level ; i -- ) {
90
- html += "<" + settings . listType + " class=\"" + settings . classes . list + "\">" +
91
- "<li class=\"" + settings . classes . item + "\">"
92
- }
93
- html += createLink ( header ) ;
94
- }
95
- level = this_level ; // update for the next one
96
- } ) ;
80
+ html += createLink ( header ) ;
81
+ }
82
+ level = this_level ; // update for the next one
83
+ } ) ;
97
84
html += "</" + settings . listType + ">" ;
98
- if ( ! settings . noBackToTopLinks ) {
99
- $ ( document ) . on ( 'click' , '.back-to-top' , function ( ) {
100
- $ ( window ) . scrollTop ( 0 ) ;
101
- window . location . hash = '' ;
102
- } ) ;
103
- }
104
-
105
85
render [ settings . showEffect ] ( ) ;
106
86
} ;
107
- } ) ( jQuery ) ;
87
+ } ) ( jQuery ) ;
0 commit comments