theme-default-4.38.0.js 5.2 KB

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