(function () { /** * @class LangSwitcher * create tabs with buttons to switching * between languages variants, * works with .highlight class elements */ class LangSwitcher { constructor(tabs, index) { this.tabs = tabs || []; this.index = index || 0; this.langButtons = null; } initLangButtons() { if (this.tabs.length < 2) { return null; } this.langButtons = document.createElement('div'); this.langButtons.classList.add('lang-tabs'); // create a wrapper for the buttons const buttonWrapper = document.createElement('div'); buttonWrapper.classList.add('lang-tabs__wrapper'); this.langButtons.append(buttonWrapper); const overlay = document.createElement('div'); overlay.classList.add('lang-tabs__overlay'); this.langButtons.append(overlay); this.tabs.forEach((tab, i) => { const lang = this.getLang(tab); let button = document.createElement('span'); button.classList.add('lang-tabs__button'); button.classList.add(`lang-tabs__button_${lang}`); i == 0 && button.classList.add('active'); button.dataset.lang = lang; button.innerHTML = `${lang}`; buttonWrapper.append(button); }); this.tabs[0].before(this.langButtons); } switchLanguage(lang) { const activeTab = this.tabs.find((t) => { return t.querySelectorAll(`code.language-${lang}`).length > 0; }); this.tabs.forEach((t) => (t.style.display = 'none')); activeTab.style.display = 'block'; this.#setActiveButton(lang); } setTabs(tabs) { tabs[0].active = true; this.tabs = tabs; } getLang(tab) { return tab.getElementsByTagName('code')[0].dataset.lang; } getLangButtons() { return this.langButtons; } // should be used together with changing of the active tab visibility #setActiveButton(lang) { this.langButtons.querySelector('.active').classList.remove('active'); this.langButtons.querySelector(`[data-lang=${lang}]`).classList.add('active'); } } const allTabs = document.getElementsByClassName('highlight'); let tabsGroups = []; let groupArr = []; /** * go through all tabs (elements with class .highlight) */ for (let hl of allTabs) { groupArr.push(hl); let isLastInGroup = !hl.nextElementSibling?.classList?.contains('highlight'); if (isLastInGroup) { tabsGroups.push(groupArr); groupArr = []; } } /** * init switcher for each group of tabs */ tabsGroups.forEach((g, i) => { const langSwitcher = new LangSwitcher(g); langSwitcher.initLangButtons(); const tabBtns = langSwitcher.getLangButtons(); if (tabBtns) { langSwitcher.getLangButtons().addEventListener('click', (e) => { const button = e.target.closest('.lang-tabs__button'); if (button && button.dataset.lang) { langSwitcher.switchLanguage(button.dataset.lang); } }); } }); }).call(this);