This is an automated email from the ASF dual-hosted git repository.

quinnj pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/arrow-julia.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 10a342e  build based on 95c053a
10a342e is described below

commit 10a342e0ea4aeea55169e3324765e727ee21c6e6
Author: Documenter.jl <[email protected]>
AuthorDate: Mon Oct 16 11:17:44 2023 +0000

    build based on 95c053a
---
 dev/.documenter-siteinfo.json          |   1 +
 dev/assets/documenter.js               | 752 ++++++++++++++++++++++++++++-----
 dev/assets/search.js                   | 267 ------------
 dev/assets/themes/documenter-dark.css  |   4 +-
 dev/assets/themes/documenter-light.css |   4 +-
 dev/assets/themeswap.js                |  82 ++--
 dev/assets/warner.js                   |  87 ++--
 dev/index.html                         |   2 +-
 dev/manual/index.html                  |   6 +-
 dev/reference/index.html               |  12 +-
 dev/search/index.html                  |   2 -
 dev/search_index.js                    |   2 +-
 12 files changed, 766 insertions(+), 455 deletions(-)

diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json
new file mode 100644
index 0000000..cf67283
--- /dev/null
+++ b/dev/.documenter-siteinfo.json
@@ -0,0 +1 @@
+{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-10-16T11:17:39","documenter_version":"1.1.1"}}
\ No newline at end of file
diff --git a/dev/assets/documenter.js b/dev/assets/documenter.js
index 6adfbbb..f531160 100644
--- a/dev/assets/documenter.js
+++ b/dev/assets/documenter.js
@@ -1,15 +1,16 @@
 // Generated by Documenter.jl
 requirejs.config({
   paths: {
-    'highlight-julia': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min',
+    'highlight-julia': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min',
     'headroom': 
'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min',
-    'jqueryui': 
'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min',
-    'katex-auto-render': 
'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min',
-    'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min',
+    'jqueryui': 
'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min',
+    'minisearch': 
'https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/index.min',
+    'katex-auto-render': 
'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min',
+    'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min',
     'headroom-jquery': 
'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min',
-    'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min',
-    'highlight': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min',
-    'highlight-julia-repl': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min',
+    'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min',
+    'highlight': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min',
+    'highlight-julia-repl': 
'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min',
   },
   shim: {
   "highlight-julia": {
@@ -70,13 +71,90 @@ $(document).ready(function() {
     hljs.highlightAll();
 })
 
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
+let timer = 0;
+var isExpanded = true;
+
+$(document).on("click", ".docstring header", function () {
+  let articleToggleTitle = "Expand docstring";
+
+  debounce(() => {
+    if ($(this).siblings("section").is(":visible")) {
+      $(this)
+        .find(".docstring-article-toggle-button")
+        .removeClass("fa-chevron-down")
+        .addClass("fa-chevron-right");
+    } else {
+      $(this)
+        .find(".docstring-article-toggle-button")
+        .removeClass("fa-chevron-right")
+        .addClass("fa-chevron-down");
+
+      articleToggleTitle = "Collapse docstring";
+    }
+
+    $(this)
+      .find(".docstring-article-toggle-button")
+      .prop("title", articleToggleTitle);
+    $(this).siblings("section").slideToggle();
+  });
+});
+
+$(document).on("click", ".docs-article-toggle-button", function () {
+  let articleToggleTitle = "Expand docstring";
+  let navArticleToggleTitle = "Expand all docstrings";
+
+  debounce(() => {
+    if (isExpanded) {
+      $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down");
+      $(".docstring-article-toggle-button")
+        .removeClass("fa-chevron-down")
+        .addClass("fa-chevron-right");
+
+      isExpanded = false;
+
+      $(".docstring section").slideUp();
+    } else {
+      $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up");
+      $(".docstring-article-toggle-button")
+        .removeClass("fa-chevron-right")
+        .addClass("fa-chevron-down");
+
+      isExpanded = true;
+      articleToggleTitle = "Collapse docstring";
+      navArticleToggleTitle = "Collapse all docstrings";
+
+      $(".docstring section").slideDown();
+    }
+
+    $(this).prop("title", navArticleToggleTitle);
+    $(".docstring-article-toggle-button").prop("title", articleToggleTitle);
+  });
+});
+
+function debounce(callback, timeout = 300) {
+  if (Date.now() - timer > timeout) {
+    callback();
+  }
+
+  clearTimeout(timer);
+
+  timer = Date.now();
+}
+
 })
 
////////////////////////////////////////////////////////////////////////////////
 require([], function() {
 function addCopyButtonCallbacks() {
   for (const el of document.getElementsByTagName("pre")) {
     const button = document.createElement("button");
-    button.classList.add("copy-button", "fas", "fa-copy");
+    button.classList.add("copy-button", "fa-solid", "fa-copy");
+    button.setAttribute("aria-label", "Copy this code block");
+    button.setAttribute("title", "Copy");
+
     el.appendChild(button);
 
     const success = function () {
@@ -85,7 +163,7 @@ function addCopyButtonCallbacks() {
     };
 
     const failure = function () {
-      button.classList.add("error", "fa-times");
+      button.classList.add("error", "fa-xmark");
       button.classList.remove("fa-copy");
     };
 
@@ -94,7 +172,7 @@ function addCopyButtonCallbacks() {
 
       setTimeout(function () {
         button.classList.add("fa-copy");
-        button.classList.remove("success", "fa-check", "fa-times");
+        button.classList.remove("success", "fa-check", "fa-xmark");
       }, 5000);
     });
   }
@@ -138,29 +216,418 @@ require(['jquery', 'headroom', 'headroom-jquery'], 
function($, Headroom) {
 // Manages the top navigation bar (hides it when the user starts scrolling 
down on the
 // mobile).
 window.Headroom = Headroom; // work around buggy module loading?
-$(document).ready(function() {
-  $('#documenter .docs-navbar').headroom({
-    "tolerance": {"up": 10, "down": 10},
+$(document).ready(function () {
+  $("#documenter .docs-navbar").headroom({
+    tolerance: { up: 10, down: 10 },
   });
+});
+
 })
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery', 'minisearch'], function($, minisearch) {
+
+// In general, most search related things will have "search" as a prefix.
+// To get an in-depth about the thought process you can refer: 
https://hetarth02.hashnode.dev/series/gsoc
+
+let results = [];
+let timer = undefined;
+
+let data = documenterSearchIndex["docs"].map((x, key) => {
+  x["id"] = key; // minisearch requires a unique for each object
+  return x;
+});
+
+// list below is the lunr 2.1.3 list minus the intersect with names(Base)
+// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, 
with)
+// ideally we'd just filter the original list but it's not available as a 
variable
+const stopWords = new Set([
+  "a",
+  "able",
+  "about",
+  "across",
+  "after",
+  "almost",
+  "also",
+  "am",
+  "among",
+  "an",
+  "and",
+  "are",
+  "as",
+  "at",
+  "be",
+  "because",
+  "been",
+  "but",
+  "by",
+  "can",
+  "cannot",
+  "could",
+  "dear",
+  "did",
+  "does",
+  "either",
+  "ever",
+  "every",
+  "from",
+  "got",
+  "had",
+  "has",
+  "have",
+  "he",
+  "her",
+  "hers",
+  "him",
+  "his",
+  "how",
+  "however",
+  "i",
+  "if",
+  "into",
+  "it",
+  "its",
+  "just",
+  "least",
+  "like",
+  "likely",
+  "may",
+  "me",
+  "might",
+  "most",
+  "must",
+  "my",
+  "neither",
+  "no",
+  "nor",
+  "not",
+  "of",
+  "off",
+  "often",
+  "on",
+  "or",
+  "other",
+  "our",
+  "own",
+  "rather",
+  "said",
+  "say",
+  "says",
+  "she",
+  "should",
+  "since",
+  "so",
+  "some",
+  "than",
+  "that",
+  "the",
+  "their",
+  "them",
+  "then",
+  "there",
+  "these",
+  "they",
+  "this",
+  "tis",
+  "to",
+  "too",
+  "twas",
+  "us",
+  "wants",
+  "was",
+  "we",
+  "were",
+  "what",
+  "when",
+  "who",
+  "whom",
+  "why",
+  "will",
+  "would",
+  "yet",
+  "you",
+  "your",
+]);
+
+let index = new minisearch({
+  fields: ["title", "text"], // fields to index for full-text search
+  storeFields: ["location", "title", "text", "category", "page"], // fields to 
return with search results
+  processTerm: (term) => {
+    let word = stopWords.has(term) ? null : term;
+    if (word) {
+      // custom trimmer that doesn't strip @ and !, which are used in julia 
macro and function names
+      word = word
+        .replace(/^[^a-zA-Z0-9@!]+/, "")
+        .replace(/[^a-zA-Z0-9@!]+$/, "");
+    }
+
+    return word ?? null;
+  },
+  // add . as a separator, because otherwise "title": 
"Documenter.Anchors.add!", would not find anything if searching for "add!", 
only for the entire qualification
+  tokenize: (string) => string.split(/[\s\-\.]+/),
+  // options which will be applied during the search
+  searchOptions: {
+    boost: { title: 100 },
+    fuzzy: 2,
+    processTerm: (term) => {
+      let word = stopWords.has(term) ? null : term;
+      if (word) {
+        word = word
+          .replace(/^[^a-zA-Z0-9@!]+/, "")
+          .replace(/[^a-zA-Z0-9@!]+$/, "");
+      }
+
+      return word ?? null;
+    },
+    tokenize: (string) => string.split(/[\s\-\.]+/),
+  },
+});
+
+index.addAll(data);
+
+let filters = [...new Set(data.map((x) => x.category))];
+var modal_filters = make_modal_body_filters(filters);
+var filter_results = [];
+
+$(document).on("keyup", ".documenter-search-input", function (event) {
+  // Adding a debounce to prevent disruptions from super-speed typing!
+  debounce(() => update_search(filter_results), 300);
+});
+
+$(document).on("click", ".search-filter", function () {
+  if ($(this).hasClass("search-filter-selected")) {
+    $(this).removeClass("search-filter-selected");
+  } else {
+    $(this).addClass("search-filter-selected");
+  }
+
+  // Adding a debounce to prevent disruptions from crazy clicking!
+  debounce(() => get_filters(), 300);
+});
+
+/**
+ * A debounce function, takes a function and an optional timeout in 
milliseconds
+ *
+ * @function callback
+ * @param {number} timeout
+ */
+function debounce(callback, timeout = 300) {
+  clearTimeout(timer);
+  timer = setTimeout(callback, timeout);
+}
+
+/**
+ * Make/Update the search component
+ *
+ * @param {string[]} selected_filters
+ */
+function update_search(selected_filters = []) {
+  let initial_search_body = `
+      <div class="has-text-centered my-5 py-5">Type something to get 
started!</div>
+    `;
+
+  let querystring = $(".documenter-search-input").val();
+
+  if (querystring.trim()) {
+    results = index.search(querystring, {
+      filter: (result) => {
+        // Filtering results
+        if (selected_filters.length === 0) {
+          return result.score >= 1;
+        } else {
+          return (
+            result.score >= 1 && selected_filters.includes(result.category)
+          );
+        }
+      },
+    });
+
+    let search_result_container = ``;
+    let search_divider = `<div class="search-divider w-100"></div>`;
+
+    if (results.length) {
+      let links = [];
+      let count = 0;
+      let search_results = "";
+
+      results.forEach(function (result) {
+        if (result.location) {
+          // Checking for duplication of results for the same page
+          if (!links.includes(result.location)) {
+            search_results += make_search_result(result, querystring);
+            count++;
+          }
+
+          links.push(result.location);
+        }
+      });
+
+      let result_count = `<div class="is-size-6">${count} result(s)</div>`;
+
+      search_result_container = `
+            <div class="is-flex is-flex-direction-column gap-2 
is-align-items-flex-start">
+                ${modal_filters}
+                ${search_divider}
+                ${result_count}
+                <div class="is-clipped w-100 is-flex is-flex-direction-column 
gap-2 is-align-items-flex-start has-text-justified mt-1">
+                  ${search_results}
+                </div>
+            </div>
+        `;
+    } else {
+      search_result_container = `
+           <div class="is-flex is-flex-direction-column gap-2 
is-align-items-flex-start">
+               ${modal_filters}
+               ${search_divider}
+               <div class="is-size-6">0 result(s)</div>
+            </div>
+            <div class="has-text-centered my-5 py-5">No result found!</div>
+       `;
+    }
+
+    if ($(".search-modal-card-body").hasClass("is-justify-content-center")) {
+      $(".search-modal-card-body").removeClass("is-justify-content-center");
+    }
+
+    $(".search-modal-card-body").html(search_result_container);
+  } else {
+    filter_results = [];
+    modal_filters = make_modal_body_filters(filters, filter_results);
+
+    if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) {
+      $(".search-modal-card-body").addClass("is-justify-content-center");
+    }
+
+    $(".search-modal-card-body").html(initial_search_body);
+  }
+}
+
+/**
+ * Make the modal filter html
+ *
+ * @param {string[]} filters
+ * @param {string[]} selected_filters
+ * @returns string
+ */
+function make_modal_body_filters(filters, selected_filters = []) {
+  let str = ``;
+
+  filters.forEach((val) => {
+    if (selected_filters.includes(val)) {
+      str += `<a href="javascript:;" class="search-filter 
search-filter-selected"><span>${val}</span></a>`;
+    } else {
+      str += `<a href="javascript:;" 
class="search-filter"><span>${val}</span></a>`;
+    }
+  });
+
+  let filter_html = `
+        <div class="is-flex gap-2 is-flex-wrap-wrap 
is-justify-content-flex-start is-align-items-center search-filters">
+            <span class="is-size-6">Filters:</span>
+            ${str}
+        </div>
+    `;
+
+  return filter_html;
+}
+
+/**
+ * Make the result component given a minisearch result data object and the 
value of the search input as queryString.
+ * To view the result object structure, refer: 
https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult
+ *
+ * @param {object} result
+ * @param {string} querystring
+ * @returns string
+ */
+function make_search_result(result, querystring) {
+  let search_divider = `<div class="search-divider w-100"></div>`;
+  let display_link =
+    result.location.slice(Math.max(0), Math.min(50, result.location.length)) +
+    (result.location.length > 30 ? "..." : ""); // To cut-off the link because 
it messes with the overflow of the whole div
+
+  if (result.page !== "") {
+    display_link += ` (${result.page})`;
+  }
+
+  let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text);
+  let text =
+    textindex !== null
+      ? result.text.slice(
+          Math.max(textindex.index - 100, 0),
+          Math.min(
+            textindex.index + querystring.length + 100,
+            result.text.length
+          )
+        )
+      : ""; // cut-off text before and after from the match
+
+  let display_result = text.length
+    ? "..." +
+      text.replace(
+        new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence
+        '<span class="search-result-highlight p-1">$&</span>'
+      ) +
+      "..."
+    : ""; // highlights the match
+
+  let in_code = false;
+  if (!["page", "section"].includes(result.category.toLowerCase())) {
+    in_code = true;
+  }
+
+  // We encode the full url to escape some special characters which can lead 
to broken links
+  let result_div = `
+      <a href="${encodeURI(
+        documenterBaseURL + "/" + result.location
+      )}" class="search-result-link w-100 is-flex is-flex-direction-column 
gap-2 px-4 py-2">
+        <div class="w-100 is-flex is-flex-wrap-wrap 
is-justify-content-space-between is-align-items-flex-start">
+          <div class="search-result-title has-text-weight-bold ${
+            in_code ? "search-result-code-title" : ""
+          }">${result.title}</div>
+          <div class="property-search-result-badge">${result.category}</div>
+        </div>
+        <p>
+          ${display_result}
+        </p>
+        <div
+          class="has-text-left"
+          style="font-size: smaller;"
+          title="${result.location}"
+        >
+          <i class="fas fa-link"></i> ${display_link}
+        </div>
+      </a>
+      ${search_divider}
+    `;
+
+  return result_div;
+}
+
+/**
+ * Get selected filters, remake the filter html and lastly update the search 
modal
+ */
+function get_filters() {
+  let ele = $(".search-filters .search-filter-selected").get();
+  filter_results = ele.map((x) => $(x).text().toLowerCase());
+  modal_filters = make_modal_body_filters(filters, filter_results);
+  update_search(filter_results);
+}
 
 })
 
////////////////////////////////////////////////////////////////////////////////
 require(['jquery'], function($) {
 
 // Modal settings dialog
-$(document).ready(function() {
-  var settings = $('#documenter-settings');
-  $('#documenter-settings-button').click(function(){
-    settings.toggleClass('is-active');
+$(document).ready(function () {
+  var settings = $("#documenter-settings");
+  $("#documenter-settings-button").click(function () {
+    settings.toggleClass("is-active");
   });
   // Close the dialog if X is clicked
-  $('#documenter-settings button.delete').click(function(){
-    settings.removeClass('is-active');
+  $("#documenter-settings button.delete").click(function () {
+    settings.removeClass("is-active");
   });
   // Close dialog if ESC is pressed
-  $(document).keyup(function(e) {
-    if (e.keyCode == 27) settings.removeClass('is-active');
+  $(document).keyup(function (e) {
+    if (e.keyCode == 27) settings.removeClass("is-active");
   });
 });
 
@@ -168,151 +635,242 @@ $(document).ready(function() {
 
////////////////////////////////////////////////////////////////////////////////
 require(['jquery'], function($) {
 
+let search_modal_header = `
+  <header class="modal-card-head gap-2 is-align-items-center 
is-justify-content-space-between w-100 px-3">
+    <div class="field mb-0 w-100">
+      <p class="control has-icons-right">
+        <input class="input documenter-search-input" type="text" 
placeholder="Search" />
+        <span class="icon is-small is-right has-text-primary-dark">
+          <i class="fas fa-magnifying-glass"></i>
+        </span>
+      </p>
+    </div>
+    <div class="icon is-size-4 is-clickable close-search-modal">
+      <i class="fas fa-times"></i>
+    </div>
+  </header>
+`;
+
+let initial_search_body = `
+  <div class="has-text-centered my-5 py-5">Type something to get started!</div>
+`;
+
+let search_modal_footer = `
+  <footer class="modal-card-foot">
+    <span>
+      <kbd class="search-modal-key-hints">Ctrl</kbd> +
+      <kbd class="search-modal-key-hints">/</kbd> to search
+    </span>
+    <span class="ml-3"> <kbd class="search-modal-key-hints">esc</kbd> to close 
</span>
+  </footer>
+`;
+
+$(document.body).append(
+  `
+    <div class="modal" id="search-modal">
+      <div class="modal-background"></div>
+      <div class="modal-card search-min-width-50 search-min-height-100 
is-justify-content-center">
+        ${search_modal_header}
+        <section class="modal-card-body is-flex is-flex-direction-column 
is-justify-content-center gap-4 search-modal-card-body">
+          ${initial_search_body}
+        </section>
+        ${search_modal_footer}
+      </div>
+    </div>
+  `
+);
+
+document.querySelector(".docs-search-query").addEventListener("click", () => {
+  openModal();
+});
+
+document.querySelector(".close-search-modal").addEventListener("click", () => {
+  closeModal();
+});
+
+$(document).on("click", ".search-result-link", function () {
+  closeModal();
+});
+
+document.addEventListener("keydown", (event) => {
+  if ((event.ctrlKey || event.metaKey) && event.key === "/") {
+    openModal();
+  } else if (event.key === "Escape") {
+    closeModal();
+  }
+
+  return false;
+});
+
+// Functions to open and close a modal
+function openModal() {
+  let searchModal = document.querySelector("#search-modal");
+
+  searchModal.classList.add("is-active");
+  document.querySelector(".documenter-search-input").focus();
+}
+
+function closeModal() {
+  let searchModal = document.querySelector("#search-modal");
+  let initial_search_body = `
+    <div class="has-text-centered my-5 py-5">Type something to get 
started!</div>
+  `;
+
+  searchModal.classList.remove("is-active");
+  document.querySelector(".documenter-search-input").blur();
+
+  if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) {
+    $(".search-modal-card-body").addClass("is-justify-content-center");
+  }
+
+  $(".documenter-search-input").val("");
+  $(".search-modal-card-body").html(initial_search_body);
+}
+
+document
+  .querySelector("#search-modal .modal-background")
+  .addEventListener("click", () => {
+    closeModal();
+  });
+
+})
+////////////////////////////////////////////////////////////////////////////////
+require(['jquery'], function($) {
+
 // Manages the showing and hiding of the sidebar.
-$(document).ready(function() {
+$(document).ready(function () {
   var sidebar = $("#documenter > .docs-sidebar");
-  var sidebar_button = $("#documenter-sidebar-button")
-  sidebar_button.click(function(ev) {
+  var sidebar_button = $("#documenter-sidebar-button");
+  sidebar_button.click(function (ev) {
     ev.preventDefault();
-    sidebar.toggleClass('visible');
-    if (sidebar.hasClass('visible')) {
+    sidebar.toggleClass("visible");
+    if (sidebar.hasClass("visible")) {
       // Makes sure that the current menu item is visible in the sidebar.
       $("#documenter .docs-menu a.is-active").focus();
     }
   });
-  $("#documenter > .docs-main").bind('click', function(ev) {
+  $("#documenter > .docs-main").bind("click", function (ev) {
     if ($(ev.target).is(sidebar_button)) {
       return;
     }
-    if (sidebar.hasClass('visible')) {
-      sidebar.removeClass('visible');
+    if (sidebar.hasClass("visible")) {
+      sidebar.removeClass("visible");
     }
   });
-})
+});
 
 // Resizes the package name / sitename in the sidebar if it is too wide.
 // Inspired by: https://github.com/davatron5000/FitText.js
-$(document).ready(function() {
+$(document).ready(function () {
   e = $("#documenter .docs-autofit");
   function resize() {
-    var L = parseInt(e.css('max-width'), 10);
+    var L = parseInt(e.css("max-width"), 10);
     var L0 = e.width();
-    if(L0 > L) {
-      var h0 = parseInt(e.css('font-size'), 10);
-      e.css('font-size', L * h0 / L0);
+    if (L0 > L) {
+      var h0 = parseInt(e.css("font-size"), 10);
+      e.css("font-size", (L * h0) / L0);
       // TODO: make sure it survives resizes?
     }
   }
   // call once and then register events
   resize();
   $(window).resize(resize);
-  $(window).on('orientationchange', resize);
+  $(window).on("orientationchange", resize);
 });
 
 // Scroll the navigation bar to the currently selected menu item
-$(document).ready(function() {
+$(document).ready(function () {
   var sidebar = $("#documenter .docs-menu").get(0);
   var active = $("#documenter .docs-menu .is-active").get(0);
-  if(typeof active !== 'undefined') {
+  if (typeof active !== "undefined") {
     sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15;
   }
-})
+});
 
 })
 
////////////////////////////////////////////////////////////////////////////////
 require(['jquery'], function($) {
 
-function set_theme(theme) {
-  var active = null;
-  var disabled = [];
-  for (var i = 0; i < document.styleSheets.length; i++) {
-    var ss = document.styleSheets[i];
-    var themename = ss.ownerNode.getAttribute("data-theme-name");
-    if(themename === null) continue; // ignore non-theme stylesheets
-    // Find the active theme
-    if(themename === theme) active = ss;
-    else disabled.push(ss);
-  }
-  if(active !== null) {
-    active.disabled = false;
-    if(active.ownerNode.getAttribute("data-theme-primary") === null) {
-      document.getElementsByTagName('html')[0].className = "theme--" + theme;
-    } else {
-      document.getElementsByTagName('html')[0].className = "";
-    }
-    disabled.forEach(function(ss){
-      ss.disabled = true;
-    });
-  }
-
-  // Store the theme in localStorage
-  if(typeof(window.localStorage) !== "undefined") {
-    window.localStorage.setItem("documenter-theme", theme);
-  } else {
-    console.error("Browser does not support window.localStorage");
-  }
-}
-
 // Theme picker setup
-$(document).ready(function() {
+$(document).ready(function () {
   // onchange callback
-  $('#documenter-themepicker').change(function themepick_callback(ev){
-    var themename = $('#documenter-themepicker option:selected').attr('value');
-    set_theme(themename);
+  $("#documenter-themepicker").change(function themepick_callback(ev) {
+    var themename = $("#documenter-themepicker option:selected").attr("value");
+    if (themename === "auto") {
+      // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 
'dark' : 'light');
+      window.localStorage.removeItem("documenter-theme");
+    } else {
+      // set_theme(themename);
+      window.localStorage.setItem("documenter-theme", themename);
+    }
+    // We re-use the global function from themeswap.js to actually do the 
swapping.
+    set_theme_from_local_storage();
   });
 
   // Make sure that the themepicker displays the correct theme when the theme 
is retrieved
   // from localStorage
-  if(typeof(window.localStorage) !== "undefined") {
-    var theme =  window.localStorage.getItem("documenter-theme");
-    if(theme !== null) {
-      $('#documenter-themepicker option').each(function(i,e) {
-        e.selected = (e.value === theme);
-      })
-    } else {
-      $('#documenter-themepicker option').each(function(i,e) {
-        e.selected = $("html").hasClass(`theme--${e.value}`);
-      })
+  if (typeof window.localStorage !== "undefined") {
+    var theme = window.localStorage.getItem("documenter-theme");
+    if (theme !== null) {
+      $("#documenter-themepicker option").each(function (i, e) {
+        e.selected = e.value === theme;
+      });
     }
   }
-})
+});
 
 })
 
////////////////////////////////////////////////////////////////////////////////
 require(['jquery'], function($) {
 
 // update the version selector with info from the siteinfo.js and 
../versions.js files
-$(document).ready(function() {
+$(document).ready(function () {
   // If the version selector is disabled with 
DOCUMENTER_VERSION_SELECTOR_DISABLED in the
   // siteinfo.js file, we just return immediately and not display the version 
selector.
-  if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && 
DOCUMENTER_VERSION_SELECTOR_DISABLED) {
+  if (
+    typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" &&
+    DOCUMENTER_VERSION_SELECTOR_DISABLED
+  ) {
     return;
   }
 
   var version_selector = $("#documenter .docs-version-selector");
   var version_selector_select = $("#documenter .docs-version-selector select");
 
-  version_selector_select.change(function(x) {
-    target_href = 
version_selector_select.children("option:selected").get(0).value;
+  version_selector_select.change(function (x) {
+    target_href = version_selector_select
+      .children("option:selected")
+      .get(0).value;
     window.location.href = target_href;
   });
 
   // add the current version to the selector based on siteinfo.js, but only if 
the selector is empty
-  if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && 
$('#version-selector > option').length == 0) {
-    var option = $("<option value='#' selected='selected'>" + 
DOCUMENTER_CURRENT_VERSION + "</option>");
+  if (
+    typeof DOCUMENTER_CURRENT_VERSION !== "undefined" &&
+    $("#version-selector > option").length == 0
+  ) {
+    var option = $(
+      "<option value='#' selected='selected'>" +
+        DOCUMENTER_CURRENT_VERSION +
+        "</option>"
+    );
     version_selector_select.append(option);
   }
 
-  if (typeof DOC_VERSIONS !== 'undefined') {
+  if (typeof DOC_VERSIONS !== "undefined") {
     var existing_versions = version_selector_select.children("option");
-    var existing_versions_texts = existing_versions.map(function(i,x){return 
x.text});
-    DOC_VERSIONS.forEach(function(each) {
-      var version_url = documenterBaseURL + "/../" + each;
+    var existing_versions_texts = existing_versions.map(function (i, x) {
+      return x.text;
+    });
+    DOC_VERSIONS.forEach(function (each) {
+      var version_url = documenterBaseURL + "/../" + each + "/";
       var existing_id = $.inArray(each, existing_versions_texts);
       // if not already in the version selector, add it as a new option,
       // otherwise update the old option with the URL and enable it
       if (existing_id == -1) {
-        var option = $("<option value='" + version_url + "'>" + each + 
"</option>");
+        var option = $(
+          "<option value='" + version_url + "'>" + each + "</option>"
+        );
         version_selector_select.append(option);
       } else {
         var option = existing_versions[existing_id];
@@ -326,6 +884,6 @@ $(document).ready(function() {
   if (version_selector_select.children("option").length > 0) {
     version_selector.toggleClass("visible");
   }
-})
+});
 
 })
diff --git a/dev/assets/search.js b/dev/assets/search.js
deleted file mode 100644
index c133f74..0000000
--- a/dev/assets/search.js
+++ /dev/null
@@ -1,267 +0,0 @@
-// Generated by Documenter.jl
-requirejs.config({
-  paths: {
-    'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min',
-    'lodash': 
'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min',
-    'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min',
-  }
-});
-////////////////////////////////////////////////////////////////////////////////
-require(['jquery', 'lunr', 'lodash'], function($, lunr, _) {
-
-$(document).ready(function() {
-  // parseUri 1.2.2
-  // (c) Steven Levithan <stevenlevithan.com>
-  // MIT License
-  function parseUri (str) {
-    var  o   = parseUri.options,
-      m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
-      uri = {},
-      i   = 14;
-
-    while (i--) uri[o.key[i]] = m[i] || "";
-
-    uri[o.q.name] = {};
-    uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
-      if ($1) uri[o.q.name][$1] = $2;
-    });
-
-    return uri;
-  };
-  parseUri.options = {
-    strictMode: false,
-    key: 
["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
-    q:   {
-      name:   "queryKey",
-      parser: /(?:^|&)([^&=]*)=?([^&]*)/g
-    },
-    parser: {
-      strict: 
/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
-      loose:  
/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
-    }
-  };
-
-  $("#search-form").submit(function(e) {
-    e.preventDefault()
-  })
-
-  // list below is the lunr 2.1.3 list minus the intersect with names(Base)
-  // (all, any, get, in, is, only, which) and (do, else, for, let, where, 
while, with)
-  // ideally we'd just filter the original list but it's not available as a 
variable
-  lunr.stopWordFilter = lunr.generateStopWordFilter([
-    'a',
-    'able',
-    'about',
-    'across',
-    'after',
-    'almost',
-    'also',
-    'am',
-    'among',
-    'an',
-    'and',
-    'are',
-    'as',
-    'at',
-    'be',
-    'because',
-    'been',
-    'but',
-    'by',
-    'can',
-    'cannot',
-    'could',
-    'dear',
-    'did',
-    'does',
-    'either',
-    'ever',
-    'every',
-    'from',
-    'got',
-    'had',
-    'has',
-    'have',
-    'he',
-    'her',
-    'hers',
-    'him',
-    'his',
-    'how',
-    'however',
-    'i',
-    'if',
-    'into',
-    'it',
-    'its',
-    'just',
-    'least',
-    'like',
-    'likely',
-    'may',
-    'me',
-    'might',
-    'most',
-    'must',
-    'my',
-    'neither',
-    'no',
-    'nor',
-    'not',
-    'of',
-    'off',
-    'often',
-    'on',
-    'or',
-    'other',
-    'our',
-    'own',
-    'rather',
-    'said',
-    'say',
-    'says',
-    'she',
-    'should',
-    'since',
-    'so',
-    'some',
-    'than',
-    'that',
-    'the',
-    'their',
-    'them',
-    'then',
-    'there',
-    'these',
-    'they',
-    'this',
-    'tis',
-    'to',
-    'too',
-    'twas',
-    'us',
-    'wants',
-    'was',
-    'we',
-    'were',
-    'what',
-    'when',
-    'who',
-    'whom',
-    'why',
-    'will',
-    'would',
-    'yet',
-    'you',
-    'your'
-  ])
-
-  // add . as a separator, because otherwise "title": "Documenter.Anchors.add!"
-  // would not find anything if searching for "add!", only for the entire 
qualification
-  lunr.tokenizer.separator = /[\s\-\.]+/
-
-  // custom trimmer that doesn't strip @ and !, which are used in julia macro 
and function names
-  lunr.trimmer = function (token) {
-    return token.update(function (s) {
-      return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '')
-    })
-  }
-
-  lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter')
-  lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer')
-
-  var index = lunr(function () {
-    this.ref('location')
-    this.field('title',{boost: 100})
-    this.field('text')
-    documenterSearchIndex['docs'].forEach(function(e) {
-        this.add(e)
-    }, this)
-  })
-  var store = {}
-
-  documenterSearchIndex['docs'].forEach(function(e) {
-      store[e.location] = {title: e.title, category: e.category, page: e.page}
-  })
-
-  $(function(){
-    searchresults = $('#documenter-search-results');
-    searchinfo = $('#documenter-search-info');
-    searchbox = $('#documenter-search-query');
-    searchform = $('.docs-search');
-    sidebar = $('.docs-sidebar');
-    function update_search(querystring) {
-      tokens = lunr.tokenizer(querystring)
-      results = index.query(function (q) {
-        tokens.forEach(function (t) {
-          q.term(t.toString(), {
-            fields: ["title"],
-            boost: 100,
-            usePipeline: true,
-            editDistance: 0,
-            wildcard: lunr.Query.wildcard.NONE
-          })
-          q.term(t.toString(), {
-            fields: ["title"],
-            boost: 10,
-            usePipeline: true,
-            editDistance: 2,
-            wildcard: lunr.Query.wildcard.NONE
-          })
-          q.term(t.toString(), {
-            fields: ["text"],
-            boost: 1,
-            usePipeline: true,
-            editDistance: 0,
-            wildcard: lunr.Query.wildcard.NONE
-          })
-        })
-      })
-      searchinfo.text("Number of results: " + results.length)
-      searchresults.empty()
-      results.forEach(function(result) {
-        data = store[result.ref]
-        link = $('<a class="docs-label">'+data.title+'</a>')
-        link.attr('href', documenterBaseURL+'/'+result.ref)
-        if (data.category != "page"){
-          cat = $('<span class="docs-category">('+data.category+', 
'+data.page+')</span>')
-        } else {
-          cat = $('<span class="docs-category">('+data.category+')</span>')
-        }
-        li = $('<li>').append(link).append(" ").append(cat)
-        searchresults.append(li)
-      })
-    }
-
-    function update_search_box() {
-      querystring = searchbox.val()
-      update_search(querystring)
-    }
-
-    searchbox.keyup(_.debounce(update_search_box, 250))
-    searchbox.change(update_search_box)
-
-    // Disable enter-key form submission for the searchbox on the search page
-    // and just re-run search rather than refresh the whole page.
-    searchform.keypress(
-      function(event){
-        if (event.which == '13') {
-          if (sidebar.hasClass('visible')) {
-            sidebar.removeClass('visible');
-          }
-          update_search_box();
-          event.preventDefault();
-        }
-      }
-    );
-
-    search_query_uri = parseUri(window.location).queryKey["q"]
-    if(search_query_uri !== undefined) {
-      search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20'))
-      searchbox.val(search_query)
-    }
-    update_search_box();
-  })
-})
-
-})
diff --git a/dev/assets/themes/documenter-dark.css 
b/dev/assets/themes/documenter-dark.css
index c94a294..ec054ec 100644
--- a/dev/assets/themes/documenter-dark.css
+++ b/dev/assets/themes/documenter-dark.css
@@ -1,7 +1,7 @@
-@keyframes 
spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}html.theme--documenter-dark
 .tabs,html.theme--documenter-dark 
.pagination-previous,html.theme--documenter-dark 
.pagination-next,html.theme--documenter-dark 
.pagination-link,html.theme--documenter-dark 
.pagination-ellipsis,html.theme--documenter-dark 
.breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark 
.button,.is-unselectable,html.theme--documenter-dark 
.modal-close,html.theme--documenter [...]
+html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark 
.pagination-next,html.theme--documenter-dark 
.pagination-link,html.theme--documenter-dark 
.pagination-ellipsis,html.theme--documenter-dark 
.file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark 
.select select,html.theme--documenter-dark 
.textarea,html.theme--documenter-dark .input,html.theme--documenter-dark 
#documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark 
.butt [...]
   Theme: a11y-dark
   Author: @ericwbailey
   Maintainer: @ericwbailey
 
   Based on the Tomorrow Night Eighties theme: 
https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
-*/}html.theme--documenter-dark 
html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark
 article,html.theme--documenter-dark aside,html.theme--documenter-dark 
figure,html.theme--documenter-dark footer,html.theme--documenter-dark 
header,html.theme--documenter-dark hgroup,html.theme--documenter-dark sec [...]
+*/}html.theme--documenter-dark 
html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark
 article,html.theme--documenter-dark aside,html.theme--documenter-dark 
figure,html.theme--documenter-dark footer,html.theme--documenter-dark 
header,html.theme--documenter-dark hgroup,html.theme--documenter-dark sec [...]
diff --git a/dev/assets/themes/documenter-light.css 
b/dev/assets/themes/documenter-light.css
index 9b9a14b..1262ec5 100644
--- a/dev/assets/themes/documenter-light.css
+++ b/dev/assets/themes/documenter-light.css
@@ -1,4 +1,4 @@
-@keyframes 
spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable,.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px
 solid rgba(0,0,0,0);border-radius:2px;border-right:0;b [...]
+.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select
 select,.textarea,.input,#documenter .docs-sidebar 
form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px
 solid 
transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em
 - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.7 [...]
   Theme: Default
   Description: Original highlight.js style
   Author: (c) Ivan Sagalaev <[email protected]>
@@ -6,4 +6,4 @@
   Website: https://highlightjs.org/
   License: see project LICENSE
   Touched: 2021
-*/pre code.hljs{display:block;overflow-x:auto}code.hljs{padding:3px 
5px}.hljs{background:#F0F0F0;color:#444}.hljs-comment{color:#888888}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag
 .hljs-name,.hljs-tag 
.hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta
 
.hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,
 [...]
+*/pre 
code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 
5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag
 .hljs-name,.hljs-tag 
.hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta
 
.hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}
 [...]
diff --git a/dev/assets/themeswap.js b/dev/assets/themeswap.js
index c58e993..9f5eebe 100644
--- a/dev/assets/themeswap.js
+++ b/dev/assets/themeswap.js
@@ -1,20 +1,17 @@
 // Small function to quickly swap out themes. Gets put into the <head> tag..
 function set_theme_from_local_storage() {
-  // Intialize the theme to null, which means default
+  // Initialize the theme to null, which means default
   var theme = null;
   // If the browser supports the localstorage and is not disabled then try to 
get the
   // documenter theme
-  if(window.localStorage != null) {
+  if (window.localStorage != null) {
     // Get the user-picked theme from localStorage. May be `null`, which means 
the default
     // theme.
-    theme =  window.localStorage.getItem("documenter-theme");
+    theme = window.localStorage.getItem("documenter-theme");
   }
-  // Check if the browser supports user color preference
-  var darkPreference = false;
   // Check if the users preference is for dark color scheme
-  if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) {
-    darkPreference = true;
-  }
+  var darkPreference =
+    window.matchMedia("(prefers-color-scheme: dark)").matches === true;
   // Initialize a few variables for the loop:
   //
   //  - active: will contain the index of the theme that should be active. 
Note that there
@@ -24,43 +21,64 @@ function set_theme_from_local_storage() {
   //
   //  - disabled: style sheets that should be disabled (i.e. all the theme 
style sheets
   //    that are not the currently active theme)
-  var active = null; var disabled = []; var darkTheme = null;
+  var active = null;
+  var disabled = [];
+  var primaryLightTheme = null;
+  var primaryDarkTheme = null;
   for (var i = 0; i < document.styleSheets.length; i++) {
     var ss = document.styleSheets[i];
     // The <link> tag of each style sheet is expected to have a 
data-theme-name attribute
     // which must contain the name of the theme. The names in localStorage 
much match this.
     var themename = ss.ownerNode.getAttribute("data-theme-name");
     // attribute not set => non-theme stylesheet => ignore
-    if(themename === null) continue;
+    if (themename === null) continue;
     // To distinguish the default (primary) theme, it needs to have the 
data-theme-primary
     // attribute set.
-    var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null);
-    // Check if the theme is primary dark theme
-    var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") 
!== null);
-    // If ss is for dark theme then set the value of darkTheme to the name of 
the theme
-    if(isDarkTheme) darkTheme = themename;
+    if (ss.ownerNode.getAttribute("data-theme-primary") !== null) {
+      primaryLightTheme = themename;
+    }
+    // Check if the theme is primary dark theme so that we could store its 
name in darkTheme
+    if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) {
+      primaryDarkTheme = themename;
+    }
     // If we find a matching theme (and it's not the default), we'll set 
active to non-null
-    if(themename === theme) active = i;
+    if (themename === theme) active = i;
     // Store the style sheets of inactive themes so that we could disable them
-    if(themename !== theme) disabled.push(ss);
+    if (themename !== theme) disabled.push(ss);
   }
-  if(active !== null) {
+  var activeTheme = null;
+  if (active !== null) {
     // If we did find an active theme, we'll (1) add the theme--$(theme) class 
to <html>
-    document.getElementsByTagName('html')[0].className = "theme--" + theme;
-    // and (2) disable all the other theme stylesheets
-    disabled.forEach(function(ss){
-      ss.disabled = true;
-    });
+    document.getElementsByTagName("html")[0].className = "theme--" + theme;
+    activeTheme = theme;
+  } else {
+    // If we did _not_ find an active theme, then we need to fall back to the 
primary theme
+    // which can either be dark or light, depending on the user's OS 
preference.
+    var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme;
+    // In case it somehow happens that the relevant primary theme was not 
found in the
+    // preceding loop, we abort without doing anything.
+    if (activeTheme === null) {
+      console.error("Unable to determine primary theme.");
+      return;
+    }
+    // When switching to the primary light theme, then we must not have a 
class name
+    // for the <html> tag. That's only for non-primary or the primary dark 
theme.
+    if (darkPreference) {
+      document.getElementsByTagName("html")[0].className =
+        "theme--" + activeTheme;
+    } else {
+      document.getElementsByTagName("html")[0].className = "";
+    }
   }
-  else if(darkTheme !== null && darkPreference === true) {
-    // If we did find an active theme, we'll (1) add the theme--$(theme) class 
to <html>
-    document.getElementsByTagName('html')[0].className = "theme--" + darkTheme;
-    // and (2) disable all the other theme stylesheets
-    disabled.forEach(function(ss){
-      if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) {
-        ss.disabled = true;
-      }
-    });
+  for (var i = 0; i < document.styleSheets.length; i++) {
+    var ss = document.styleSheets[i];
+    // The <link> tag of each style sheet is expected to have a 
data-theme-name attribute
+    // which must contain the name of the theme. The names in localStorage 
much match this.
+    var themename = ss.ownerNode.getAttribute("data-theme-name");
+    // attribute not set => non-theme stylesheet => ignore
+    if (themename === null) continue;
+    // we'll disable all the stylesheets, except for the active one
+    ss.disabled = !(themename == activeTheme);
   }
 }
 set_theme_from_local_storage();
diff --git a/dev/assets/warner.js b/dev/assets/warner.js
index 5531c88..3f6f5d0 100644
--- a/dev/assets/warner.js
+++ b/dev/assets/warner.js
@@ -1,49 +1,52 @@
-function maybeAddWarning () {
-    // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION 
and DOCUMENTER_STABLE
-    // in siteinfo.js.
-    // If either of these are undefined something went horribly wrong, so we 
abort.
-    if (
-            window.DOCUMENTER_NEWEST === undefined ||
-            window.DOCUMENTER_CURRENT_VERSION === undefined ||
-            window.DOCUMENTER_STABLE === undefined
-       ) {
-        return
-    };
+function maybeAddWarning() {
+  // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION 
and DOCUMENTER_STABLE
+  // in siteinfo.js.
+  // If either of these are undefined something went horribly wrong, so we 
abort.
+  if (
+    window.DOCUMENTER_NEWEST === undefined ||
+    window.DOCUMENTER_CURRENT_VERSION === undefined ||
+    window.DOCUMENTER_STABLE === undefined
+  ) {
+    return;
+  }
 
-    // Current version is not a version number, so we can't tell if it's the 
newest version. Abort.
-    if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) {
-        return
-    };
+  // Current version is not a version number, so we can't tell if it's the 
newest version. Abort.
+  if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) {
+    return;
+  }
 
-    // Current version is newest version, so no need to add a warning.
-    if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) {
-        return
-    };
+  // Current version is newest version, so no need to add a warning.
+  if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) {
+    return;
+  }
 
-    // Add a noindex meta tag (unless one exists) so that search engines don't 
index this version of the docs.
-    if (document.body.querySelector('meta[name="robots"]') === null) {
-        const meta = document.createElement('meta');
-        meta.name = 'robots';
-        meta.content = 'noindex';
+  // Add a noindex meta tag (unless one exists) so that search engines don't 
index this version of the docs.
+  if (document.body.querySelector('meta[name="robots"]') === null) {
+    const meta = document.createElement("meta");
+    meta.name = "robots";
+    meta.content = "noindex";
 
-        document.getElementsByTagName('head')[0].appendChild(meta);
-    };
+    document.getElementsByTagName("head")[0].appendChild(meta);
+  }
 
-    const div = document.createElement('div');
-    div.classList.add('outdated-warning-overlay');
-    const closer = document.createElement('button');
-    closer.classList.add('outdated-warning-closer', 'delete');
-    closer.addEventListener('click', function () {
-        document.body.removeChild(div);
-    });
-    const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE;
-    div.innerHTML = 'This documentation is not for the latest stable release, 
but for either the development version or an older release.<br><a href="' + 
href + '">Click here to go to the documentation for the latest stable 
release.</a>';
-    div.appendChild(closer);
-    document.body.appendChild(div);
-};
+  const div = document.createElement("div");
+  div.classList.add("outdated-warning-overlay");
+  const closer = document.createElement("button");
+  closer.classList.add("outdated-warning-closer", "delete");
+  closer.addEventListener("click", function () {
+    document.body.removeChild(div);
+  });
+  const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE;
+  div.innerHTML =
+    'This documentation is not for the latest stable release, but for either 
the development version or an older release.<br><a href="' +
+    href +
+    '">Click here to go to the documentation for the latest stable 
release.</a>';
+  div.appendChild(closer);
+  document.body.appendChild(div);
+}
 
-if (document.readyState === 'loading') {
-    document.addEventListener('DOMContentLoaded', maybeAddWarning);
+if (document.readyState === "loading") {
+  document.addEventListener("DOMContentLoaded", maybeAddWarning);
 } else {
-    maybeAddWarning();
-};
+  maybeAddWarning();
+}
diff --git a/dev/index.html b/dev/index.html
index 22a99d1..639869e 100644
--- a/dev/index.html
+++ b/dev/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>Home · 
Arrow.jl</title><script data-outdated-warner 
src="assets/warner.js"></script><link rel="canonical" 
href="https://arrow.juliadata.org/"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css";
 rel="stylesheet" type="text/css"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css"; 
rel="stylesheet" [...]
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>Home · 
Arrow.jl</title><meta name="title" content="Home · Arrow.jl"/><meta 
property="og:title" content="Home · Arrow.jl"/><meta property="twitter:title" 
content="Home · Arrow.jl"/><meta name="description" content="Documentation for 
Arrow.jl."/><meta property="og:description" content="Documentation for 
Arrow.jl."/><meta property="twitter:description" content="Document [...]
diff --git a/dev/manual/index.html b/dev/manual/index.html
index 905e3f6..42121d4 100644
--- a/dev/manual/index.html
+++ b/dev/manual/index.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>User Manual · 
Arrow.jl</title><script data-outdated-warner 
src="../assets/warner.js"></script><link rel="canonical" 
href="https://arrow.juliadata.org/manual/"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css";
 rel="stylesheet" type="text/css"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css"; 
[...]
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>User Manual · 
Arrow.jl</title><meta name="title" content="User Manual · Arrow.jl"/><meta 
property="og:title" content="User Manual · Arrow.jl"/><meta 
property="twitter:title" content="User Manual · Arrow.jl"/><meta 
name="description" content="Documentation for Arrow.jl."/><meta 
property="og:description" content="Documentation for Arrow.jl."/><meta 
property="twitter:de [...]
 
-table = Arrow.Table(&quot;data.arrow&quot;)</code></pre><h3 
id="Arrow.Table"><a class="docs-heading-anchor" 
href="#Arrow.Table"><code>Arrow.Table</code></a><a id="Arrow.Table-1"></a><a 
class="docs-heading-anchor-permalink" href="#Arrow.Table" 
title="Permalink"></a></h3><p>The type of <code>table</code> in this example 
will be an <code>Arrow.Table</code>. When &quot;reading&quot; the arrow data, 
<code>Arrow.Table</code> first <a 
href="https://en.wikipedia.org/wiki/Mmap";>&quot;mmapped&quot [...]
+table = Arrow.Table(&quot;data.arrow&quot;)</code></pre><h3 
id="Arrow.Table"><a class="docs-heading-anchor" 
href="#Arrow.Table"><code>Arrow.Table</code></a><a id="Arrow.Table-1"></a><a 
class="docs-heading-anchor-permalink" href="#Arrow.Table" 
title="Permalink"></a></h3><p>The type of <code>table</code> in this example 
will be an <code>Arrow.Table</code>. When &quot;reading&quot; the arrow data, 
<code>Arrow.Table</code> first <a 
href="https://en.wikipedia.org/wiki/Mmap";>&quot;mmapped&quot [...]
 
 struct Person
     id::Int
@@ -50,4 +50,4 @@ Arrow.write(io, tbl_parts)
 # treat an array of csv files with same schema where each file is a partition
 # in this form, a function `CSV.File` is applied to each element of 2nd 
argument
 csv_parts = Tables.partitioner(CSV.File, csv_files)
-Arrow.write(io, csv_parts)</code></pre><h3 id="Arrow.Writer"><a 
class="docs-heading-anchor" 
href="#Arrow.Writer"><code>Arrow.Writer</code></a><a id="Arrow.Writer-1"></a><a 
class="docs-heading-anchor-permalink" href="#Arrow.Writer" 
title="Permalink"></a></h3><p>With <code>Arrow.Writer</code>, you instantiate 
an <code>Arrow.Writer</code> object, write sources using it, and then close it. 
 This allows for incrmental writes to the same sink.  It is similar to 
<code>Arrow.append</code> withou [...]
+Arrow.write(io, csv_parts)</code></pre><h3 id="Arrow.Writer"><a 
class="docs-heading-anchor" 
href="#Arrow.Writer"><code>Arrow.Writer</code></a><a id="Arrow.Writer-1"></a><a 
class="docs-heading-anchor-permalink" href="#Arrow.Writer" 
title="Permalink"></a></h3><p>With <code>Arrow.Writer</code>, you instantiate 
an <code>Arrow.Writer</code> object, write sources using it, and then close it. 
 This allows for incrmental writes to the same sink.  It is similar to 
<code>Arrow.append</code> withou [...]
diff --git a/dev/reference/index.html b/dev/reference/index.html
index 947444b..0bc6a1f 100644
--- a/dev/reference/index.html
+++ b/dev/reference/index.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>API Reference · 
Arrow.jl</title><script data-outdated-warner 
src="../assets/warner.js"></script><link rel="canonical" 
href="https://arrow.juliadata.org/reference/"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css";
 rel="stylesheet" type="text/css"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min [...]
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>API Reference · 
Arrow.jl</title><meta name="title" content="API Reference · Arrow.jl"/><meta 
property="og:title" content="API Reference · Arrow.jl"/><meta 
property="twitter:title" content="API Reference · Arrow.jl"/><meta 
name="description" content="Documentation for Arrow.jl."/><meta 
property="og:description" content="Documentation for Arrow.jl."/><meta 
property="tw [...]
 Arrow.Stream(file::String; convert::Bool=true)
 Arrow.Stream(bytes::Vector{UInt8}, pos=1, len=nothing; convert::Bool=true)
-Arrow.Stream(inputs::Vector; convert::Bool=true)</code></pre><p>Start reading 
an arrow formatted table, from:</p><ul><li><code>io</code>, bytes will be read 
all at once via <code>read(io)</code></li><li><code>file</code>, bytes will be 
read via <code>Mmap.mmap(file)</code></li><li><code>bytes</code>, a byte vector 
directly, optionally allowing specifying the starting byte position 
<code>pos</code> and <code>len</code></li><li>A <code>Vector</code> of any of 
the above, in which each input [...]
+Arrow.Stream(inputs::Vector; convert::Bool=true)</code></pre><p>Start reading 
an arrow formatted table, from:</p><ul><li><code>io</code>, bytes will be read 
all at once via <code>read(io)</code></li><li><code>file</code>, bytes will be 
read via <code>Mmap.mmap(file)</code></li><li><code>bytes</code>, a byte vector 
directly, optionally allowing specifying the starting byte position 
<code>pos</code> and <code>len</code></li><li>A <code>Vector</code> of any of 
the above, in which each input [...]
 Arrow.Table(file::String; convert::Bool=true)
 Arrow.Table(bytes::Vector{UInt8}, pos=1, len=nothing; convert::Bool=true)
-Arrow.Table(inputs::Vector; convert::Bool=true)</code></pre><p>Read an arrow 
formatted table, from:</p><ul><li><code>io</code>, bytes will be read all at 
once via <code>read(io)</code></li><li><code>file</code>, bytes will be read 
via <code>Mmap.mmap(file)</code></li><li><code>bytes</code>, a byte vector 
directly, optionally allowing specifying the starting byte position 
<code>pos</code> and <code>len</code></li><li>A <code>Vector</code> of any of 
the above, in which each input should be [...]
+Arrow.Table(inputs::Vector; convert::Bool=true)</code></pre><p>Read an arrow 
formatted table, from:</p><ul><li><code>io</code>, bytes will be read all at 
once via <code>read(io)</code></li><li><code>file</code>, bytes will be read 
via <code>Mmap.mmap(file)</code></li><li><code>bytes</code>, a byte vector 
directly, optionally allowing specifying the starting byte position 
<code>pos</code> and <code>len</code></li><li>A <code>Vector</code> of any of 
the above, in which each input should be [...]
 
 julia&gt; partition1 = (col1 = [1, 2], col2 = [&quot;A&quot;, &quot;B&quot;])
 (col1 = [1, 2], col2 = [&quot;A&quot;, &quot;B&quot;])
@@ -22,8 +22,8 @@ julia&gt; close(writer)</code></pre><p>It&#39;s also possible 
to automatically c
            Arrow.write(writer, partition1)
            partition2 = (col1 = [3, 4], col2 = [&quot;C&quot;, &quot;D&quot;])
            Arrow.write(writer, partition2)
-       end</code></pre></div><a class="docs-sourcelink" target="_blank" 
href="https://github.com/apache/arrow-julia/blob/95efe954784062a115c2a5af15f5c4dbde3fe6f3/src/write.jl#LL78-L110";>source</a></section></article><article
 class="docstring"><header><a class="docstring-binding" id="Arrow.append" 
href="#Arrow.append"><code>Arrow.append</code></a> — <span 
class="docstring-category">Function</span></header><section><div><pre><code 
class="language-julia hljs">Arrow.append(io::IO, tbl)
+       end</code></pre></div><a class="docs-sourcelink" target="_blank" 
href="https://github.com/apache/arrow-julia/blob/95c053a272ddae7d2037eddad0379681c59e3608/src/write.jl#L78-L110";>source</a></section></article><article
 class="docstring"><header><a class="docstring-article-toggle-button fa-solid 
fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a 
class="docstring-binding" id="Arrow.append" 
href="#Arrow.append"><code>Arrow.append</code></a> — <span class="docstring- 
[...]
 Arrow.append(file::String, tbl)
-tbl |&gt; Arrow.append(file)</code></pre><p>Append any <a 
href="https://github.com/JuliaData/Tables.jl";>Tables.jl</a>-compatible 
<code>tbl</code> to an existing arrow formatted file or IO. The existing arrow 
data must be in IPC stream format. Note that appending to the &quot;feather 
formatted file&quot; is <em>not</em> allowed, as this file format doesn&#39;t 
support appending. That means files written like 
<code>Arrow.write(filename::String, tbl)</code> <em>cannot</em> be appended to; 
i [...]
+tbl |&gt; Arrow.append(file)</code></pre><p>Append any <a 
href="https://github.com/JuliaData/Tables.jl";>Tables.jl</a>-compatible 
<code>tbl</code> to an existing arrow formatted file or IO. The existing arrow 
data must be in IPC stream format. Note that appending to the &quot;feather 
formatted file&quot; is <em>not</em> allowed, as this file format doesn&#39;t 
support appending. That means files written like 
<code>Arrow.write(filename::String, tbl)</code> <em>cannot</em> be appended to; 
i [...]
 Arrow.write(file::String, tbl)
-tbl |&gt; Arrow.write(io_or_file)</code></pre><p>Write any <a 
href="https://github.com/JuliaData/Tables.jl";>Tables.jl</a>-compatible 
<code>tbl</code> out as arrow formatted data. Providing an <code>io::IO</code> 
argument will cause the data to be written to it in the <a 
href="https://arrow.apache.org/docs/format/Columnar.html#ipc-streaming-format";>&quot;streaming&quot;
 format</a>, unless <code>file=true</code> keyword argument is passed. 
Providing a <code>file::String</code> argument wil [...]
+tbl |&gt; Arrow.write(io_or_file)</code></pre><p>Write any <a 
href="https://github.com/JuliaData/Tables.jl";>Tables.jl</a>-compatible 
<code>tbl</code> out as arrow formatted data. Providing an <code>io::IO</code> 
argument will cause the data to be written to it in the <a 
href="https://arrow.apache.org/docs/format/Columnar.html#ipc-streaming-format";>&quot;streaming&quot;
 format</a>, unless <code>file=true</code> keyword argument is passed. 
Providing a <code>file::String</code> argument wil [...]
diff --git a/dev/search/index.html b/dev/search/index.html
deleted file mode 100644
index c6379fa..0000000
--- a/dev/search/index.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><title>Search · 
Arrow.jl</title><script data-outdated-warner 
src="../assets/warner.js"></script><link rel="canonical" 
href="https://arrow.juliadata.org/search/"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css";
 rel="stylesheet" type="text/css"/><link 
href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css"; 
rel= [...]
diff --git a/dev/search_index.js b/dev/search_index.js
index 5b2bda4..2929bed 100644
--- a/dev/search_index.js
+++ b/dev/search_index.js
@@ -1,3 +1,3 @@
 var documenterSearchIndex = {"docs":
-[{"location":"manual/","page":"User Manual","title":"User Manual","text":"<!–- 
  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 [...]
+[{"location":"manual/","page":"User Manual","title":"User Manual","text":"<!–- 
  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 [...]
 }

Reply via email to