theme-default.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. document.addEventListener('DOMContentLoaded', function() {
  2. const updateHash = function (id) {
  3. window.location.hash = `#${id}`;
  4. };
  5. const navButton = document.getElementById('nav-button');
  6. const menuWrapper = document.querySelector('.tocify-wrapper');
  7. function toggleSidebar(event) {
  8. event.preventDefault();
  9. if (menuWrapper) {
  10. menuWrapper.classList.toggle('open');
  11. navButton.classList.toggle('open');
  12. }
  13. }
  14. function closeSidebar(event) {
  15. event.preventDefault();
  16. if (menuWrapper) {
  17. menuWrapper.classList.remove('open');
  18. navButton.classList.remove('open');
  19. }
  20. }
  21. navButton.addEventListener('click', toggleSidebar);
  22. window.hljs.highlightAll();
  23. const wrapper = document.getElementById('toc');
  24. // https://jets.js.org/
  25. window.jets = new window.Jets({
  26. // *OR - Selects elements whose values contains at least one part of search substring
  27. searchSelector: '*OR',
  28. searchTag: '#input-search',
  29. contentTag: '#toc li',
  30. didSearch: function(term) {
  31. wrapper.classList.toggle('jets-searching', String(term).length > 0)
  32. },
  33. // map these accent keys to plain values
  34. diacriticsMap: {
  35. a: 'ÀÁÂÃÄÅàáâãäåĀāąĄ',
  36. c: 'ÇçćĆčČ',
  37. d: 'đĐďĎ',
  38. e: 'ÈÉÊËèéêëěĚĒēęĘ',
  39. i: 'ÌÍÎÏìíîïĪī',
  40. l: 'łŁ',
  41. n: 'ÑñňŇńŃ',
  42. o: 'ÒÓÔÕÕÖØòóôõöøŌō',
  43. r: 'řŘ',
  44. s: 'ŠšśŚ',
  45. t: 'ťŤ',
  46. u: 'ÙÚÛÜùúûüůŮŪū',
  47. y: 'ŸÿýÝ',
  48. z: 'ŽžżŻźŹ'
  49. }
  50. });
  51. function hashChange() {
  52. const currentItems = document.querySelectorAll('.tocify-subheader.visible, .tocify-item.tocify-focus');
  53. Array.from(currentItems).forEach((elem) => {
  54. elem.classList.remove('visible', 'tocify-focus');
  55. });
  56. const currentTag = document.querySelector(`a[href="${window.location.hash}"]`);
  57. if (currentTag) {
  58. const parent = currentTag.closest('.tocify-subheader');
  59. if (parent) {
  60. parent.classList.add('visible');
  61. }
  62. const siblings = currentTag.closest('.tocify-header');
  63. if (siblings) {
  64. Array.from(siblings.querySelectorAll('.tocify-subheader')).forEach((elem) => {
  65. elem.classList.add('visible');
  66. });
  67. }
  68. currentTag.parentElement.classList.add('tocify-focus');
  69. // wait for dom changes to be done
  70. setTimeout(() => {
  71. currentTag.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
  72. // only close the sidebar on level-2 events
  73. if (currentTag.parentElement.classList.contains('level-2')) {
  74. closeSidebar();
  75. }
  76. }, 1500);
  77. }
  78. }
  79. let languages = JSON.parse(document.body.getAttribute('data-languages'));
  80. // Support a key => value object where the key is the name, or an array of strings where the value is the name
  81. if (!Array.isArray(languages)) {
  82. languages = Object.values(languages);
  83. }
  84. // if there is no language use the first one
  85. const currentLanguage = window.localStorage.getItem('language') || languages[0];
  86. const languageStyle = document.getElementById('language-style');
  87. const langSelector = document.querySelectorAll('.lang-selector button.lang-button');
  88. function setActiveLanguage(newLanguage) {
  89. window.localStorage.setItem('language', newLanguage);
  90. if (!languageStyle) {
  91. return;
  92. }
  93. const newStyle = languages.map((language) => {
  94. return language === newLanguage
  95. // the current one should be visible
  96. ? `body .content .${language}-example code { display: block; }`
  97. // the inactive one should be hidden
  98. : `body .content .${language}-example code { display: none; }`;
  99. }).join(`\n`);
  100. Array.from(langSelector).forEach((elem) => {
  101. elem.classList.toggle('active', elem.getAttribute('data-language-name') === newLanguage);
  102. });
  103. const activeHash = window.location.hash.slice(1);
  104. languageStyle.innerHTML = newStyle;
  105. setTimeout(() => {
  106. updateHash(activeHash);
  107. }, 200);
  108. }
  109. setActiveLanguage(currentLanguage);
  110. Array.from(langSelector).forEach((elem) => {
  111. elem.addEventListener('click', () => {
  112. const newLanguage = elem.getAttribute('data-language-name');
  113. setActiveLanguage(newLanguage);
  114. });
  115. });
  116. window.addEventListener('hashchange', hashChange, false);
  117. hashChange();
  118. });