mirror of
https://github.com/sp-tarkov/forge.git
synced 2025-02-13 04:30:41 -05:00
Installs Scribe for (mostly) automatic API documentation. Does a pretty good job and it's pretty painless to set-up. I'll have to configure it to work in the CI and to ensure that the static files are being pushed to production as they should be, but this is a good start.
150 lines
5.2 KiB
JavaScript
150 lines
5.2 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function() {
|
|
const updateHash = function (id) {
|
|
window.location.hash = `#${id}`;
|
|
};
|
|
|
|
const navButton = document.getElementById('nav-button');
|
|
const menuWrapper = document.querySelector('.tocify-wrapper');
|
|
function toggleSidebar(event) {
|
|
event.preventDefault();
|
|
if (menuWrapper) {
|
|
menuWrapper.classList.toggle('open');
|
|
navButton.classList.toggle('open');
|
|
}
|
|
}
|
|
function closeSidebar() {
|
|
if (menuWrapper) {
|
|
menuWrapper.classList.remove('open');
|
|
navButton.classList.remove('open');
|
|
}
|
|
}
|
|
navButton.addEventListener('click', toggleSidebar);
|
|
|
|
window.hljs.highlightAll();
|
|
|
|
const wrapper = document.getElementById('toc');
|
|
// https://jets.js.org/
|
|
window.jets = new window.Jets({
|
|
// *OR - Selects elements whose values contains at least one part of search substring
|
|
searchSelector: '*OR',
|
|
searchTag: '#input-search',
|
|
contentTag: '#toc li',
|
|
didSearch: function(term) {
|
|
wrapper.classList.toggle('jets-searching', String(term).length > 0)
|
|
},
|
|
// map these accent keys to plain values
|
|
diacriticsMap: {
|
|
a: 'ÀÁÂÃÄÅàáâãäåĀāąĄ',
|
|
c: 'ÇçćĆčČ',
|
|
d: 'đĐďĎ',
|
|
e: 'ÈÉÊËèéêëěĚĒēęĘ',
|
|
i: 'ÌÍÎÏìíîïĪī',
|
|
l: 'łŁ',
|
|
n: 'ÑñňŇńŃ',
|
|
o: 'ÒÓÔÕÕÖØòóôõöøŌō',
|
|
r: 'řŘ',
|
|
s: 'ŠšśŚ',
|
|
t: 'ťŤ',
|
|
u: 'ÙÚÛÜùúûüůŮŪū',
|
|
y: 'ŸÿýÝ',
|
|
z: 'ŽžżŻźŹ'
|
|
}
|
|
});
|
|
|
|
function hashChange() {
|
|
const currentItems = document.querySelectorAll('.tocify-subheader.visible, .tocify-item.tocify-focus');
|
|
Array.from(currentItems).forEach((elem) => {
|
|
elem.classList.remove('visible', 'tocify-focus');
|
|
});
|
|
|
|
const currentTag = document.querySelector(`a[href="${window.location.hash}"]`);
|
|
if (currentTag) {
|
|
const parent = currentTag.closest('.tocify-subheader');
|
|
if (parent) {
|
|
parent.classList.add('visible');
|
|
}
|
|
|
|
const siblings = currentTag.closest('.tocify-header');
|
|
if (siblings) {
|
|
Array.from(siblings.querySelectorAll('.tocify-subheader')).forEach((elem) => {
|
|
elem.classList.add('visible');
|
|
});
|
|
}
|
|
|
|
currentTag.parentElement.classList.add('tocify-focus');
|
|
|
|
// wait for dom changes to be done
|
|
setTimeout(() => {
|
|
currentTag.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
// only close the sidebar on level-2 events
|
|
if (currentTag.parentElement.classList.contains('level-2')) {
|
|
closeSidebar();
|
|
}
|
|
}, 1500);
|
|
}
|
|
}
|
|
|
|
let languages = JSON.parse(document.body.getAttribute('data-languages'));
|
|
// Support a key => value object where the key is the name, or an array of strings where the value is the name
|
|
if (!Array.isArray(languages)) {
|
|
languages = Object.values(languages);
|
|
}
|
|
// if there is no language use the first one
|
|
const currentLanguage = window.localStorage.getItem('language') || languages[0];
|
|
const languageStyle = document.getElementById('language-style');
|
|
const langSelector = document.querySelectorAll('.lang-selector button.lang-button');
|
|
|
|
function setActiveLanguage(newLanguage) {
|
|
window.localStorage.setItem('language', newLanguage);
|
|
if (!languageStyle) {
|
|
return;
|
|
}
|
|
|
|
const newStyle = languages.map((language) => {
|
|
return language === newLanguage
|
|
// the current one should be visible
|
|
? `body .content .${language}-example pre { display: block; }`
|
|
// the inactive one should be hidden
|
|
: `body .content .${language}-example pre { display: none; }`;
|
|
}).join(`\n`);
|
|
|
|
Array.from(langSelector).forEach((elem) => {
|
|
elem.classList.toggle('active', elem.getAttribute('data-language-name') === newLanguage);
|
|
});
|
|
|
|
const activeHash = window.location.hash.slice(1);
|
|
|
|
languageStyle.innerHTML = newStyle;
|
|
|
|
setTimeout(() => {
|
|
updateHash(activeHash);
|
|
}, 200);
|
|
}
|
|
|
|
setActiveLanguage(currentLanguage);
|
|
|
|
Array.from(langSelector).forEach((elem) => {
|
|
elem.addEventListener('click', () => {
|
|
const newLanguage = elem.getAttribute('data-language-name');
|
|
setActiveLanguage(newLanguage);
|
|
});
|
|
});
|
|
|
|
window.addEventListener('hashchange', hashChange, false);
|
|
|
|
const divs = document.querySelectorAll('.content h1[id], .content h2[id]');
|
|
|
|
document.addEventListener('scroll', () => {
|
|
divs.forEach(item => {
|
|
const rect = item.getBoundingClientRect();
|
|
if (rect.top > 0 && rect.top < 150) {
|
|
const location = window.location.toString().split('#')[0];
|
|
history.replaceState(null, null, location + '#' + item.id);
|
|
hashChange();
|
|
}
|
|
});
|
|
});
|
|
|
|
hashChange();
|
|
});
|