1
1
( function ( ) {
2
2
3
- var main = document . getElementById ( 'main' ) ,
4
- doc = document . documentElement ,
5
- body = document . body ,
6
- header = document . getElementById ( 'header' ) ,
7
- menu = document . querySelector ( '.sidebar' ) ,
8
- menuToggle = document . querySelector ( '.sidebar .toggle' )
9
-
10
- if ( menu ) {
11
- window . addEventListener ( 'scroll' , function ( ) {
12
- var top = doc && doc . scrollTop || body . scrollTop
13
- if ( top > header . offsetHeight ) {
14
- main . className = 'fix-sidebar'
15
- } else {
16
- main . className = ''
17
- }
18
- } )
19
- menuToggle . addEventListener ( 'click' , function ( ) {
20
- menu . classList . toggle ( 'open' )
21
- } )
3
+ var each = [ ] . forEach
4
+ var main = document . getElementById ( 'main' )
5
+ var doc = document . documentElement
6
+ var body = document . body
7
+ var header = document . getElementById ( 'header' )
8
+ var menu = document . querySelector ( '.sidebar' )
9
+ var menuToggle = document . querySelector ( '.sidebar .toggle' )
10
+ var content = document . querySelector ( '.content' )
11
+
12
+ if ( ! menu ) return
13
+
14
+ menuToggle . addEventListener ( 'click' , function ( ) {
15
+ menu . classList . toggle ( 'open' )
16
+ } )
17
+
18
+ // build sidebar
19
+ var allLinks = [ ]
20
+ var currentPageAnchor = menu . querySelector ( '.sidebar-link.current' )
21
+ var sectionContainer = document . createElement ( 'ul' )
22
+ sectionContainer . className = 'menu-sub'
23
+ currentPageAnchor . parentNode . appendChild ( sectionContainer )
24
+ var h2s = content . querySelectorAll ( 'h2' )
25
+ if ( h2s . length ) {
26
+ each . call ( h2s , function ( h ) {
27
+ sectionContainer . appendChild ( makeLink ( h ) )
28
+ var h3s = collectH3s ( h )
29
+ allLinks . push ( h )
30
+ allLinks . push . apply ( allLinks , h3s )
31
+ if ( h3s . length ) {
32
+ sectionContainer . appendChild ( makeSubLinks ( h3s ) )
33
+ }
34
+ } )
35
+ } else {
36
+ h2s = content . querySelectorAll ( 'h3' )
37
+ each . call ( h2s , function ( h ) {
38
+ sectionContainer . appendChild ( makeLink ( h ) )
39
+ allLinks . push ( h )
40
+ } )
41
+ }
42
+
43
+ // init smooth scroll
44
+ smoothScroll . init ( {
45
+ speed : 400
46
+ } )
47
+
48
+ var animating = false
49
+ sectionContainer . addEventListener ( 'click' , function ( e ) {
50
+ e . preventDefault ( )
51
+ if ( e . target . classList . contains ( 'section-link' ) ) {
52
+ setActive ( e . target )
53
+ animating = true
54
+ setTimeout ( function ( ) {
55
+ animating = false
56
+ } , 400 )
22
57
}
58
+ } , true )
59
+
60
+ // listen for scroll event to do positioning & highlights
61
+ window . addEventListener ( 'scroll' , updateSidebar )
62
+ window . addEventListener ( 'resize' , updateSidebar )
63
+
64
+ function updateSidebar ( ) {
65
+ var top = doc && doc . scrollTop || body . scrollTop
66
+ if ( top > header . offsetHeight ) {
67
+ main . className = 'fix-sidebar'
68
+ } else {
69
+ main . className = ''
70
+ }
71
+ if ( animating ) return
72
+ var last
73
+ for ( var i = 0 ; i < allLinks . length ; i ++ ) {
74
+ var link = allLinks [ i ]
75
+ if ( link . offsetTop > top ) {
76
+ if ( ! last ) last = link
77
+ break
78
+ } else {
79
+ last = link
80
+ }
81
+ }
82
+ if ( last )
83
+ setActive ( last . id )
84
+ }
85
+
86
+ function makeLink ( h ) {
87
+ var link = document . createElement ( 'li' )
88
+ link . innerHTML =
89
+ '<a class="section-link" data-scroll href="#' + h . id + '">' +
90
+ h . textContent . replace ( / \( .* \) $ / , '' ) +
91
+ '</a>'
92
+ return link
93
+ }
94
+
95
+ function collectH3s ( h ) {
96
+ var h3s = [ ]
97
+ var next = h . nextSibling
98
+ while ( next && next . tagName !== 'H2' ) {
99
+ if ( next . tagName === 'H3' ) {
100
+ h3s . push ( next )
101
+ }
102
+ next = next . nextSibling
103
+ }
104
+ return h3s
105
+ }
106
+
107
+ function makeSubLinks ( h3s ) {
108
+ var container = document . createElement ( 'ul' )
109
+ h3s . forEach ( function ( h ) {
110
+ container . appendChild ( makeLink ( h ) )
111
+ } )
112
+ return container
113
+ }
23
114
24
- if ( PAGE_TYPE === 'api' ) {
25
- var h1 = document . querySelector ( 'h1' ) ,
26
- h3s = document . querySelectorAll ( 'h3' ) ,
27
- list = document . createElement ( 'ul' ) ,
28
- inner = '' ,
29
- replaceRE = / \( .* $ /
30
- for ( var i = 0 , l = h3s . length ; i < l ; i ++ ) {
31
- var h3 = h3s [ i ]
32
- inner += '<li><a href="#' + h3 . id + '">' +
33
- h3 . textContent . replace ( replaceRE , '' ) +
34
- '</a></li>'
35
- }
36
- list . innerHTML = inner
37
- h1 . parentNode . insertBefore ( list , h1 . nextSibling )
115
+ function setActive ( id ) {
116
+ var previousActive = menu . querySelector ( '.section-link.active' )
117
+ var currentActive = typeof id === 'string'
118
+ ? menu . querySelector ( '.section-link[href="#' + id + '"]' )
119
+ : id
120
+ if ( currentActive !== previousActive ) {
121
+ if ( previousActive ) previousActive . classList . remove ( 'active' )
122
+ currentActive . classList . add ( 'active' )
38
123
}
124
+ }
39
125
40
126
} ) ( )
0 commit comments