[DOCS] Add state retention to design-tabs (#19179)

This commit is contained in:
bstankix
2023-08-14 13:37:52 +00:00
committed by GitHub
parent b10b773f0c
commit 6afe49decf
2 changed files with 83 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
var sd_labels_by_text = {};
var pageHash = getPageHash(window.location.pathname)
var languages = ['py', 'cpp', 'c']
function ready() {
const savedState = getTabsState(pageHash)
const languageState = getLanguageState()
const preselect = []
let changeLanguage = false
const li = document.getElementsByClassName("sd-tab-label");
for (const label of li) {
syncId = label.getAttribute("data-sync-id");
if (syncId) {
label.onclick = onLabelClick;
if (!sd_labels_by_text[syncId]) {
sd_labels_by_text[syncId] = [];
}
sd_labels_by_text[syncId].push(label);
if (syncId == languageState) changeLanguage = true;
if (savedState.includes(syncId) && !preselect.includes(syncId))
preselect.push(syncId)
}
}
for (item of preselect) selectItem(item);
if (changeLanguage) selectItem(languageState);
}
function onLabelClick() {
const syncId = this.getAttribute("data-sync-id");
selectItem(syncId)
const tabsState = getTabsState()
saveCurrentTabsState(tabsState)
if (languages.includes(syncId))
saveLanguageState(syncId)
}
function selectItem(item) {
for (label of sd_labels_by_text[item]) {
label.previousElementSibling.checked = true;
}
}
function getTabsState(currentPageHash) {
allPagesState = JSON.parse(window.localStorage.getItem('sphinx-design-tabs-state')) || {}
if (currentPageHash)
return getCurrentPageTabsState(currentPageHash, allPagesState)
return allPagesState
}
function getCurrentPageTabsState(currentPageHash, allPagesState) {
return allPagesState[currentPageHash] || []
}
function getLanguageState() {
return window.localStorage.getItem('sphinx-design-language-state')
}
function saveCurrentTabsState(tabsState) {
const checkedElements = []
for (label in sd_labels_by_text) {
if(sd_labels_by_text[label][0].previousElementSibling.checked)
checkedElements.push(label);
}
tabsState[pageHash] = checkedElements
window.localStorage.setItem('sphinx-design-tabs-state', JSON.stringify(tabsState))
}
function saveLanguageState(language) {
window.localStorage.setItem('sphinx-design-language-state', language)
}
function getPageHash(labels) {
return labels.split('').map(v=>v.charCodeAt(0)).reduce((a,v)=>a+((a<<7)+(a<<3))^v).toString(16);
}
// document.addEventListener("DOMContentLoaded", ready, false);
+5
View File
@@ -179,6 +179,10 @@ shutil.copy("../../../docs/home.rst",".")
def replace_index_with_redirect(app,exception):
shutil.copy("../../../docs/index.html","../_build/index.html")
def replace_design_tabs_script(app, exception):
shutil.copy("../../../docs/_static/design-tabs.js","../_build/_static/design-tabs.js")
def setup(app):
logger = logging.getLogger(__name__)
app.add_config_value('doxygen_mapping_file',
@@ -186,6 +190,7 @@ def setup(app):
app.add_config_value('repositories', repositories, rebuild=True)
app.connect('autodoc-skip-member', autodoc_skip_member)
app.connect('build-finished',replace_index_with_redirect)
app.connect('build-finished', replace_design_tabs_script)
app.add_js_file('js/custom.js')
app.add_js_file('js/graphs.js')
app.add_js_file('js/newsletter.js')