Moved from JCenter to Maven Central.
Updated dependencies.
This commit is contained in:
parent
2c8a9c61cc
commit
c61f9ad59c
93 changed files with 6881 additions and 190 deletions
52
docs/scripts/clipboard.js
Normal file
52
docs/scripts/clipboard.js
Normal 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
67
docs/scripts/main.js
Normal file
File diff suppressed because one or more lines are too long
64
docs/scripts/navigation-loader.js
Normal file
64
docs/scripts/navigation-loader.js
Normal 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()
|
||||
}
|
1
docs/scripts/navigation-pane.json
Normal file
1
docs/scripts/navigation-pane.json
Normal 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
1
docs/scripts/pages.json
Normal file
File diff suppressed because one or more lines are too long
290
docs/scripts/platform-content-handler.js
Normal file
290
docs/scripts/platform-content-handler.js
Normal 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")
|
||||
}
|
||||
})
|
||||
}
|
1
docs/scripts/sourceset_dependencies.js
Normal file
1
docs/scripts/sourceset_dependencies.js
Normal file
|
@ -0,0 +1 @@
|
|||
sourceset_dependencies='{":dokkaHtml/main":[]}'
|
Loading…
Add table
Add a link
Reference in a new issue