Sphinx RTD template: toggle sidebar and highlighting

Toggle sidebar (Esc-H) and search keyword highlighting (Esc-U) on Sphinx HTML pages using the Read the Docs template.

  1. // ==UserScript==
  2. // @name Sphinx RTD template: toggle sidebar and highlighting
  3. // @namespace club.porcupine.gm_scripts.sphinx_rtd_template_toggle_sidebar_and_highlighting
  4. // @version 3
  5. // @description Toggle sidebar (Esc-H) and search keyword highlighting (Esc-U) on Sphinx HTML pages using the Read the Docs template.
  6. // @author Sam Birch
  7. // @license MIT
  8. // @icon https://icons.duckduckgo.com/ip2/readthedocs.io.ico
  9. // @match *://*/*
  10. // @grant none
  11. // @noframes
  12. // ==/UserScript==
  13. (function() {
  14. 'use strict'
  15.  
  16. function initialize() {
  17. function gen_style_toggler(source) {
  18. const stylesheet = document.createElement('style')
  19. stylesheet.innerHTML = source
  20. function toggle() {
  21. if (stylesheet.parentElement) {
  22. stylesheet.parentElement.removeChild(stylesheet)
  23. } else {
  24. document.head.appendChild(stylesheet)
  25. }
  26. }
  27. return toggle
  28. }
  29.  
  30. const toggle_search_highlighting = gen_style_toggler(`
  31. .highlighted { background-color: unset !important; }
  32. `)
  33. const toggle_sidebar_visibility = gen_style_toggler(`
  34. .wy-nav-side, .rst-versions { display: none }
  35. .wy-nav-content-wrap { margin-left: unset }
  36. `)
  37.  
  38. const esc_timeout_ms = 1000
  39. let esc_pressed = 0
  40. window.addEventListener("keydown", ev => {
  41. if (ev.defaultPrevented) {
  42. return
  43. }
  44. switch (ev.key) {
  45. case "Escape":
  46. esc_pressed = Date.now()
  47. ev.preventDefault()
  48. break
  49. case "h":
  50. if (esc_pressed && Date.now() - esc_pressed < esc_timeout_ms) {
  51. esc_pressed = 0
  52. toggle_sidebar_visibility()
  53. ev.preventDefault()
  54. }
  55. break
  56. case "u":
  57. if (esc_pressed && Date.now() - esc_pressed < esc_timeout_ms) {
  58. esc_pressed = 0
  59. toggle_search_highlighting()
  60. ev.preventDefault()
  61. }
  62. break
  63. }
  64. })
  65. }
  66.  
  67. if (document.body.classList.contains('wy-body-for-nav')) {
  68. initialize()
  69. }
  70. }())