diff --git a/Makefile b/Makefile
index 6d54cdb42..f48736ff9 100644
--- a/Makefile
+++ b/Makefile
@@ -30,13 +30,8 @@ clean: ## Clean docs build directory
cd $(DOCS_DIR) && rm -rf $(BUILDDIR)/
.PHONY: distclean
-distclean: ## Clean docs build directory and Python virtual environment, then install requirements
- cd $(DOCS_DIR) && rm -rf $(BUILDDIR)/
- python3 -m venv venv --clear
- venv/bin/pip install -r requirements-initial.txt
- venv/bin/pip install -r requirements.txt
- @echo
- @echo "Installation of requirements completed."
+distclean: clean ## Clean docs build directory and Python virtual environment
+ rm -rf venv
venv/bin/python: ## Setup up Python virtual environment and install requirements
python3 -m venv venv
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
deleted file mode 100644
index 6242c425c..000000000
--- a/docs/_static/custom.css
+++ /dev/null
@@ -1,467 +0,0 @@
-:root {
- /* Add Font Awesome 5 icon and color for todo */
- --pst-icon-clipboard-list: '\f46d';
- --pst-icon-admonition-todo: var(--pst-icon-clipboard-list);
- --pst-color-admonition-todo: 161, 46, 233;
- --target-color: #b9ee9e;
- --codeblock-color: #aad993;
-}
-
-.visuallyhidden {
- display: none;
-}
-
-pre {
- border-radius: 0;
- background-color: white;
- box-shadow: none;
-}
-
-a,
-a:visited,
-main.bd-content #main-content a,
-main.bd-content #main-content a:visited {
- color: #2980b9;
-}
-
-a:hover,
-main.bd-content #main-content a:hover {
- color: #1a567e;
- text-decoration: none;
-}
-
-ul {
- list-style-type: square;
-}
-
-ul li>p {
- margin-bottom: 0.3rem;
-}
-
-ol li>p {
- margin-bottom: 0.3rem;
-}
-
-img {
- margin: 1rem 0;
-}
-
-figure img,
-img.figure,
-.figure img {
- box-shadow: 0 6px 24px 0 rgba(153, 153, 153, 0.3);
-}
-
-.sidebar img.logo {
- box-shadow: none;
- width: 200px;
- margin-bottom: 1rem;
-}
-
-img.inline {
- margin: 0;
- height: 1em;
-}
-
-span.linenos {
- padding-right: 1em;
-}
-
-p.ploneorglink img {
- vertical-align: bottom;
-}
-
-dt:target,
-span.highlighted,
-ul.search li span.highlighted {
- background-color: var(--target-color);
-}
-
-.bd-sidebar .nav ul {
- padding: 0 0 0 1rem;
-}
-
-.bd-sidebar .nav .toctree-checkbox~label i {
- transform: rotate(90deg);
-}
-
-.bd-sidebar .nav .toctree-checkbox:checked~label i {
- transform: rotate(0deg);
-}
-
-.toctree-wrapper .caption {
- font-weight: bold;
- font-size: 1.2em;
- margin-top: 3rem;
-}
-
-.toctree-wrapper ul {
- list-style: none;
-}
-
-section:not(#glossary) h1~dl {
- display: grid;
- grid-template-columns: max-content auto;
-}
-
-section:not(#glossary) h1~dl dd {
- margin-bottom: unset !important;
-}
-
-div.section {
- margin-bottom: 5rem;
-}
-
-div.section div.section {
- margin-bottom: 5rem;
-}
-
-div.section div.section div.section {
- margin-bottom: 2rem;
-}
-
-/* admonitions */
-.admonition {
- border-radius: 0;
- border: none;
- border-left: .2rem solid;
- border-left-color: rgba(var(--pst-color-admonition-default), 1);
-}
-
-.admonition .admonition-title {
- margin-bottom: 1.5rem !important;
-}
-
-/* admonition todo */
-.admonition.admonition-todo,
-div.admonition.admonition-todo {
- border-color: rgba(var(--pst-color-admonition-todo), 1);
-}
-
-.admonition.admonition-todo>.admonition-title,
-div.admonition.admonition-todo>.admonition-title {
- background-color: rgba(var(--pst-color-admonition-todo), .1);
-}
-
-.admonition.admonition-todo>.admonition-title::before,
-div.admonition.admonition-todo>.admonition-title::before {
- color: rgba(var(--pst-color-admonition-todo), 1);
- content: var(--pst-icon-admonition-todo);
-}
-
-.admonition-github-only.admonition {
- display: none;
-}
-
-/* admonition margin */
-.admonition.margin ul,
-.admonition.margin ol {
- padding-left: 1rem;
-}
-
-.topic {
- padding: 1.5em 1em .5em 1em;
-}
-
-.topic-title {
- font-weight: bold;
-}
-
-
-/* Bootstrap */
-.btn-primary {
- color: #fff;
- background-color: #2980b9;
- border-color: #2980b9;
-}
-
-.btn-primary {
- background-color: #1f86ca;
- border-color: #2980b9;
-}
-
-/* Search */
-
-/* Show search form. It is hidden by default. */
-#search-documentation,
-#search-documentation~form,
-#search-documentation~p {
- display: block;
-}
-
-#search-form:focus-within #shortcut-page,
-.bd-search:focus-within #shortcut {
- display: none;
-}
-
-#shortcut-page.input-group-text {
- padding-top: 0;
- padding-bottom: 0;
-}
-
-input#q {
- border-radius: .25rem 0 0 .25rem;
-}
-
-.form-control:focus {
- box-shadow: none;
- border-width: 2px;
-}
-
-ul.search {
- margin-left: 0;
-}
-
-p.search-summary {
- margin: 1em 0 2rem 0;
-}
-
-#search-results ul {
- list-style-type: none;
- padding-left: 0;
-}
-
-#search-results ul li,
-ul.search li {
- margin-bottom: 2rem;
- padding: 0;
- background-image: none;
- border-bottom: none;
-}
-
-#search-results ul li h3 {
- margin: 0.4rem 0 .5rem;
- font-size: 1.5rem;
-}
-
-#search-results ul li .breadcrumbs {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
-}
-
-#search-results ul li .breadcrumbs a {
- font-weight: normal;
-}
-
-#search-results ul li .breadcrumbs .lastbreadcrumb {
- white-space: nowrap;
- display: inline-block;
- max-width: 12rem;
- overflow: hidden;
- /* "overflow"-Wert darf nicht "visible" sein */
-
- text-overflow: ellipsis;
-}
-
-ul.search li p.context {
- margin-left: 0;
-}
-
-/* Search form sidebar */
-
-.bd-search {
- font-size: .8rem;
-}
-
-.bd-search:focus-within #search-input {
- border-radius: .25rem;
-}
-
-#shortcut.input-group-text {
- padding-top: 0;
- padding-bottom: 0;
-}
-
-.bd-search input,
-.bd-search .input-group-text {
- font-size: .8rem;
- padding-left: .5em;
-}
-
-input#search-input {
- padding-left: 2.1875rem;
- border-radius: .25rem 0 0 .25rem;
-}
-
-.search-icon {
- position: absolute;
- color: #a4a6a7;
- left: .625rem;
- z-index: 100;
- align-self: center;
-}
-
-.input-group-text kbd {
- padding: 0rem 0.4rem;
- font-size: 135%;
-}
-
-.pathseparator {
- padding: 0 0.7rem;
-}
-
-/* header-article */
-div.header-article__label {
- display: flex;
- align-items: center;
- margin: 0 auto 0 1em;
- font-size: 80%;
- overflow: hidden;
- white-space: nowrap;
-}
-
-/* submenu */
-.bd-toc {
- box-shadow: 0 .2rem .5rem rgba(0, 0, 0, .05), 0 0 .0625rem rgba(0, 0, 0, .1);
-}
-
-/* extra sidebar */
-div.sidebar:not(.margin) {
- width: 40%;
- float: right;
- clear: right;
- margin: .3rem 0 .3rem 0.5em;
- padding: 2rem 0 1.5rem 1rem !important;
- background-color: rgba(var(--pst-color-admonition-note), .1);
- border: none;
- border-left: 8px rgba(var(--pst-color-admonition-default), 1) solid;
- border-radius: .2rem;
- box-shadow: 0 .2rem .5rem rgba(0, 0, 0, .05), 0 0 .0625rem rgba(0, 0, 0, .1);
-}
-
-div.sidebar:not(.margin) .figure {
- margin-top: 0;
- padding-top: 0;
- margin-left: 0;
- padding-left: 0;
-}
-
-div.sidebar:not(.margin) img.logo {
- margin-top: 0;
- margin-bottom: .3rem;
-}
-
-div.sidebar:not(.margin) p {
- margin-bottom: 0;
-}
-
-div.sidebar:not(.margin) p.sidebar-title {
- display: none;
-}
-
-div.sidebar:not(.margin) div.topic {
- padding: .5em 0;
- background-color: transparent;
- border: none;
-}
-
-div.sidebar:not(.margin) pre {
- margin: .5em 0 1.5em 0;
-}
-
-div.sidebar:not(.margin) div[class*="highlight-"] {
- margin-right: .5em;
-}
-
-div.sidebar:not(.margin) .admonition {
- margin-right: .5em;
- background-color: #ffffff;
-}
-
-@media (min-width:768px) {
- div.sidebar:not(.margin) {
- width: 50%;
- margin-left: 1.5em;
- margin-right: -28%;
- }
-}
-
-
-main.bd-content #main-content dl.simple dt {
- margin-top: .8em;
-}
-
-main.bd-content #main-content dl.simple dt:nth-of-type(1) {
- margin-top: 0;
-}
-
-main.bd-content #main-content dl.simple dd {
- margin-top: .8em;
-}
-
-main.bd-content #main-content dl.simple dt+dd {
- margin-top: 0;
-}
-
-.prev-next-bottom {
- margin: 20px 0 30px 0;
-}
-
-.prev-next-bottom a.left-prev,
-.prev-next-bottom a.right-next {
- padding: 5px 10px;
- border: 1px solid rgba(0, 0, 0, .2);
- max-width: 45%;
- overflow-x: hidden;
- color: rgba(0, 0, 0, .65);
- border-radius: 10px;
-}
-
-/* Local navigation */
-li.nav-item.toc-entry {
- line-height: 1.25em;
- margin-bottom: 0.25em;
-}
-
-span.guilabel,
-span.menuselection {
- border: none;
- background: #e7f2fa;
- border-radius: 4px;
- padding: 4px 5px;
- font-size: 90%;
- font-weight: bold;
- white-space: nowrap;
-}
-
-
-/*
- * extensions
- */
-
-/* definitions */
-dl.py.function {
- margin-bottom: 5rem;
-}
-
-dl.py.function>dt {
- background-color: var(--codeblock-color);
- padding: 4px 5px;
-}
-
-dl.py.function>dt:target {
- background-color: var(--target-color);
-}
-
-dl.field-list>dt {
- padding-left: 0;
-}
-
-/* code blocks */
-div.viewcode-block:target {
- padding: 10px 10px;
- background-color: var(--codeblock-color);
- border-top: 1px solid var(--codeblock-color);
- border-bottom: 1px solid var(--codeblock-color);
-}
-
-/* Fix paragraphs in list items. */
-#main-content ol > li > p:nth-child(n+2),
-#main-content ul > li > p:nth-child(n+2) {
- margin-top: 1em;
-}
-
-video {
- width: 100%;
-}
diff --git a/docs/_static/patch_scrollToActive.js b/docs/_static/patch_scrollToActive.js
deleted file mode 100644
index 6cad65df0..000000000
--- a/docs/_static/patch_scrollToActive.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Patch of scrollToActive of sphinxbook theme
- * Scroll to active navigation item
- */
-
-/**
- * A helper function to load scripts when the DOM is loaded.
- * This waits for everything to be on the page first before running, since
- * some functionality doesn't behave properly until everything is ready.
- */
- var sbRunWhenDOMLoaded = (cb) => {
- if (document.readyState != "loading") {
- cb();
- } else if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", cb);
- } else {
- document.attachEvent("onreadystatechange", function () {
- if (document.readyState == "complete") cb();
- });
- }
-};
-
-/**
- * Sidebar scroll on load.
- *
- * Detect the active page in the sidebar, and scroll so that it is centered on
- * the screen.
- */
-
-var scrollToActive = () => {
- let navbar_scrollable = $("#site-navigation").children()[0];
- let active_navigation_item = $("#site-navigation .active").last();
- if (active_navigation_item) {
- if (active_navigation_item.offset().top > $(window).height() * 0.5) {
- navbar_scrollable.scrollTop = active_navigation_item.offset().top - $(window).height() * 0.2;
- }
- }
-};
-
-
-sbRunWhenDOMLoaded(scrollToActive);
diff --git a/docs/_static/search_shortcut.js b/docs/_static/search_shortcut.js
deleted file mode 100644
index 177bf7f1a..000000000
--- a/docs/_static/search_shortcut.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Add shortcut `ctrl+k` to focus on search field
- */
-
- $(document).ready(() => {
- if (window.location.pathname === '/search.html') {
- $('form.bd-search .input-group').hide(); // Hide Sidebar Search field
-
- $(document).keydown(function(event) {
- if ((event.ctrlKey || event.metaKey) && event.key == "k") {
- event.preventDefault();
- $('#q').focus();
- }
- });
- } else {
- $(document).keydown(function(event) {
- if ((event.ctrlKey || event.metaKey) && event.key == "k") {
- event.preventDefault();
- $('#search-input').focus();
- }
- });
- }
-
- // if OS isn't Mac change visual indication of search field
- if (navigator.platform.indexOf('Mac') === -1) {
- $('#search-shortcut').html("^");
- $('#search-page-shortcut').html("^");
- }
-
-});
-
-function onReset() {
- $('#search-form').trigger('reset');
- $('#search-form').trigger('submit');
-}
\ No newline at end of file
diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js
deleted file mode 100644
index a9b62c7e9..000000000
--- a/docs/_static/searchtools.js
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * searchtools.js
- * ~~~~~~~~~~~~~~~~
- *
- * Sphinx JavaScript utilities for the full-text search.
- *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-var title_documentation = 'Plone Documentation';
-
-if (!Scorer) {
- /**
- * Simple result scoring code.
- */
- var Scorer = {
- // Implement the following function to further tweak the score for each result
- // The function takes a result array [filename, title, anchor, descr, score]
- // and returns the new score.
- /*
- score: function(result) {
- return result[4];
- },
- */
-
- // query matches the full name of an object
- objNameMatch: 11,
- // or matches in the last dotted part of the object name
- objPartialMatch: 6,
- // Additive scores depending on the priority of the object
- objPrio: {0: 15, // used to be importantResults
- 1: 5, // used to be objectResults
- 2: -5}, // used to be unimportantResults
- // Used when the priority is not in the mapping.
- objPrioDefault: 0,
-
- // query found in title
- title: 15,
- partialTitle: 7,
- // query found in terms
- term: 5,
- partialTerm: 2
- };
-}
-
-if (!splitQuery) {
- function splitQuery(query) {
- return query.split(/\s+/);
- }
-}
-
-/**
- * Search Module
- */
-var Search = {
-
- _index : null,
- _queued_query : null,
- _pulse_status : -1,
-
- htmlToText : function(htmlString) {
- var virtualDocument = document.implementation.createHTMLDocument('virtual');
- var htmlElement = $(htmlString, virtualDocument);
- htmlElement.find('.headerlink').remove();
- docContent = htmlElement.find('[role=main]')[0];
- if(docContent === undefined) {
- console.warn("Content block not found. Sphinx search tries to obtain it " +
- "via '[role=main]'. Could you check your theme or template.");
- return "";
- }
- return docContent.textContent || docContent.innerText;
- },
-
- init : function() {
- var params = $.getQueryParameters();
- let doc_section = params.doc_section ? params.doc_section[0] : 'all';
- $('input[id="doc_section_' + doc_section + '"]').prop("checked", true)
- if (params.q) {
- var query = params.q[0];
- $('input[name="q"]')[0].value = query;
- $('input[name="q"]')[1].value = query;
- this.performSearch(query, doc_section);
- }
- },
-
- loadIndex : function(url) {
- $.ajax({type: "GET", url: url, data: null,
- dataType: "script", cache: true,
- complete: function(jqxhr, textstatus) {
- if (textstatus != "success") {
- document.getElementById("searchindexloader").src = url;
- }
- }});
- },
-
- setIndex : function(index) {
- var q;
- this._index = index;
- if ((q = this._queued_query) !== null) {
- this._queued_query = null;
- Search.query(q);
- }
- },
-
- hasIndex : function() {
- return this._index !== null;
- },
-
- deferQuery : function(query) {
- this._queued_query = query;
- },
-
- stopPulse : function() {
- this._pulse_status = 0;
- },
-
- startPulse : function() {
- if (this._pulse_status >= 0)
- return;
- function pulse() {
- var i;
- Search._pulse_status = (Search._pulse_status + 1) % 4;
- var dotString = '';
- for (i = 0; i < Search._pulse_status; i++)
- dotString += '.';
- Search.dots.text(dotString);
- if (Search._pulse_status > -1)
- window.setTimeout(pulse, 500);
- }
- pulse();
- },
-
- /**
- * perform a search for something (or wait until index is loaded)
- */
- performSearch : function(query, doc_section) {
- // create the required interface elements
- this.out = $('#search-results');
- this.title = $('').appendTo(this.out);
- this.dots = $(' ').appendTo(this.title);
- this.status = $('
').appendTo(this.out);
- this.output = $('').appendTo(this.out);
-
- $('#search-progress').text(_('Preparing search...'));
- this.startPulse();
-
- // index already loaded, the browser was quick!
- if (this.hasIndex()) {
- this.query(query, doc_section);
- } else {
- this.deferQuery(query);
- }
- },
-
- /**
- * execute search (requires search index to be loaded)
- */
- query : function(query, doc_section) {
- var i;
-
- // stem the searchterms and add them to the correct list
- var stemmer = new Stemmer();
- var searchterms = [];
- var excluded = [];
- var hlterms = [];
- var tmp = splitQuery(query);
- var objectterms = [];
- for (i = 0; i < tmp.length; i++) {
- if (tmp[i] !== "") {
- objectterms.push(tmp[i].toLowerCase());
- }
-
- if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
- // skip this "word"
- continue;
- }
- // stem the word
- var word = stemmer.stemWord(tmp[i].toLowerCase());
- // prevent stemmer from cutting word smaller than two chars
- if(word.length < 3 && tmp[i].length >= 3) {
- word = tmp[i];
- }
- var toAppend;
- // select the correct list
- if (word[0] == '-') {
- toAppend = excluded;
- word = word.substr(1);
- }
- else {
- toAppend = searchterms;
- hlterms.push(tmp[i].toLowerCase());
- }
- // only add if not already in the list
- if (!$u.contains(toAppend, word))
- toAppend.push(word);
- }
- var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
- // prepare search
- var terms = this._index.terms;
- var titleterms = this._index.titleterms;
-
- // array of [filename, title, anchor, descr, score]
- var results = [];
- $('#search-progress').empty();
-
- // lookup as object
- for (i = 0; i < objectterms.length; i++) {
- var others = [].concat(objectterms.slice(0, i),
- objectterms.slice(i+1, objectterms.length));
- results = results.concat(this.performObjectSearch(objectterms[i], others));
- }
-
- // lookup as search terms in fulltext
- results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
-
- // let the scorer override scores with a custom scoring function
- if (Scorer.score) {
- for (i = 0; i < results.length; i++)
- results[i][4] = Scorer.score(results[i]);
- }
-
- // Filter results by doc_section
- if (doc_section && doc_section !== 'all') {
- results = results.filter(result => {
- let condition = result[0].split('/')[0] === doc_section;
- return condition
- })
- }
-
- // Enrich item with parent doc_section title
- for (i = 0; i < results.length; i++)
- results[i][6] = results[i][6] || title_documentation;
-
- // now sort the results by score (in opposite order of appearance, since the
- // display function below uses pop() to retrieve items) and then
- // alphabetically
- results.sort(function(a, b) {
- var left = a[4];
- var right = b[4];
- if (left > right) {
- return 1;
- } else if (left < right) {
- return -1;
- } else {
- // same score: sort alphabetically
- left = a[1].toLowerCase();
- right = b[1].toLowerCase();
- return (left > right) ? -1 : ((left < right) ? 1 : 0);
- }
- });
-
- function _getBreadcrumbs(item, linkUrl) {
- let parentTitles = item[6];
- let ploneApiTitles = [
- "A Plone API",
- "List of all API methods with descriptions"
- ];
- // ugly hack for plone.api documentation integrated via git submodule
- parentTitles = Array.isArray(parentTitles) ? parentTitles : ploneApiTitles;
- let path = item[0].split('/')
- .slice(0, -1);
- path = path.map((el, index) => {
- return {
- "path": path.slice(0, index+1).join('/'),
- "title": parentTitles[index]
- }
- })
- let markup = path
- .map((el, idx) => {
- return `${el.title} `
- })
- markup.push(`${item[1]} `)
- return markup.join('> ');
- }
-
- // Print the results.
- var resultCount = results.length;
- function displayNextItem() {
- // results left, load the summary and display it
- if (results.length) {
- var item = results.pop();
- var listItem = $(' ');
- var requestUrl = "";
- var linkUrl = "";
- if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
- // dirhtml builder
- var dirname = item[0] + '/';
- if (dirname.match(/\/index\/$/)) {
- dirname = dirname.substring(0, dirname.length-6);
- } else if (dirname == 'index/') {
- dirname = '';
- }
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
- linkUrl = requestUrl;
-
- } else {
- // normal html builders
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
- linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
- }
- let breadcrumbs = _getBreadcrumbs(item, linkUrl);
- breadcrumbs = $("" + breadcrumbs + "
");
- listItem.append(breadcrumbs);
- let headline = $(' ');
- headline.append($(' ').attr('href',
- linkUrl +
- highlightstring + item[2]).html(item[1]));
-
- listItem.append(headline);
-
- if (item[3]) {
- listItem.append($(' (' + item[3] + ') '));
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
- $.ajax({url: requestUrl,
- dataType: "text",
- complete: function(jqxhr, textstatus) {
- var data = jqxhr.responseText;
- if (data !== '' && data !== undefined) {
- listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
- }
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- }});
- } else {
- // no source available, just display title
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- }
- }
- // search finished, update title and status message
- else {
- Search.stopPulse();
- Search.title.text(_('Search Results'));
- if (query === '') {
- Search.status.text(_('No query, no results.'));
- }
- else if (!resultCount)
- Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly. Searching for multiple words only shows matches that contain all words.'));
- else
- Search.status.text(_('Found %s page(s) matching the search query.').replace('%s', resultCount));
- Search.status.fadeIn(500);
- }
- }
- displayNextItem();
- },
-
- /**
- * search for object names
- */
- performObjectSearch : function(object, otherterms) {
- var filenames = this._index.filenames;
- var docnames = this._index.docnames;
- var objects = this._index.objects;
- var objnames = this._index.objnames;
- var titles = this._index.titles;
-
- var i;
- var results = [];
-
- for (var prefix in objects) {
- for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) {
- var match = objects[prefix][iMatch];
- var name = match[4];
- var fullname = (prefix ? prefix + '.' : '') + name;
- var fullnameLower = fullname.toLowerCase()
- if (fullnameLower.indexOf(object) > -1) {
- var score = 0;
- var parts = fullnameLower.split('.');
- // check for different match types: exact matches of full name or
- // "last name" (i.e. last dotted part)
- if (fullnameLower == object || parts[parts.length - 1] == object) {
- score += Scorer.objNameMatch;
- // matches in last name
- } else if (parts[parts.length - 1].indexOf(object) > -1) {
- score += Scorer.objPartialMatch;
- }
- var objname = objnames[match[1]][2];
- var title = titles[match[0]];
- // If more than one term searched for, we require other words to be
- // found in the name/title/description
- if (otherterms.length > 0) {
- var haystack = (prefix + ' ' + name + ' ' +
- objname + ' ' + title).toLowerCase();
- var allfound = true;
- for (i = 0; i < otherterms.length; i++) {
- if (haystack.indexOf(otherterms[i]) == -1) {
- allfound = false;
- break;
- }
- }
- if (!allfound) {
- continue;
- }
- }
- var descr = objname + _(', in ') + title;
-
- var anchor = match[3];
- if (anchor === '')
- anchor = fullname;
- else if (anchor == '-')
- anchor = objnames[match[1]][1] + '-' + fullname;
- // add custom score for some objects according to scorer
- if (Scorer.objPrio.hasOwnProperty(match[2])) {
- score += Scorer.objPrio[match[2]];
- } else {
- score += Scorer.objPrioDefault;
- }
- results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
- }
- }
- }
-
- return results;
- },
-
- /**
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- */
- escapeRegExp : function(string) {
- return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
- },
-
- /**
- * search for full-text terms in the index
- */
- performTermsSearch : function(searchterms, excluded, terms, titleterms) {
- var docnames = this._index.docnames;
- var filenames = this._index.filenames;
- var titles = this._index.titles;
-
- var i, j, file;
- var fileMap = {};
- var scoreMap = {};
- var results = [];
-
- // perform the search on the required terms
- for (i = 0; i < searchterms.length; i++) {
- var word = searchterms[i];
- var files = [];
- var _o = [
- {files: terms[word], score: Scorer.term},
- {files: titleterms[word], score: Scorer.title}
- ];
- // add support for partial matches
- if (word.length > 2) {
- var word_regex = this.escapeRegExp(word);
- for (var w in terms) {
- if (w.match(word_regex) && !terms[word]) {
- _o.push({files: terms[w], score: Scorer.partialTerm})
- }
- }
- for (var w in titleterms) {
- if (w.match(word_regex) && !titleterms[word]) {
- _o.push({files: titleterms[w], score: Scorer.partialTitle})
- }
- }
- }
-
- // no match but word was a required one
- if ($u.every(_o, function(o){return o.files === undefined;})) {
- break;
- }
- // found search word in contents
- $u.each(_o, function(o) {
- var _files = o.files;
- if (_files === undefined)
- return
-
- if (_files.length === undefined)
- _files = [_files];
- files = files.concat(_files);
-
- // set score for the word in each file to Scorer.term
- for (j = 0; j < _files.length; j++) {
- file = _files[j];
- if (!(file in scoreMap))
- scoreMap[file] = {};
- scoreMap[file][word] = o.score;
- }
- });
-
- // create the mapping
- for (j = 0; j < files.length; j++) {
- file = files[j];
- if (file in fileMap && fileMap[file].indexOf(word) === -1)
- fileMap[file].push(word);
- else
- fileMap[file] = [word];
- }
- }
-
- // now check if the files don't contain excluded terms
- for (file in fileMap) {
- var valid = true;
-
- // check if all requirements are matched
- var filteredTermCount = // as search terms with length < 3 are discarded: ignore
- searchterms.filter(function(term){return term.length > 2}).length
- if (
- fileMap[file].length != searchterms.length &&
- fileMap[file].length != filteredTermCount
- ) continue;
-
- // ensure that none of the excluded terms is in the search result
- for (i = 0; i < excluded.length; i++) {
- if (terms[excluded[i]] == file ||
- titleterms[excluded[i]] == file ||
- $u.contains(terms[excluded[i]] || [], file) ||
- $u.contains(titleterms[excluded[i]] || [], file)) {
- valid = false;
- break;
- }
- }
- // if we have still a valid result we can add it to the result list
- if (valid) {
- /**
- * file: index
- * docnames: array of paths
- * titles: array of titles
- */
-
- // select one (max) score for the file.
- // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
- var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
-
- /**
- * Return array with titles of ancestors of file.
- * @param {number} idx - The index of the result item in global list of files
- * @returns array
- */
- function getParentTitles(idx) {
- let path = docnames[idx]
-
- let foo = path.split('/').slice(0, -1);
- foo = foo.map((el, index) => {
- return `${foo.slice(0, index+1).join('/')}/index`
- })
-
- let parentTitles = foo.map(el => {
- let parentId = docnames.indexOf(el);
- let title = parentId === -1 ? title_documentation : titles[parentId];
- return title
- })
- return parentTitles
- }
-
- results.push([docnames[file], titles[file], '', null, score, filenames[file], getParentTitles(file)]);
- }
- }
- return results;
- },
-
- /**
- * helper function to return a node containing the
- * search summary for a given text. keywords is a list
- * of stemmed words, hlwords is the list of normal, unstemmed
- * words. the first one is used to find the occurrence, the
- * latter for highlighting it.
- */
- makeSearchSummary : function(htmlText, keywords, hlwords) {
- var text = Search.htmlToText(htmlText);
- var textLower = text.toLowerCase();
- var start = 0;
- $.each(keywords, function() {
- var i = textLower.indexOf(this.toLowerCase());
- if (i > -1)
- start = i;
- });
- start = Math.max(start - 120, 0);
- var excerpt = ((start > 0) ? '...' : '') +
- $.trim(text.substr(start, 240)) +
- ((start + 240 - text.length) ? '...' : '');
- var rv = $('
').text(excerpt);
- $.each(hlwords, function() {
- rv = rv.highlightText(this, 'highlighted');
- });
- return rv;
- }
-};
-
-$(document).ready(function() {
- Search.init();
- $('#q').focus();
- $('input[name="doc_section"]').change(function() {
- this.form.submit();
- });
-
- function clearSearchField() {
- $('#q').val('');
- this.form.submit();
- }
- $( "button.clear_search" ).on( "click", clearSearchField );
-});
diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json
index eef57af73..bcdf3e9f6 100644
--- a/docs/_static/switcher.json
+++ b/docs/_static/switcher.json
@@ -1,7 +1,7 @@
[
{
"name": "6 (stable)",
- "version": "6.0",
+ "version": "6",
"url": "https://6.docs.plone.org/"
},
{
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
index 6757818f0..799ca64d7 100644
--- a/docs/_templates/layout.html
+++ b/docs/_templates/layout.html
@@ -10,8 +10,3 @@
{% endblock %}
-
-
-{% block body_tag %}
-
-{%- endblock %}
\ No newline at end of file
diff --git a/docs/_templates/page.html b/docs/_templates/page.html
deleted file mode 100644
index e9c968333..000000000
--- a/docs/_templates/page.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{% extends "!page.html" %}
-
-{%- block htmltitle %}
-{{ title|striptags|e }}{%- for parent in parents %} – {{ parent.title }}{%- endfor %}{{ titlesuffix }}
-{%- endblock %}
-
-
-{% block footer %}
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/docs/_templates/search-field.html b/docs/_templates/search-field.html
deleted file mode 100644
index 9c3bfe988..000000000
--- a/docs/_templates/search-field.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/_templates/search.html b/docs/_templates/search.html
deleted file mode 100644
index 9f88c309c..000000000
--- a/docs/_templates/search.html
+++ /dev/null
@@ -1,136 +0,0 @@
-{#
- basic/search.html
- ~~~~~~~~~~~~~~~~~
-
- Template for the search page.
-
- :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
- :license: BSD, see LICENSE for details.
-#}
-{%- extends "layout.html" %}
-{% set title = _('Search') %}
-{% block header %}
-
-
-{% endblock %}
-{%- block scripts %}
- {{ super() }}
-
-
-{%- endblock %}
-{% block extrahead %}
-
- {{ super() }}
-{% endblock %}
-{% block body %}
- {{ _('Search') }}
- {% block scriptwarning %}
-
-
-
- {% trans %}Please activate JavaScript to enable the search
- functionality.{% endtrans %}
-
-
- {% endblock %}
- {% block searchtext %}
-
- {% trans %}Searching for multiple words only shows matches that contain
- all words.{% endtrans %}
-
- {% endblock %}
- {% block searchbox %}
-
- {% endblock %}
-
- {% block searchresults %}
-
- {% if search_results %}
-
- {% for href, caption, context in search_results %}
- {{ caption }}
- {{ context|e }}
-
- {% endfor %}
-
- {% endif %}
-
- {% endblock %}
-{% endblock %}
-
-
-{% block footer %}
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/docs/_templates/sections/header-article.html b/docs/_templates/sections/header-article.html
deleted file mode 100644
index 136ce58e5..000000000
--- a/docs/_templates/sections/header-article.html
+++ /dev/null
@@ -1,35 +0,0 @@
-{# To trigger whether the TOC and its button show up #}
-{% set page_toc = generate_toc_html() %}
-{% from "../macros/buttons.html" import render_funcs, render_label_input_button with context %}
-
-
-
- {% if theme_single_page != True %}
- {{ render_label_input_button(for_input="__navigation", tooltip="Toggle navigation", icon="fas fa-bars", tooltip_placement="right") }}
- {% endif %}
-
-
- {{ title|striptags|e }}{%- for parent in parents[:1] %} – {{ parent.title }}{%- endfor %}
-
-
- {%- for button in header_buttons -%}
- {{ render_funcs[button.pop("type")](**button) }}
- {%- endfor -%}
-
- {% if page_toc -%}
- {{ render_label_input_button("__page-toc", icon="fas fa-list", label="page-toc") }}
- {%- endif %}
-
-
-
-
-
- {%- if page_toc | length >= 1 %}
-
- {{ translate(theme_toc_title) }}
-
-
- {{ page_toc }}
-
- {%- endif %}
-
diff --git a/docs/_templates/sections/sidebar.html b/docs/_templates/sections/sidebar.html
deleted file mode 100644
index 054e9cc9b..000000000
--- a/docs/_templates/sections/sidebar.html
+++ /dev/null
@@ -1,4 +0,0 @@
-{%- for sidebartemplate in sidebars %}
-{%- include sidebartemplate %}
-{%- endfor %}
-{%- include 'version-switcher.html' -%}
diff --git a/docs/conf.py b/docs/conf.py
index 8d7dee55a..f1c539535 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -19,7 +19,7 @@
project = "Plone Documentation"
copyright = "Plone Foundation"
-author = "the Plone community"
+author = "Plone community"
trademark_name = "Plone"
now = datetime.now()
year = str(now.year)
@@ -29,9 +29,9 @@
# built documents.
#
# The short X.Y version.
-version = "6.0"
+version = "6"
# The full version, including alpha/beta/rc tags.
-release = "6.0"
+release = "6"
# -- General configuration ----------------------------------------------------
@@ -43,10 +43,15 @@
# or your custom ones.
extensions = [
"myst_parser",
+ "notfound.extension",
"sphinx.ext.autodoc",
+ "sphinx.ext.autosummary", # plone.api
+ "sphinx.ext.doctest", # plone.api
+ "sphinx.ext.graphviz",
"sphinx.ext.ifconfig",
"sphinx.ext.intersphinx",
"sphinx.ext.todo",
+ "sphinx.ext.viewcode", # plone.api
"sphinx_copybutton",
"sphinx_design",
"sphinx_examples",
@@ -54,13 +59,9 @@
"sphinx_sitemap",
"sphinxcontrib.httpdomain", # plone.restapi
"sphinxcontrib.httpexample", # plone.restapi
+ "sphinxcontrib.mermaid",
"sphinxcontrib.video",
"sphinxext.opengraph",
- "sphinx.ext.viewcode", # plone.api
- "sphinx.ext.autosummary", # plone.api
- "sphinx.ext.graphviz",
- "sphinxcontrib.mermaid",
- "notfound.extension",
]
# If true, the Docutils Smart Quotes transform, originally based on SmartyPants
@@ -70,10 +71,6 @@
# hyphenated words to be marked as misspelled by spellchecker.
smartquotes = False
-# The name of the Pygments (syntax highlighting) style to use.
-# pygments_style = "sphinx.pygments_styles.PyramidStyle"
-pygments_style = "sphinx"
-
# Options for the linkcheck builder
# Ignore localhost
linkcheck_ignore = [
@@ -99,14 +96,17 @@
r"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors#Identifying_the_issue",
r"https://docs.cypress.io/guides/references/migration-guide#Migrating-to-Cypress-version-10-0", # volto
# Ignore unreliable sites
- r"https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
- r"https://chromewebstore.google.com/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
- r"https://stackoverflow.com", # volto and documentation # TODO retest with latest Sphinx.
+ # r"https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
+ # r"https://chromewebstore.google.com/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
+ # r"https://stackoverflow.com", # volto and documentation # TODO retest with latest Sphinx.
r"https://web.archive.org/", # volto
- r"https://www.youtube.com/playlist", # volto, TODO remove after installing sphinxcontrib.youtube
- r"https://www.upc.edu/en", # TODO remove after their certificate is fixed
+# r"https://www.youtube.com/playlist", # volto, TODO remove after installing sphinxcontrib.youtube
r"http://z3c.pt", # fluke where Sphinx interprets this as a URL
]
+linkcheck_allowed_redirects = { # TODO: Confirm usage of linkcheck_allowed_redirects
+ # All HTTP redirections from the source URI to the canonical URI will be treated as "working".
+ r"https://chrome\.google\.com/webstore/detail/.*": r"https://consent\.google\.com/.*",
+}
linkcheck_anchors = True
linkcheck_timeout = 5
linkcheck_retries = 1
@@ -157,17 +157,151 @@
"toc.not_readable", # Suppress `WARNING: toctree contains reference to nonexisting document 'news*'`
]
-html_js_files = ["patch_scrollToActive.js", "search_shortcut.js"]
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = "plone_sphinx_theme"
+html_logo = "_static/logo.svg"
+html_favicon = "_static/favicon.ico"
+# The default value includes icon-links, so override it with that one omitted, and add it to html_theme_options[footer_content_items].
+html_sidebars = {
+ "**": [
+ "navbar-logo",
+ "search-button-field",
+ "sbt-sidebar-nav",
+ ]
+}
+
+html_theme_options = {
+ "article_header_start": ["toggle-primary-sidebar"],
+ "footer_content_items": [
+ "author",
+ "copyright",
+ "last-updated",
+ "extra-footer",
+ "icon-links",
+ ],
+ "extra_footer": """The text and illustrations in this website are licensed by the Plone Foundation under a Creative Commons Attribution 4.0 International license. Plone and the Plone® logo are registered trademarks of the Plone Foundation, registered in the United States and other countries. For guidelines on the permitted uses of the Plone trademarks, see https://plone.org/foundation/logo . All other trademarks are owned by their respective owners.
+ Pull request previews by Read the Docs .
""",
+ "icon_links": [
+ {
+ "name": "GitHub",
+ "url": "https://github.com/plone/documentation",
+ "icon": "fa-brands fa-square-github",
+ "type": "fontawesome",
+ "attributes": {
+ "target": "_blank",
+ "rel": "noopener me",
+ "class": "nav-link custom-fancy-css"
+ }
+ },
+ {
+ "name": "Mastodon",
+ "url": "https://plone.social/@plone",
+ "icon": "fa-brands fa-mastodon",
+ "type": "fontawesome",
+ "attributes": {
+ "target": "_blank",
+ "rel": "noopener me",
+ "class": "nav-link custom-fancy-css"
+ }
+ },
+ {
+ "name": "YouTube",
+ "url": "https://www.youtube.com/@PloneCMS",
+ "icon": "fa-brands fa-youtube",
+ "type": "fontawesome",
+ "attributes": {
+ "target": "_blank",
+ "rel": "noopener me",
+ "class": "nav-link custom-fancy-css"
+ }
+ },
+ {
+ "name": "X (formerly Twitter)",
+ "url": "https://x.com/plone",
+ "icon": "fa-brands fa-square-x-twitter",
+ "type": "fontawesome",
+ "attributes": {
+ "target": "_blank",
+ "rel": "noopener me",
+ "class": "nav-link custom-fancy-css"
+ }
+ },
+ ],
+ "logo": {
+ "text": "Plone Documentation v" + version,
+ },
+ "navigation_with_keys": True,
+ "path_to_docs": "docs",
+ "primary_sidebar_end": [
+ "version-switcher",
+ ],
+ "repository_branch": "main",
+ "repository_url": "https://github.com/plone/documentation",
+ "search_bar_text": "Search",
+ "switcher": {
+ "json_url": "/_static/switcher.json",
+ "version_match": version,
+ },
+ "use_edit_page_button": True,
+ "use_issues_button": True,
+ "use_repository_button": True,
+}
+# suggest edit link
+# remark: {{ file_name }} is mandatory in "edit_page_url_template"
+html_context = {
+ "edit_page_url_template": "https://6.docs.plone.org/contributing/index.html?{{ file_name }}#making-contributions-on-github",
+}
+
+# Announce that we have an opensearch plugin
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_use_opensearch
+html_use_opensearch = "https://6.docs.plone.org"
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+html_title = "%(project)s v%(release)s" % {"project": project, "release": release}
+
+# If false, no index is generated.
+html_use_index = True
+
+html_css_files = [("print.css", {"media": "print"})]
+html_js_files = []
html_extra_path = [
"robots.txt",
]
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = [
"volto/_static",
"_static", # Last path wins. See https://github.com/plone/documentation/pull/1442
]
+
+# -- Options for autodoc ----------------------------------------------------
+
+# https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#configuration
+# Automatically extract typehints when specified and place them in
+# descriptions of the relevant function/method.
+# autodoc_typehints = "description"
+
+# Don't show class signature with the class' name.
+autodoc_class_signature = "separated"
+
+
+# -- Options for sphinx_sitemap to html -----------------------------
+
+# Used by sphinx_sitemap to generate a sitemap
+html_baseurl = "https://6.docs.plone.org/"
+# https://sphinx-sitemap.readthedocs.io/en/latest/advanced-configuration.html#customizing-the-url-scheme
+sitemap_url_scheme = "{link}"
+sitemap_filename = "sitemap-custom.xml"
+
# -- Options for myST markdown conversion to html -----------------------------
# For more information see:
@@ -192,8 +326,6 @@
"fawrench": ' ',
}
-mermaid_version = "10.9.1"
-
# -- Intersphinx configuration ----------------------------------
# This extension can generate automatic links to the documentation of objects
@@ -224,6 +356,10 @@
graphviz_output_format = "svg"
+# -- Mermaid configuration ----------------------------------
+# mermaid_version = "10.9.1"
+
+
# -- OpenGraph configuration ----------------------------------
ogp_site_url = "https://6.docs.plone.org/"
@@ -236,6 +372,11 @@
]
+# -- sphinx.ext.todo -----------------------
+# See http://sphinx-doc.org/ext/todo.html#confval-todo_include_todos
+todo_include_todos = True
+
+
# -- sphinx-notfound-page configuration ----------------------------------
notfound_urls_prefix = ""
@@ -253,68 +394,6 @@
}
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sphinx_book_theme"
-
-html_logo = "_static/logo.svg"
-html_favicon = "_static/favicon.ico"
-
-html_css_files = ["custom.css", ("print.css", {"media": "print"})]
-
-# See http://sphinx-doc.org/ext/todo.html#confval-todo_include_todos
-todo_include_todos = True
-
-# Announce that we have an opensearch plugin
-# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_use_opensearch
-html_use_opensearch = "https://6.docs.plone.org"
-
-html_sidebars = {
- "**": [
- "sidebar-logo.html",
- "search-field.html",
- "sbt-sidebar-nav.html",
- ]
-}
-
-html_theme_options = {
- "path_to_docs": "docs",
- "repository_url": "https://github.com/plone/documentation",
- "repository_branch": "main",
- "use_repository_button": True,
- "use_issues_button": True,
- "use_edit_page_button": True,
- "search_bar_text": "Search",
- "switcher": {
- "json_url": "/_static/switcher.json",
- "version_match": version,
- },
- "extra_navbar": """
-
-
- plone.org
-
""",
- "extra_footer": """The text and illustrations in this website are licensed by the Plone Foundation under a Creative Commons Attribution 4.0 International license. Plone and the Plone® logo are registered trademarks of the Plone Foundation, registered in the United States and other countries. For guidelines on the permitted uses of the Plone trademarks, see https://plone.org/foundation/logo . All other trademarks are owned by their respective owners.
-
-
-
""",
-}
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# " v documentation".
-html_title = "%(project)s v%(release)s" % {"project": project, "release": release}
-
-# If false, no index is generated.
-html_use_index = True
-
-# Used by sphinx_sitemap to generate a sitemap
-html_baseurl = "https://6.docs.plone.org/"
-# https://sphinx-sitemap.readthedocs.io/en/latest/advanced-configuration.html#customizing-the-url-scheme
-sitemap_url_scheme = "{link}"
-
# -- Options for HTML help output -------------------------------------------------
# Output file base name for HTML help builder.
@@ -339,14 +418,7 @@
# the title page.
latex_logo = "_static/logo_2x.png"
-
-# suggest edit link
-# remark: {{ file_name }} is mandatory in "edit_page_url_template"
-html_context = {
- "edit_page_url_template": "https://6.docs.plone.org/contributing/index.html?{{ file_name }}#making-contributions-on-github",
-}
-
-
+# -- Configuration for source_replacements extension -----------------------
# An extension that allows replacements for code blocks that
# are not supported in `rst_epilog` or other substitutions.
# https://stackoverflow.com/a/56328457/2214933
@@ -366,6 +438,7 @@ def source_replace(app, docname, source):
}
+# Finally, configure app attributes.
def setup(app):
app.add_config_value("source_replacements", {}, True)
app.connect("source-read", source_replace)
diff --git a/docs/netlify_robots.txt b/docs/netlify_robots.txt
deleted file mode 100644
index 0a875a487..000000000
--- a/docs/netlify_robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Disallow all user agents from indexing pages and links in the site on Netlify only.
-User-agent: *
-Disallow: /
diff --git a/netlify.toml b/netlify.toml
deleted file mode 100644
index 324168726..000000000
--- a/netlify.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[build.environment]
- PYTHON_VERSION = "3.8"
-[[headers]]
- for = "/*"
- [headers.values]
- X-Robots-Tag = "none"
diff --git a/requirements.txt b/requirements.txt
index a0d60d48f..fbd73a896 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,27 +1,16 @@
-docutils<0.17,>=0.15 # sphinx-book-theme 0.2.0 has requirement docutils<0.17,>=0.15
-Sphinx<5,>=3 # sphinx-book-theme 0.3.3 has requirement sphinx<5,>=3
-graphviz
lesscpy
linkify-it-py
-myst-parser
-pydata-sphinx-theme<=0.8.99 # Build fails in 0.9.0. See https://github.com/plone/documentation/issues/1297
+plone-sphinx-theme
sphinx-autobuild
-sphinx-book-theme==0.3.3 # Temporary pin until we can sort out HTML refactoring.
sphinx-copybutton
-sphinx-design # Documentation only
+sphinx-design
sphinx-examples
sphinx-notfound-page # Documentation only
sphinx-reredirects
sphinx-sitemap
-sphinx-togglebutton
-sphinxcontrib.httpdomain # plone.restapi
-sphinxcontrib.httpexample # plone.restapi
-sphinxcontrib-applehelp==1.0.4 # https://github.com/plone/documentation/issues/1604
-sphinxcontrib-devhelp==1.0.2 # https://github.com/plone/documentation/issues/1604
-sphinxcontrib-htmlhelp==2.0.1 # https://github.com/plone/documentation/issues/1604
-sphinxcontrib-qthelp==1.0.3 # https://github.com/plone/documentation/issues/1604
-sphinxcontrib-serializinghtml==1.1.5 # https://github.com/plone/documentation/issues/1604
+sphinxcontrib.httpdomain
+sphinxcontrib.httpexample
sphinxcontrib-video
sphinxext-opengraph
sphinxcontrib.mermaid==0.9.2
-vale==2.30.0
+vale
diff --git a/styles/Vocab/Base/accept.txt b/styles/config/vocabularies/Base/accept.txt
similarity index 100%
rename from styles/Vocab/Base/accept.txt
rename to styles/config/vocabularies/Base/accept.txt
diff --git a/styles/Vocab/Base/reject.txt b/styles/config/vocabularies/Base/reject.txt
similarity index 100%
rename from styles/Vocab/Base/reject.txt
rename to styles/config/vocabularies/Base/reject.txt
diff --git a/styles/Vocab/Plone/accept.txt b/styles/config/vocabularies/Plone/accept.txt
similarity index 100%
rename from styles/Vocab/Plone/accept.txt
rename to styles/config/vocabularies/Plone/accept.txt
diff --git a/styles/Vocab/Plone/reject.txt b/styles/config/vocabularies/Plone/reject.txt
similarity index 100%
rename from styles/Vocab/Plone/reject.txt
rename to styles/config/vocabularies/Plone/reject.txt