diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js
index 8cbf1b161a6..e7050924cea 100644
--- a/sphinx/themes/basic/static/doctools.js
+++ b/sphinx/themes/basic/static/doctools.js
@@ -2,322 +2,241 @@
* doctools.js
* ~~~~~~~~~~~
*
- * Sphinx JavaScript utilities for all documentation.
+ * Fundamental JS-based functionality for all Sphinx-based documentation
+ * websites.
*
* :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
-
-/**
- * select a different prefix for underscore
- */
-$u = _.noConflict();
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
-if (!window.console || !console.firebug) {
- var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
- "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
- "profile", "profileEnd"];
- window.console = {};
- for (var i = 0; i < names.length; ++i)
- window.console[names[i]] = function() {};
-}
- */
-
-/**
- * small helper function to urldecode strings
- *
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
- */
-jQuery.urldecode = function(x) {
- if (!x) {
- return x
+"use strict";
+
+class _SphinxDocumentation {
+ /** Initialise the utilities for Sphinx documentation. */
+ constructor() {
+ // Attributes
+ this._translation_db = {
+ messages: {}, // mapping of {"source": gettext_value}
+ locale: "unknown",
+ plural_expr: this._default_plural_expr,
+ };
}
- return decodeURIComponent(x.replace(/\+/g, ' '));
-};
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
+ /** Triggered when the page has been loaded. */
+ _page_loaded() {
+ this._workaroundForFirefoxAnchorBug();
+ this._initDomainIndex();
+ this._highlightSearchWords();
+ if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
+ this._initKeyListeners();
+ }
+ }
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
- if (typeof s === 'undefined')
- s = document.location.search;
- var parts = s.substr(s.indexOf('?') + 1).split('&');
- var result = {};
- for (var i = 0; i < parts.length; i++) {
- var tmp = parts[i].split('=', 2);
- var key = jQuery.urldecode(tmp[0]);
- var value = jQuery.urldecode(tmp[1]);
- if (key in result)
- result[key].push(value);
- else
- result[key] = [value];
+ //
+ // Translation utilities
+ //
+ _default_plural_expr(n) {
+ return Number(n !== 1);
}
- return result;
-};
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
- function highlight(node, addItems) {
- if (node.nodeType === 3) {
- var val = node.nodeValue;
- var pos = val.toLowerCase().indexOf(text);
- if (pos >= 0 &&
- !jQuery(node.parentNode).hasClass(className) &&
- !jQuery(node.parentNode).hasClass("nohighlight")) {
- var span;
- var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
- if (isInSVG) {
- span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
- } else {
- span = document.createElement("span");
- span.className = className;
- }
- span.appendChild(document.createTextNode(val.substr(pos, text.length)));
- node.parentNode.insertBefore(span, node.parentNode.insertBefore(
- document.createTextNode(val.substr(pos + text.length)),
- node.nextSibling));
- node.nodeValue = val.substr(0, pos);
- if (isInSVG) {
- var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
- var bbox = node.parentElement.getBBox();
- rect.x.baseVal.value = bbox.x;
- rect.y.baseVal.value = bbox.y;
- rect.width.baseVal.value = bbox.width;
- rect.height.baseVal.value = bbox.height;
- rect.setAttribute('class', className);
- addItems.push({
- "parent": node.parentNode,
- "target": rect});
- }
- }
+ // This is primarily accessed via the `_` global variable.
+ gettext(string) {
+ let translated = this._translation_db.messages[string];
+ if (typeof translated === "undefined") {
+ // No translation available. Return original as-is.
+ return string;
}
- else if (!jQuery(node).is("button, select, textarea")) {
- jQuery.each(node.childNodes, function() {
- highlight(this, addItems);
- });
+ if (typeof translated === "string") {
+ // Translation exists, and only has one form.
+ return translated;
}
+ // This is a [singular, plural] array -- return the singular.
+ return translated[0];
}
- var addItems = [];
- var result = this.each(function() {
- highlight(this, addItems);
- });
- for (var i = 0; i < addItems.length; ++i) {
- jQuery(addItems[i].parent).before(addItems[i].target);
- }
- return result;
-};
-/*
- * backward compatibility for jQuery.browser
- * This will be supported until firefox bug is fixed.
- */
-if (!jQuery.browser) {
- jQuery.uaMatch = function(ua) {
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
- /(webkit)[ \/]([\w.]+)/.exec(ua) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
- /(msie) ([\w.]+)/.exec(ua) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
- [];
+ ngettext(singular, plural, n) {
+ let translated = this._translation_db.messages[singular];
+ if (typeof translated !== "undefined") {
+ // No translation available. Return appropriate original.
+ if (n == 1) {
+ return singular;
+ }
+ return plural;
+ }
+ return translated[this._translation_db.plural_expr(n)];
+ }
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
- };
- jQuery.browser = {};
- jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
-}
+ /** Add information from the translations, into the translation
+ * database maintained by this instance.
+ *
+ * @param {Object} translations
+ * Translation object, that contains messages to be added, the
+ * plural expression and the appropriate locale to be used.
+ */
+ addTranslations(translations) {
+ // Add messages.
+ for (let [key, value] of Object.entries(translations)) {
+ this._translation_db.messages[key] = value;
+ }
+ // Update the function used to compute plurals.
+ this._translation_db.plural_expr = new Function(
+ "n",
+ `return (${translations.plural_expr})`
+ );
+ // Update the locale.
+ this._translation_db.locale = translations.locale;
+ }
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
+ //
+ // Search highlighting
+ //
- init : function() {
- this.fixFirefoxAnchorBug();
- this.highlightSearchWords();
- this.initIndexTable();
- if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
- this.initOnKeyListeners();
+ _highlightSearchWords() {
+ let parameters = new URLSearchParams(window.location.search);
+ let highlight_words = parameters.getAll("highlight");
+ if (highlight_words.length === 0) {
+ // Nothing to highlight.
+ return;
}
- },
- /**
- * i18n support
- */
- TRANSLATIONS : {},
- PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
- LOCALE : 'unknown',
-
- // gettext and ngettext don't access this so that the functions
- // can safely bound to a different name (_ = Documentation.gettext)
- gettext : function(string) {
- var translated = Documentation.TRANSLATIONS[string];
- if (typeof translated === 'undefined')
- return string;
- return (typeof translated === 'string') ? translated : translated[0];
- },
+ // Highlight content within `role="main"`
+ // TODO: implement this.
+ // window.setTimeout(function () {
+ // $.each(terms, function () {
+ // element.highlightText(this.toLowerCase(), "highlighted");
+ // });
+ // }, 10);
+
+ let searchbox = document.getElementById("searchbox");
+ if (searchbox !== null) {
+ searchbox.insertAdjacentHTML(
+ "afterend",
+ '
' +
+ '' +
+ this.gettext("Hide Search Matches") +
+ "" +
+ "
"
+ );
+ }
+ }
- ngettext : function(singular, plural, n) {
- var translated = Documentation.TRANSLATIONS[singular];
- if (typeof translated === 'undefined')
- return (n == 1) ? singular : plural;
- return translated[Documentation.PLURALEXPR(n)];
- },
+ hideSearchWords() {
+ let searchbox = document.getElementById("searchbox");
+ if (searchbox === null) {
+ return;
+ }
+ // Remove any .highlight-link nodes.
+ searchbox
+ .querySelectorAll(".highlight-link")
+ .forEach((element) => element.remove());
+ // Remove all the highlighted classes.
+ document
+ .querySelector('[role="main"]')
+ .querySelectorAll("span.highlighted")
+ .forEach((element) => element.classList.remove("highlighted"));
+ }
- addTranslations : function(catalog) {
- for (var key in catalog.messages)
- this.TRANSLATIONS[key] = catalog.messages[key];
- this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
- this.LOCALE = catalog.locale;
- },
+ //
+ // Domain Index stuff
+ //
- /**
- * add context elements like header anchor links
+ /** Initialize domain index toggle buttons
*/
- addContextElements : function() {
- $('div[id] > :header:first').each(function() {
- $('').
- attr('href', '#' + this.id).
- attr('title', _('Permalink to this headline')).
- appendTo(this);
- });
- $('dt[id]').each(function() {
- $('').
- attr('href', '#' + this.id).
- attr('title', _('Permalink to this definition')).
- appendTo(this);
+ _initDomainIndex() {
+ let toggle = (element) => {
+ if (window.getComputedStyle(element).display === "block") {
+ element.style.display = "none";
+ } else {
+ element.style.display = "block";
+ }
+ };
+
+ let toggle_images = document.querySelectorAll('[role="main"] img.toggler');
+
+ toggle_images.forEach((element) => {
+ element.addEventListener("click", () => {
+ let src = element.getAttribute("src");
+ let id_number = element.getAttribute("id").substr(7);
+
+ // Toggle visibility.
+ toggle(document.querySelector(`tr.cg-${id_number}`));
+ // Toggle icon.
+ let new_src =
+ src.substr(-9) === "minus.png"
+ ? src.substr(0, src.length - 9) + "plus.png"
+ : src.substr(0, src.length - 8) + "minus.png";
+ element.setAttribute("src", new_src);
+ });
});
- },
- /**
- * workaround a firefox stupidity
- * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
- */
- fixFirefoxAnchorBug : function() {
- if (document.location.hash && $.browser.mozilla)
- window.setTimeout(function() {
- document.location.href += '';
- }, 10);
- },
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
+ toggle_images.forEach((e) => e.click());
+ }
+ }
- /**
- * highlight the search words provided in the url in the text
- */
- highlightSearchWords : function() {
- var params = $.getQueryParameters();
- var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
- if (terms.length) {
- var body = $('div.body');
- if (!body.length) {
- body = $('body');
- }
- window.setTimeout(function() {
- $.each(terms, function() {
- body.highlightText(this.toLowerCase(), 'highlighted');
- });
- }, 10);
- $('' + _('Hide Search Matches') + '
')
- .appendTo($('#searchbox'));
+ //
+ // Keyboard handling
+ //
+ _keyListener(event) {
+ let tag_name = document.activeElement.tagName;
+ if (
+ tag_name === "TEXTAREA" ||
+ tag_name === "INPUT" ||
+ tag_name === "SELECT" ||
+ tag_name === "BUTTON"
+ ) {
+ // Don't handle keyboard presses in input elements.
+ return;
+ }
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
+ // Don't handle keyboard presses with modifier keys.
+ return;
}
- },
- /**
- * init the domain index toggle buttons
- */
- initIndexTable : function() {
- var togglers = $('img.toggler').click(function() {
- var src = $(this).attr('src');
- var idnum = $(this).attr('id').substr(7);
- $('tr.cg-' + idnum).toggle();
- if (src.substr(-9) === 'minus.png')
- $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
- else
- $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
- }).css('display', '');
- if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
- togglers.click();
+ // Actual event handling
+ if (event.keyCode == 37) {
+ // Left
+ let link_prev = document.querySelector('link[rel="prev"]');
+ if (link_prev !== null && link_prev.href !== "") {
+ window.location.href = link_prev.href;
+ }
+ } else if (event.keyCode == 39) {
+ // Right
+ let link_next = document.querySelector('link[rel="next"]');
+ if (link_next !== null && link_next.href !== "") {
+ window.location.href = link_next.href;
+ }
}
- },
+ }
- /**
- * helper function to hide the search marks again
- */
- hideSearchWords : function() {
- $('#searchbox .highlight-link').fadeOut(300);
- $('span.highlighted').removeClass('highlighted');
- },
+ _initKeyListeners() {
+ document.addEventListener("keydown", this._keyListener);
+ }
- /**
- * make the url absolute
- */
- makeURL : function(relativeURL) {
- return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
- },
+ //
+ // Misc
+ //
/**
- * get the current relative url
+ * Workaround for a weird Firefox bug around anchor handling.
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=645075 for details.
*/
- getCurrentURL : function() {
- var path = document.location.pathname;
- var parts = path.split(/\//);
- $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
- if (this === '..')
- parts.pop();
- });
- var url = parts.join('/');
- return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
- },
-
- initOnKeyListeners: function() {
- $(document).keydown(function(event) {
- var activeElementType = document.activeElement.tagName;
- // don't navigate when in search box, textarea, dropdown or button
- if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
- && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
- && !event.shiftKey) {
- switch (event.keyCode) {
- case 37: // left
- var prevHref = $('link[rel="prev"]').prop('href');
- if (prevHref) {
- window.location.href = prevHref;
- return false;
- }
- break;
- case 39: // right
- var nextHref = $('link[rel="next"]').prop('href');
- if (nextHref) {
- window.location.href = nextHref;
- return false;
- }
- break;
- }
- }
- });
+ _workaroundForFirefoxAnchorBug() {
+ document.location.href += "";
}
-};
+}
-// quick alias for translations
+// We expose a single object, for public use.
+var Documentation = new _SphinxDocumentation();
+
+// a common short alias
_ = Documentation.gettext;
-$(document).ready(function() {
- Documentation.init();
-});
+if (
+ document.readyState === "complete" ||
+ document.readyState === "interactive"
+) {
+ setTimeout(Documentation._page_loaded, 1);
+} else {
+ document.addEventListener("DOMContentLoaded", Documentation._page_loaded);
+}
diff --git a/sphinx/themes/basic/static/jquery-3.5.1.js b/sphinx/themes/basic/static/jquery-3.5.1.js
deleted file mode 100644
index 50937333b99..00000000000
--- a/sphinx/themes/basic/static/jquery-3.5.1.js
+++ /dev/null
@@ -1,10872 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.5.1
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2020-05-04T22:49Z
- */
-( function( global, factory ) {
-
- "use strict";
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
-
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var flat = arr.flat ? function( array ) {
- return arr.flat.call( array );
-} : function( array ) {
- return arr.concat.apply( [], array );
-};
-
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-var isFunction = function isFunction( obj ) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML