blob: 9024751cc558bb10b3eb558ef9f8522247608f1f [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Function to synchronize all tabs on a page to a given user selection.
*
* The selection of a tab group should only change if it contains an
* input with the given tabId. Otherwise, its current seletion should
* remain unchanged.
*
* See layouts/shortcodes/tabs.html
*/
function onSwitch(tabId) {
var selectorForId = "[data-tab-group='flink-tabs'][data-tab-item='" + tabId + "']";
Array
// find all tab group elements on the page
.from(document.getElementsByClassName("book-tabs"))
// filter out any elements that do not contain
// the specific tab the user wants to switch to.
// these tabs should remain on their current selection
.filter(div => div.querySelectorAll(selectorForId).length > 0)
// extract the input elements for all tab groups
// that do contain the target tab id
.flatMap(div => Array.from(div.querySelectorAll("[data-tab-group='flink-tabs']")))
// check input elements that contain the selected tabId
// and uncheck all others
.forEach(input => {
if (input.matches(selectorForId)) {
input.setAttribute("checked", "checked")
} else {
input.removeAttribute("checked")
}
});
}
/**
* Function to collapse the ToC in desktop mode.
*/
function collapseToc() {
document.querySelector(".book-toc").style["display"] = "none";
document.querySelector(".expand-toc").style["display"] = "block";
sessionStorage.setItem("collapse-toc", "true");
}
/**
* Function to expand the ToC in desktop mode.
*/
function expandToc() {
document.querySelector(".book-toc").style["display"] = "block";
document.querySelector(".expand-toc").style["display"] = "none";
sessionStorage.removeItem("collapse-toc");
}
/**
* Selects all text within the given container and copies it
* to the users clipboard. If any actions are not supported
* by a users browser this function will do nothing.
*/
function selectTextAndCopy(containerId) {
if (wasLastCopied(containerId)) {
return;
}
try {
if (highlightContent(containerId)) {
if (document.queryCommandSupported("copy")) {
document.execCommand("copy") && showCurrentCopyAlert(containerId);
}
}
} catch (e) {}
}
/**
* Checks if this container was the most recent one copied
* to the clipboard. This was users can double click and
* highlight specific portions of the dep.
*/
function wasLastCopied(containerId) {
return document
.querySelector("[copyable='flink-module'][copyattribute='" + containerId + "'")
.style["display"] == "block";
}
/**
* Highlights the content of the given container.
* Returns true on success, false otherwise.
*/
function highlightContent(containerId) {
try {
if (document.selection) {
var range = document.body.createTextRange();
range.moveToElementText(document.getElementById(containerId));
range.select().createTextRange();
return true;
} else if (window.getSelection) {
var range = document.createRange();
range.selectNode(document.getElementById(containerId));
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
return true;
} else {
return false;
}
} catch (err) {
// Text highlighting is not supported by this browser
return false;
}
}
/**
* Makes the copy alert for the given container
* visible while hiding all others.
*/
function showCurrentCopyAlert(containerId) {
document
.querySelectorAll("[copyable='flink-module']")
.forEach(function (alert) {
alert.style["display"] = "none";
});
var alert = document.querySelector("[copyable='flink-module'][copyattribute='" + containerId + "'");
alert.style["text-align"] = "center";
alert.style["display"] = "block";
}
/**
* Adds forEach to NodeList for old versions
* of microsoft IE and Edge.
*/
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
/**
* Adds forEach to Element for old versions
* of microsoft IE and Edge.
*/
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector ||
Element.prototype.webkitMatchesSelector;
}
document.addEventListener("DOMContentLoaded", function(event) {
if (sessionStorage.getItem("collapse-toc") === "true") {
collapseToc();
}
// Display anchor links when hovering over headers. For documentation of the
// configuration options, see the AnchorJS documentation.
anchors.options = {
placement: 'right'
};
// add anchors to h5 headings, hugo already adds them
// to h1-h4 but we use h5 in generated documentation
anchors.add('h5');
});
function resizeNav(event) {
const footerTop = Math.min(0, document.querySelector('footer').getBoundingClientRect().top - window.innerHeight);
const headerSize = document.querySelector('header nav').getBoundingClientRect().bottom;
document.querySelector('aside nav').style.height = (window.innerHeight - headerSize + footerTop) + 'px';
}
document.addEventListener("scroll", resizeNav);
window.addEventListener("resize", resizeNav);