Moved from JCenter to Maven Central.

Updated dependencies.
This commit is contained in:
Erik C. Thauvin 2021-03-21 12:47:09 -07:00
parent 2c8a9c61cc
commit c61f9ad59c
93 changed files with 6881 additions and 190 deletions

52
docs/scripts/clipboard.js Normal file
View file

@ -0,0 +1,52 @@
window.addEventListener('load', () => {
document.querySelectorAll('span.copy-icon').forEach(element => {
element.addEventListener('click', (el) => copyElementsContentToClipboard(element));
})
document.querySelectorAll('span.anchor-icon').forEach(element => {
element.addEventListener('click', (el) => {
if(element.hasAttribute('pointing-to')){
const location = hrefWithoutCurrentlyUsedAnchor() + '#' + element.getAttribute('pointing-to')
copyTextToClipboard(element, location)
}
});
})
})
const copyElementsContentToClipboard = (element) => {
const selection = window.getSelection();
const range = document.createRange();
range.selectNodeContents(element.parentNode.parentNode);
selection.removeAllRanges();
selection.addRange(range);
copyAndShowPopup(element, () => selection.removeAllRanges())
}
const copyTextToClipboard = (element, text) => {
var textarea = document.createElement("textarea");
textarea.textContent = text;
textarea.style.position = "fixed";
document.body.appendChild(textarea);
textarea.select();
copyAndShowPopup(element, () => document.body.removeChild(textarea))
}
const copyAndShowPopup = (element, after) => {
try {
document.execCommand('copy');
element.nextElementSibling.classList.add('active-popup');
setTimeout(() => {
element.nextElementSibling.classList.remove('active-popup');
}, 1200);
} catch (e) {
console.error('Failed to write to clipboard:', e)
}
finally {
if(after) after()
}
}
const hrefWithoutCurrentlyUsedAnchor = () => window.location.href.split('#')[0]

67
docs/scripts/main.js Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,64 @@
navigationPageText = fetch(pathToRoot + "navigation.html").then(response => response.text())
displayNavigationFromPage = () => {
navigationPageText.then(data => {
document.getElementById("sideMenu").innerHTML = data;
}).then(() => {
document.querySelectorAll(".overview > a").forEach(link => {
link.setAttribute("href", pathToRoot + link.getAttribute("href"));
})
}).then(() => {
document.querySelectorAll(".sideMenuPart").forEach(nav => {
if (!nav.classList.contains("hidden"))
nav.classList.add("hidden")
})
}).then(() => {
revealNavigationForCurrentPage()
})
document.querySelectorAll('.footer a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
}
revealNavigationForCurrentPage = () => {
let pageId = document.getElementById("content").attributes["pageIds"].value.toString();
let parts = document.querySelectorAll(".sideMenuPart");
let found = 0;
do {
parts.forEach(part => {
if (part.attributes['pageId'].value.indexOf(pageId) !== -1 && found === 0) {
found = 1;
if (part.classList.contains("hidden")) {
part.classList.remove("hidden");
part.setAttribute('data-active', "");
}
revealParents(part)
}
});
pageId = pageId.substring(0, pageId.lastIndexOf("/"))
} while (pageId.indexOf("/") !== -1 && found === 0)
};
revealParents = (part) => {
if (part.classList.contains("sideMenuPart")) {
if (part.classList.contains("hidden"))
part.classList.remove("hidden");
revealParents(part.parentNode)
}
};
/*
This is a work-around for safari being IE of our times.
It doesn't fire a DOMContentLoaded, presumabely because eventListener is added after it wants to do it
*/
if (document.readyState == 'loading') {
window.addEventListener('DOMContentLoaded', () => {
displayNavigationFromPage()
})
} else {
displayNavigationFromPage()
}

View file

@ -0,0 +1 @@
[{"name":"bitly-shorten","description":null,"location":"index.html","searchKeys":["bitly-shorten"]},{"name":"net.thauvin.erik.bitly","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/index.html","searchKeys":["net.thauvin.erik.bitly"]},{"name":"Bitlinks","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-bitlinks/index.html","searchKeys":["Bitlinks"]},{"name":"Bitly","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-bitly/index.html","searchKeys":["Bitly"]},{"name":"CallResponse","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-call-response/index.html","searchKeys":["CallResponse"]},{"name":"Constants","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-constants/index.html","searchKeys":["Constants"]},{"name":"Methods","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-methods/index.html","searchKeys":["Methods"]},{"name":"DELETE","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-methods/-d-e-l-e-t-e/index.html","searchKeys":["DELETE"]},{"name":"GET","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-methods/-g-e-t/index.html","searchKeys":["GET"]},{"name":"PATCH","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-methods/-p-a-t-c-h/index.html","searchKeys":["PATCH"]},{"name":"POST","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-methods/-p-o-s-t/index.html","searchKeys":["POST"]},{"name":"Units","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/index.html","searchKeys":["Units"]},{"name":"DAY","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/-d-a-y/index.html","searchKeys":["DAY"]},{"name":"HOUR","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/-h-o-u-r/index.html","searchKeys":["HOUR"]},{"name":"MINUTE","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/-m-i-n-u-t-e/index.html","searchKeys":["MINUTE"]},{"name":"MONTH","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/-m-o-n-t-h/index.html","searchKeys":["MONTH"]},{"name":"WEEK","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-units/-w-e-e-k/index.html","searchKeys":["WEEK"]},{"name":"Utils","description":null,"location":"bitly-shorten/net.thauvin.erik.bitly/-utils/index.html","searchKeys":["Utils"]}]

1
docs/scripts/pages.json Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,290 @@
filteringContext = {
dependencies: {},
restrictedDependencies: [],
activeFilters: []
}
let highlightedAnchor;
let topNavbarOffset;
window.addEventListener('load', () => {
document.querySelectorAll("div[data-platform-hinted]")
.forEach(elem => elem.addEventListener('click', (event) => togglePlatformDependent(event,elem)))
document.querySelectorAll("div[tabs-section]")
.forEach(elem => elem.addEventListener('click', (event) => toggleSectionsEventHandler(event)))
const filterSection = document.getElementById('filter-section')
if (filterSection) {
filterSection.addEventListener('click', (event) => filterButtonHandler(event))
initializeFiltering()
}
initTabs()
handleAnchor()
initHidingLeftNavigation()
document.getElementById('main').addEventListener("scroll", (e) => {
document.getElementsByClassName("navigation-wrapper")[0].classList.toggle("sticky-navigation", e.target.scrollTop > 0)
})
topNavbarOffset = document.getElementById('navigation-wrapper')
})
const initHidingLeftNavigation = () => {
document.getElementById("leftToggler").onclick = function(event) {
//Events need to be prevented from bubbling since they will trigger next handler
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
document.getElementById("leftColumn").classList.toggle("open");
}
document.getElementById("main").onclick = () => {
document.getElementById("leftColumn").classList.remove("open");
}
}
// Hash change is needed in order to allow for linking inside the same page with anchors
// If this is not present user is forced to refresh the site in order to use an anchor
window.onhashchange = handleAnchor
function scrollToElementInContent(element){
const scrollToElement = () => document.getElementById('main').scrollTo({ top: element.offsetTop - topNavbarOffset.offsetHeight, behavior: "smooth"})
const waitAndScroll = () => {
setTimeout(() => {
if(topNavbarOffset){
scrollToElement()
} else {
waitForScroll()
}
}, 50)
}
if(topNavbarOffset){
scrollToElement()
} else {
waitAndScroll()
}
}
function handleAnchor() {
if(highlightedAnchor){
highlightedAnchor.classList.remove('anchor-highlight')
highlightedAnchor = null;
}
let searchForTab = function(element) {
if(element && element.hasAttribute) {
if(element.hasAttribute("data-togglable")) return element;
else return searchForTab(element.parentNode)
} else return null
}
let anchor = window.location.hash
if (anchor != "") {
anchor = anchor.substring(1)
let element = document.querySelector('a[data-name="' + anchor+'"]')
if (element) {
let tab = searchForTab(element)
if (tab) {
toggleSections(tab)
}
const content = element.nextElementSibling
if(content){
content.classList.add('anchor-highlight')
highlightedAnchor = content
}
scrollToElementInContent(element)
}
}
}
function initTabs(){
document.querySelectorAll("div[tabs-section]")
.forEach(element => {
showCorrespondingTabBody(element)
element.addEventListener('click', (event) => toggleSectionsEventHandler(event))
})
let cached = localStorage.getItem("active-tab")
if (cached) {
let parsed = JSON.parse(cached)
let tab = document.querySelector('div[tabs-section] > button[data-togglable="' + parsed + '"]')
if(tab) {
toggleSections(tab)
}
}
}
function showCorrespondingTabBody(element){
const key = element.querySelector("button[data-active]").getAttribute("data-togglable")
document.querySelector(".tabs-section-body")
.querySelector("div[data-togglable='" + key + "']")
.setAttribute("data-active", "")
}
function filterButtonHandler(event) {
if(event.target.tagName == "BUTTON" && event.target.hasAttribute("data-filter")) {
let sourceset = event.target.getAttribute("data-filter")
if(filteringContext.activeFilters.indexOf(sourceset) != -1) {
filterSourceset(sourceset)
} else {
unfilterSourceset(sourceset)
}
}
}
function initializeFiltering() {
filteringContext.dependencies = JSON.parse(sourceset_dependencies)
document.querySelectorAll("#filter-section > button")
.forEach(p => filteringContext.restrictedDependencies.push(p.getAttribute("data-filter")))
Object.keys(filteringContext.dependencies).forEach(p => {
filteringContext.dependencies[p] = filteringContext.dependencies[p]
.filter(q => -1 !== filteringContext.restrictedDependencies.indexOf(q))
})
let cached = window.localStorage.getItem('inactive-filters')
if (cached) {
let parsed = JSON.parse(cached)
//Events are used by react to get values in 'on this page'
const event = new CustomEvent('sourceset-filter-change', { detail: parsed });
window.dispatchEvent(event);
filteringContext.activeFilters = filteringContext.restrictedDependencies
.filter(q => parsed.indexOf(q) == -1 )
} else {
filteringContext.activeFilters = filteringContext.restrictedDependencies
}
refreshFiltering()
}
function filterSourceset(sourceset) {
filteringContext.activeFilters = filteringContext.activeFilters.filter(p => p != sourceset)
refreshFiltering()
addSourcesetFilterToCache(sourceset)
}
function unfilterSourceset(sourceset) {
if(filteringContext.activeFilters.length == 0) {
filteringContext.activeFilters = filteringContext.dependencies[sourceset].concat([sourceset])
refreshFiltering()
filteringContext.dependencies[sourceset].concat([sourceset]).forEach(p => removeSourcesetFilterFromCache(p))
} else {
filteringContext.activeFilters.push(sourceset)
refreshFiltering()
removeSourcesetFilterFromCache(sourceset)
}
}
function addSourcesetFilterToCache(sourceset) {
let cached = localStorage.getItem('inactive-filters')
if (cached) {
let parsed = JSON.parse(cached)
localStorage.setItem('inactive-filters', JSON.stringify(parsed.concat([sourceset])))
} else {
localStorage.setItem('inactive-filters', JSON.stringify([sourceset]))
}
}
function removeSourcesetFilterFromCache(sourceset) {
let cached = localStorage.getItem('inactive-filters')
if (cached) {
let parsed = JSON.parse(cached)
localStorage.setItem('inactive-filters', JSON.stringify(parsed.filter(p => p != sourceset)))
}
}
function toggleSections(target) {
localStorage.setItem('active-tab', JSON.stringify(target.getAttribute("data-togglable")))
const activateTabs = (containerClass) => {
for(const element of document.getElementsByClassName(containerClass)){
for(const child of element.children){
if(child.getAttribute("data-togglable") === target.getAttribute("data-togglable")){
child.setAttribute("data-active", "")
} else {
child.removeAttribute("data-active")
}
}
}
}
activateTabs("tabs-section")
activateTabs("tabs-section-body")
}
function toggleSectionsEventHandler(evt){
if(!evt.target.getAttribute("data-togglable")) return
toggleSections(evt.target)
}
function togglePlatformDependent(e, container) {
let target = e.target
if (target.tagName != 'BUTTON') return;
let index = target.getAttribute('data-toggle')
for(let child of container.children){
if(child.hasAttribute('data-toggle-list')){
for(let bm of child.children){
if(bm == target){
bm.setAttribute('data-active',"")
} else if(bm != target) {
bm.removeAttribute('data-active')
}
}
}
else if(child.getAttribute('data-togglable') == index) {
child.setAttribute('data-active',"")
}
else {
child.removeAttribute('data-active')
}
}
}
function refreshFiltering() {
let sourcesetList = filteringContext.activeFilters
document.querySelectorAll("[data-filterable-set]")
.forEach(
elem => {
let platformList = elem.getAttribute("data-filterable-set").split(' ').filter(v => -1 !== sourcesetList.indexOf(v))
elem.setAttribute("data-filterable-current", platformList.join(' '))
}
)
const event = new CustomEvent('sourceset-filter-change', { detail: sourcesetList });
window.dispatchEvent(event);
refreshFilterButtons()
refreshPlatformTabs()
}
function refreshPlatformTabs() {
document.querySelectorAll(".platform-hinted > .platform-bookmarks-row").forEach(
p => {
let active = false;
let firstAvailable = null
p.childNodes.forEach(
element => {
if(element.getAttribute("data-filterable-current") != ''){
if( firstAvailable == null) {
firstAvailable = element
}
if(element.hasAttribute("data-active")) {
active = true;
}
}
}
)
if( active == false && firstAvailable) {
firstAvailable.click()
}
}
)
}
function refreshFilterButtons() {
document.querySelectorAll("#filter-section > button")
.forEach(f => {
if(filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) != -1){
f.setAttribute("data-active","")
} else {
f.removeAttribute("data-active")
}
})
}

View file

@ -0,0 +1 @@
sourceset_dependencies='{":dokkaHtml/main":[]}'