@@ -14,24 +14,37 @@ const DOC_HEADERS_SELECTOR = ".top-doc div.docblock>h1[id], .top-doc div.docbloc
14
14
function highlight ( ) {
15
15
let headers = Array . from ( document . querySelectorAll ( DOC_HEADERS_SELECTOR ) )
16
16
. filter ( header => [ "H1" , "H2" , "H3" ] . includes ( header . tagName ) ) ;
17
+ const OFFSET = 32 ;
18
+ const activeByHash = ( hash ) => {
19
+ document . querySelectorAll ( ".rse-doc-toc-item.rse-active" ) . forEach ( ( item ) => {
20
+ item . classList . remove ( "rse-active" ) ;
21
+ } ) ;
22
+ const link = document . querySelector ( `.rse-doc-toc-item a[href$="${ hash } "]` )
23
+ if ( link ) {
24
+ let target = link . parentElement ;
25
+ target . classList . add ( "rse-active" ) ;
26
+ target . scrollIntoView ( { behavior : "auto" , block : "nearest" } ) ;
27
+ }
28
+ }
17
29
const scrollHandler = entries => {
30
+ let hashEl = document . querySelector ( document . location . hash ) ;
31
+ if ( hashEl ?. getBoundingClientRect ( ) . top === OFFSET ) {
32
+ activeByHash ( document . location . hash ) ;
33
+ // Early return if navigating directly to a named anchor.
34
+ return ;
35
+ }
36
+
18
37
entries . forEach ( entry => {
19
38
if ( entry . intersectionRatio > 0 ) {
20
- document . querySelectorAll ( ".rse-doc-toc-item" ) . forEach ( ( item ) => {
21
- item . classList . remove ( "rse-active" ) ;
22
- } ) ;
23
-
24
39
let url = new URL ( entry . target . firstChild . href ) ;
25
- let link = document . querySelector ( `.rse-doc-toc-item a[href$="${ url . hash } "]` )
26
- if ( link ) {
27
- let target = link . parentElement ;
28
- target . classList . add ( "rse-active" ) ;
29
- target . scrollIntoView ( { behavior : "auto" , block : "nearest" } ) ;
30
- }
40
+ activeByHash ( url . hash ) ;
31
41
}
32
42
} ) ;
33
43
} ;
34
- const observer = new IntersectionObserver ( scrollHandler ) ;
44
+ const observer = new IntersectionObserver (
45
+ scrollHandler ,
46
+ { rootMargin : `-${ OFFSET } px 0px 0px 0px` }
47
+ ) ;
35
48
headers . forEach ( item => observer . observe ( item ) ) ;
36
49
}
37
50
@@ -59,11 +72,11 @@ document.addEventListener("DOMContentLoaded", () => {
59
72
let ul = document . createElement ( "ul" ) ;
60
73
ul . classList . add ( "rse-doc-toc" ) ;
61
74
for ( let header of headers ) {
62
- let link = header . firstChild ;
75
+ let [ link , text ] = header . childNodes ;
63
76
64
77
let item = document . createElement ( "li" ) ;
65
78
item . innerHTML = `<div class="rse-doc-toc-item rse-doc-toc-${ header . tagName . toLowerCase ( ) } ">
66
- <a href="${ link . href } ">${ link . textContent } </a>
79
+ <a href="${ link . href } ">${ text . nodeValue } </a>
67
80
</div>` ;
68
81
69
82
ul . appendChild ( item ) ;
0 commit comments