1
1
const SEARCH_TAG_NAMES = [ "h1" , "h2" , "h3" , "h4" , "h5" , "h6" , "p" ] ;
2
2
const SEARCH_BAR_ID = "searchBar" ;
3
+ const NO_RESULTS_DIV_ID = "ruleset-no-results" ;
4
+ let NO_RESULTS_DIV = null ;
3
5
let RULESET_ELEMENTS = null ;
4
6
let NODE_MAP = null ;
7
+ let HEAD_NODE = "H0" ;
5
8
6
9
function treeifyHeaders ( ) {
7
10
const stack = [ { domNode : { tagName : "H0" } , children : [ ] , parent : null } ] ;
8
11
const nodeMap = new Map ( ) ;
12
+ nodeMap [ HEAD_NODE ] = stack [ 0 ] ;
9
13
const rulesetElements = document . querySelectorAll ( SEARCH_TAG_NAMES . join ( "," ) )
10
14
for ( const rulesetElement of rulesetElements ) {
11
15
const node = {
@@ -41,7 +45,11 @@ function filterRuleset() {
41
45
if ( filter == "" ) {
42
46
RULESET_ELEMENTS . forEach ( rulesetElement => {
43
47
rulesetElement . classList . remove ( "hidden" ) ;
48
+ if ( rulesetElement . tagName != "P" ) {
49
+ document . getElementById ( `navigation-${ rulesetElement . tagName } -${ rulesetElement . id } ` ) . classList . remove ( "hidden" ) ;
50
+ }
44
51
} ) ;
52
+ NO_RESULTS_DIV . classList . remove ( "hidden" ) ;
45
53
return ;
46
54
}
47
55
@@ -66,13 +74,58 @@ function filterRuleset() {
66
74
RULESET_ELEMENTS . forEach ( rulesetElement => {
67
75
if ( ! toShow . has ( rulesetElement ) ) {
68
76
rulesetElement . classList . add ( "hidden" ) ;
77
+ if ( rulesetElement . tagName != "P" ) {
78
+ document . getElementById ( `navigation-${ rulesetElement . tagName } -${ rulesetElement . id } ` ) . classList . add ( "hidden" ) ;
79
+ }
69
80
} else {
70
81
rulesetElement . classList . remove ( "hidden" ) ;
82
+ if ( rulesetElement . tagName != "P" ) {
83
+ document . getElementById ( `navigation-${ rulesetElement . tagName } -${ rulesetElement . id } ` ) . classList . remove ( "hidden" ) ;
84
+ }
85
+ }
86
+ } ) ;
87
+
88
+ let allHidden = true ;
89
+ RULESET_ELEMENTS . forEach ( rulesetElement => {
90
+ if ( ! rulesetElement . classList . contains ( "hidden" ) ) {
91
+ allHidden = false ;
92
+ }
93
+ } ) ;
94
+
95
+ if ( allHidden ) {
96
+ NO_RESULTS_DIV . classList . remove ( "hidden" ) ;
97
+ } else {
98
+ NO_RESULTS_DIV . classList . add ( "hidden" ) ;
99
+ }
100
+
101
+ }
102
+
103
+ function generateList ( headNodes ) {
104
+ let list = `<ul>` ;
105
+ headNodes . forEach ( child => {
106
+ if ( child . domNode . tagName != "P" ) {
107
+ list += `<li id="navigation-${ child . domNode . tagName } -${ child . domNode . id } "><a href="#${ child . domNode . id } ">${ child . domNode . textContent } </a>${ generateList ( child . children ) } </li>` ;
108
+ }
109
+ } ) ;
110
+ return list + '</ul>' ;
111
+ }
112
+
113
+ function generateAnchors ( headNodes ) {
114
+ getAllChildren ( NODE_MAP [ HEAD_NODE ] ) . forEach ( rulesetElement => {
115
+ if ( rulesetElement . domNode . tagName != "P" ) {
116
+ const anchor = rulesetElement . domNode . textContent
117
+ . replace ( / [ . , \/ # ! $ % \^ & \* ; : { } = \- _ ` ~ ( ) ] / g, "" )
118
+ . replace ( / / g, "-" )
119
+ . toLowerCase ( ) ;
120
+ rulesetElement . domNode . id = anchor ;
71
121
}
72
122
} ) ;
73
123
}
74
124
75
125
window . onload = function ( ) {
76
126
[ RULESET_ELEMENTS , NODE_MAP ] = treeifyHeaders ( ) ;
77
127
document . getElementById ( SEARCH_BAR_ID ) . addEventListener ( "input" , filterRuleset ) ;
128
+ generateAnchors ( ) ;
129
+ document . getElementById ( "navigator" ) . innerHTML = generateList ( NODE_MAP [ HEAD_NODE ] . children ) ;
130
+ NO_RESULTS_DIV = document . getElementById ( NO_RESULTS_DIV_ID ) ;
78
131
}
0 commit comments