@@ -519,18 +519,22 @@ export default class Spec {
519
519
this . setCharset ( ) ;
520
520
const wrapper = this . buildSpecWrapper ( ) ;
521
521
522
- let tocEles : HTMLElement [ ] = [ ] ;
522
+ let commonEles : HTMLElement [ ] = [ ] ;
523
523
let tocJs = '' ;
524
524
if ( this . opts . toc ) {
525
525
this . log ( 'Building table of contents...' ) ;
526
526
527
527
if ( this . opts . oldToc ) {
528
528
new Toc ( this ) . build ( ) ;
529
529
} else {
530
- ( { js : tocJs , eles : tocEles } = makeMenu ( this ) ) ;
530
+ ( { js : tocJs , eles : commonEles } = makeMenu ( this ) ) ;
531
531
}
532
532
}
533
- for ( const ele of tocEles ) {
533
+
534
+ this . log ( 'Building shortcuts help dialog...' ) ;
535
+ commonEles . push ( this . buildShortcutsHelp ( ) ) ;
536
+
537
+ for ( const ele of commonEles ) {
534
538
this . doc . body . insertBefore ( ele , this . doc . body . firstChild ) ;
535
539
}
536
540
@@ -539,7 +543,7 @@ export default class Spec {
539
543
const jsSha = sha ( jsContents ) ;
540
544
541
545
if ( this . opts . multipage ) {
542
- await this . buildMultipage ( wrapper , tocEles , jsSha ) ;
546
+ await this . buildMultipage ( wrapper , commonEles , jsSha ) ;
543
547
}
544
548
545
549
await this . buildAssets ( jsContents , jsSha ) ;
@@ -731,7 +735,7 @@ export default class Spec {
731
735
return null ;
732
736
}
733
737
734
- private async buildMultipage ( wrapper : Element , tocEles : Element [ ] , jsSha : string ) {
738
+ private async buildMultipage ( wrapper : Element , commonEles : Element [ ] , jsSha : string ) {
735
739
let stillIntro = true ;
736
740
const introEles = [ ] ;
737
741
const sections : { name : string ; eles : Element [ ] } [ ] = [ ] ;
@@ -864,9 +868,9 @@ ${await utils.readFile(path.join(__dirname, '../js/multipage.js'))}
864
868
for ( const { name, eles } of sections ) {
865
869
this . log ( `Generating section ${ name } ...` ) ;
866
870
const headClone = head . cloneNode ( true ) as HTMLHeadElement ;
867
- const tocClone = tocEles . map ( e => e . cloneNode ( true ) ) ;
871
+ const commonClone = commonEles . map ( e => e . cloneNode ( true ) ) ;
868
872
const clones = eles . map ( e => e . cloneNode ( true ) ) ;
869
- const allClones = [ headClone , ...tocClone , ...clones ] ;
873
+ const allClones = [ headClone , ...commonClone , ...clones ] ;
870
874
// @ts -ignore
871
875
const links = allClones . flatMap ( e => [ ...e . querySelectorAll ( 'a,link' ) ] ) ;
872
876
for ( const link of links ) {
@@ -919,10 +923,10 @@ ${await utils.readFile(path.join(__dirname, '../js/multipage.js'))}
919
923
}
920
924
921
925
// @ts -ignore
922
- const tocHTML = tocClone . map ( e => e . outerHTML ) . join ( '\n' ) ;
926
+ const commonHTML = commonClone . map ( e => e . outerHTML ) . join ( '\n' ) ;
923
927
// @ts -ignore
924
928
const clonesHTML = clones . map ( e => e . outerHTML ) . join ( '\n' ) ;
925
- const content = `<!doctype html>${ htmlEle } \n${ headClone . outerHTML } \n<body>${ tocHTML } <div id='spec-container'>${ clonesHTML } </div></body>` ;
929
+ const content = `<!doctype html>${ htmlEle } \n${ headClone . outerHTML } \n<body>${ commonHTML } <div id='spec-container'>${ clonesHTML } </div></body>` ;
926
930
927
931
this . generatedFiles . set ( path . join ( this . opts . outfile ! , `multipage/${ name } .html` ) , content ) ;
928
932
}
@@ -1027,6 +1031,19 @@ ${await utils.readFile(path.join(__dirname, '../js/multipage.js'))}
1027
1031
return wrapper ;
1028
1032
}
1029
1033
1034
+ private buildShortcutsHelp ( ) {
1035
+ const shortcutsHelp = this . doc . createElement ( 'div' ) ;
1036
+ shortcutsHelp . setAttribute ( 'id' , 'shortcuts-help' ) ;
1037
+ shortcutsHelp . innerHTML = `
1038
+ <ul>
1039
+ <li><span>Toggle shortcuts help</span><code>?</code></li>
1040
+ <li><span>Toggle "can call user code" annotations</span><code>u</code></li>
1041
+ ${ this . opts . multipage ? `<li><span>Navigate to/from multipage</span><code>m</code></li>` : '' }
1042
+ <li><span>Jump to search box</span><code>/</code></li>
1043
+ </ul>` ;
1044
+ return shortcutsHelp ;
1045
+ }
1046
+
1030
1047
private processMetadata ( ) {
1031
1048
const block = this . doc . querySelector ( 'pre.metadata' ) ;
1032
1049
0 commit comments