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