* [PR PATCH] Manual: generate mdbook version
@ 2024-02-12 20:12 classabbyamp
2024-02-12 20:45 ` [PR PATCH] [Updated] " classabbyamp
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: classabbyamp @ 2024-02-12 20:12 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 627 bytes --]
There is a new pull request by classabbyamp against master on the void-packages repository
https://github.com/classabbyamp/void-packages manual-mdbook
https://github.com/void-linux/void-packages/pull/48677
Manual: generate mdbook version
#35856 rises from the ashes, this time with cleaner code and less reliance on the markdown!
still working on the theming, and I'd maybe like to do a go-through of the manual updating everything before or after this is merged
#### Testing the changes
- I tested the changes in this PR: **YES**
A patch file from https://github.com/void-linux/void-packages/pull/48677.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-manual-mdbook-48677.patch --]
[-- Type: text/x-diff, Size: 63537 bytes --]
From be8a7fdcedcbc0287c6aca79e4c8f665d806b45b Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 25 Feb 2022 21:36:12 -0500
Subject: [PATCH 1/2] manual/: Add script to generate mdbook of Manual.md
---
Manual.md | 55 ++++
manual/book.toml | 17 +
manual/generate_mdbook.py | 125 ++++++++
manual/src/SUMMARY.md | 1 +
manual/src/theme/book.js | 119 +++++++
manual/src/theme/css/chrome.css | 484 +++++++++++++++++++++++++++++
manual/src/theme/css/general.css | 345 ++++++++++++++++++++
manual/src/theme/css/print.css | 79 +++++
manual/src/theme/css/variables.css | 107 +++++++
manual/src/theme/favicon.png | Bin 0 -> 5800 bytes
manual/src/theme/index.hbs | 253 +++++++++++++++
11 files changed, 1585 insertions(+)
create mode 100644 manual/book.toml
create mode 100644 manual/generate_mdbook.py
create mode 100644 manual/src/SUMMARY.md
create mode 100644 manual/src/theme/book.js
create mode 100644 manual/src/theme/css/chrome.css
create mode 100644 manual/src/theme/css/general.css
create mode 100644 manual/src/theme/css/print.css
create mode 100644 manual/src/theme/css/variables.css
create mode 100644 manual/src/theme/favicon.png
create mode 100644 manual/src/theme/index.hbs
diff --git a/Manual.md b/Manual.md
index 34c737e6df427d..44e7487c68c7fe 100644
--- a/Manual.md
+++ b/Manual.md
@@ -1,3 +1,4 @@
+<!-- mdbook:cut -->
# The XBPS source packages manual
This article contains an exhaustive manual of how to create new source
@@ -74,8 +75,10 @@ packages for XBPS, the `Void Linux` native packaging system.
* [Notes](#notes)
* [Contributing via git](#contributing)
* [Help](#help)
+<!-- mdbook:endcut -->
<a id="Introduction"></a>
+<!-- mdbook:page:introduction -->
### Introduction
The `void-packages` repository contains all the
@@ -122,8 +125,10 @@ If everything went fine after running
a binary package named `foo-1.0_1.<arch>.xbps` will be generated in the local repository
`hostdir/binpkgs`.
+<!-- mdbook:endpage -->
<a id="buildphase"></a>
+<!-- mdbook:page:buildphases -->
### Package build phases
Building a package consist of the following phases:
@@ -160,8 +165,10 @@ via `make install` or any other compatible method.
`xbps-src` supports running just the specified phase, and if it ran
successfully, the phase will be skipped later (unless its work directory
`${wrksrc}` is removed with `xbps-src clean`).
+<!-- mdbook:endpage -->
<a id="namingconventions"></a>
+<!-- mdbook:page:naming-conventions -->
### Package naming conventions
<a id="libs"></a>
@@ -237,8 +244,10 @@ is lowercase.
Programs can be split into program packages and library packages. The program
package should be named as described above. The library package should be
prefixed with "lib" (see section `Libraries`)
+<!-- mdbook:endpage -->
<a id="global_funcs"></a>
+<!-- mdbook:page:global-funcs -->
### Global functions
The following functions are defined by `xbps-src` and can be used on any template:
@@ -359,8 +368,10 @@ The following functions are defined by `xbps-src` and can be used on any templat
This is useful when used in conjunction with `skip_extraction`.
> Shell wildcards must be properly quoted, Example: `vmove "usr/lib/*.a"`.
+<!-- mdbook:endpage -->
<a id="global_vars"></a>
+<!-- mdbook:page:global-vars -->
### Global variables
The following variables are defined by `xbps-src` and can be used on any template:
@@ -424,8 +435,10 @@ in this directory such as `${XBPS_BUILDDIR}/${wrksrc}`.
- `XBPS_RUST_TARGET` The target architecture triplet used by `rustc` and `cargo`.
- `XBPS_BUILD_ENVIRONMENT` Enables continuous-integration-specific operations. Set to `void-packages-ci` if in continuous integration.
+<!-- mdbook:endpage -->
<a id="available_vars"></a>
+<!-- mdbook:page:available-vars -->
### Available variables
<a id="mandatory_vars"></a>
@@ -863,8 +876,10 @@ information on this map.
Finally, as a general rule, if a package is built the exact same way whether or
not a particular package is present in `makedepends` or `hostmakedepends`, that
package shouldn't be added as a build time dependency.
+<!-- mdbook:endpage -->
<a id="repositories"></a>
+<!-- mdbook:page:repositories -->
### Repositories
<a id="repo_by_branch"></a>
@@ -889,8 +904,10 @@ The following repository names are valid:
* `debug`: Repository for packages containing debug symbols. In almost all cases,
these packages are generated automatically.
* `nonfree`: Repository for packages that are closed source or have nonfree licenses.
+<!-- mdbook:endpage -->
<a id="updates"></a>
+<!-- mdbook:page:updates -->
### Checking for new upstream releases
New upstream versions can be automatically checked using
@@ -932,8 +949,10 @@ in url. Defaults to `(|\.x)`.
- `disabled` can be set to disable update checking for the package,
in cases where checking for updates is impossible or does not make sense.
This should be set to a string describing why it is disabled.
+<!-- mdbook:endpage -->
<a id="patches"></a>
+<!-- mdbook:page:patches -->
### Handling patches
Sometimes software needs to be patched, most commonly to fix bugs that have
@@ -955,8 +974,10 @@ xbps-src will only apply patches named in the `series` file.
be used to set the args passed to `patch(1)`. As an example, if `foo.patch` requires
special arguments to be passed to `patch(1)` that can't be used when applying other
patches, `foo.patch.args` can be created containing those args.
+<!-- mdbook:endpage -->
<a id="build_scripts"></a>
+<!-- mdbook:page:build-styles -->
### build style scripts
The `build_style` variable specifies the build method to build and install a
@@ -1083,8 +1104,10 @@ matching the `build_style` name, Example:
- `texmf` For texmf zip/tarballs that need to go into /usr/share/texmf-dist. Includes
duplicates handling.
+<!-- mdbook:endpage -->
<a id="build_helper"></a>
+<!-- mdbook:page:build-helpers -->
### build helper scripts
The `build_helper` variable specifies shell snippets to be sourced that will create a
@@ -1132,8 +1155,10 @@ This aims to fix cross-builds for when the build-style is mixed: e.g. when in a
- `rust` specifies environment variables required for cross-compiling crates via cargo and
for compiling cargo -sys crates. This helper is added by default for packages that use the
`cargo` build style.
+<!-- mdbook:endpage -->
<a id="functions"></a>
+<!-- mdbook:page:functions -->
### Functions
The following functions can be defined to change the behavior of how the
@@ -1197,8 +1222,10 @@ Current working directory for functions is set as follows:
- For post_patch through post_install: `build_wrksrc`
if it is defined, otherwise `wrksrc`.
+<!-- mdbook:endpage -->
<a id="build_options"></a>
+<!-- mdbook:page:build-options -->
### Build options
Some packages might be built with different build options to enable/disable
@@ -1307,8 +1334,10 @@ Example: `XBPS_PKG_OPTIONS_xorg_server=opt`.
The list of supported package build options and its description is defined in the
`common/options.description` file.
+<!-- mdbook:endpage -->
<a id="install_remove_files"></a>
+<!-- mdbook:page:install-remove-files -->
### INSTALL and REMOVE files
The INSTALL and REMOVE shell snippets can be used to execute certain actions at a specified
@@ -1351,8 +1380,10 @@ be executed via `chroot(2)` won't work correctly.
> NOTE: do not use INSTALL/REMOVE scripts to print messages, see the next section for
more information.
+<!-- mdbook:endpage -->
<a id="install_remove_files_msg"></a>
+<!-- mdbook:page:install-remove-msg-files -->
### INSTALL.msg and REMOVE.msg files
The `INSTALL.msg` and `REMOVE.msg` files can be used to print a message at post-install
@@ -1364,8 +1395,10 @@ subpackages can also have their own `INSTALL.msg` and `REMOVE.msg` files, simply
as `srcpkgs/<pkgname>/<subpkg>.INSTALL.msg` or `srcpkgs/<pkgname>/<subpkg>.REMOVE.msg` respectively.
This should only be used for critical messages, like warning users of breaking changes.
+<!-- mdbook:endpage -->
<a id="runtime_account_creation"></a>
+<!-- mdbook:page:account-creation -->
### Creating system accounts/groups at runtime
There's a trigger along with some variables that are specifically to create
@@ -1396,8 +1429,10 @@ accounts.
> NOTE: The underscore policy does not apply to old packages, due to the inevitable breakage of
> changing the username only new packages should follow it.
+<!-- mdbook:endpage -->
<a id="writing_runit_services"></a>
+<!-- mdbook:page:runit-services -->
### Writing runit services
Void Linux uses [runit](http://smarden.org/runit/) for booting and supervision of services.
@@ -1443,8 +1478,10 @@ Examples of when *not* to install systemd units:
1. When doing so changes runtime behavior of the packaged software.
2. When it is done via a compile time flag that also changes build dependencies.
+<!-- mdbook:endpage -->
<a id="32bit_pkgs"></a>
+<!-- mdbook:page:32bit-pkgs -->
### 32bit packages
32bit packages are built automatically when the builder is x86 (32bit), but
@@ -1465,8 +1502,10 @@ This expects the basename of the target file, Example: `lib32symlinks="foo"`.
- `lib32mode` If unset, only shared/static libraries and pkg-config files will be copied to the
**32bit** package. If set to `full` all files will be copied to the 32bit package, unmodified.
+<!-- mdbook:endpage -->
<a id="pkgs_sub"></a>
+<!-- mdbook:page:subpkgs -->
### Subpackages
In the example shown above just a binary package is generated, but with some
@@ -1525,8 +1564,10 @@ destdir (`$DESTDIR`) to the `subpackage` destdir (`$PKGDESTDIR`).
Subpackages are processed always in alphabetical order; To force a custom order,
the `subpackages` variable can be declared with the wanted order.
+<!-- mdbook:endpage -->
<a id="pkgs_classes"></a>
+<!-- mdbook:page:pkg-classes -->
### Some package classes
<a id="pkgs_development"></a>
@@ -1709,8 +1750,10 @@ following variables:
cache during the install/removal of the package
- `font_dirs`: which should be set to the directory where the package
installs its fonts
+<!-- mdbook:endpage -->
<a id="pkg_rename"></a>
+<!-- mdbook:page:renaming-pkgs -->
### Renaming a package
- Create empty package of old name, depending on new package. This is
@@ -1721,8 +1764,10 @@ old version and increased revision.
- Edit references to package in other templates and common/shlibs.
- Don't set `replaces=`, it can result in removing both packages from
systems by xbps.
+<!-- mdbook:endpage -->
<a id="pkg_remove"></a>
+<!-- mdbook:page:removing-pkgs -->
### Removing a package
Follows a list of things that should be done to help guarantee that a
@@ -1752,8 +1797,10 @@ template. All removed subpkgs should be added too.
This will uninstall package from systems where it is installed.
- Remove the package from the repository index
or contact a team member that can do so.
+<!-- mdbook:endpage -->
<a id="xbps_triggers"></a>
+<!-- mdbook:page:triggers -->
### XBPS Triggers
XBPS triggers are a collection of snippets of code, provided by the `xbps-triggers`
@@ -2151,16 +2198,20 @@ During removal it uses `xmlcatmgr` to remove all catalogs passed to it by the
To include this trigger use the `sgml_entries` variable or/and the `xml_entries` variable,
as the trigger won't do anything unless either of them are defined.
+<!-- mdbook:endpage -->
<a id="documentation"></a>
+<!-- mdbook:page:void-docs -->
### Void specific documentation
When you want document details of package's configuration and usage specific to Void Linux,
not covered by upstream documentation, put notes into
`srcpkgs/<pkgname>/files/README.voidlinux` and install with
`vdoc "${FILESDIR}/README.voidlinux"`.
+<!-- mdbook:endpage -->
<a id="notes"></a>
+<!-- mdbook:page:notes -->
### Notes
- Make sure that all software is configured to use the `/usr` prefix.
@@ -2178,8 +2229,10 @@ the installed files (`./xbps-src show-files pkg`) before pushing new updates.
- Make sure that binaries are not stripped by the software, let xbps-src do this;
otherwise the `debug` packages won't have debugging symbols.
+<!-- mdbook:endpage -->
<a id="contributing"></a>
+<!-- mdbook:page:contributing -->
### Contributing via git
To get started, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) the void-linux `void-packages` git repository on GitHub and clone it:
@@ -2197,8 +2250,10 @@ to pull in new changes:
$ git remote add upstream https://github.com/void-linux/void-packages.git
$ git pull --rebase upstream master
+<!-- mdbook:endpage -->
<a id="help"></a>
+<!-- mdbook:page:help -->
### Help
If after reading this `manual` you still need some kind of help, please join
diff --git a/manual/book.toml b/manual/book.toml
new file mode 100644
index 00000000000000..8f15412495ebcd
--- /dev/null
+++ b/manual/book.toml
@@ -0,0 +1,17 @@
+[book]
+authors = ["The Void Linux Team"]
+multilingual = false
+src = "src"
+title = "XBPS Source Packages Manual"
+
+[preprocessor.gen_manual]
+command = "python3 generate_mdbook.py"
+
+[output.html]
+# TODO: this should be a submodule or something
+# to avoid de-syncing with void-docs/src/theme
+theme = "src/theme"
+default-theme = "void-light"
+preferred-dark-theme = "void-dark"
+edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
+limit-results = 100
diff --git a/manual/generate_mdbook.py b/manual/generate_mdbook.py
new file mode 100644
index 00000000000000..259b067272a0ff
--- /dev/null
+++ b/manual/generate_mdbook.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+from dataclasses import asdict, dataclass, field
+import json
+from pathlib import Path
+import re
+import sys
+from typing import Optional
+
+
+BEGCUT_RE = re.compile("<!-- mdbook:cut -->")
+ENDCUT_RE = re.compile(r"<!-- mdbook:endcut -->")
+
+BEGPAGE_RE = re.compile(r"<!-- mdbook:page:(?P<name>[^ ]+) -->")
+ENDPAGE_RE = re.compile(r"<!-- mdbook:endpage -->")
+
+
+@dataclass
+class Chapter:
+ name: str
+ content: str
+ path: str
+ source_path: str
+ number: Optional[list[int]] = None
+ sub_items: list['Chapter'] = field(default_factory=list)
+ parent_names: list[str] = field(default_factory=list)
+
+
+@dataclass
+class Section:
+ Chapter: Chapter
+
+
+@dataclass
+class Book:
+ sections: list[Section]
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] == "supports":
+ raise SystemExit
+
+ doc = Path("Manual.md").read_text()
+
+ # remove TOC anchor links
+ doc = re.sub(r'<a id="[^"]+"></a>', "", doc)
+ # increase heading levels (Manual.md uses ### as the highest level)
+ doc = re.sub(r"^##(#+ .+)$", r"\1", doc, flags=re.MULTILINE)
+ # replace relative links with absolute ones
+ doc = re.sub(
+ r"\[(?P<text>[^\]]+)\]\(\./(?P<url>[^)]+)\)",
+ r"[\g<text>](https://github.com/void-linux/void-packages/blob/master/\g<url>)",
+ doc
+ )
+ if False:
+ print(doc)
+ raise SystemExit
+
+ sections = []
+ chapter = []
+ num = 1
+ heading = ""
+ filename = ""
+ in_section = False
+ in_cut = False
+
+ for lno, line in enumerate(doc.split("\n")):
+ if BEGCUT_RE.search(line):
+ in_cut = True
+ elif in_cut:
+ if ENDCUT_RE.search(line):
+ in_cut = False
+ elif BEGCUT_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-cut marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ elif m := BEGPAGE_RE.search(line):
+ filename = f"{m.group('name')}.md"
+ in_section = True
+ elif in_section:
+ if ENDPAGE_RE.search(line):
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+ num += 1
+ heading = ""
+ chapter = []
+ in_section = False
+ elif line.startswith("# ") and not heading:
+ _, _, heading = line.partition(" ")
+ chapter += [line]
+ elif BEGPAGE_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-page marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ else:
+ chapter += [line]
+
+ # get the last section
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+
+ # mdBook requires this key in the emitted json, for reasons unknown
+ book = asdict(Book(sections)) | {"__non_exhaustive": None}
+ print(json.dumps(book))
diff --git a/manual/src/SUMMARY.md b/manual/src/SUMMARY.md
new file mode 100644
index 00000000000000..73fa82d6e79c1a
--- /dev/null
+++ b/manual/src/SUMMARY.md
@@ -0,0 +1 @@
+<!-- leave this file empty. mdBook needs it but it will not be used -->
diff --git a/manual/src/theme/book.js b/manual/src/theme/book.js
new file mode 100644
index 00000000000000..d1a280f9eca341
--- /dev/null
+++ b/manual/src/theme/book.js
@@ -0,0 +1,119 @@
+"use strict";
+
+// Fix back button cache problem
+window.onunload = function () { };
+
+(function theme() {
+ var html = document.querySelector("html");
+ var themeToggleButton = document.getElementById("theme-toggle");
+
+ themeToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("void-light")) {
+ html.classList.replace("void-light", "void-dark");
+ localStorage.setItem('mdbook-theme', "void-dark");
+ } else {
+ html.classList.replace("void-dark", "void-light");
+ localStorage.setItem('mdbook-theme', "void-light");
+ }
+ });
+})();
+
+(function sidebar() {
+ var html = document.querySelector("html");
+ var sidebar = document.getElementById("sidebar");
+ var sidebarLinks = document.querySelectorAll('#sidebar a');
+ var sidebarToggleButton = document.getElementById("sidebar-toggle");
+ var firstContact = null;
+
+ function showSidebar() {
+ html.classList.remove('sidebar-hidden')
+ html.classList.add('sidebar-visible');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', 0);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', true);
+ sidebar.setAttribute('aria-hidden', false);
+ try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
+ }
+
+ function hideSidebar() {
+ html.classList.remove('sidebar-visible')
+ html.classList.add('sidebar-hidden');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', -1);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', false);
+ sidebar.setAttribute('aria-hidden', true);
+ try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { }
+ }
+
+ // Toggle sidebar
+ sidebarToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("sidebar-hidden")) {
+ showSidebar();
+ } else if (html.classList.contains("sidebar-visible")) {
+ hideSidebar();
+ } else {
+ if (getComputedStyle(sidebar)['transform'] === 'none') {
+ hideSidebar();
+ } else {
+ showSidebar();
+ }
+ }
+ });
+
+ document.addEventListener('touchstart', function (e) {
+ firstContact = {
+ x: e.touches[0].clientX,
+ time: Date.now()
+ };
+ }, { passive: true });
+
+ document.addEventListener('touchmove', function (e) {
+ if (!firstContact)
+ return;
+
+ var curX = e.touches[0].clientX;
+ var xDiff = curX - firstContact.x,
+ tDiff = Date.now() - firstContact.time;
+
+ if (tDiff < 250 && Math.abs(xDiff) >= 150) {
+ if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300))
+ showSidebar();
+ else if (xDiff < 0 && curX < 300)
+ hideSidebar();
+
+ firstContact = null;
+ }
+ }, { passive: true });
+
+ // Scroll sidebar to current active section
+ var activeSection = sidebar.querySelector(".active");
+ if (activeSection) {
+ sidebar.scrollTop = activeSection.offsetTop;
+ }
+})();
+
+(function chapterNavigation() {
+ document.addEventListener('keydown', function (e) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; }
+ if (window.search && window.search.hasFocus()) { return; }
+
+ switch (e.key) {
+ case 'ArrowRight':
+ e.preventDefault();
+ var nextButton = document.querySelector('.nav-chapters.next');
+ if (nextButton) {
+ window.location.href = nextButton.href;
+ }
+ break;
+ case 'ArrowLeft':
+ e.preventDefault();
+ var previousButton = document.querySelector('.nav-chapters.previous');
+ if (previousButton) {
+ window.location.href = previousButton.href;
+ }
+ break;
+ }
+ });
+})();
diff --git a/manual/src/theme/css/chrome.css b/manual/src/theme/css/chrome.css
new file mode 100644
index 00000000000000..544e7718ed9d2b
--- /dev/null
+++ b/manual/src/theme/css/chrome.css
@@ -0,0 +1,484 @@
+/* CSS for UI elements (a.k.a. chrome) */
+
+@import 'variables.css';
+
+::-webkit-scrollbar {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+html {
+ scrollbar-color: var(--scrollbar) var(--bg);
+}
+#searchresults a,
+.content a:link,
+a:visited,
+a > .hljs {
+ color: var(--links);
+}
+
+/* Menu Bar */
+
+#menu-bar,
+#menu-bar-hover-placeholder {
+ z-index: 101;
+ margin: auto calc(0px - var(--page-padding));
+}
+#menu-bar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ background-color: var(--bg);
+ border-bottom-color: var(--bg);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+#menu-bar.sticky,
+.js #menu-bar-hover-placeholder:hover + #menu-bar,
+.js #menu-bar:hover,
+.js.sidebar-visible #menu-bar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0 !important;
+}
+#menu-bar-hover-placeholder {
+ position: sticky;
+ position: -webkit-sticky;
+ top: 0;
+ height: var(--menu-bar-height);
+}
+#menu-bar.bordered {
+ border-bottom-color: var(--table-border-color);
+}
+#menu-bar i, #menu-bar .icon-button {
+ position: relative;
+ padding: 0 8px;
+ z-index: 10;
+ line-height: var(--menu-bar-height);
+ cursor: pointer;
+ transition: color 0.5s;
+}
+@media only screen and (max-width: 420px) {
+ #menu-bar i, #menu-bar .icon-button {
+ padding: 0 5px;
+ }
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ padding: 0;
+ color: inherit;
+}
+.icon-button i {
+ margin: 0;
+}
+
+.right-buttons {
+ margin: 0 15px;
+}
+.right-buttons a {
+ text-decoration: none;
+}
+
+.left-buttons {
+ display: flex;
+ margin: 0 5px;
+}
+.no-js .left-buttons {
+ display: none;
+}
+
+.menu-title {
+ display: inline-block;
+ font-weight: 200;
+ font-size: 2.4rem;
+ line-height: var(--menu-bar-height);
+ text-align: center;
+ margin: 0;
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.js .menu-title {
+ cursor: pointer;
+}
+
+.menu-bar,
+.menu-bar:visited,
+.nav-chapters,
+.nav-chapters:visited,
+.mobile-nav-chapters,
+.mobile-nav-chapters:visited,
+.menu-bar .icon-button,
+.menu-bar a i {
+ color: var(--icons);
+}
+
+.menu-bar i:hover,
+.menu-bar .icon-button:hover,
+.nav-chapters:hover,
+.mobile-nav-chapters i:hover {
+ color: var(--icons-hover);
+}
+
+/* Nav Icons */
+
+.nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ margin: 0;
+ max-width: 150px;
+ min-width: 90px;
+
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ flex-direction: column;
+
+ transition: color 0.5s, background-color 0.5s;
+}
+
+.nav-chapters:hover {
+ text-decoration: none;
+ transition: color 0.15s, color 0.15s;
+}
+
+.nav-wrapper {
+ margin-top: 50px;
+ display: none;
+}
+
+.mobile-nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+ width: 90px;
+ border-radius: 5px;
+ background-color: var(--sidebar-bg);
+}
+
+.previous {
+ float: left;
+}
+
+.next {
+ float: right;
+ right: var(--page-padding);
+}
+
+@media only screen and (max-width: 1080px) {
+ .nav-wide-wrapper { display: none; }
+ .nav-wrapper { display: block; }
+}
+
+@media only screen and (max-width: 1380px) {
+ .sidebar-visible .nav-wide-wrapper { display: none; }
+ .sidebar-visible .nav-wrapper { display: block; }
+}
+
+/* Inline code */
+
+:not(pre) > .hljs {
+ display: inline;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+}
+
+:not(pre):not(a) > .hljs {
+ color: var(--inline-code-color);
+ overflow-x: initial;
+}
+
+a:hover > .hljs {
+ text-decoration: underline;
+}
+
+pre {
+ position: relative;
+}
+pre > .buttons {
+ position: absolute;
+ z-index: 100;
+ right: 5px;
+ top: 5px;
+
+ color: var(--sidebar-fg);
+ cursor: pointer;
+}
+pre > .buttons :hover {
+ color: var(--sidebar-active);
+}
+pre > .buttons i {
+ margin-left: 8px;
+}
+pre > .buttons button {
+ color: inherit;
+ background: transparent;
+ border: none;
+ cursor: inherit;
+}
+pre > .result {
+ margin-top: 10px;
+}
+
+/* Search */
+
+#searchresults a {
+ text-decoration: none;
+}
+
+mark {
+ border-radius: 2px;
+ padding: 0 3px 1px 3px;
+ margin: 0 -3px -1px -3px;
+ background-color: var(--search-mark-bg);
+ transition: background-color 300ms linear;
+ cursor: pointer;
+}
+
+mark.fade-out {
+ background-color: rgba(0,0,0,0) !important;
+ cursor: auto;
+}
+
+.searchbar-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+}
+
+#searchbar {
+ width: 100%;
+ margin: 5px auto 0px auto;
+ padding: 10px 16px;
+ transition: box-shadow 300ms ease-in-out;
+ border: 1px solid var(--searchbar-border-color);
+ border-radius: 3px;
+ background-color: var(--searchbar-bg);
+ color: var(--searchbar-fg);
+}
+#searchbar:focus,
+#searchbar.active {
+ box-shadow: 0 0 3px var(--searchbar-shadow-color);
+}
+
+.searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+ color: var(--searchresults-header-fg);
+}
+
+.searchresults-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+ border-bottom: 1px dashed var(--searchresults-border-color);
+}
+
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults li.focus {
+ background-color: var(--searchresults-li-bg);
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+ul#searchresults span.teaser em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+/* Sidebar */
+
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: var(--sidebar-width);
+ font-size: 0.875em;
+ box-sizing: border-box;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior-y: contain;
+ background-color: var(--sidebar-bg);
+ color: var(--sidebar-fg);
+}
+.sidebar-resizing {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.js:not(.sidebar-resizing) .sidebar {
+ transition: transform 0.3s; /* Animation: slide away */
+}
+.sidebar code {
+ line-height: 2em;
+}
+/* .sidebar .sidebar-scrollbox {
+ overflow-y: auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 10px 10px;
+} */
+.sidebar .sidebar-resize-handle {
+ position: absolute;
+ cursor: col-resize;
+ width: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+.js .sidebar .sidebar-resize-handle {
+ cursor: col-resize;
+ width: 5px;
+}
+.sidebar-hidden .sidebar {
+ transform: translateX(calc(0px - var(--sidebar-width)));
+}
+.sidebar::-webkit-scrollbar {
+ background: var(--sidebar-bg);
+}
+.sidebar::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+
+.chapter {
+ list-style: none outside none;
+ padding-left: 0;
+ line-height: 2.2em;
+}
+
+.chapter ol {
+ width: 100%;
+}
+
+.chapter li {
+ display: flex;
+ color: var(--sidebar-non-existant);
+}
+.chapter li a {
+ display: block;
+ padding: 0;
+ text-decoration: none;
+ color: var(--sidebar-fg);
+}
+
+.chapter li a:hover {
+ color: var(--sidebar-active);
+}
+
+.chapter li a.active {
+ color: var(--sidebar-active);
+}
+
+.chapter li > a.toggle {
+ cursor: pointer;
+ display: block;
+ margin-left: auto;
+ padding: 0 10px;
+ user-select: none;
+ opacity: 0.68;
+}
+
+.chapter li > a.toggle div {
+ transition: transform 0.5s;
+}
+
+/* collapse the section */
+.chapter li:not(.expanded) + li > ol {
+ display: none;
+}
+
+.chapter li.chapter-item {
+ line-height: 1.5em;
+ margin-top: 0.6em;
+}
+
+.chapter li.expanded > a.toggle div {
+ transform: rotate(90deg);
+}
+
+.spacer {
+ width: 100%;
+ height: 3px;
+ margin: 5px 0px;
+}
+.chapter .spacer {
+ background-color: var(--sidebar-spacer);
+}
+
+@media (-moz-touch-enabled: 1), (pointer: coarse) {
+ .chapter li a { padding: 5px 0; }
+ .spacer { margin: 10px 0; }
+}
+
+.section {
+ list-style: none outside none;
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+
+/* Theme Menu Popup */
+
+.theme-popup {
+ position: absolute;
+ left: 10px;
+ top: var(--menu-bar-height);
+ z-index: 1000;
+ border-radius: 4px;
+ font-size: 0.7em;
+ color: var(--fg);
+ background: var(--theme-popup-bg);
+ border: 1px solid var(--theme-popup-border);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: none;
+}
+.theme-popup .default {
+ color: var(--icons);
+}
+.theme-popup .theme {
+ width: 100%;
+ border: 0;
+ margin: 0;
+ padding: 2px 10px;
+ line-height: 25px;
+ white-space: nowrap;
+ text-align: left;
+ cursor: pointer;
+ color: inherit;
+ background: inherit;
+ font-size: inherit;
+}
+.theme-popup .theme:hover {
+ background-color: var(--theme-hover);
+}
+.theme-popup .theme:hover:first-child,
+.theme-popup .theme:hover:last-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
diff --git a/manual/src/theme/css/general.css b/manual/src/theme/css/general.css
new file mode 100644
index 00000000000000..740ad0d140ef61
--- /dev/null
+++ b/manual/src/theme/css/general.css
@@ -0,0 +1,345 @@
+@import 'variables.css';
+
+body {
+ font-family: 'Ubuntu', sans-serif;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: var(--fg);
+ margin: 0;
+ background-color: var(--bg);
+}
+h1, h2, h3, h4, h5, h6 { color: var(--fg); }
+a, a:visited {
+ color: var(--links);
+ text-decoration: none;
+}
+a:hover, a:visited:hover {
+ color: var(--links-hover);
+ text-decoration: underline;
+}
+
+code {
+ background: var(--inline-code-color);
+ padding: 2px 4px;
+ border-radius: 4px;
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+}
+pre code {
+ padding: 0;
+ border-radius: 0;
+}
+pre {
+ padding: .5em;
+ margin: 1em 0;
+ background: var(--inline-code-color);
+ border: 1px solid var(--code-border);
+ border-radius: 4px;
+}
+
+blockquote {
+ margin: 20px 0;
+ padding: 0 20px;
+ padding-left: 1em;
+ background: var(--quote-bg);
+ border: 1px solid var(--quote-border);
+ border-left: none;
+ border-right: none;
+}
+
+blockquote code {
+ background: var(--quote-code-bg);
+}
+
+li.js-unavailable {
+ background-color: #f6cf68;
+ border-radius: 10px;
+ margin-left: 1em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+table {
+ border-collapse: collapse;
+ display: block;
+ overflow-y: auto;
+ border: 1px var(--table-border-color) solid;
+}
+table td {
+ padding: 3px 20px;
+}
+table thead {
+ background: var(--table-header-bg);
+ color: var(--table-header-fg);
+}
+table thead td {
+ font-weight: 700;
+}
+table tbody tr:nth-child(2n) {
+ /* Alternate background colors for rows */
+ background: var(--table-alternate-bg);
+}
+
+svg {
+ position: relative;
+ top: .125em;
+ width: 1em;
+ height: auto;
+}
+
+.hidden {
+ display: none;
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ cursor: pointer;
+ padding: 1em;
+}
+
+/* void navigation */
+
+#void-nav {
+ width: 100%;
+ min-height: 50px;
+ background: var(--nav-bg);
+ font-size: 14px;
+
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+#void-nav a,
+#void-nav button,
+#void-nav label {
+ fill: var(--nav-fg);
+ height: 50px;
+ min-height: 100%;
+ display: block;
+ line-height: 50px;
+ padding: 0 15px;
+ font-size: 1.2em;
+}
+#void-nav ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#void-nav ul#nav-right {
+ margin-left: auto;
+}
+
+#void-nav ul li {
+ display: inline-block;
+}
+#void-nav ul li a {
+ color: var(--nav-fg);
+ display: block;
+ padding: 0 15px;
+ line-height: 50px;
+ font-size: 1.2em;
+ text-decoration: none
+}
+#void-nav ul li a:hover,
+#void-nav ul li a:focus,
+#void-nav button:hover,
+#void-nav button:focus,
+#void-nav label:hover,
+#void-nav label:focus {
+ background: #000;
+}
+
+#skip-to-content {
+ position: absolute;
+ left: -999px;
+ top: -999px;
+}
+
+#skip-to-content:active,
+#skip-to-content:focus {
+ position: relative;
+ left: 0;
+ top: 0;
+}
+
+#icon-theme-light {
+ display: var(--theme-toggle-light);
+}
+#icon-theme-dark {
+ display: var(--theme-toggle-dark);
+}
+
+/* sidebar */
+
+.sidebar-hidden #sidebar {
+ display: none;
+}
+#sidebar {
+ padding: .5em;
+ background: var(--sidebar-bg);
+ font-size: 0.875em;
+ min-height: calc(100vh - 50px - 14px);
+}
+#sidebar ol {
+ list-style: none;
+ margin: 0;
+}
+#sidebar ol.chapter {
+ padding: 0;
+ line-height: 2.2em;
+}
+#sidebar ol.section {
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+#sidebar a {
+ color: var(--sidebar-fg);
+ display: block;
+}
+#sidebar a:hover {
+ color: var(--sidebar-active);
+ text-decoration: none;
+}
+#sidebar a.active {
+ color: var(--sidebar-active);
+}
+
+#sidebar-toggle {
+ display: none;
+}
+
+/* search */
+
+#searchbar {
+ width: 100%;
+ padding: 10px 16px;
+ margin: 5px 0;
+ border-radius: 3px;
+ border: 1px solid var(--searchbar-border-color);
+}
+#searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+}
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+
+/* chapter navigation */
+
+#nav-wide-wrapper {
+ max-width: 800px;
+ margin: 0 auto;
+ margin-top: 50px;
+}
+.previous {
+ float: left;
+}
+.next {
+ float: right;
+ right: 15px;
+}
+.nav-chapters {
+ fill: var(--nav-arrow-fg);
+ text-align: center;
+ text-decoration: none;
+ display: block;
+ max-width: 150px;
+ min-width: 90px;
+}
+.nav-chapters:hover {
+ text-decoration: none;
+ fill: var(--nav-fg-hover);
+}
+
+.nav-chapters svg {
+ margin: 0 auto;
+ width: 1.5em;
+}
+.mobile-nav-chapters {
+ fill: var(--nav-arrow-fg);
+}
+.mobile-nav-chapters:hover {
+ fill: var(--nav-fg-hover);
+}
+
+/* layout */
+
+body {
+ box-sizing: border-box;
+}
+#content {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+#page-wrapper {
+ --content-padding: 10px;
+ padding: 0 var(--content-padding);
+ width: calc(100% - var(--content-padding) * 2);
+}
+#search-wrapper,
+#page-wrapper main {
+ width: 100%;
+ max-width: 800px;
+ margin: 0 auto;
+}
+#sidebar {
+ max-width: 300px;
+ flex-shrink: 0;
+}
+
+/* 300px + 800px + 2*90px + 15px */
+@media only screen and (min-width: 1295px) {
+ .sidebar-visible #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-visible .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+}
+/* 800px + 2*90px + 15px */
+@media only screen and (min-width: 995px) {
+ .sidebar-hidden #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-hidden .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+ table {
+ display: table;
+ }
+}
diff --git a/manual/src/theme/css/print.css b/manual/src/theme/css/print.css
new file mode 100644
index 00000000000000..2970c2b6c7aba2
--- /dev/null
+++ b/manual/src/theme/css/print.css
@@ -0,0 +1,79 @@
+
+#sidebar,
+#menu-bar,
+#void-nav,
+.nav-chapters,
+.mobile-nav-chapters {
+ display: none;
+}
+
+#page-wrapper.page-wrapper {
+ transform: none;
+ margin-left: 0px;
+ overflow-y: initial;
+}
+
+#content {
+ max-width: none;
+ margin: 0;
+ padding: 0;
+}
+
+.page {
+ overflow-y: initial;
+}
+
+code {
+ background-color: #ddd;
+ border-radius: 5px;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+
+pre {
+ background-color: #ddd;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+pre > .buttons {
+ z-index: 2;
+}
+
+a, a:visited, a:active, a:hover {
+ color: #4183c4;
+ text-decoration: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+}
+
+pre, code {
+ page-break-inside: avoid;
+ white-space: pre-wrap;
+}
+
+svg {
+ display: none !important;
+}
+
+table {
+ color: black;
+ border-color: black;
+ background-color: unset;
+}
+
+table thead tr {
+ color: black;
+ background-color: unset;
+}
+
+table tbody tr {
+ background-color: unset;
+}
+
diff --git a/manual/src/theme/css/variables.css b/manual/src/theme/css/variables.css
new file mode 100644
index 00000000000000..ea306becc5fb5b
--- /dev/null
+++ b/manual/src/theme/css/variables.css
@@ -0,0 +1,107 @@
+
+/* Globals */
+
+:root {
+ --sidebar-width: 300px;
+ --page-padding: 15px;
+ --content-max-width: 750px;
+ --menu-bar-height: 50px;
+ --void-green: #478061;
+ --void-dark-green: #62b086;
+ --void-light: #fafafa;
+ --void-dark: #252525;
+}
+
+/* Themes */
+
+.void-light {
+ --bg: #ffffff;
+ --fg: #333;
+
+ --sidebar-bg: var(--void-light);
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: var(--void-green);
+ --nav-fg: var(--bg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #000;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #fdf6e3;
+ --code-border: #ccc;
+
+ --theme-toggle-light: none;
+ --theme-toggle-dark: inherit;
+
+ --quote-bg: #ebf4ef;
+ --quote-border: #d1e6da;
+ --quote-code-bg: var(--inline-code-color);
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: var(--void-light);
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
+
+.void-dark {
+ --bg: #222;
+ --fg: #ccc;
+
+ --sidebar-bg: #252525;
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: #295340;
+ --nav-fg: var(--fg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #fff;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-dark-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #353535;
+ --code-border: #111;
+
+ --theme-toggle-light: inherit;
+ --theme-toggle-dark: none;
+
+ --quote-bg: #293d35;
+ --quote-border: #22362e;
+ --quote-code-bg: #2a2a2a;
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: #2c2c2c;
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
diff --git a/manual/src/theme/favicon.png b/manual/src/theme/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ec045d08445cdd73c7413e01a89754827593f
GIT binary patch
literal 5800
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
literal 0
HcmV?d00001
diff --git a/manual/src/theme/index.hbs b/manual/src/theme/index.hbs
new file mode 100644
index 00000000000000..5679e803b1ba78
--- /dev/null
+++ b/manual/src/theme/index.hbs
@@ -0,0 +1,253 @@
+<!DOCTYPE HTML>
+<html lang="{{ language }}" class="sidebar-visible no-js {{ default_theme }}">
+ <head>
+ <!-- Book generated using mdBook -->
+ <meta charset="UTF-8">
+ <title>{{ title }}</title>
+ {{#if is_print }}
+ <meta name="robots" content="noindex" />
+ {{/if}}
+ {{#if base_url}}
+ <base href="{{ base_url }}">
+ {{/if}}
+
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="description" content="{{ description }}">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff" />
+
+ <link rel="shortcut icon" href="{{ path_to_root }}favicon.png">
+ <link rel="stylesheet" href="{{ path_to_root }}css/variables.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/general.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/chrome.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/print.css" media="print">
+ </head>
+ <body>
+ <!-- Provide site root to javascript -->
+ <script type="text/javascript">
+ var path_to_root = "{{ path_to_root }}";
+ var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
+ </script>
+ <!-- Work around some values being stored in localStorage wrapped in quotes -->
+ <script type="text/javascript">
+ try {
+ var theme = localStorage.getItem('mdbook-theme');
+ var sidebar = localStorage.getItem('mdbook-sidebar');
+
+ if (theme.startsWith('"') && theme.endsWith('"')) {
+ localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
+ }
+ if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
+ localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
+ }
+ } catch (e) { }
+ </script>
+
+ <!-- Set the theme before any content is loaded, prevents flash -->
+ <script type="text/javascript">
+ var theme;
+ try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+ if (theme === null || theme === undefined) { theme = default_theme; }
+ var html = document.querySelector('html');
+ html.classList.remove('no-js')
+ html.classList.remove('{{ default_theme }}')
+ html.classList.add(theme);
+ html.classList.add('js');
+ </script>
+
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <header>
+ <nav id="void-nav">
+ <ul>
+ <li><a id="skip-to-content" tabindex="1" href="#main">Skip to content</a></li>
+ <li>
+ <a id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z"/>
+ </svg>
+ </a>
+ </li>
+ <li>
+ <a id="theme-toggle" class="icon-button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
+ <svg id="icon-theme-light" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/>
+ </svg>
+ <svg id="icon-theme-dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"/>
+ </svg>
+ </a>
+ </li>
+ {{#if print_enable}}
+ <li>
+ <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if git_repository_edit_url}}
+ <li>
+ <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
+ <path d="M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if search_enabled}}
+ <li>
+ <a id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46C10.79 14.43 9.21 15 7.5 15 3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/>
+ </svg>
+ </a>
+ </li>
+ <noscript>
+ <li class="js-unavailable">Search functionality requires JavaScript</li>
+ </noscript>
+ {{/if}}
+ </ul>
+ <ul id="nav-right">
+ <li><a href="https://www.voidlinux.org">Home</a></li>
+ <li><a href="https://www.voidlinux.org/news/">News</a></li>
+ <li><a href="https://www.voidlinux.org/download/">Download</a></li>
+ <li><a href="https://www.voidlinux.org/packages/">Packages</a></li>
+ <li><a href="https://docs.voidlinux.org">Documentation</a></li>
+ <li><a href="https://man.voidlinux.org/">Manual Pages</a></li>
+ <li><a href="https://github.com/void-linux">GitHub</a></li>
+ </ul>
+ </nav>
+ </header>
+
+ <div id="content">
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <nav id="sidebar" aria-label="Table of contents">
+ {{#toc}}{{/toc}}
+ </nav>
+
+ <div id="page-wrapper" class="page-wrapper">
+
+
+ {{#if search_enabled}}
+ <div id="search-wrapper" class="hidden">
+ <form id="searchbar-outer" class="searchbar-outer">
+ <input type="search" name="search" id="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
+ </form>
+ <div id="searchresults-outer" class="searchresults-outer hidden">
+ <div id="searchresults-header" class="searchresults-header"></div>
+ <ul id="searchresults">
+ </ul>
+ </div>
+ </div>
+ {{/if}}
+
+ <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
+ <script type="text/javascript">
+ document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
+ document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
+ Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
+ link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
+ });
+ </script>
+
+ <main id="main">
+ {{{ content }}}
+ </main>
+
+ <nav class="nav-wrapper" aria-label="Page navigation">
+ <!-- Mobile navigation buttons -->
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+
+ <div style="clear: both"></div>
+ </nav>
+
+ <nav class="nav-wide-wrapper" aria-label="Page navigation">
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+ </nav>
+ </div>
+ </div>
+
+ {{#if livereload}}
+ <!-- Livereload script (if served using the cli tool) -->
+ <script type="text/javascript">
+ var socket = new WebSocket("{{{livereload}}}");
+ socket.onmessage = function (event) {
+ if (event.data === "reload") {
+ socket.close();
+ location.reload(true); // force reload from server (not from cache)
+ }
+ };
+
+ window.onbeforeunload = function() {
+ socket.close();
+ }
+ </script>
+ {{/if}}
+
+ {{#if search_js}}
+ <script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script>
+ {{/if}}
+
+ <script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script>
+ {{#if is_print}}
+ <script type="text/javascript">
+ window.addEventListener('load', function() {
+ window.setTimeout(window.print, 100);
+ });
+ </script>
+ {{/if}}
+ </body>
+</html>
From cd223c81a3bd2cbe252e98bb1ad2d68a57463ac7 Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 1 Apr 2022 15:24:18 -0400
Subject: [PATCH 2/2] manual/: add linkcheck, CI for checking Manual.md changes
---
.github/workflows/manual.yml | 28 ++++++++++++++++++++++++++++
common/travis/manual-ci.sh | 10 ++++++++++
manual/book.toml | 7 ++++++-
3 files changed, 44 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/manual.yml
create mode 100755 common/travis/manual-ci.sh
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
new file mode 100644
index 00000000000000..ddcf67a9f9a6f6
--- /dev/null
+++ b/.github/workflows/manual.yml
@@ -0,0 +1,28 @@
+name: Check Manual Changes
+
+on:
+ pull_request:
+ paths:
+ - 'Manual.md'
+ - 'manual/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ manual:
+ name: Check formatting and links
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/void-linux/void-musl:20231230R1
+ steps:
+ - name: Prepare container
+ run: |
+ xbps-install -Syu || xbps-install -Syu xbps
+ xbps-install -yu
+ xbps-install -y mdBook mdbook-linkcheck
+ - name: Clone and checkout
+ uses: classabbyamp/treeless-checkout-action@v1
+ - run: ./common/travis/manual-ci.sh
+
diff --git a/common/travis/manual-ci.sh b/common/travis/manual-ci.sh
new file mode 100755
index 00000000000000..34281e42bf12af
--- /dev/null
+++ b/common/travis/manual-ci.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+echo "Checking links"
+RUST_LOG=linkcheck=debug mdbook build manual
+LINKCHECK=$?
+
+# Generate exit value
+if [ ! $LINKCHECK -eq 0 ] ; then
+ exit 2
+fi
diff --git a/manual/book.toml b/manual/book.toml
index 8f15412495ebcd..2a98cbe327af3e 100644
--- a/manual/book.toml
+++ b/manual/book.toml
@@ -5,7 +5,7 @@ src = "src"
title = "XBPS Source Packages Manual"
[preprocessor.gen_manual]
-command = "python3 generate_mdbook.py"
+command = "python3 manual/generate_mdbook.py"
[output.html]
# TODO: this should be a submodule or something
@@ -15,3 +15,8 @@ default-theme = "void-light"
preferred-dark-theme = "void-dark"
edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
limit-results = 100
+
+[output.linkcheck]
+optional = true
+follow-web-links = true
+exclude = [ "https://docs.github.com/en/get-started/quickstart/fork-a-repo" ]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PR PATCH] [Updated] Manual: generate mdbook version
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
@ 2024-02-12 20:45 ` classabbyamp
2024-02-12 20:46 ` classabbyamp
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2024-02-12 20:45 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 632 bytes --]
There is an updated pull request by classabbyamp against master on the void-packages repository
https://github.com/classabbyamp/void-packages manual-mdbook
https://github.com/void-linux/void-packages/pull/48677
Manual: generate mdbook version
#35856 rises from the ashes, this time with cleaner code and less reliance on the markdown!
still working on the theming, and I'd maybe like to do a go-through of the manual updating everything before or after this is merged
#### Testing the changes
- I tested the changes in this PR: **YES**
A patch file from https://github.com/void-linux/void-packages/pull/48677.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-manual-mdbook-48677.patch --]
[-- Type: text/x-diff, Size: 64418 bytes --]
From be8a7fdcedcbc0287c6aca79e4c8f665d806b45b Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 25 Feb 2022 21:36:12 -0500
Subject: [PATCH 1/3] manual/: Add script to generate mdbook of Manual.md
---
Manual.md | 55 ++++
manual/book.toml | 17 +
manual/generate_mdbook.py | 125 ++++++++
manual/src/SUMMARY.md | 1 +
manual/src/theme/book.js | 119 +++++++
manual/src/theme/css/chrome.css | 484 +++++++++++++++++++++++++++++
manual/src/theme/css/general.css | 345 ++++++++++++++++++++
manual/src/theme/css/print.css | 79 +++++
manual/src/theme/css/variables.css | 107 +++++++
manual/src/theme/favicon.png | Bin 0 -> 5800 bytes
manual/src/theme/index.hbs | 253 +++++++++++++++
11 files changed, 1585 insertions(+)
create mode 100644 manual/book.toml
create mode 100644 manual/generate_mdbook.py
create mode 100644 manual/src/SUMMARY.md
create mode 100644 manual/src/theme/book.js
create mode 100644 manual/src/theme/css/chrome.css
create mode 100644 manual/src/theme/css/general.css
create mode 100644 manual/src/theme/css/print.css
create mode 100644 manual/src/theme/css/variables.css
create mode 100644 manual/src/theme/favicon.png
create mode 100644 manual/src/theme/index.hbs
diff --git a/Manual.md b/Manual.md
index 34c737e6df427d..44e7487c68c7fe 100644
--- a/Manual.md
+++ b/Manual.md
@@ -1,3 +1,4 @@
+<!-- mdbook:cut -->
# The XBPS source packages manual
This article contains an exhaustive manual of how to create new source
@@ -74,8 +75,10 @@ packages for XBPS, the `Void Linux` native packaging system.
* [Notes](#notes)
* [Contributing via git](#contributing)
* [Help](#help)
+<!-- mdbook:endcut -->
<a id="Introduction"></a>
+<!-- mdbook:page:introduction -->
### Introduction
The `void-packages` repository contains all the
@@ -122,8 +125,10 @@ If everything went fine after running
a binary package named `foo-1.0_1.<arch>.xbps` will be generated in the local repository
`hostdir/binpkgs`.
+<!-- mdbook:endpage -->
<a id="buildphase"></a>
+<!-- mdbook:page:buildphases -->
### Package build phases
Building a package consist of the following phases:
@@ -160,8 +165,10 @@ via `make install` or any other compatible method.
`xbps-src` supports running just the specified phase, and if it ran
successfully, the phase will be skipped later (unless its work directory
`${wrksrc}` is removed with `xbps-src clean`).
+<!-- mdbook:endpage -->
<a id="namingconventions"></a>
+<!-- mdbook:page:naming-conventions -->
### Package naming conventions
<a id="libs"></a>
@@ -237,8 +244,10 @@ is lowercase.
Programs can be split into program packages and library packages. The program
package should be named as described above. The library package should be
prefixed with "lib" (see section `Libraries`)
+<!-- mdbook:endpage -->
<a id="global_funcs"></a>
+<!-- mdbook:page:global-funcs -->
### Global functions
The following functions are defined by `xbps-src` and can be used on any template:
@@ -359,8 +368,10 @@ The following functions are defined by `xbps-src` and can be used on any templat
This is useful when used in conjunction with `skip_extraction`.
> Shell wildcards must be properly quoted, Example: `vmove "usr/lib/*.a"`.
+<!-- mdbook:endpage -->
<a id="global_vars"></a>
+<!-- mdbook:page:global-vars -->
### Global variables
The following variables are defined by `xbps-src` and can be used on any template:
@@ -424,8 +435,10 @@ in this directory such as `${XBPS_BUILDDIR}/${wrksrc}`.
- `XBPS_RUST_TARGET` The target architecture triplet used by `rustc` and `cargo`.
- `XBPS_BUILD_ENVIRONMENT` Enables continuous-integration-specific operations. Set to `void-packages-ci` if in continuous integration.
+<!-- mdbook:endpage -->
<a id="available_vars"></a>
+<!-- mdbook:page:available-vars -->
### Available variables
<a id="mandatory_vars"></a>
@@ -863,8 +876,10 @@ information on this map.
Finally, as a general rule, if a package is built the exact same way whether or
not a particular package is present in `makedepends` or `hostmakedepends`, that
package shouldn't be added as a build time dependency.
+<!-- mdbook:endpage -->
<a id="repositories"></a>
+<!-- mdbook:page:repositories -->
### Repositories
<a id="repo_by_branch"></a>
@@ -889,8 +904,10 @@ The following repository names are valid:
* `debug`: Repository for packages containing debug symbols. In almost all cases,
these packages are generated automatically.
* `nonfree`: Repository for packages that are closed source or have nonfree licenses.
+<!-- mdbook:endpage -->
<a id="updates"></a>
+<!-- mdbook:page:updates -->
### Checking for new upstream releases
New upstream versions can be automatically checked using
@@ -932,8 +949,10 @@ in url. Defaults to `(|\.x)`.
- `disabled` can be set to disable update checking for the package,
in cases where checking for updates is impossible or does not make sense.
This should be set to a string describing why it is disabled.
+<!-- mdbook:endpage -->
<a id="patches"></a>
+<!-- mdbook:page:patches -->
### Handling patches
Sometimes software needs to be patched, most commonly to fix bugs that have
@@ -955,8 +974,10 @@ xbps-src will only apply patches named in the `series` file.
be used to set the args passed to `patch(1)`. As an example, if `foo.patch` requires
special arguments to be passed to `patch(1)` that can't be used when applying other
patches, `foo.patch.args` can be created containing those args.
+<!-- mdbook:endpage -->
<a id="build_scripts"></a>
+<!-- mdbook:page:build-styles -->
### build style scripts
The `build_style` variable specifies the build method to build and install a
@@ -1083,8 +1104,10 @@ matching the `build_style` name, Example:
- `texmf` For texmf zip/tarballs that need to go into /usr/share/texmf-dist. Includes
duplicates handling.
+<!-- mdbook:endpage -->
<a id="build_helper"></a>
+<!-- mdbook:page:build-helpers -->
### build helper scripts
The `build_helper` variable specifies shell snippets to be sourced that will create a
@@ -1132,8 +1155,10 @@ This aims to fix cross-builds for when the build-style is mixed: e.g. when in a
- `rust` specifies environment variables required for cross-compiling crates via cargo and
for compiling cargo -sys crates. This helper is added by default for packages that use the
`cargo` build style.
+<!-- mdbook:endpage -->
<a id="functions"></a>
+<!-- mdbook:page:functions -->
### Functions
The following functions can be defined to change the behavior of how the
@@ -1197,8 +1222,10 @@ Current working directory for functions is set as follows:
- For post_patch through post_install: `build_wrksrc`
if it is defined, otherwise `wrksrc`.
+<!-- mdbook:endpage -->
<a id="build_options"></a>
+<!-- mdbook:page:build-options -->
### Build options
Some packages might be built with different build options to enable/disable
@@ -1307,8 +1334,10 @@ Example: `XBPS_PKG_OPTIONS_xorg_server=opt`.
The list of supported package build options and its description is defined in the
`common/options.description` file.
+<!-- mdbook:endpage -->
<a id="install_remove_files"></a>
+<!-- mdbook:page:install-remove-files -->
### INSTALL and REMOVE files
The INSTALL and REMOVE shell snippets can be used to execute certain actions at a specified
@@ -1351,8 +1380,10 @@ be executed via `chroot(2)` won't work correctly.
> NOTE: do not use INSTALL/REMOVE scripts to print messages, see the next section for
more information.
+<!-- mdbook:endpage -->
<a id="install_remove_files_msg"></a>
+<!-- mdbook:page:install-remove-msg-files -->
### INSTALL.msg and REMOVE.msg files
The `INSTALL.msg` and `REMOVE.msg` files can be used to print a message at post-install
@@ -1364,8 +1395,10 @@ subpackages can also have their own `INSTALL.msg` and `REMOVE.msg` files, simply
as `srcpkgs/<pkgname>/<subpkg>.INSTALL.msg` or `srcpkgs/<pkgname>/<subpkg>.REMOVE.msg` respectively.
This should only be used for critical messages, like warning users of breaking changes.
+<!-- mdbook:endpage -->
<a id="runtime_account_creation"></a>
+<!-- mdbook:page:account-creation -->
### Creating system accounts/groups at runtime
There's a trigger along with some variables that are specifically to create
@@ -1396,8 +1429,10 @@ accounts.
> NOTE: The underscore policy does not apply to old packages, due to the inevitable breakage of
> changing the username only new packages should follow it.
+<!-- mdbook:endpage -->
<a id="writing_runit_services"></a>
+<!-- mdbook:page:runit-services -->
### Writing runit services
Void Linux uses [runit](http://smarden.org/runit/) for booting and supervision of services.
@@ -1443,8 +1478,10 @@ Examples of when *not* to install systemd units:
1. When doing so changes runtime behavior of the packaged software.
2. When it is done via a compile time flag that also changes build dependencies.
+<!-- mdbook:endpage -->
<a id="32bit_pkgs"></a>
+<!-- mdbook:page:32bit-pkgs -->
### 32bit packages
32bit packages are built automatically when the builder is x86 (32bit), but
@@ -1465,8 +1502,10 @@ This expects the basename of the target file, Example: `lib32symlinks="foo"`.
- `lib32mode` If unset, only shared/static libraries and pkg-config files will be copied to the
**32bit** package. If set to `full` all files will be copied to the 32bit package, unmodified.
+<!-- mdbook:endpage -->
<a id="pkgs_sub"></a>
+<!-- mdbook:page:subpkgs -->
### Subpackages
In the example shown above just a binary package is generated, but with some
@@ -1525,8 +1564,10 @@ destdir (`$DESTDIR`) to the `subpackage` destdir (`$PKGDESTDIR`).
Subpackages are processed always in alphabetical order; To force a custom order,
the `subpackages` variable can be declared with the wanted order.
+<!-- mdbook:endpage -->
<a id="pkgs_classes"></a>
+<!-- mdbook:page:pkg-classes -->
### Some package classes
<a id="pkgs_development"></a>
@@ -1709,8 +1750,10 @@ following variables:
cache during the install/removal of the package
- `font_dirs`: which should be set to the directory where the package
installs its fonts
+<!-- mdbook:endpage -->
<a id="pkg_rename"></a>
+<!-- mdbook:page:renaming-pkgs -->
### Renaming a package
- Create empty package of old name, depending on new package. This is
@@ -1721,8 +1764,10 @@ old version and increased revision.
- Edit references to package in other templates and common/shlibs.
- Don't set `replaces=`, it can result in removing both packages from
systems by xbps.
+<!-- mdbook:endpage -->
<a id="pkg_remove"></a>
+<!-- mdbook:page:removing-pkgs -->
### Removing a package
Follows a list of things that should be done to help guarantee that a
@@ -1752,8 +1797,10 @@ template. All removed subpkgs should be added too.
This will uninstall package from systems where it is installed.
- Remove the package from the repository index
or contact a team member that can do so.
+<!-- mdbook:endpage -->
<a id="xbps_triggers"></a>
+<!-- mdbook:page:triggers -->
### XBPS Triggers
XBPS triggers are a collection of snippets of code, provided by the `xbps-triggers`
@@ -2151,16 +2198,20 @@ During removal it uses `xmlcatmgr` to remove all catalogs passed to it by the
To include this trigger use the `sgml_entries` variable or/and the `xml_entries` variable,
as the trigger won't do anything unless either of them are defined.
+<!-- mdbook:endpage -->
<a id="documentation"></a>
+<!-- mdbook:page:void-docs -->
### Void specific documentation
When you want document details of package's configuration and usage specific to Void Linux,
not covered by upstream documentation, put notes into
`srcpkgs/<pkgname>/files/README.voidlinux` and install with
`vdoc "${FILESDIR}/README.voidlinux"`.
+<!-- mdbook:endpage -->
<a id="notes"></a>
+<!-- mdbook:page:notes -->
### Notes
- Make sure that all software is configured to use the `/usr` prefix.
@@ -2178,8 +2229,10 @@ the installed files (`./xbps-src show-files pkg`) before pushing new updates.
- Make sure that binaries are not stripped by the software, let xbps-src do this;
otherwise the `debug` packages won't have debugging symbols.
+<!-- mdbook:endpage -->
<a id="contributing"></a>
+<!-- mdbook:page:contributing -->
### Contributing via git
To get started, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) the void-linux `void-packages` git repository on GitHub and clone it:
@@ -2197,8 +2250,10 @@ to pull in new changes:
$ git remote add upstream https://github.com/void-linux/void-packages.git
$ git pull --rebase upstream master
+<!-- mdbook:endpage -->
<a id="help"></a>
+<!-- mdbook:page:help -->
### Help
If after reading this `manual` you still need some kind of help, please join
diff --git a/manual/book.toml b/manual/book.toml
new file mode 100644
index 00000000000000..8f15412495ebcd
--- /dev/null
+++ b/manual/book.toml
@@ -0,0 +1,17 @@
+[book]
+authors = ["The Void Linux Team"]
+multilingual = false
+src = "src"
+title = "XBPS Source Packages Manual"
+
+[preprocessor.gen_manual]
+command = "python3 generate_mdbook.py"
+
+[output.html]
+# TODO: this should be a submodule or something
+# to avoid de-syncing with void-docs/src/theme
+theme = "src/theme"
+default-theme = "void-light"
+preferred-dark-theme = "void-dark"
+edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
+limit-results = 100
diff --git a/manual/generate_mdbook.py b/manual/generate_mdbook.py
new file mode 100644
index 00000000000000..259b067272a0ff
--- /dev/null
+++ b/manual/generate_mdbook.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+from dataclasses import asdict, dataclass, field
+import json
+from pathlib import Path
+import re
+import sys
+from typing import Optional
+
+
+BEGCUT_RE = re.compile("<!-- mdbook:cut -->")
+ENDCUT_RE = re.compile(r"<!-- mdbook:endcut -->")
+
+BEGPAGE_RE = re.compile(r"<!-- mdbook:page:(?P<name>[^ ]+) -->")
+ENDPAGE_RE = re.compile(r"<!-- mdbook:endpage -->")
+
+
+@dataclass
+class Chapter:
+ name: str
+ content: str
+ path: str
+ source_path: str
+ number: Optional[list[int]] = None
+ sub_items: list['Chapter'] = field(default_factory=list)
+ parent_names: list[str] = field(default_factory=list)
+
+
+@dataclass
+class Section:
+ Chapter: Chapter
+
+
+@dataclass
+class Book:
+ sections: list[Section]
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] == "supports":
+ raise SystemExit
+
+ doc = Path("Manual.md").read_text()
+
+ # remove TOC anchor links
+ doc = re.sub(r'<a id="[^"]+"></a>', "", doc)
+ # increase heading levels (Manual.md uses ### as the highest level)
+ doc = re.sub(r"^##(#+ .+)$", r"\1", doc, flags=re.MULTILINE)
+ # replace relative links with absolute ones
+ doc = re.sub(
+ r"\[(?P<text>[^\]]+)\]\(\./(?P<url>[^)]+)\)",
+ r"[\g<text>](https://github.com/void-linux/void-packages/blob/master/\g<url>)",
+ doc
+ )
+ if False:
+ print(doc)
+ raise SystemExit
+
+ sections = []
+ chapter = []
+ num = 1
+ heading = ""
+ filename = ""
+ in_section = False
+ in_cut = False
+
+ for lno, line in enumerate(doc.split("\n")):
+ if BEGCUT_RE.search(line):
+ in_cut = True
+ elif in_cut:
+ if ENDCUT_RE.search(line):
+ in_cut = False
+ elif BEGCUT_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-cut marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ elif m := BEGPAGE_RE.search(line):
+ filename = f"{m.group('name')}.md"
+ in_section = True
+ elif in_section:
+ if ENDPAGE_RE.search(line):
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+ num += 1
+ heading = ""
+ chapter = []
+ in_section = False
+ elif line.startswith("# ") and not heading:
+ _, _, heading = line.partition(" ")
+ chapter += [line]
+ elif BEGPAGE_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-page marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ else:
+ chapter += [line]
+
+ # get the last section
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+
+ # mdBook requires this key in the emitted json, for reasons unknown
+ book = asdict(Book(sections)) | {"__non_exhaustive": None}
+ print(json.dumps(book))
diff --git a/manual/src/SUMMARY.md b/manual/src/SUMMARY.md
new file mode 100644
index 00000000000000..73fa82d6e79c1a
--- /dev/null
+++ b/manual/src/SUMMARY.md
@@ -0,0 +1 @@
+<!-- leave this file empty. mdBook needs it but it will not be used -->
diff --git a/manual/src/theme/book.js b/manual/src/theme/book.js
new file mode 100644
index 00000000000000..d1a280f9eca341
--- /dev/null
+++ b/manual/src/theme/book.js
@@ -0,0 +1,119 @@
+"use strict";
+
+// Fix back button cache problem
+window.onunload = function () { };
+
+(function theme() {
+ var html = document.querySelector("html");
+ var themeToggleButton = document.getElementById("theme-toggle");
+
+ themeToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("void-light")) {
+ html.classList.replace("void-light", "void-dark");
+ localStorage.setItem('mdbook-theme', "void-dark");
+ } else {
+ html.classList.replace("void-dark", "void-light");
+ localStorage.setItem('mdbook-theme', "void-light");
+ }
+ });
+})();
+
+(function sidebar() {
+ var html = document.querySelector("html");
+ var sidebar = document.getElementById("sidebar");
+ var sidebarLinks = document.querySelectorAll('#sidebar a');
+ var sidebarToggleButton = document.getElementById("sidebar-toggle");
+ var firstContact = null;
+
+ function showSidebar() {
+ html.classList.remove('sidebar-hidden')
+ html.classList.add('sidebar-visible');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', 0);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', true);
+ sidebar.setAttribute('aria-hidden', false);
+ try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
+ }
+
+ function hideSidebar() {
+ html.classList.remove('sidebar-visible')
+ html.classList.add('sidebar-hidden');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', -1);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', false);
+ sidebar.setAttribute('aria-hidden', true);
+ try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { }
+ }
+
+ // Toggle sidebar
+ sidebarToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("sidebar-hidden")) {
+ showSidebar();
+ } else if (html.classList.contains("sidebar-visible")) {
+ hideSidebar();
+ } else {
+ if (getComputedStyle(sidebar)['transform'] === 'none') {
+ hideSidebar();
+ } else {
+ showSidebar();
+ }
+ }
+ });
+
+ document.addEventListener('touchstart', function (e) {
+ firstContact = {
+ x: e.touches[0].clientX,
+ time: Date.now()
+ };
+ }, { passive: true });
+
+ document.addEventListener('touchmove', function (e) {
+ if (!firstContact)
+ return;
+
+ var curX = e.touches[0].clientX;
+ var xDiff = curX - firstContact.x,
+ tDiff = Date.now() - firstContact.time;
+
+ if (tDiff < 250 && Math.abs(xDiff) >= 150) {
+ if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300))
+ showSidebar();
+ else if (xDiff < 0 && curX < 300)
+ hideSidebar();
+
+ firstContact = null;
+ }
+ }, { passive: true });
+
+ // Scroll sidebar to current active section
+ var activeSection = sidebar.querySelector(".active");
+ if (activeSection) {
+ sidebar.scrollTop = activeSection.offsetTop;
+ }
+})();
+
+(function chapterNavigation() {
+ document.addEventListener('keydown', function (e) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; }
+ if (window.search && window.search.hasFocus()) { return; }
+
+ switch (e.key) {
+ case 'ArrowRight':
+ e.preventDefault();
+ var nextButton = document.querySelector('.nav-chapters.next');
+ if (nextButton) {
+ window.location.href = nextButton.href;
+ }
+ break;
+ case 'ArrowLeft':
+ e.preventDefault();
+ var previousButton = document.querySelector('.nav-chapters.previous');
+ if (previousButton) {
+ window.location.href = previousButton.href;
+ }
+ break;
+ }
+ });
+})();
diff --git a/manual/src/theme/css/chrome.css b/manual/src/theme/css/chrome.css
new file mode 100644
index 00000000000000..544e7718ed9d2b
--- /dev/null
+++ b/manual/src/theme/css/chrome.css
@@ -0,0 +1,484 @@
+/* CSS for UI elements (a.k.a. chrome) */
+
+@import 'variables.css';
+
+::-webkit-scrollbar {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+html {
+ scrollbar-color: var(--scrollbar) var(--bg);
+}
+#searchresults a,
+.content a:link,
+a:visited,
+a > .hljs {
+ color: var(--links);
+}
+
+/* Menu Bar */
+
+#menu-bar,
+#menu-bar-hover-placeholder {
+ z-index: 101;
+ margin: auto calc(0px - var(--page-padding));
+}
+#menu-bar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ background-color: var(--bg);
+ border-bottom-color: var(--bg);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+#menu-bar.sticky,
+.js #menu-bar-hover-placeholder:hover + #menu-bar,
+.js #menu-bar:hover,
+.js.sidebar-visible #menu-bar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0 !important;
+}
+#menu-bar-hover-placeholder {
+ position: sticky;
+ position: -webkit-sticky;
+ top: 0;
+ height: var(--menu-bar-height);
+}
+#menu-bar.bordered {
+ border-bottom-color: var(--table-border-color);
+}
+#menu-bar i, #menu-bar .icon-button {
+ position: relative;
+ padding: 0 8px;
+ z-index: 10;
+ line-height: var(--menu-bar-height);
+ cursor: pointer;
+ transition: color 0.5s;
+}
+@media only screen and (max-width: 420px) {
+ #menu-bar i, #menu-bar .icon-button {
+ padding: 0 5px;
+ }
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ padding: 0;
+ color: inherit;
+}
+.icon-button i {
+ margin: 0;
+}
+
+.right-buttons {
+ margin: 0 15px;
+}
+.right-buttons a {
+ text-decoration: none;
+}
+
+.left-buttons {
+ display: flex;
+ margin: 0 5px;
+}
+.no-js .left-buttons {
+ display: none;
+}
+
+.menu-title {
+ display: inline-block;
+ font-weight: 200;
+ font-size: 2.4rem;
+ line-height: var(--menu-bar-height);
+ text-align: center;
+ margin: 0;
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.js .menu-title {
+ cursor: pointer;
+}
+
+.menu-bar,
+.menu-bar:visited,
+.nav-chapters,
+.nav-chapters:visited,
+.mobile-nav-chapters,
+.mobile-nav-chapters:visited,
+.menu-bar .icon-button,
+.menu-bar a i {
+ color: var(--icons);
+}
+
+.menu-bar i:hover,
+.menu-bar .icon-button:hover,
+.nav-chapters:hover,
+.mobile-nav-chapters i:hover {
+ color: var(--icons-hover);
+}
+
+/* Nav Icons */
+
+.nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ margin: 0;
+ max-width: 150px;
+ min-width: 90px;
+
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ flex-direction: column;
+
+ transition: color 0.5s, background-color 0.5s;
+}
+
+.nav-chapters:hover {
+ text-decoration: none;
+ transition: color 0.15s, color 0.15s;
+}
+
+.nav-wrapper {
+ margin-top: 50px;
+ display: none;
+}
+
+.mobile-nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+ width: 90px;
+ border-radius: 5px;
+ background-color: var(--sidebar-bg);
+}
+
+.previous {
+ float: left;
+}
+
+.next {
+ float: right;
+ right: var(--page-padding);
+}
+
+@media only screen and (max-width: 1080px) {
+ .nav-wide-wrapper { display: none; }
+ .nav-wrapper { display: block; }
+}
+
+@media only screen and (max-width: 1380px) {
+ .sidebar-visible .nav-wide-wrapper { display: none; }
+ .sidebar-visible .nav-wrapper { display: block; }
+}
+
+/* Inline code */
+
+:not(pre) > .hljs {
+ display: inline;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+}
+
+:not(pre):not(a) > .hljs {
+ color: var(--inline-code-color);
+ overflow-x: initial;
+}
+
+a:hover > .hljs {
+ text-decoration: underline;
+}
+
+pre {
+ position: relative;
+}
+pre > .buttons {
+ position: absolute;
+ z-index: 100;
+ right: 5px;
+ top: 5px;
+
+ color: var(--sidebar-fg);
+ cursor: pointer;
+}
+pre > .buttons :hover {
+ color: var(--sidebar-active);
+}
+pre > .buttons i {
+ margin-left: 8px;
+}
+pre > .buttons button {
+ color: inherit;
+ background: transparent;
+ border: none;
+ cursor: inherit;
+}
+pre > .result {
+ margin-top: 10px;
+}
+
+/* Search */
+
+#searchresults a {
+ text-decoration: none;
+}
+
+mark {
+ border-radius: 2px;
+ padding: 0 3px 1px 3px;
+ margin: 0 -3px -1px -3px;
+ background-color: var(--search-mark-bg);
+ transition: background-color 300ms linear;
+ cursor: pointer;
+}
+
+mark.fade-out {
+ background-color: rgba(0,0,0,0) !important;
+ cursor: auto;
+}
+
+.searchbar-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+}
+
+#searchbar {
+ width: 100%;
+ margin: 5px auto 0px auto;
+ padding: 10px 16px;
+ transition: box-shadow 300ms ease-in-out;
+ border: 1px solid var(--searchbar-border-color);
+ border-radius: 3px;
+ background-color: var(--searchbar-bg);
+ color: var(--searchbar-fg);
+}
+#searchbar:focus,
+#searchbar.active {
+ box-shadow: 0 0 3px var(--searchbar-shadow-color);
+}
+
+.searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+ color: var(--searchresults-header-fg);
+}
+
+.searchresults-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+ border-bottom: 1px dashed var(--searchresults-border-color);
+}
+
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults li.focus {
+ background-color: var(--searchresults-li-bg);
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+ul#searchresults span.teaser em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+/* Sidebar */
+
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: var(--sidebar-width);
+ font-size: 0.875em;
+ box-sizing: border-box;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior-y: contain;
+ background-color: var(--sidebar-bg);
+ color: var(--sidebar-fg);
+}
+.sidebar-resizing {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.js:not(.sidebar-resizing) .sidebar {
+ transition: transform 0.3s; /* Animation: slide away */
+}
+.sidebar code {
+ line-height: 2em;
+}
+/* .sidebar .sidebar-scrollbox {
+ overflow-y: auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 10px 10px;
+} */
+.sidebar .sidebar-resize-handle {
+ position: absolute;
+ cursor: col-resize;
+ width: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+.js .sidebar .sidebar-resize-handle {
+ cursor: col-resize;
+ width: 5px;
+}
+.sidebar-hidden .sidebar {
+ transform: translateX(calc(0px - var(--sidebar-width)));
+}
+.sidebar::-webkit-scrollbar {
+ background: var(--sidebar-bg);
+}
+.sidebar::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+
+.chapter {
+ list-style: none outside none;
+ padding-left: 0;
+ line-height: 2.2em;
+}
+
+.chapter ol {
+ width: 100%;
+}
+
+.chapter li {
+ display: flex;
+ color: var(--sidebar-non-existant);
+}
+.chapter li a {
+ display: block;
+ padding: 0;
+ text-decoration: none;
+ color: var(--sidebar-fg);
+}
+
+.chapter li a:hover {
+ color: var(--sidebar-active);
+}
+
+.chapter li a.active {
+ color: var(--sidebar-active);
+}
+
+.chapter li > a.toggle {
+ cursor: pointer;
+ display: block;
+ margin-left: auto;
+ padding: 0 10px;
+ user-select: none;
+ opacity: 0.68;
+}
+
+.chapter li > a.toggle div {
+ transition: transform 0.5s;
+}
+
+/* collapse the section */
+.chapter li:not(.expanded) + li > ol {
+ display: none;
+}
+
+.chapter li.chapter-item {
+ line-height: 1.5em;
+ margin-top: 0.6em;
+}
+
+.chapter li.expanded > a.toggle div {
+ transform: rotate(90deg);
+}
+
+.spacer {
+ width: 100%;
+ height: 3px;
+ margin: 5px 0px;
+}
+.chapter .spacer {
+ background-color: var(--sidebar-spacer);
+}
+
+@media (-moz-touch-enabled: 1), (pointer: coarse) {
+ .chapter li a { padding: 5px 0; }
+ .spacer { margin: 10px 0; }
+}
+
+.section {
+ list-style: none outside none;
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+
+/* Theme Menu Popup */
+
+.theme-popup {
+ position: absolute;
+ left: 10px;
+ top: var(--menu-bar-height);
+ z-index: 1000;
+ border-radius: 4px;
+ font-size: 0.7em;
+ color: var(--fg);
+ background: var(--theme-popup-bg);
+ border: 1px solid var(--theme-popup-border);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: none;
+}
+.theme-popup .default {
+ color: var(--icons);
+}
+.theme-popup .theme {
+ width: 100%;
+ border: 0;
+ margin: 0;
+ padding: 2px 10px;
+ line-height: 25px;
+ white-space: nowrap;
+ text-align: left;
+ cursor: pointer;
+ color: inherit;
+ background: inherit;
+ font-size: inherit;
+}
+.theme-popup .theme:hover {
+ background-color: var(--theme-hover);
+}
+.theme-popup .theme:hover:first-child,
+.theme-popup .theme:hover:last-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
diff --git a/manual/src/theme/css/general.css b/manual/src/theme/css/general.css
new file mode 100644
index 00000000000000..740ad0d140ef61
--- /dev/null
+++ b/manual/src/theme/css/general.css
@@ -0,0 +1,345 @@
+@import 'variables.css';
+
+body {
+ font-family: 'Ubuntu', sans-serif;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: var(--fg);
+ margin: 0;
+ background-color: var(--bg);
+}
+h1, h2, h3, h4, h5, h6 { color: var(--fg); }
+a, a:visited {
+ color: var(--links);
+ text-decoration: none;
+}
+a:hover, a:visited:hover {
+ color: var(--links-hover);
+ text-decoration: underline;
+}
+
+code {
+ background: var(--inline-code-color);
+ padding: 2px 4px;
+ border-radius: 4px;
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+}
+pre code {
+ padding: 0;
+ border-radius: 0;
+}
+pre {
+ padding: .5em;
+ margin: 1em 0;
+ background: var(--inline-code-color);
+ border: 1px solid var(--code-border);
+ border-radius: 4px;
+}
+
+blockquote {
+ margin: 20px 0;
+ padding: 0 20px;
+ padding-left: 1em;
+ background: var(--quote-bg);
+ border: 1px solid var(--quote-border);
+ border-left: none;
+ border-right: none;
+}
+
+blockquote code {
+ background: var(--quote-code-bg);
+}
+
+li.js-unavailable {
+ background-color: #f6cf68;
+ border-radius: 10px;
+ margin-left: 1em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+table {
+ border-collapse: collapse;
+ display: block;
+ overflow-y: auto;
+ border: 1px var(--table-border-color) solid;
+}
+table td {
+ padding: 3px 20px;
+}
+table thead {
+ background: var(--table-header-bg);
+ color: var(--table-header-fg);
+}
+table thead td {
+ font-weight: 700;
+}
+table tbody tr:nth-child(2n) {
+ /* Alternate background colors for rows */
+ background: var(--table-alternate-bg);
+}
+
+svg {
+ position: relative;
+ top: .125em;
+ width: 1em;
+ height: auto;
+}
+
+.hidden {
+ display: none;
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ cursor: pointer;
+ padding: 1em;
+}
+
+/* void navigation */
+
+#void-nav {
+ width: 100%;
+ min-height: 50px;
+ background: var(--nav-bg);
+ font-size: 14px;
+
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+#void-nav a,
+#void-nav button,
+#void-nav label {
+ fill: var(--nav-fg);
+ height: 50px;
+ min-height: 100%;
+ display: block;
+ line-height: 50px;
+ padding: 0 15px;
+ font-size: 1.2em;
+}
+#void-nav ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#void-nav ul#nav-right {
+ margin-left: auto;
+}
+
+#void-nav ul li {
+ display: inline-block;
+}
+#void-nav ul li a {
+ color: var(--nav-fg);
+ display: block;
+ padding: 0 15px;
+ line-height: 50px;
+ font-size: 1.2em;
+ text-decoration: none
+}
+#void-nav ul li a:hover,
+#void-nav ul li a:focus,
+#void-nav button:hover,
+#void-nav button:focus,
+#void-nav label:hover,
+#void-nav label:focus {
+ background: #000;
+}
+
+#skip-to-content {
+ position: absolute;
+ left: -999px;
+ top: -999px;
+}
+
+#skip-to-content:active,
+#skip-to-content:focus {
+ position: relative;
+ left: 0;
+ top: 0;
+}
+
+#icon-theme-light {
+ display: var(--theme-toggle-light);
+}
+#icon-theme-dark {
+ display: var(--theme-toggle-dark);
+}
+
+/* sidebar */
+
+.sidebar-hidden #sidebar {
+ display: none;
+}
+#sidebar {
+ padding: .5em;
+ background: var(--sidebar-bg);
+ font-size: 0.875em;
+ min-height: calc(100vh - 50px - 14px);
+}
+#sidebar ol {
+ list-style: none;
+ margin: 0;
+}
+#sidebar ol.chapter {
+ padding: 0;
+ line-height: 2.2em;
+}
+#sidebar ol.section {
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+#sidebar a {
+ color: var(--sidebar-fg);
+ display: block;
+}
+#sidebar a:hover {
+ color: var(--sidebar-active);
+ text-decoration: none;
+}
+#sidebar a.active {
+ color: var(--sidebar-active);
+}
+
+#sidebar-toggle {
+ display: none;
+}
+
+/* search */
+
+#searchbar {
+ width: 100%;
+ padding: 10px 16px;
+ margin: 5px 0;
+ border-radius: 3px;
+ border: 1px solid var(--searchbar-border-color);
+}
+#searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+}
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+
+/* chapter navigation */
+
+#nav-wide-wrapper {
+ max-width: 800px;
+ margin: 0 auto;
+ margin-top: 50px;
+}
+.previous {
+ float: left;
+}
+.next {
+ float: right;
+ right: 15px;
+}
+.nav-chapters {
+ fill: var(--nav-arrow-fg);
+ text-align: center;
+ text-decoration: none;
+ display: block;
+ max-width: 150px;
+ min-width: 90px;
+}
+.nav-chapters:hover {
+ text-decoration: none;
+ fill: var(--nav-fg-hover);
+}
+
+.nav-chapters svg {
+ margin: 0 auto;
+ width: 1.5em;
+}
+.mobile-nav-chapters {
+ fill: var(--nav-arrow-fg);
+}
+.mobile-nav-chapters:hover {
+ fill: var(--nav-fg-hover);
+}
+
+/* layout */
+
+body {
+ box-sizing: border-box;
+}
+#content {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+#page-wrapper {
+ --content-padding: 10px;
+ padding: 0 var(--content-padding);
+ width: calc(100% - var(--content-padding) * 2);
+}
+#search-wrapper,
+#page-wrapper main {
+ width: 100%;
+ max-width: 800px;
+ margin: 0 auto;
+}
+#sidebar {
+ max-width: 300px;
+ flex-shrink: 0;
+}
+
+/* 300px + 800px + 2*90px + 15px */
+@media only screen and (min-width: 1295px) {
+ .sidebar-visible #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-visible .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+}
+/* 800px + 2*90px + 15px */
+@media only screen and (min-width: 995px) {
+ .sidebar-hidden #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-hidden .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+ table {
+ display: table;
+ }
+}
diff --git a/manual/src/theme/css/print.css b/manual/src/theme/css/print.css
new file mode 100644
index 00000000000000..2970c2b6c7aba2
--- /dev/null
+++ b/manual/src/theme/css/print.css
@@ -0,0 +1,79 @@
+
+#sidebar,
+#menu-bar,
+#void-nav,
+.nav-chapters,
+.mobile-nav-chapters {
+ display: none;
+}
+
+#page-wrapper.page-wrapper {
+ transform: none;
+ margin-left: 0px;
+ overflow-y: initial;
+}
+
+#content {
+ max-width: none;
+ margin: 0;
+ padding: 0;
+}
+
+.page {
+ overflow-y: initial;
+}
+
+code {
+ background-color: #ddd;
+ border-radius: 5px;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+
+pre {
+ background-color: #ddd;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+pre > .buttons {
+ z-index: 2;
+}
+
+a, a:visited, a:active, a:hover {
+ color: #4183c4;
+ text-decoration: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+}
+
+pre, code {
+ page-break-inside: avoid;
+ white-space: pre-wrap;
+}
+
+svg {
+ display: none !important;
+}
+
+table {
+ color: black;
+ border-color: black;
+ background-color: unset;
+}
+
+table thead tr {
+ color: black;
+ background-color: unset;
+}
+
+table tbody tr {
+ background-color: unset;
+}
+
diff --git a/manual/src/theme/css/variables.css b/manual/src/theme/css/variables.css
new file mode 100644
index 00000000000000..ea306becc5fb5b
--- /dev/null
+++ b/manual/src/theme/css/variables.css
@@ -0,0 +1,107 @@
+
+/* Globals */
+
+:root {
+ --sidebar-width: 300px;
+ --page-padding: 15px;
+ --content-max-width: 750px;
+ --menu-bar-height: 50px;
+ --void-green: #478061;
+ --void-dark-green: #62b086;
+ --void-light: #fafafa;
+ --void-dark: #252525;
+}
+
+/* Themes */
+
+.void-light {
+ --bg: #ffffff;
+ --fg: #333;
+
+ --sidebar-bg: var(--void-light);
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: var(--void-green);
+ --nav-fg: var(--bg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #000;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #fdf6e3;
+ --code-border: #ccc;
+
+ --theme-toggle-light: none;
+ --theme-toggle-dark: inherit;
+
+ --quote-bg: #ebf4ef;
+ --quote-border: #d1e6da;
+ --quote-code-bg: var(--inline-code-color);
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: var(--void-light);
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
+
+.void-dark {
+ --bg: #222;
+ --fg: #ccc;
+
+ --sidebar-bg: #252525;
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: #295340;
+ --nav-fg: var(--fg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #fff;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-dark-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #353535;
+ --code-border: #111;
+
+ --theme-toggle-light: inherit;
+ --theme-toggle-dark: none;
+
+ --quote-bg: #293d35;
+ --quote-border: #22362e;
+ --quote-code-bg: #2a2a2a;
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: #2c2c2c;
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
diff --git a/manual/src/theme/favicon.png b/manual/src/theme/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ec045d08445cdd73c7413e01a89754827593f
GIT binary patch
literal 5800
zcmV;Z7FX$sP)<h;3K|Lk000e1NJLTq0055w0055&1^@s6!()h(00004b3#c}2nYxW
zd<bNS00009a7bBm000SL000SL0ncLY;Q#;t8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H179~kUK~#90?VWjaRn@)6Kfir$5@wasC%UX+TPJX;sMQt%v63Kl
zs3iBkqM{)R*sj(N+FFa1gF~s+zGZ8DidF#!^xYfkQ<O<+NP^W?v<^77z9O|aA{xdd
z_nzPT<0hDp>E`C_b8aA?wO9+1dw$<v;LASy?DO0EC+vkhT=nq2DJOL>!Xc_U0yr4h
z7uZKt`yuofWC-9iU6NFEiy-wVn-DeuA0fO$ihm|0x!!r-*%*t(QX&0Fp&(%=U=vqe
zGxDjChmm5m7&!rDG;lm=qxj8E;1%E{;3b23w*S`tYbQ;bRBu5mC)nf6^HA+WhewD^
zRMj(puK`0sOs8JawSv?rx?=Ny&3~SG;>^Yn^YN8lZ=R~Es>nxqA59>|nFtesFNU2{
zC)6qW1j--rcr;cN+ZuL4J)zf{C;n9YcuC2Hz!YG3*!g6^4n>y=a^JAju*ZvvijrX`
z)LnX&dG3Ga{vrJu`dzH(G~k%9^YM|5qB371a#!isOWzJVnM~;w=2^6A(f)aPdEY^}
z4A?L1d@SMtOV!g~#>U5<4m+8y$Z7M$YvLmf<|m4t2jqvHPmri+6~Z;KF|jpa=h6{5
zX`TnyJa}Lv6}b+f957+$6EZ7}XRa<CU;1p=iR?~JnP<t`B?ETu*!g{wS-{}1^T{C;
zs5FlGNiNNaa>hKB)s+{i=v?4{uye^_wyEgc&HXq3Iv3W9LO0Lin#Bircy|D2hn-7r
zK}FX&;!H0cQ~FGpd4y&jRh2|dqC!M|1MCx49=(_p!Yu>044f6#E09pk<Em>$)sFfj
za84NddlHJi2%HxyjJ+DPb|_CWuDG6x-a-0hVjn#~kmCedTUk>%J$UU9NmM6_5gq~h
zg_*~mf*|*K5pQPfYq1@{=!HzYHa<~Q9;VMgzM$x{DU<rvlrd8_+SUr)JkU1+Szx26
zoLM%m>~A(ja$@y1Ixf0WMbD*g4&)aHs_5$Y>i7hkA~|6mfY{jBa+GuEGmu{l5hIUP
z)>M|-637|zKzan~Gmx+3EBZf`)s+|72%Zyjp55u2MEj1Xs#9a*VvGC?nv>>%Pz=-n
zya#+py2@{-AW0yPbiw=}U?AywqJaVB<R?i%qGg3;|La%4oHY+vGtds;FCy}ys;(1}
zm%XI-c65C7eG$=&@~VmtmxvsR#}OiOxT41arvd|f%+m(-M$DO|V@p^05iF<81HKqY
zfoD;csH3adkH5x7#TtA}5rFtB@qGDEzKX+XC`F`qZshr`;{$c7Iwm$Q_Hs`H<-B<y
zO9Lru5$-i9^KfZV={xqaYoB;c{PRZ46!ml}!ihoacZMMUYBY_f^mHMySC|JfHqbUf
z?nSxF_5xXVh}XnN3Nj6tLAd+KK0{f%)!RCDTG6zupKN=Ld7#sk=q)Jo)zi7LqS$+3
z<dzAKta)T`eX71fkgE{(4?7=0?kg)SyD<Cfdl|cpKsykAQ=eCV(*>toP#1P?nG&yx
z55nO)g8UpiTc0yVkQrr#Wp`zFZ5Ft$Yh2g$vboj|nhbQl8l4pz6Wb709z7*q6(25+
z+ytCYc>j@iD0*Tx^+4GqEG2IF5*6mHoV{R47T5Q&8;h$K7p6?=Hc>e`41E<{w=KEt
zr0&jty8U{hWKP9*LB1&}mBn+)&+6{=eYB-?TxktM84cV*dTAk0MCIr~kwMpY`?~IY
zc%oZALXnsFY+Fo&ik9__K>iW0j-M?e^MRoOOMB|+nC|RU?as&}irh)-{Z#pVBapwu
z#>E~@rjnz9zXmLA#K^pPYv*OWu$i%WirtFoKzsEe`Jxgpamy!W8mo`anNl=my+(9A
z@Myr&#|+&*^omSBoY8IT>>Dcv*YD83L#JyKeYY^5iO1uP442!1AdB0#tI?w}d5X<w
z<Z0O9{hZE?1AVtJ--*Rysj{(UGg0OQC_BJ-CZox7mm|*^?j;9#q~0L&H^zM<kOdMo
ziC+R&1th1&GhglMaD^^M9wqrJx>st@Hv(CpY;4&q5xF}cIZ2t+bzOa^Q}dKuTXCEs
zQ?d~6n?(DJh^Y6jHxuEHf#@M6i>ntGcJ`UhM;=dq+T~|DrXR>7eIt;6#A30OI(h*C
zJ;r<D&F<{`9nN`*ub=h>N%9swFKFtU1NlsRP5fZ-<ayw8wzWj$l(Mm9e`)V~9gZrJ
z<Z}F}gzK9F`Alp~Y(vwjY1Ut5sOk?p`d+&u&o}3uw_mcpU<2u*Z@=gpfqbU2w(=HL
z{efkfq;brb+dGl0-H|6*UoahijRSp?Xy5UMdOrnhAFUG6q_(?A+0kuls-;BwCec0;
z8x?E7<5Dc&zErfLs;Vlo``6o;XM$UCB4D$wBp)^BS&Y9|5gi|`6_E!m%N(#NvgwT7
zzu3k+4rE=^nj!U$le*fn#$H83eZ!A|Pi$(aYMZ-Js|oXX*NqhL_B(X_9xMAKVD3tH
z{?Bd2?<rMPRgw41dk5rsc>}$OHxOZ~)97qVeVBSTm-}fYY7<wY{K}%lc1`L2Et{>h
zx{u}a_Czci2l%uB{k6sT-DYvs;)7BqRU#rq2%|sJkG>colCO>;Dxlyw9x_}S5;ci`
z2=bhYRwX65B8UT&GDVYmn>ca>FwBy~0CD6@;GyO(v@(x@v+OP$$Zf0L`BsP5OsJ}=
zifoE(imK`*9^QCC(zox<fB1Z0q@p8HrbaZ9O4KC&gz$$~#=NrFmGCwM0K|%7TNAa3
z-=nw|WhT?YJgw$D3MCeWw=0dmwHUukR8<nSi3>M5n_gGdMZjrf|N6xNic#XDYDc}A
zs7ZX=zf7}39laIUVo{>FWu@V+InNpHw2@xA&7mdat`+V*Gwj9hoXV=oBQ>ITqKvgD
z^Q5M9W~?ao4~rU|lBiAGjB>d(0guAy_-HM(_+RIVw0RWsSCcz!#_x<oZQ??8^jXWs
z0XR(@c|Kkp4{a%;sd(NVhKZm3wi#8Mx2(TC;oh^>V*GYdRY_DQT$F|Qzhd4IgGJ<l
zM0LXElTU|~jVXIY(dR8n>?+eR0MU5VA$=r>9Yhyei`@aLDwVaB^AI{ME3k%eWo1p}
zt>H+^eHO!?v~=mx0%$T%-RlF6#NKIFno{p!OR+m-aqZ$83AS*&4T^p*QJrvu)^!|b
z5n!t;PQlgzTTg)I+m`2ywj>0wc9nZ?p!>-yt1B;3^d~`Tc8D-LULF6>ASEY%eewqg
z_B!GSC&R8ekM|X8LhzWy*ll>I`k|v#^tK>1yFx_nj910K9H^#Bm95yum}6j<dBony
zRYtA-5WAzQ;)ruQxp&~?5FBm~Qc%U--@B*YvGCc`mX$Ws3Omfcg9F<(ySQfYg}}I=
z^tyu}r&m^2#)8rtxMkqez;+w41sUb4YfOoI@lfnFOZ)4x%We&%kytz)cT_Z|-`1<q
zIj*{a9Gu?Nz|B^B?EyzTb;NLE42M_}K;Q*ivD;|vFW&|NomX@l<;bIJk3KgjIT2ZB
zD|RFm8DTv24z?u#SWCVQ!X<%e^#E19I4CVoy*Dg|Kh!8{%{>#60me@q=lx@|n{J
z6Beyn6v$zgj_15?E4HFvFh<3ic?8zmirorjB01KCr4u5Nf=F=?LaF@Jo3>($kzqzr
zTg5|-Co|#$OR-xaDn&u)_=Qn(S`a$XQ==QP^~9y}IRj#=U&6)!PfWGBLhd_?o)Cmi
zQ!foG#dnGhGgxc3As^X^+nT20q!B@A`N&~GJ+ce3wd+r1#Q-DL%%g#H*d10s>_Bp}
zK}cuxKm1RJe?AByMXgj8Dq3JXdu@J#Y0umsgS-Az?h$b!LFH|$EH&SVwPtAQdt0J*
zRYdy-q2o8kF+ug_+GZoDsN@-eq?O=EApfYM637VWH(tuK@)Wc?iWXQ2EbK6vZjb0Y
z+WNd^Yb5iMy{2JFOOmOi&0P+=5KB+fif%JlG7kZnXLG;J?_#fN&K5h~{KlIf2BM^P
z=Cp!rH=tJTi9wA#Gf$k^D9As9(DDmK-wbS%pzt4-B5yMwn`}fDdu1MNQ1rQ=wERF2
zo4Xr!5s$|m>}?<4W-Kn|4VvVZ54RM%6@tBzOB)FCWFSHZF`V?yR{v2p8St!(JOCaX
zX)AV18ntnGTCP`+G>%yrh?2*l)?ynr7%<j4|9Y6iZN+ZMlyOu3rJ~hAX!*d3$zPuw
z)C=QdZN*mAw~Zp}Z3ze*VJr6T7)(}uGJ{4%gF3|>)J|=BQ|t|fh-dLhMXfo1cf5DK
zIPmwN^s+&a*Ipg->LUS4+WY%&V1wD`@U0txtb1#B!Pla0G~ZI}R>Well!|uQFCk=p
z5!54k{Lk_JfUPZ6n`0AVpPEE0kpi)Gw90@wGw`dHVz(hWCVD@xIw-yFpy;Zy!m`DI
z2{v*n=>w^JM@3(NU8S4)k_{06RRXD+gLLte8od;-Rl|}kpE}~q3{udDv9^D$d7Y|x
z$EY>)5O9fTY)tG875#3Inq4AHFCAO@e?dxmc;{FPuB?S7^C)U<SEs<&zj4DQf$SD&
zCN?&9A22sa&5lrXc64ks5u|3kI)11i$JvT6D$hZad7Pnxp2OaxIg;0y3iOl+Xlibz
z6545GP23tQj9nYJs!(PzdfmFhb#FnFd6r#vYrP;g-w)YpN6;Z6qNRnUmj>LQ^D~qi
zqlMASLeYlvtwmOzYJOsDQH1T)+SB92Gu&w-ZN={h5z*+ls4K`+f}2Ed0j5O9MSm8M
zUMu3O<EPrZWhuI%`S-ibBSx0n5=@IS&1U@0C@U<xUyYs!Sbc?|=&F>H`bxAg`cT)O
zwu2b4dm5U<E}!f=O1G(Xz(?3CrKpP()Q@=lszsYE#qSbTl|)Tqiio(tVSdFG<TaJx
zC&s(8Xw{<q^YZil30Nrs7G!-{VcD*it-D5^)vlWaU1dYGi6P1Qg6~_5-z6fVv2n3Q
z`ko%8s^3O<0?4+XL<(h@AZ6>ut~)wx;{fF6=U<K`<213X<sVu#E-7)#&jWeDqWH%J
z{bj_XSKbpy{ca{axaPqF9nUE?nA4heavnzeE3@?~`gc)z4&lkh`o<OKoqpc?0jJv`
z@ju6hN>bKiv4T_4Gh>CZ$D9A$s`o@a10Kz1#}2XQ-k}XUxfHm`Qv7by)O=(?)30>(
z-9Ze;V-U(94{wW#Zgn;~@8@#Y8%fGl*e(72VDo^@t?H24^cXF1%PT=jEhbS%Ufz)_
zX5IO&MUB0Rcy;_x5qS-;v&|;WEz!d0k6M1A?S5&odH^)Q5E_#=TGrUBFk<Fn*EkqV
z8(*|BPrV-UIAFPtluj*~Q_-uAMagAU^&afKApm%#w6L^I(S95Aq@TL5+x!AR_12(j
zefD&s<Dx57^jvHiNZa>AyT^Pu5px%owjsA*R2>8RZeKnT8yj1Wat{6*XiLP4v|Bpc
zu6dSTefQfy0EJ8PgNbu00y`aaPbWGqy3%h033A7|Md!AAKvahZ40*`SekITeqN?{4
zUw4VUEh2jvJ{zd9Q5!q#+|!|Xn)+h}v6*gPNhKeO{#UeD9+i@d_-LR-Q^rmCS4ZFM
z^k_5Bc)#eOc!tQyb#;T{<6Sq>^=JFY1Ro~Ro|AGqz58@(o+qwZ_!RI&mg3#z%zWOS
zPdf{jePl-uC(#Qh7ftT;9PKU-RTQJM=&EV7PY7I4>`uEO2(7(^EN@{ulA7$YLt>Za
zS$@reXBBL|ENz9rRmJYK-_kb%`9^mQB*;yj&2^f|=s4H>Na|-;I@_*21THIar!5#g
zZ$@uB<uqsMhJilVnZNTlnZ(S<Jda&{@4r<7-;HqLuy-3P`<}x5Ba=zAh+K8SDHmjP
zRA0siN$;auZ&G+U)6e_F*>!b;swcYTBLddlW9ecN{bcEw(u`kCWo({=n`jWsC1hWD
zmn|nL^5Vof<<Wq3_gFf(g>5rprZ=@5$cS!FN=w{nHv^Y<_c|X?;CDmV`qPA)2;_|C
zJ)J~#q8Q;3pr0V$DJv|yqdV7kyZ?b1I%pOFcJOO~06(Z>@XHh2ia=Tp?dj|qfs|#X
zV@v0C_xh|JhfA)#Xq0;9S&QYWU7><5GH}IGcforh<<Mg$U4QW*$)tC^pbxBY7g*i;
z)ETb2CYz&QvR+FmnNvQU@VE1Ris;;ee&)Y(si?jyPXE=6eaz0rD+PW;x_!e=&~w8y
zP&V{vA+E%ob{FJCZ_hfA+d+Q4!oB<Bu#@SCv)mcO8cBXn;WE(ucKddNik7XMy<kZw
z$z?&0%ro9C?^l4-04MpBPfytb+==n#uefHRtplsN&BSZVPg2iJ2R)z8yA1WJ5va$n
z04BH<2O9Jl;0r$F<0sD}dar8g!IkcPft)_tl1bNJd`L3oO%~-s;P`G_+G`Bt%lo5A
z*OniX@?;G##E*DBlLVd?<Vi7F#lC}{S$5g2^?r+tcgy?b<D4vb<3Y{_?Mds(USS~L
zUOpDjDW4!JOR&5J#0RzuJfrAKVBS#l&HPB}jmNIO_urXZ?7FUbI&b6t+Sqs~$kBp#
zEa_7zPQu@xJ?9PN>znIhxBOdzB-m{yYA<0s@CoUjoLdC_RFMYI2<drBKZX4z-OC}U
zpD(8k<a^me(|-5+=skVTbDf+uknc?`-dg>_%U>FQ{F{QDV<Y}vNCYJIrK00sd~5X!
zZ-$*rORN=K6}!{U6i8sLhv{BN&aDGkt=21XD^3SpOm04f^+s~)7G}NFv*g-~M&X&I
zz`?e)_7ZYt1hPJ<U2)CAS3KlYA${<3A3Y{tRN^IW`NXgj3FL|B3HP3jGIY=wfv{hs
z?kV&Gd8Bww`B`Bm5%>;;k~!tmRpqxKmUHY$ggOTbd@W|h>;-o@=~g~32CcmZ(huZP
z*L6c#Qwwcx)EU3~eu4M#)*FBy(zhOz4WA(Vc*X4b_Rmu4fY3MAopJ5OU-3Ne55Ngw
z=hAzS<r>i$E3cm4<;Fa#S%fLx%;<SD@;?7w;}xpR0tSYiPp+cyZv#JD?#{nI>|7v6
z%+t&Sx8gttovrEW#J+c9pRo<(_XYjAA(zT+bILr;q$}^_I-n%%TtX%Va*u;|O)eJt
z=cIX>ndnxG0iB}+*J?6Hs8{rU;O3R?g4e@NrXzCNJk3mS%a1phAA?Szch(AJN}a+2
z2j`|`?jPO>JDINN73OJX()AY~l1h5hNw;4*FzkGM<Zl8C^83sDT$<B#MXxeXGtqd|
z`Si7clSIu_&~MWDj)WXV-vwFZ7+tvZngu~0AmIzW(mX9GzG><}wmD}BW-{mmVBfHF
z>V$uQt`LzWgOA#}D&5n*_tNXl(~|M78!0gBPsNiGU>xb!AYm4xeFCgOWVtb^<;#At
z@U0MY@tr-&Ji8NhqxoCR;L)ny$*LS9$g#jE?A+!)23}NjEh5i}n&(!ycfUnI=Q)PK
z9&MfukO^+Z0hrXGj%N<_kb?vrCNNClbEHSA0U%A=Xf#QBC+aq!Uf>f&HVfVc57_`_
my~EB8%iIStI!$X&;{O3r3)blbBiM}q0000<MNUMnLSTX!m`rj2
literal 0
HcmV?d00001
diff --git a/manual/src/theme/index.hbs b/manual/src/theme/index.hbs
new file mode 100644
index 00000000000000..5679e803b1ba78
--- /dev/null
+++ b/manual/src/theme/index.hbs
@@ -0,0 +1,253 @@
+<!DOCTYPE HTML>
+<html lang="{{ language }}" class="sidebar-visible no-js {{ default_theme }}">
+ <head>
+ <!-- Book generated using mdBook -->
+ <meta charset="UTF-8">
+ <title>{{ title }}</title>
+ {{#if is_print }}
+ <meta name="robots" content="noindex" />
+ {{/if}}
+ {{#if base_url}}
+ <base href="{{ base_url }}">
+ {{/if}}
+
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="description" content="{{ description }}">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff" />
+
+ <link rel="shortcut icon" href="{{ path_to_root }}favicon.png">
+ <link rel="stylesheet" href="{{ path_to_root }}css/variables.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/general.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/chrome.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/print.css" media="print">
+ </head>
+ <body>
+ <!-- Provide site root to javascript -->
+ <script type="text/javascript">
+ var path_to_root = "{{ path_to_root }}";
+ var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
+ </script>
+ <!-- Work around some values being stored in localStorage wrapped in quotes -->
+ <script type="text/javascript">
+ try {
+ var theme = localStorage.getItem('mdbook-theme');
+ var sidebar = localStorage.getItem('mdbook-sidebar');
+
+ if (theme.startsWith('"') && theme.endsWith('"')) {
+ localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
+ }
+ if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
+ localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
+ }
+ } catch (e) { }
+ </script>
+
+ <!-- Set the theme before any content is loaded, prevents flash -->
+ <script type="text/javascript">
+ var theme;
+ try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+ if (theme === null || theme === undefined) { theme = default_theme; }
+ var html = document.querySelector('html');
+ html.classList.remove('no-js')
+ html.classList.remove('{{ default_theme }}')
+ html.classList.add(theme);
+ html.classList.add('js');
+ </script>
+
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <header>
+ <nav id="void-nav">
+ <ul>
+ <li><a id="skip-to-content" tabindex="1" href="#main">Skip to content</a></li>
+ <li>
+ <a id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z"/>
+ </svg>
+ </a>
+ </li>
+ <li>
+ <a id="theme-toggle" class="icon-button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
+ <svg id="icon-theme-light" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/>
+ </svg>
+ <svg id="icon-theme-dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"/>
+ </svg>
+ </a>
+ </li>
+ {{#if print_enable}}
+ <li>
+ <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if git_repository_edit_url}}
+ <li>
+ <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
+ <path d="M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if search_enabled}}
+ <li>
+ <a id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46C10.79 14.43 9.21 15 7.5 15 3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/>
+ </svg>
+ </a>
+ </li>
+ <noscript>
+ <li class="js-unavailable">Search functionality requires JavaScript</li>
+ </noscript>
+ {{/if}}
+ </ul>
+ <ul id="nav-right">
+ <li><a href="https://www.voidlinux.org">Home</a></li>
+ <li><a href="https://www.voidlinux.org/news/">News</a></li>
+ <li><a href="https://www.voidlinux.org/download/">Download</a></li>
+ <li><a href="https://www.voidlinux.org/packages/">Packages</a></li>
+ <li><a href="https://docs.voidlinux.org">Documentation</a></li>
+ <li><a href="https://man.voidlinux.org/">Manual Pages</a></li>
+ <li><a href="https://github.com/void-linux">GitHub</a></li>
+ </ul>
+ </nav>
+ </header>
+
+ <div id="content">
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <nav id="sidebar" aria-label="Table of contents">
+ {{#toc}}{{/toc}}
+ </nav>
+
+ <div id="page-wrapper" class="page-wrapper">
+
+
+ {{#if search_enabled}}
+ <div id="search-wrapper" class="hidden">
+ <form id="searchbar-outer" class="searchbar-outer">
+ <input type="search" name="search" id="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
+ </form>
+ <div id="searchresults-outer" class="searchresults-outer hidden">
+ <div id="searchresults-header" class="searchresults-header"></div>
+ <ul id="searchresults">
+ </ul>
+ </div>
+ </div>
+ {{/if}}
+
+ <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
+ <script type="text/javascript">
+ document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
+ document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
+ Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
+ link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
+ });
+ </script>
+
+ <main id="main">
+ {{{ content }}}
+ </main>
+
+ <nav class="nav-wrapper" aria-label="Page navigation">
+ <!-- Mobile navigation buttons -->
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+
+ <div style="clear: both"></div>
+ </nav>
+
+ <nav class="nav-wide-wrapper" aria-label="Page navigation">
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+ </nav>
+ </div>
+ </div>
+
+ {{#if livereload}}
+ <!-- Livereload script (if served using the cli tool) -->
+ <script type="text/javascript">
+ var socket = new WebSocket("{{{livereload}}}");
+ socket.onmessage = function (event) {
+ if (event.data === "reload") {
+ socket.close();
+ location.reload(true); // force reload from server (not from cache)
+ }
+ };
+
+ window.onbeforeunload = function() {
+ socket.close();
+ }
+ </script>
+ {{/if}}
+
+ {{#if search_js}}
+ <script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script>
+ {{/if}}
+
+ <script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script>
+ {{#if is_print}}
+ <script type="text/javascript">
+ window.addEventListener('load', function() {
+ window.setTimeout(window.print, 100);
+ });
+ </script>
+ {{/if}}
+ </body>
+</html>
From cd223c81a3bd2cbe252e98bb1ad2d68a57463ac7 Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 1 Apr 2022 15:24:18 -0400
Subject: [PATCH 2/3] manual/: add linkcheck, CI for checking Manual.md changes
---
.github/workflows/manual.yml | 28 ++++++++++++++++++++++++++++
common/travis/manual-ci.sh | 10 ++++++++++
manual/book.toml | 7 ++++++-
3 files changed, 44 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/manual.yml
create mode 100755 common/travis/manual-ci.sh
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
new file mode 100644
index 00000000000000..ddcf67a9f9a6f6
--- /dev/null
+++ b/.github/workflows/manual.yml
@@ -0,0 +1,28 @@
+name: Check Manual Changes
+
+on:
+ pull_request:
+ paths:
+ - 'Manual.md'
+ - 'manual/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ manual:
+ name: Check formatting and links
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/void-linux/void-musl:20231230R1
+ steps:
+ - name: Prepare container
+ run: |
+ xbps-install -Syu || xbps-install -Syu xbps
+ xbps-install -yu
+ xbps-install -y mdBook mdbook-linkcheck
+ - name: Clone and checkout
+ uses: classabbyamp/treeless-checkout-action@v1
+ - run: ./common/travis/manual-ci.sh
+
diff --git a/common/travis/manual-ci.sh b/common/travis/manual-ci.sh
new file mode 100755
index 00000000000000..34281e42bf12af
--- /dev/null
+++ b/common/travis/manual-ci.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+echo "Checking links"
+RUST_LOG=linkcheck=debug mdbook build manual
+LINKCHECK=$?
+
+# Generate exit value
+if [ ! $LINKCHECK -eq 0 ] ; then
+ exit 2
+fi
diff --git a/manual/book.toml b/manual/book.toml
index 8f15412495ebcd..2a98cbe327af3e 100644
--- a/manual/book.toml
+++ b/manual/book.toml
@@ -5,7 +5,7 @@ src = "src"
title = "XBPS Source Packages Manual"
[preprocessor.gen_manual]
-command = "python3 generate_mdbook.py"
+command = "python3 manual/generate_mdbook.py"
[output.html]
# TODO: this should be a submodule or something
@@ -15,3 +15,8 @@ default-theme = "void-light"
preferred-dark-theme = "void-dark"
edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
limit-results = 100
+
+[output.linkcheck]
+optional = true
+follow-web-links = true
+exclude = [ "https://docs.github.com/en/get-started/quickstart/fork-a-repo" ]
From 6faa31a5739f87065af8d1bf6ac21e599087c2c0 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Mon, 12 Feb 2024 15:44:59 -0500
Subject: [PATCH 3/3] fixup! manual/: add linkcheck, CI for checking Manual.md
changes
---
.github/workflows/manual.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
index ddcf67a9f9a6f6..a16175db6234ab 100644
--- a/.github/workflows/manual.yml
+++ b/.github/workflows/manual.yml
@@ -21,7 +21,7 @@ jobs:
run: |
xbps-install -Syu || xbps-install -Syu xbps
xbps-install -yu
- xbps-install -y mdBook mdbook-linkcheck
+ xbps-install -y bash mdBook mdbook-linkcheck
- name: Clone and checkout
uses: classabbyamp/treeless-checkout-action@v1
- run: ./common/travis/manual-ci.sh
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PR PATCH] [Updated] Manual: generate mdbook version
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
2024-02-12 20:45 ` [PR PATCH] [Updated] " classabbyamp
@ 2024-02-12 20:46 ` classabbyamp
2024-02-12 20:47 ` classabbyamp
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2024-02-12 20:46 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 632 bytes --]
There is an updated pull request by classabbyamp against master on the void-packages repository
https://github.com/classabbyamp/void-packages manual-mdbook
https://github.com/void-linux/void-packages/pull/48677
Manual: generate mdbook version
#35856 rises from the ashes, this time with cleaner code and less reliance on the markdown!
still working on the theming, and I'd maybe like to do a go-through of the manual updating everything before or after this is merged
#### Testing the changes
- I tested the changes in this PR: **YES**
A patch file from https://github.com/void-linux/void-packages/pull/48677.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-manual-mdbook-48677.patch --]
[-- Type: text/x-diff, Size: 65492 bytes --]
From be8a7fdcedcbc0287c6aca79e4c8f665d806b45b Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 25 Feb 2022 21:36:12 -0500
Subject: [PATCH 1/4] manual/: Add script to generate mdbook of Manual.md
---
Manual.md | 55 ++++
manual/book.toml | 17 +
manual/generate_mdbook.py | 125 ++++++++
manual/src/SUMMARY.md | 1 +
manual/src/theme/book.js | 119 +++++++
manual/src/theme/css/chrome.css | 484 +++++++++++++++++++++++++++++
manual/src/theme/css/general.css | 345 ++++++++++++++++++++
manual/src/theme/css/print.css | 79 +++++
manual/src/theme/css/variables.css | 107 +++++++
manual/src/theme/favicon.png | Bin 0 -> 5800 bytes
manual/src/theme/index.hbs | 253 +++++++++++++++
11 files changed, 1585 insertions(+)
create mode 100644 manual/book.toml
create mode 100644 manual/generate_mdbook.py
create mode 100644 manual/src/SUMMARY.md
create mode 100644 manual/src/theme/book.js
create mode 100644 manual/src/theme/css/chrome.css
create mode 100644 manual/src/theme/css/general.css
create mode 100644 manual/src/theme/css/print.css
create mode 100644 manual/src/theme/css/variables.css
create mode 100644 manual/src/theme/favicon.png
create mode 100644 manual/src/theme/index.hbs
diff --git a/Manual.md b/Manual.md
index 34c737e6df427..44e7487c68c7f 100644
--- a/Manual.md
+++ b/Manual.md
@@ -1,3 +1,4 @@
+<!-- mdbook:cut -->
# The XBPS source packages manual
This article contains an exhaustive manual of how to create new source
@@ -74,8 +75,10 @@ packages for XBPS, the `Void Linux` native packaging system.
* [Notes](#notes)
* [Contributing via git](#contributing)
* [Help](#help)
+<!-- mdbook:endcut -->
<a id="Introduction"></a>
+<!-- mdbook:page:introduction -->
### Introduction
The `void-packages` repository contains all the
@@ -122,8 +125,10 @@ If everything went fine after running
a binary package named `foo-1.0_1.<arch>.xbps` will be generated in the local repository
`hostdir/binpkgs`.
+<!-- mdbook:endpage -->
<a id="buildphase"></a>
+<!-- mdbook:page:buildphases -->
### Package build phases
Building a package consist of the following phases:
@@ -160,8 +165,10 @@ via `make install` or any other compatible method.
`xbps-src` supports running just the specified phase, and if it ran
successfully, the phase will be skipped later (unless its work directory
`${wrksrc}` is removed with `xbps-src clean`).
+<!-- mdbook:endpage -->
<a id="namingconventions"></a>
+<!-- mdbook:page:naming-conventions -->
### Package naming conventions
<a id="libs"></a>
@@ -237,8 +244,10 @@ is lowercase.
Programs can be split into program packages and library packages. The program
package should be named as described above. The library package should be
prefixed with "lib" (see section `Libraries`)
+<!-- mdbook:endpage -->
<a id="global_funcs"></a>
+<!-- mdbook:page:global-funcs -->
### Global functions
The following functions are defined by `xbps-src` and can be used on any template:
@@ -359,8 +368,10 @@ The following functions are defined by `xbps-src` and can be used on any templat
This is useful when used in conjunction with `skip_extraction`.
> Shell wildcards must be properly quoted, Example: `vmove "usr/lib/*.a"`.
+<!-- mdbook:endpage -->
<a id="global_vars"></a>
+<!-- mdbook:page:global-vars -->
### Global variables
The following variables are defined by `xbps-src` and can be used on any template:
@@ -424,8 +435,10 @@ in this directory such as `${XBPS_BUILDDIR}/${wrksrc}`.
- `XBPS_RUST_TARGET` The target architecture triplet used by `rustc` and `cargo`.
- `XBPS_BUILD_ENVIRONMENT` Enables continuous-integration-specific operations. Set to `void-packages-ci` if in continuous integration.
+<!-- mdbook:endpage -->
<a id="available_vars"></a>
+<!-- mdbook:page:available-vars -->
### Available variables
<a id="mandatory_vars"></a>
@@ -863,8 +876,10 @@ information on this map.
Finally, as a general rule, if a package is built the exact same way whether or
not a particular package is present in `makedepends` or `hostmakedepends`, that
package shouldn't be added as a build time dependency.
+<!-- mdbook:endpage -->
<a id="repositories"></a>
+<!-- mdbook:page:repositories -->
### Repositories
<a id="repo_by_branch"></a>
@@ -889,8 +904,10 @@ The following repository names are valid:
* `debug`: Repository for packages containing debug symbols. In almost all cases,
these packages are generated automatically.
* `nonfree`: Repository for packages that are closed source or have nonfree licenses.
+<!-- mdbook:endpage -->
<a id="updates"></a>
+<!-- mdbook:page:updates -->
### Checking for new upstream releases
New upstream versions can be automatically checked using
@@ -932,8 +949,10 @@ in url. Defaults to `(|\.x)`.
- `disabled` can be set to disable update checking for the package,
in cases where checking for updates is impossible or does not make sense.
This should be set to a string describing why it is disabled.
+<!-- mdbook:endpage -->
<a id="patches"></a>
+<!-- mdbook:page:patches -->
### Handling patches
Sometimes software needs to be patched, most commonly to fix bugs that have
@@ -955,8 +974,10 @@ xbps-src will only apply patches named in the `series` file.
be used to set the args passed to `patch(1)`. As an example, if `foo.patch` requires
special arguments to be passed to `patch(1)` that can't be used when applying other
patches, `foo.patch.args` can be created containing those args.
+<!-- mdbook:endpage -->
<a id="build_scripts"></a>
+<!-- mdbook:page:build-styles -->
### build style scripts
The `build_style` variable specifies the build method to build and install a
@@ -1083,8 +1104,10 @@ matching the `build_style` name, Example:
- `texmf` For texmf zip/tarballs that need to go into /usr/share/texmf-dist. Includes
duplicates handling.
+<!-- mdbook:endpage -->
<a id="build_helper"></a>
+<!-- mdbook:page:build-helpers -->
### build helper scripts
The `build_helper` variable specifies shell snippets to be sourced that will create a
@@ -1132,8 +1155,10 @@ This aims to fix cross-builds for when the build-style is mixed: e.g. when in a
- `rust` specifies environment variables required for cross-compiling crates via cargo and
for compiling cargo -sys crates. This helper is added by default for packages that use the
`cargo` build style.
+<!-- mdbook:endpage -->
<a id="functions"></a>
+<!-- mdbook:page:functions -->
### Functions
The following functions can be defined to change the behavior of how the
@@ -1197,8 +1222,10 @@ Current working directory for functions is set as follows:
- For post_patch through post_install: `build_wrksrc`
if it is defined, otherwise `wrksrc`.
+<!-- mdbook:endpage -->
<a id="build_options"></a>
+<!-- mdbook:page:build-options -->
### Build options
Some packages might be built with different build options to enable/disable
@@ -1307,8 +1334,10 @@ Example: `XBPS_PKG_OPTIONS_xorg_server=opt`.
The list of supported package build options and its description is defined in the
`common/options.description` file.
+<!-- mdbook:endpage -->
<a id="install_remove_files"></a>
+<!-- mdbook:page:install-remove-files -->
### INSTALL and REMOVE files
The INSTALL and REMOVE shell snippets can be used to execute certain actions at a specified
@@ -1351,8 +1380,10 @@ be executed via `chroot(2)` won't work correctly.
> NOTE: do not use INSTALL/REMOVE scripts to print messages, see the next section for
more information.
+<!-- mdbook:endpage -->
<a id="install_remove_files_msg"></a>
+<!-- mdbook:page:install-remove-msg-files -->
### INSTALL.msg and REMOVE.msg files
The `INSTALL.msg` and `REMOVE.msg` files can be used to print a message at post-install
@@ -1364,8 +1395,10 @@ subpackages can also have their own `INSTALL.msg` and `REMOVE.msg` files, simply
as `srcpkgs/<pkgname>/<subpkg>.INSTALL.msg` or `srcpkgs/<pkgname>/<subpkg>.REMOVE.msg` respectively.
This should only be used for critical messages, like warning users of breaking changes.
+<!-- mdbook:endpage -->
<a id="runtime_account_creation"></a>
+<!-- mdbook:page:account-creation -->
### Creating system accounts/groups at runtime
There's a trigger along with some variables that are specifically to create
@@ -1396,8 +1429,10 @@ accounts.
> NOTE: The underscore policy does not apply to old packages, due to the inevitable breakage of
> changing the username only new packages should follow it.
+<!-- mdbook:endpage -->
<a id="writing_runit_services"></a>
+<!-- mdbook:page:runit-services -->
### Writing runit services
Void Linux uses [runit](http://smarden.org/runit/) for booting and supervision of services.
@@ -1443,8 +1478,10 @@ Examples of when *not* to install systemd units:
1. When doing so changes runtime behavior of the packaged software.
2. When it is done via a compile time flag that also changes build dependencies.
+<!-- mdbook:endpage -->
<a id="32bit_pkgs"></a>
+<!-- mdbook:page:32bit-pkgs -->
### 32bit packages
32bit packages are built automatically when the builder is x86 (32bit), but
@@ -1465,8 +1502,10 @@ This expects the basename of the target file, Example: `lib32symlinks="foo"`.
- `lib32mode` If unset, only shared/static libraries and pkg-config files will be copied to the
**32bit** package. If set to `full` all files will be copied to the 32bit package, unmodified.
+<!-- mdbook:endpage -->
<a id="pkgs_sub"></a>
+<!-- mdbook:page:subpkgs -->
### Subpackages
In the example shown above just a binary package is generated, but with some
@@ -1525,8 +1564,10 @@ destdir (`$DESTDIR`) to the `subpackage` destdir (`$PKGDESTDIR`).
Subpackages are processed always in alphabetical order; To force a custom order,
the `subpackages` variable can be declared with the wanted order.
+<!-- mdbook:endpage -->
<a id="pkgs_classes"></a>
+<!-- mdbook:page:pkg-classes -->
### Some package classes
<a id="pkgs_development"></a>
@@ -1709,8 +1750,10 @@ following variables:
cache during the install/removal of the package
- `font_dirs`: which should be set to the directory where the package
installs its fonts
+<!-- mdbook:endpage -->
<a id="pkg_rename"></a>
+<!-- mdbook:page:renaming-pkgs -->
### Renaming a package
- Create empty package of old name, depending on new package. This is
@@ -1721,8 +1764,10 @@ old version and increased revision.
- Edit references to package in other templates and common/shlibs.
- Don't set `replaces=`, it can result in removing both packages from
systems by xbps.
+<!-- mdbook:endpage -->
<a id="pkg_remove"></a>
+<!-- mdbook:page:removing-pkgs -->
### Removing a package
Follows a list of things that should be done to help guarantee that a
@@ -1752,8 +1797,10 @@ template. All removed subpkgs should be added too.
This will uninstall package from systems where it is installed.
- Remove the package from the repository index
or contact a team member that can do so.
+<!-- mdbook:endpage -->
<a id="xbps_triggers"></a>
+<!-- mdbook:page:triggers -->
### XBPS Triggers
XBPS triggers are a collection of snippets of code, provided by the `xbps-triggers`
@@ -2151,16 +2198,20 @@ During removal it uses `xmlcatmgr` to remove all catalogs passed to it by the
To include this trigger use the `sgml_entries` variable or/and the `xml_entries` variable,
as the trigger won't do anything unless either of them are defined.
+<!-- mdbook:endpage -->
<a id="documentation"></a>
+<!-- mdbook:page:void-docs -->
### Void specific documentation
When you want document details of package's configuration and usage specific to Void Linux,
not covered by upstream documentation, put notes into
`srcpkgs/<pkgname>/files/README.voidlinux` and install with
`vdoc "${FILESDIR}/README.voidlinux"`.
+<!-- mdbook:endpage -->
<a id="notes"></a>
+<!-- mdbook:page:notes -->
### Notes
- Make sure that all software is configured to use the `/usr` prefix.
@@ -2178,8 +2229,10 @@ the installed files (`./xbps-src show-files pkg`) before pushing new updates.
- Make sure that binaries are not stripped by the software, let xbps-src do this;
otherwise the `debug` packages won't have debugging symbols.
+<!-- mdbook:endpage -->
<a id="contributing"></a>
+<!-- mdbook:page:contributing -->
### Contributing via git
To get started, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) the void-linux `void-packages` git repository on GitHub and clone it:
@@ -2197,8 +2250,10 @@ to pull in new changes:
$ git remote add upstream https://github.com/void-linux/void-packages.git
$ git pull --rebase upstream master
+<!-- mdbook:endpage -->
<a id="help"></a>
+<!-- mdbook:page:help -->
### Help
If after reading this `manual` you still need some kind of help, please join
diff --git a/manual/book.toml b/manual/book.toml
new file mode 100644
index 0000000000000..8f15412495ebc
--- /dev/null
+++ b/manual/book.toml
@@ -0,0 +1,17 @@
+[book]
+authors = ["The Void Linux Team"]
+multilingual = false
+src = "src"
+title = "XBPS Source Packages Manual"
+
+[preprocessor.gen_manual]
+command = "python3 generate_mdbook.py"
+
+[output.html]
+# TODO: this should be a submodule or something
+# to avoid de-syncing with void-docs/src/theme
+theme = "src/theme"
+default-theme = "void-light"
+preferred-dark-theme = "void-dark"
+edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
+limit-results = 100
diff --git a/manual/generate_mdbook.py b/manual/generate_mdbook.py
new file mode 100644
index 0000000000000..259b067272a0f
--- /dev/null
+++ b/manual/generate_mdbook.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+from dataclasses import asdict, dataclass, field
+import json
+from pathlib import Path
+import re
+import sys
+from typing import Optional
+
+
+BEGCUT_RE = re.compile("<!-- mdbook:cut -->")
+ENDCUT_RE = re.compile(r"<!-- mdbook:endcut -->")
+
+BEGPAGE_RE = re.compile(r"<!-- mdbook:page:(?P<name>[^ ]+) -->")
+ENDPAGE_RE = re.compile(r"<!-- mdbook:endpage -->")
+
+
+@dataclass
+class Chapter:
+ name: str
+ content: str
+ path: str
+ source_path: str
+ number: Optional[list[int]] = None
+ sub_items: list['Chapter'] = field(default_factory=list)
+ parent_names: list[str] = field(default_factory=list)
+
+
+@dataclass
+class Section:
+ Chapter: Chapter
+
+
+@dataclass
+class Book:
+ sections: list[Section]
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] == "supports":
+ raise SystemExit
+
+ doc = Path("Manual.md").read_text()
+
+ # remove TOC anchor links
+ doc = re.sub(r'<a id="[^"]+"></a>', "", doc)
+ # increase heading levels (Manual.md uses ### as the highest level)
+ doc = re.sub(r"^##(#+ .+)$", r"\1", doc, flags=re.MULTILINE)
+ # replace relative links with absolute ones
+ doc = re.sub(
+ r"\[(?P<text>[^\]]+)\]\(\./(?P<url>[^)]+)\)",
+ r"[\g<text>](https://github.com/void-linux/void-packages/blob/master/\g<url>)",
+ doc
+ )
+ if False:
+ print(doc)
+ raise SystemExit
+
+ sections = []
+ chapter = []
+ num = 1
+ heading = ""
+ filename = ""
+ in_section = False
+ in_cut = False
+
+ for lno, line in enumerate(doc.split("\n")):
+ if BEGCUT_RE.search(line):
+ in_cut = True
+ elif in_cut:
+ if ENDCUT_RE.search(line):
+ in_cut = False
+ elif BEGCUT_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-cut marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ elif m := BEGPAGE_RE.search(line):
+ filename = f"{m.group('name')}.md"
+ in_section = True
+ elif in_section:
+ if ENDPAGE_RE.search(line):
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+ num += 1
+ heading = ""
+ chapter = []
+ in_section = False
+ elif line.startswith("# ") and not heading:
+ _, _, heading = line.partition(" ")
+ chapter += [line]
+ elif BEGPAGE_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-page marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ else:
+ chapter += [line]
+
+ # get the last section
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+
+ # mdBook requires this key in the emitted json, for reasons unknown
+ book = asdict(Book(sections)) | {"__non_exhaustive": None}
+ print(json.dumps(book))
diff --git a/manual/src/SUMMARY.md b/manual/src/SUMMARY.md
new file mode 100644
index 0000000000000..73fa82d6e79c1
--- /dev/null
+++ b/manual/src/SUMMARY.md
@@ -0,0 +1 @@
+<!-- leave this file empty. mdBook needs it but it will not be used -->
diff --git a/manual/src/theme/book.js b/manual/src/theme/book.js
new file mode 100644
index 0000000000000..d1a280f9eca34
--- /dev/null
+++ b/manual/src/theme/book.js
@@ -0,0 +1,119 @@
+"use strict";
+
+// Fix back button cache problem
+window.onunload = function () { };
+
+(function theme() {
+ var html = document.querySelector("html");
+ var themeToggleButton = document.getElementById("theme-toggle");
+
+ themeToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("void-light")) {
+ html.classList.replace("void-light", "void-dark");
+ localStorage.setItem('mdbook-theme', "void-dark");
+ } else {
+ html.classList.replace("void-dark", "void-light");
+ localStorage.setItem('mdbook-theme', "void-light");
+ }
+ });
+})();
+
+(function sidebar() {
+ var html = document.querySelector("html");
+ var sidebar = document.getElementById("sidebar");
+ var sidebarLinks = document.querySelectorAll('#sidebar a');
+ var sidebarToggleButton = document.getElementById("sidebar-toggle");
+ var firstContact = null;
+
+ function showSidebar() {
+ html.classList.remove('sidebar-hidden')
+ html.classList.add('sidebar-visible');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', 0);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', true);
+ sidebar.setAttribute('aria-hidden', false);
+ try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
+ }
+
+ function hideSidebar() {
+ html.classList.remove('sidebar-visible')
+ html.classList.add('sidebar-hidden');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', -1);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', false);
+ sidebar.setAttribute('aria-hidden', true);
+ try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { }
+ }
+
+ // Toggle sidebar
+ sidebarToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("sidebar-hidden")) {
+ showSidebar();
+ } else if (html.classList.contains("sidebar-visible")) {
+ hideSidebar();
+ } else {
+ if (getComputedStyle(sidebar)['transform'] === 'none') {
+ hideSidebar();
+ } else {
+ showSidebar();
+ }
+ }
+ });
+
+ document.addEventListener('touchstart', function (e) {
+ firstContact = {
+ x: e.touches[0].clientX,
+ time: Date.now()
+ };
+ }, { passive: true });
+
+ document.addEventListener('touchmove', function (e) {
+ if (!firstContact)
+ return;
+
+ var curX = e.touches[0].clientX;
+ var xDiff = curX - firstContact.x,
+ tDiff = Date.now() - firstContact.time;
+
+ if (tDiff < 250 && Math.abs(xDiff) >= 150) {
+ if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300))
+ showSidebar();
+ else if (xDiff < 0 && curX < 300)
+ hideSidebar();
+
+ firstContact = null;
+ }
+ }, { passive: true });
+
+ // Scroll sidebar to current active section
+ var activeSection = sidebar.querySelector(".active");
+ if (activeSection) {
+ sidebar.scrollTop = activeSection.offsetTop;
+ }
+})();
+
+(function chapterNavigation() {
+ document.addEventListener('keydown', function (e) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; }
+ if (window.search && window.search.hasFocus()) { return; }
+
+ switch (e.key) {
+ case 'ArrowRight':
+ e.preventDefault();
+ var nextButton = document.querySelector('.nav-chapters.next');
+ if (nextButton) {
+ window.location.href = nextButton.href;
+ }
+ break;
+ case 'ArrowLeft':
+ e.preventDefault();
+ var previousButton = document.querySelector('.nav-chapters.previous');
+ if (previousButton) {
+ window.location.href = previousButton.href;
+ }
+ break;
+ }
+ });
+})();
diff --git a/manual/src/theme/css/chrome.css b/manual/src/theme/css/chrome.css
new file mode 100644
index 0000000000000..544e7718ed9d2
--- /dev/null
+++ b/manual/src/theme/css/chrome.css
@@ -0,0 +1,484 @@
+/* CSS for UI elements (a.k.a. chrome) */
+
+@import 'variables.css';
+
+::-webkit-scrollbar {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+html {
+ scrollbar-color: var(--scrollbar) var(--bg);
+}
+#searchresults a,
+.content a:link,
+a:visited,
+a > .hljs {
+ color: var(--links);
+}
+
+/* Menu Bar */
+
+#menu-bar,
+#menu-bar-hover-placeholder {
+ z-index: 101;
+ margin: auto calc(0px - var(--page-padding));
+}
+#menu-bar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ background-color: var(--bg);
+ border-bottom-color: var(--bg);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+#menu-bar.sticky,
+.js #menu-bar-hover-placeholder:hover + #menu-bar,
+.js #menu-bar:hover,
+.js.sidebar-visible #menu-bar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0 !important;
+}
+#menu-bar-hover-placeholder {
+ position: sticky;
+ position: -webkit-sticky;
+ top: 0;
+ height: var(--menu-bar-height);
+}
+#menu-bar.bordered {
+ border-bottom-color: var(--table-border-color);
+}
+#menu-bar i, #menu-bar .icon-button {
+ position: relative;
+ padding: 0 8px;
+ z-index: 10;
+ line-height: var(--menu-bar-height);
+ cursor: pointer;
+ transition: color 0.5s;
+}
+@media only screen and (max-width: 420px) {
+ #menu-bar i, #menu-bar .icon-button {
+ padding: 0 5px;
+ }
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ padding: 0;
+ color: inherit;
+}
+.icon-button i {
+ margin: 0;
+}
+
+.right-buttons {
+ margin: 0 15px;
+}
+.right-buttons a {
+ text-decoration: none;
+}
+
+.left-buttons {
+ display: flex;
+ margin: 0 5px;
+}
+.no-js .left-buttons {
+ display: none;
+}
+
+.menu-title {
+ display: inline-block;
+ font-weight: 200;
+ font-size: 2.4rem;
+ line-height: var(--menu-bar-height);
+ text-align: center;
+ margin: 0;
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.js .menu-title {
+ cursor: pointer;
+}
+
+.menu-bar,
+.menu-bar:visited,
+.nav-chapters,
+.nav-chapters:visited,
+.mobile-nav-chapters,
+.mobile-nav-chapters:visited,
+.menu-bar .icon-button,
+.menu-bar a i {
+ color: var(--icons);
+}
+
+.menu-bar i:hover,
+.menu-bar .icon-button:hover,
+.nav-chapters:hover,
+.mobile-nav-chapters i:hover {
+ color: var(--icons-hover);
+}
+
+/* Nav Icons */
+
+.nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ margin: 0;
+ max-width: 150px;
+ min-width: 90px;
+
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ flex-direction: column;
+
+ transition: color 0.5s, background-color 0.5s;
+}
+
+.nav-chapters:hover {
+ text-decoration: none;
+ transition: color 0.15s, color 0.15s;
+}
+
+.nav-wrapper {
+ margin-top: 50px;
+ display: none;
+}
+
+.mobile-nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+ width: 90px;
+ border-radius: 5px;
+ background-color: var(--sidebar-bg);
+}
+
+.previous {
+ float: left;
+}
+
+.next {
+ float: right;
+ right: var(--page-padding);
+}
+
+@media only screen and (max-width: 1080px) {
+ .nav-wide-wrapper { display: none; }
+ .nav-wrapper { display: block; }
+}
+
+@media only screen and (max-width: 1380px) {
+ .sidebar-visible .nav-wide-wrapper { display: none; }
+ .sidebar-visible .nav-wrapper { display: block; }
+}
+
+/* Inline code */
+
+:not(pre) > .hljs {
+ display: inline;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+}
+
+:not(pre):not(a) > .hljs {
+ color: var(--inline-code-color);
+ overflow-x: initial;
+}
+
+a:hover > .hljs {
+ text-decoration: underline;
+}
+
+pre {
+ position: relative;
+}
+pre > .buttons {
+ position: absolute;
+ z-index: 100;
+ right: 5px;
+ top: 5px;
+
+ color: var(--sidebar-fg);
+ cursor: pointer;
+}
+pre > .buttons :hover {
+ color: var(--sidebar-active);
+}
+pre > .buttons i {
+ margin-left: 8px;
+}
+pre > .buttons button {
+ color: inherit;
+ background: transparent;
+ border: none;
+ cursor: inherit;
+}
+pre > .result {
+ margin-top: 10px;
+}
+
+/* Search */
+
+#searchresults a {
+ text-decoration: none;
+}
+
+mark {
+ border-radius: 2px;
+ padding: 0 3px 1px 3px;
+ margin: 0 -3px -1px -3px;
+ background-color: var(--search-mark-bg);
+ transition: background-color 300ms linear;
+ cursor: pointer;
+}
+
+mark.fade-out {
+ background-color: rgba(0,0,0,0) !important;
+ cursor: auto;
+}
+
+.searchbar-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+}
+
+#searchbar {
+ width: 100%;
+ margin: 5px auto 0px auto;
+ padding: 10px 16px;
+ transition: box-shadow 300ms ease-in-out;
+ border: 1px solid var(--searchbar-border-color);
+ border-radius: 3px;
+ background-color: var(--searchbar-bg);
+ color: var(--searchbar-fg);
+}
+#searchbar:focus,
+#searchbar.active {
+ box-shadow: 0 0 3px var(--searchbar-shadow-color);
+}
+
+.searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+ color: var(--searchresults-header-fg);
+}
+
+.searchresults-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+ border-bottom: 1px dashed var(--searchresults-border-color);
+}
+
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults li.focus {
+ background-color: var(--searchresults-li-bg);
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+ul#searchresults span.teaser em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+/* Sidebar */
+
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: var(--sidebar-width);
+ font-size: 0.875em;
+ box-sizing: border-box;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior-y: contain;
+ background-color: var(--sidebar-bg);
+ color: var(--sidebar-fg);
+}
+.sidebar-resizing {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.js:not(.sidebar-resizing) .sidebar {
+ transition: transform 0.3s; /* Animation: slide away */
+}
+.sidebar code {
+ line-height: 2em;
+}
+/* .sidebar .sidebar-scrollbox {
+ overflow-y: auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 10px 10px;
+} */
+.sidebar .sidebar-resize-handle {
+ position: absolute;
+ cursor: col-resize;
+ width: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+.js .sidebar .sidebar-resize-handle {
+ cursor: col-resize;
+ width: 5px;
+}
+.sidebar-hidden .sidebar {
+ transform: translateX(calc(0px - var(--sidebar-width)));
+}
+.sidebar::-webkit-scrollbar {
+ background: var(--sidebar-bg);
+}
+.sidebar::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+
+.chapter {
+ list-style: none outside none;
+ padding-left: 0;
+ line-height: 2.2em;
+}
+
+.chapter ol {
+ width: 100%;
+}
+
+.chapter li {
+ display: flex;
+ color: var(--sidebar-non-existant);
+}
+.chapter li a {
+ display: block;
+ padding: 0;
+ text-decoration: none;
+ color: var(--sidebar-fg);
+}
+
+.chapter li a:hover {
+ color: var(--sidebar-active);
+}
+
+.chapter li a.active {
+ color: var(--sidebar-active);
+}
+
+.chapter li > a.toggle {
+ cursor: pointer;
+ display: block;
+ margin-left: auto;
+ padding: 0 10px;
+ user-select: none;
+ opacity: 0.68;
+}
+
+.chapter li > a.toggle div {
+ transition: transform 0.5s;
+}
+
+/* collapse the section */
+.chapter li:not(.expanded) + li > ol {
+ display: none;
+}
+
+.chapter li.chapter-item {
+ line-height: 1.5em;
+ margin-top: 0.6em;
+}
+
+.chapter li.expanded > a.toggle div {
+ transform: rotate(90deg);
+}
+
+.spacer {
+ width: 100%;
+ height: 3px;
+ margin: 5px 0px;
+}
+.chapter .spacer {
+ background-color: var(--sidebar-spacer);
+}
+
+@media (-moz-touch-enabled: 1), (pointer: coarse) {
+ .chapter li a { padding: 5px 0; }
+ .spacer { margin: 10px 0; }
+}
+
+.section {
+ list-style: none outside none;
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+
+/* Theme Menu Popup */
+
+.theme-popup {
+ position: absolute;
+ left: 10px;
+ top: var(--menu-bar-height);
+ z-index: 1000;
+ border-radius: 4px;
+ font-size: 0.7em;
+ color: var(--fg);
+ background: var(--theme-popup-bg);
+ border: 1px solid var(--theme-popup-border);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: none;
+}
+.theme-popup .default {
+ color: var(--icons);
+}
+.theme-popup .theme {
+ width: 100%;
+ border: 0;
+ margin: 0;
+ padding: 2px 10px;
+ line-height: 25px;
+ white-space: nowrap;
+ text-align: left;
+ cursor: pointer;
+ color: inherit;
+ background: inherit;
+ font-size: inherit;
+}
+.theme-popup .theme:hover {
+ background-color: var(--theme-hover);
+}
+.theme-popup .theme:hover:first-child,
+.theme-popup .theme:hover:last-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
diff --git a/manual/src/theme/css/general.css b/manual/src/theme/css/general.css
new file mode 100644
index 0000000000000..740ad0d140ef6
--- /dev/null
+++ b/manual/src/theme/css/general.css
@@ -0,0 +1,345 @@
+@import 'variables.css';
+
+body {
+ font-family: 'Ubuntu', sans-serif;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: var(--fg);
+ margin: 0;
+ background-color: var(--bg);
+}
+h1, h2, h3, h4, h5, h6 { color: var(--fg); }
+a, a:visited {
+ color: var(--links);
+ text-decoration: none;
+}
+a:hover, a:visited:hover {
+ color: var(--links-hover);
+ text-decoration: underline;
+}
+
+code {
+ background: var(--inline-code-color);
+ padding: 2px 4px;
+ border-radius: 4px;
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+}
+pre code {
+ padding: 0;
+ border-radius: 0;
+}
+pre {
+ padding: .5em;
+ margin: 1em 0;
+ background: var(--inline-code-color);
+ border: 1px solid var(--code-border);
+ border-radius: 4px;
+}
+
+blockquote {
+ margin: 20px 0;
+ padding: 0 20px;
+ padding-left: 1em;
+ background: var(--quote-bg);
+ border: 1px solid var(--quote-border);
+ border-left: none;
+ border-right: none;
+}
+
+blockquote code {
+ background: var(--quote-code-bg);
+}
+
+li.js-unavailable {
+ background-color: #f6cf68;
+ border-radius: 10px;
+ margin-left: 1em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+table {
+ border-collapse: collapse;
+ display: block;
+ overflow-y: auto;
+ border: 1px var(--table-border-color) solid;
+}
+table td {
+ padding: 3px 20px;
+}
+table thead {
+ background: var(--table-header-bg);
+ color: var(--table-header-fg);
+}
+table thead td {
+ font-weight: 700;
+}
+table tbody tr:nth-child(2n) {
+ /* Alternate background colors for rows */
+ background: var(--table-alternate-bg);
+}
+
+svg {
+ position: relative;
+ top: .125em;
+ width: 1em;
+ height: auto;
+}
+
+.hidden {
+ display: none;
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ cursor: pointer;
+ padding: 1em;
+}
+
+/* void navigation */
+
+#void-nav {
+ width: 100%;
+ min-height: 50px;
+ background: var(--nav-bg);
+ font-size: 14px;
+
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+#void-nav a,
+#void-nav button,
+#void-nav label {
+ fill: var(--nav-fg);
+ height: 50px;
+ min-height: 100%;
+ display: block;
+ line-height: 50px;
+ padding: 0 15px;
+ font-size: 1.2em;
+}
+#void-nav ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#void-nav ul#nav-right {
+ margin-left: auto;
+}
+
+#void-nav ul li {
+ display: inline-block;
+}
+#void-nav ul li a {
+ color: var(--nav-fg);
+ display: block;
+ padding: 0 15px;
+ line-height: 50px;
+ font-size: 1.2em;
+ text-decoration: none
+}
+#void-nav ul li a:hover,
+#void-nav ul li a:focus,
+#void-nav button:hover,
+#void-nav button:focus,
+#void-nav label:hover,
+#void-nav label:focus {
+ background: #000;
+}
+
+#skip-to-content {
+ position: absolute;
+ left: -999px;
+ top: -999px;
+}
+
+#skip-to-content:active,
+#skip-to-content:focus {
+ position: relative;
+ left: 0;
+ top: 0;
+}
+
+#icon-theme-light {
+ display: var(--theme-toggle-light);
+}
+#icon-theme-dark {
+ display: var(--theme-toggle-dark);
+}
+
+/* sidebar */
+
+.sidebar-hidden #sidebar {
+ display: none;
+}
+#sidebar {
+ padding: .5em;
+ background: var(--sidebar-bg);
+ font-size: 0.875em;
+ min-height: calc(100vh - 50px - 14px);
+}
+#sidebar ol {
+ list-style: none;
+ margin: 0;
+}
+#sidebar ol.chapter {
+ padding: 0;
+ line-height: 2.2em;
+}
+#sidebar ol.section {
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+#sidebar a {
+ color: var(--sidebar-fg);
+ display: block;
+}
+#sidebar a:hover {
+ color: var(--sidebar-active);
+ text-decoration: none;
+}
+#sidebar a.active {
+ color: var(--sidebar-active);
+}
+
+#sidebar-toggle {
+ display: none;
+}
+
+/* search */
+
+#searchbar {
+ width: 100%;
+ padding: 10px 16px;
+ margin: 5px 0;
+ border-radius: 3px;
+ border: 1px solid var(--searchbar-border-color);
+}
+#searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+}
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+
+/* chapter navigation */
+
+#nav-wide-wrapper {
+ max-width: 800px;
+ margin: 0 auto;
+ margin-top: 50px;
+}
+.previous {
+ float: left;
+}
+.next {
+ float: right;
+ right: 15px;
+}
+.nav-chapters {
+ fill: var(--nav-arrow-fg);
+ text-align: center;
+ text-decoration: none;
+ display: block;
+ max-width: 150px;
+ min-width: 90px;
+}
+.nav-chapters:hover {
+ text-decoration: none;
+ fill: var(--nav-fg-hover);
+}
+
+.nav-chapters svg {
+ margin: 0 auto;
+ width: 1.5em;
+}
+.mobile-nav-chapters {
+ fill: var(--nav-arrow-fg);
+}
+.mobile-nav-chapters:hover {
+ fill: var(--nav-fg-hover);
+}
+
+/* layout */
+
+body {
+ box-sizing: border-box;
+}
+#content {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+#page-wrapper {
+ --content-padding: 10px;
+ padding: 0 var(--content-padding);
+ width: calc(100% - var(--content-padding) * 2);
+}
+#search-wrapper,
+#page-wrapper main {
+ width: 100%;
+ max-width: 800px;
+ margin: 0 auto;
+}
+#sidebar {
+ max-width: 300px;
+ flex-shrink: 0;
+}
+
+/* 300px + 800px + 2*90px + 15px */
+@media only screen and (min-width: 1295px) {
+ .sidebar-visible #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-visible .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+}
+/* 800px + 2*90px + 15px */
+@media only screen and (min-width: 995px) {
+ .sidebar-hidden #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-hidden .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+ table {
+ display: table;
+ }
+}
diff --git a/manual/src/theme/css/print.css b/manual/src/theme/css/print.css
new file mode 100644
index 0000000000000..2970c2b6c7aba
--- /dev/null
+++ b/manual/src/theme/css/print.css
@@ -0,0 +1,79 @@
+
+#sidebar,
+#menu-bar,
+#void-nav,
+.nav-chapters,
+.mobile-nav-chapters {
+ display: none;
+}
+
+#page-wrapper.page-wrapper {
+ transform: none;
+ margin-left: 0px;
+ overflow-y: initial;
+}
+
+#content {
+ max-width: none;
+ margin: 0;
+ padding: 0;
+}
+
+.page {
+ overflow-y: initial;
+}
+
+code {
+ background-color: #ddd;
+ border-radius: 5px;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+
+pre {
+ background-color: #ddd;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+pre > .buttons {
+ z-index: 2;
+}
+
+a, a:visited, a:active, a:hover {
+ color: #4183c4;
+ text-decoration: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+}
+
+pre, code {
+ page-break-inside: avoid;
+ white-space: pre-wrap;
+}
+
+svg {
+ display: none !important;
+}
+
+table {
+ color: black;
+ border-color: black;
+ background-color: unset;
+}
+
+table thead tr {
+ color: black;
+ background-color: unset;
+}
+
+table tbody tr {
+ background-color: unset;
+}
+
diff --git a/manual/src/theme/css/variables.css b/manual/src/theme/css/variables.css
new file mode 100644
index 0000000000000..ea306becc5fb5
--- /dev/null
+++ b/manual/src/theme/css/variables.css
@@ -0,0 +1,107 @@
+
+/* Globals */
+
+:root {
+ --sidebar-width: 300px;
+ --page-padding: 15px;
+ --content-max-width: 750px;
+ --menu-bar-height: 50px;
+ --void-green: #478061;
+ --void-dark-green: #62b086;
+ --void-light: #fafafa;
+ --void-dark: #252525;
+}
+
+/* Themes */
+
+.void-light {
+ --bg: #ffffff;
+ --fg: #333;
+
+ --sidebar-bg: var(--void-light);
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: var(--void-green);
+ --nav-fg: var(--bg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #000;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #fdf6e3;
+ --code-border: #ccc;
+
+ --theme-toggle-light: none;
+ --theme-toggle-dark: inherit;
+
+ --quote-bg: #ebf4ef;
+ --quote-border: #d1e6da;
+ --quote-code-bg: var(--inline-code-color);
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: var(--void-light);
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
+
+.void-dark {
+ --bg: #222;
+ --fg: #ccc;
+
+ --sidebar-bg: #252525;
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: #295340;
+ --nav-fg: var(--fg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #fff;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-dark-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #353535;
+ --code-border: #111;
+
+ --theme-toggle-light: inherit;
+ --theme-toggle-dark: none;
+
+ --quote-bg: #293d35;
+ --quote-border: #22362e;
+ --quote-code-bg: #2a2a2a;
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: #2c2c2c;
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
diff --git a/manual/src/theme/favicon.png b/manual/src/theme/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ec045d08445cdd73c7413e01a89754827593f
GIT binary patch
literal 5800
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
literal 0
HcmV?d00001
diff --git a/manual/src/theme/index.hbs b/manual/src/theme/index.hbs
new file mode 100644
index 0000000000000..5679e803b1ba7
--- /dev/null
+++ b/manual/src/theme/index.hbs
@@ -0,0 +1,253 @@
+<!DOCTYPE HTML>
+<html lang="{{ language }}" class="sidebar-visible no-js {{ default_theme }}">
+ <head>
+ <!-- Book generated using mdBook -->
+ <meta charset="UTF-8">
+ <title>{{ title }}</title>
+ {{#if is_print }}
+ <meta name="robots" content="noindex" />
+ {{/if}}
+ {{#if base_url}}
+ <base href="{{ base_url }}">
+ {{/if}}
+
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="description" content="{{ description }}">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff" />
+
+ <link rel="shortcut icon" href="{{ path_to_root }}favicon.png">
+ <link rel="stylesheet" href="{{ path_to_root }}css/variables.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/general.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/chrome.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/print.css" media="print">
+ </head>
+ <body>
+ <!-- Provide site root to javascript -->
+ <script type="text/javascript">
+ var path_to_root = "{{ path_to_root }}";
+ var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
+ </script>
+ <!-- Work around some values being stored in localStorage wrapped in quotes -->
+ <script type="text/javascript">
+ try {
+ var theme = localStorage.getItem('mdbook-theme');
+ var sidebar = localStorage.getItem('mdbook-sidebar');
+
+ if (theme.startsWith('"') && theme.endsWith('"')) {
+ localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
+ }
+ if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
+ localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
+ }
+ } catch (e) { }
+ </script>
+
+ <!-- Set the theme before any content is loaded, prevents flash -->
+ <script type="text/javascript">
+ var theme;
+ try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+ if (theme === null || theme === undefined) { theme = default_theme; }
+ var html = document.querySelector('html');
+ html.classList.remove('no-js')
+ html.classList.remove('{{ default_theme }}')
+ html.classList.add(theme);
+ html.classList.add('js');
+ </script>
+
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <header>
+ <nav id="void-nav">
+ <ul>
+ <li><a id="skip-to-content" tabindex="1" href="#main">Skip to content</a></li>
+ <li>
+ <a id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z"/>
+ </svg>
+ </a>
+ </li>
+ <li>
+ <a id="theme-toggle" class="icon-button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
+ <svg id="icon-theme-light" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/>
+ </svg>
+ <svg id="icon-theme-dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"/>
+ </svg>
+ </a>
+ </li>
+ {{#if print_enable}}
+ <li>
+ <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if git_repository_edit_url}}
+ <li>
+ <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
+ <path d="M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if search_enabled}}
+ <li>
+ <a id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46C10.79 14.43 9.21 15 7.5 15 3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/>
+ </svg>
+ </a>
+ </li>
+ <noscript>
+ <li class="js-unavailable">Search functionality requires JavaScript</li>
+ </noscript>
+ {{/if}}
+ </ul>
+ <ul id="nav-right">
+ <li><a href="https://www.voidlinux.org">Home</a></li>
+ <li><a href="https://www.voidlinux.org/news/">News</a></li>
+ <li><a href="https://www.voidlinux.org/download/">Download</a></li>
+ <li><a href="https://www.voidlinux.org/packages/">Packages</a></li>
+ <li><a href="https://docs.voidlinux.org">Documentation</a></li>
+ <li><a href="https://man.voidlinux.org/">Manual Pages</a></li>
+ <li><a href="https://github.com/void-linux">GitHub</a></li>
+ </ul>
+ </nav>
+ </header>
+
+ <div id="content">
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <nav id="sidebar" aria-label="Table of contents">
+ {{#toc}}{{/toc}}
+ </nav>
+
+ <div id="page-wrapper" class="page-wrapper">
+
+
+ {{#if search_enabled}}
+ <div id="search-wrapper" class="hidden">
+ <form id="searchbar-outer" class="searchbar-outer">
+ <input type="search" name="search" id="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
+ </form>
+ <div id="searchresults-outer" class="searchresults-outer hidden">
+ <div id="searchresults-header" class="searchresults-header"></div>
+ <ul id="searchresults">
+ </ul>
+ </div>
+ </div>
+ {{/if}}
+
+ <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
+ <script type="text/javascript">
+ document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
+ document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
+ Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
+ link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
+ });
+ </script>
+
+ <main id="main">
+ {{{ content }}}
+ </main>
+
+ <nav class="nav-wrapper" aria-label="Page navigation">
+ <!-- Mobile navigation buttons -->
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+
+ <div style="clear: both"></div>
+ </nav>
+
+ <nav class="nav-wide-wrapper" aria-label="Page navigation">
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+ </nav>
+ </div>
+ </div>
+
+ {{#if livereload}}
+ <!-- Livereload script (if served using the cli tool) -->
+ <script type="text/javascript">
+ var socket = new WebSocket("{{{livereload}}}");
+ socket.onmessage = function (event) {
+ if (event.data === "reload") {
+ socket.close();
+ location.reload(true); // force reload from server (not from cache)
+ }
+ };
+
+ window.onbeforeunload = function() {
+ socket.close();
+ }
+ </script>
+ {{/if}}
+
+ {{#if search_js}}
+ <script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script>
+ {{/if}}
+
+ <script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script>
+ {{#if is_print}}
+ <script type="text/javascript">
+ window.addEventListener('load', function() {
+ window.setTimeout(window.print, 100);
+ });
+ </script>
+ {{/if}}
+ </body>
+</html>
From cd223c81a3bd2cbe252e98bb1ad2d68a57463ac7 Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 1 Apr 2022 15:24:18 -0400
Subject: [PATCH 2/4] manual/: add linkcheck, CI for checking Manual.md changes
---
.github/workflows/manual.yml | 28 ++++++++++++++++++++++++++++
common/travis/manual-ci.sh | 10 ++++++++++
manual/book.toml | 7 ++++++-
3 files changed, 44 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/manual.yml
create mode 100755 common/travis/manual-ci.sh
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
new file mode 100644
index 0000000000000..ddcf67a9f9a6f
--- /dev/null
+++ b/.github/workflows/manual.yml
@@ -0,0 +1,28 @@
+name: Check Manual Changes
+
+on:
+ pull_request:
+ paths:
+ - 'Manual.md'
+ - 'manual/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ manual:
+ name: Check formatting and links
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/void-linux/void-musl:20231230R1
+ steps:
+ - name: Prepare container
+ run: |
+ xbps-install -Syu || xbps-install -Syu xbps
+ xbps-install -yu
+ xbps-install -y mdBook mdbook-linkcheck
+ - name: Clone and checkout
+ uses: classabbyamp/treeless-checkout-action@v1
+ - run: ./common/travis/manual-ci.sh
+
diff --git a/common/travis/manual-ci.sh b/common/travis/manual-ci.sh
new file mode 100755
index 0000000000000..34281e42bf12a
--- /dev/null
+++ b/common/travis/manual-ci.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+echo "Checking links"
+RUST_LOG=linkcheck=debug mdbook build manual
+LINKCHECK=$?
+
+# Generate exit value
+if [ ! $LINKCHECK -eq 0 ] ; then
+ exit 2
+fi
diff --git a/manual/book.toml b/manual/book.toml
index 8f15412495ebc..2a98cbe327af3 100644
--- a/manual/book.toml
+++ b/manual/book.toml
@@ -5,7 +5,7 @@ src = "src"
title = "XBPS Source Packages Manual"
[preprocessor.gen_manual]
-command = "python3 generate_mdbook.py"
+command = "python3 manual/generate_mdbook.py"
[output.html]
# TODO: this should be a submodule or something
@@ -15,3 +15,8 @@ default-theme = "void-light"
preferred-dark-theme = "void-dark"
edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
limit-results = 100
+
+[output.linkcheck]
+optional = true
+follow-web-links = true
+exclude = [ "https://docs.github.com/en/get-started/quickstart/fork-a-repo" ]
From 6faa31a5739f87065af8d1bf6ac21e599087c2c0 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Mon, 12 Feb 2024 15:44:59 -0500
Subject: [PATCH 3/4] fixup! manual/: add linkcheck, CI for checking Manual.md
changes
---
.github/workflows/manual.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
index ddcf67a9f9a6f..a16175db6234a 100644
--- a/.github/workflows/manual.yml
+++ b/.github/workflows/manual.yml
@@ -21,7 +21,7 @@ jobs:
run: |
xbps-install -Syu || xbps-install -Syu xbps
xbps-install -yu
- xbps-install -y mdBook mdbook-linkcheck
+ xbps-install -y bash mdBook mdbook-linkcheck
- name: Clone and checkout
uses: classabbyamp/treeless-checkout-action@v1
- run: ./common/travis/manual-ci.sh
From 11bbd28d90f61b9b59f91d82075711ec87b2624c Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Mon, 12 Feb 2024 15:46:06 -0500
Subject: [PATCH 4/4] fixup! manual/: add linkcheck, CI for checking Manual.md
changes
---
.github/workflows/manual.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
index a16175db6234a..dc7847e26545f 100644
--- a/.github/workflows/manual.yml
+++ b/.github/workflows/manual.yml
@@ -12,7 +12,7 @@ concurrency:
jobs:
manual:
- name: Check formatting and links
+ name: Check links
runs-on: ubuntu-latest
container:
image: ghcr.io/void-linux/void-musl:20231230R1
@@ -21,7 +21,7 @@ jobs:
run: |
xbps-install -Syu || xbps-install -Syu xbps
xbps-install -yu
- xbps-install -y bash mdBook mdbook-linkcheck
+ xbps-install -y git bash mdBook mdbook-linkcheck
- name: Clone and checkout
uses: classabbyamp/treeless-checkout-action@v1
- run: ./common/travis/manual-ci.sh
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PR PATCH] [Updated] Manual: generate mdbook version
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
2024-02-12 20:45 ` [PR PATCH] [Updated] " classabbyamp
2024-02-12 20:46 ` classabbyamp
@ 2024-02-12 20:47 ` classabbyamp
2024-05-14 1:46 ` github-actions
2024-07-24 7:07 ` [PR PATCH] [Closed]: " classabbyamp
4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2024-02-12 20:47 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 632 bytes --]
There is an updated pull request by classabbyamp against master on the void-packages repository
https://github.com/classabbyamp/void-packages manual-mdbook
https://github.com/void-linux/void-packages/pull/48677
Manual: generate mdbook version
#35856 rises from the ashes, this time with cleaner code and less reliance on the markdown!
still working on the theming, and I'd maybe like to do a go-through of the manual updating everything before or after this is merged
#### Testing the changes
- I tested the changes in this PR: **YES**
A patch file from https://github.com/void-linux/void-packages/pull/48677.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-manual-mdbook-48677.patch --]
[-- Type: text/x-diff, Size: 63505 bytes --]
From be8a7fdcedcbc0287c6aca79e4c8f665d806b45b Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 25 Feb 2022 21:36:12 -0500
Subject: [PATCH 1/2] manual/: Add script to generate mdbook of Manual.md
---
Manual.md | 55 ++++
manual/book.toml | 17 +
manual/generate_mdbook.py | 125 ++++++++
manual/src/SUMMARY.md | 1 +
manual/src/theme/book.js | 119 +++++++
manual/src/theme/css/chrome.css | 484 +++++++++++++++++++++++++++++
manual/src/theme/css/general.css | 345 ++++++++++++++++++++
manual/src/theme/css/print.css | 79 +++++
manual/src/theme/css/variables.css | 107 +++++++
manual/src/theme/favicon.png | Bin 0 -> 5800 bytes
manual/src/theme/index.hbs | 253 +++++++++++++++
11 files changed, 1585 insertions(+)
create mode 100644 manual/book.toml
create mode 100644 manual/generate_mdbook.py
create mode 100644 manual/src/SUMMARY.md
create mode 100644 manual/src/theme/book.js
create mode 100644 manual/src/theme/css/chrome.css
create mode 100644 manual/src/theme/css/general.css
create mode 100644 manual/src/theme/css/print.css
create mode 100644 manual/src/theme/css/variables.css
create mode 100644 manual/src/theme/favicon.png
create mode 100644 manual/src/theme/index.hbs
diff --git a/Manual.md b/Manual.md
index 34c737e6df427..44e7487c68c7f 100644
--- a/Manual.md
+++ b/Manual.md
@@ -1,3 +1,4 @@
+<!-- mdbook:cut -->
# The XBPS source packages manual
This article contains an exhaustive manual of how to create new source
@@ -74,8 +75,10 @@ packages for XBPS, the `Void Linux` native packaging system.
* [Notes](#notes)
* [Contributing via git](#contributing)
* [Help](#help)
+<!-- mdbook:endcut -->
<a id="Introduction"></a>
+<!-- mdbook:page:introduction -->
### Introduction
The `void-packages` repository contains all the
@@ -122,8 +125,10 @@ If everything went fine after running
a binary package named `foo-1.0_1.<arch>.xbps` will be generated in the local repository
`hostdir/binpkgs`.
+<!-- mdbook:endpage -->
<a id="buildphase"></a>
+<!-- mdbook:page:buildphases -->
### Package build phases
Building a package consist of the following phases:
@@ -160,8 +165,10 @@ via `make install` or any other compatible method.
`xbps-src` supports running just the specified phase, and if it ran
successfully, the phase will be skipped later (unless its work directory
`${wrksrc}` is removed with `xbps-src clean`).
+<!-- mdbook:endpage -->
<a id="namingconventions"></a>
+<!-- mdbook:page:naming-conventions -->
### Package naming conventions
<a id="libs"></a>
@@ -237,8 +244,10 @@ is lowercase.
Programs can be split into program packages and library packages. The program
package should be named as described above. The library package should be
prefixed with "lib" (see section `Libraries`)
+<!-- mdbook:endpage -->
<a id="global_funcs"></a>
+<!-- mdbook:page:global-funcs -->
### Global functions
The following functions are defined by `xbps-src` and can be used on any template:
@@ -359,8 +368,10 @@ The following functions are defined by `xbps-src` and can be used on any templat
This is useful when used in conjunction with `skip_extraction`.
> Shell wildcards must be properly quoted, Example: `vmove "usr/lib/*.a"`.
+<!-- mdbook:endpage -->
<a id="global_vars"></a>
+<!-- mdbook:page:global-vars -->
### Global variables
The following variables are defined by `xbps-src` and can be used on any template:
@@ -424,8 +435,10 @@ in this directory such as `${XBPS_BUILDDIR}/${wrksrc}`.
- `XBPS_RUST_TARGET` The target architecture triplet used by `rustc` and `cargo`.
- `XBPS_BUILD_ENVIRONMENT` Enables continuous-integration-specific operations. Set to `void-packages-ci` if in continuous integration.
+<!-- mdbook:endpage -->
<a id="available_vars"></a>
+<!-- mdbook:page:available-vars -->
### Available variables
<a id="mandatory_vars"></a>
@@ -863,8 +876,10 @@ information on this map.
Finally, as a general rule, if a package is built the exact same way whether or
not a particular package is present in `makedepends` or `hostmakedepends`, that
package shouldn't be added as a build time dependency.
+<!-- mdbook:endpage -->
<a id="repositories"></a>
+<!-- mdbook:page:repositories -->
### Repositories
<a id="repo_by_branch"></a>
@@ -889,8 +904,10 @@ The following repository names are valid:
* `debug`: Repository for packages containing debug symbols. In almost all cases,
these packages are generated automatically.
* `nonfree`: Repository for packages that are closed source or have nonfree licenses.
+<!-- mdbook:endpage -->
<a id="updates"></a>
+<!-- mdbook:page:updates -->
### Checking for new upstream releases
New upstream versions can be automatically checked using
@@ -932,8 +949,10 @@ in url. Defaults to `(|\.x)`.
- `disabled` can be set to disable update checking for the package,
in cases where checking for updates is impossible or does not make sense.
This should be set to a string describing why it is disabled.
+<!-- mdbook:endpage -->
<a id="patches"></a>
+<!-- mdbook:page:patches -->
### Handling patches
Sometimes software needs to be patched, most commonly to fix bugs that have
@@ -955,8 +974,10 @@ xbps-src will only apply patches named in the `series` file.
be used to set the args passed to `patch(1)`. As an example, if `foo.patch` requires
special arguments to be passed to `patch(1)` that can't be used when applying other
patches, `foo.patch.args` can be created containing those args.
+<!-- mdbook:endpage -->
<a id="build_scripts"></a>
+<!-- mdbook:page:build-styles -->
### build style scripts
The `build_style` variable specifies the build method to build and install a
@@ -1083,8 +1104,10 @@ matching the `build_style` name, Example:
- `texmf` For texmf zip/tarballs that need to go into /usr/share/texmf-dist. Includes
duplicates handling.
+<!-- mdbook:endpage -->
<a id="build_helper"></a>
+<!-- mdbook:page:build-helpers -->
### build helper scripts
The `build_helper` variable specifies shell snippets to be sourced that will create a
@@ -1132,8 +1155,10 @@ This aims to fix cross-builds for when the build-style is mixed: e.g. when in a
- `rust` specifies environment variables required for cross-compiling crates via cargo and
for compiling cargo -sys crates. This helper is added by default for packages that use the
`cargo` build style.
+<!-- mdbook:endpage -->
<a id="functions"></a>
+<!-- mdbook:page:functions -->
### Functions
The following functions can be defined to change the behavior of how the
@@ -1197,8 +1222,10 @@ Current working directory for functions is set as follows:
- For post_patch through post_install: `build_wrksrc`
if it is defined, otherwise `wrksrc`.
+<!-- mdbook:endpage -->
<a id="build_options"></a>
+<!-- mdbook:page:build-options -->
### Build options
Some packages might be built with different build options to enable/disable
@@ -1307,8 +1334,10 @@ Example: `XBPS_PKG_OPTIONS_xorg_server=opt`.
The list of supported package build options and its description is defined in the
`common/options.description` file.
+<!-- mdbook:endpage -->
<a id="install_remove_files"></a>
+<!-- mdbook:page:install-remove-files -->
### INSTALL and REMOVE files
The INSTALL and REMOVE shell snippets can be used to execute certain actions at a specified
@@ -1351,8 +1380,10 @@ be executed via `chroot(2)` won't work correctly.
> NOTE: do not use INSTALL/REMOVE scripts to print messages, see the next section for
more information.
+<!-- mdbook:endpage -->
<a id="install_remove_files_msg"></a>
+<!-- mdbook:page:install-remove-msg-files -->
### INSTALL.msg and REMOVE.msg files
The `INSTALL.msg` and `REMOVE.msg` files can be used to print a message at post-install
@@ -1364,8 +1395,10 @@ subpackages can also have their own `INSTALL.msg` and `REMOVE.msg` files, simply
as `srcpkgs/<pkgname>/<subpkg>.INSTALL.msg` or `srcpkgs/<pkgname>/<subpkg>.REMOVE.msg` respectively.
This should only be used for critical messages, like warning users of breaking changes.
+<!-- mdbook:endpage -->
<a id="runtime_account_creation"></a>
+<!-- mdbook:page:account-creation -->
### Creating system accounts/groups at runtime
There's a trigger along with some variables that are specifically to create
@@ -1396,8 +1429,10 @@ accounts.
> NOTE: The underscore policy does not apply to old packages, due to the inevitable breakage of
> changing the username only new packages should follow it.
+<!-- mdbook:endpage -->
<a id="writing_runit_services"></a>
+<!-- mdbook:page:runit-services -->
### Writing runit services
Void Linux uses [runit](http://smarden.org/runit/) for booting and supervision of services.
@@ -1443,8 +1478,10 @@ Examples of when *not* to install systemd units:
1. When doing so changes runtime behavior of the packaged software.
2. When it is done via a compile time flag that also changes build dependencies.
+<!-- mdbook:endpage -->
<a id="32bit_pkgs"></a>
+<!-- mdbook:page:32bit-pkgs -->
### 32bit packages
32bit packages are built automatically when the builder is x86 (32bit), but
@@ -1465,8 +1502,10 @@ This expects the basename of the target file, Example: `lib32symlinks="foo"`.
- `lib32mode` If unset, only shared/static libraries and pkg-config files will be copied to the
**32bit** package. If set to `full` all files will be copied to the 32bit package, unmodified.
+<!-- mdbook:endpage -->
<a id="pkgs_sub"></a>
+<!-- mdbook:page:subpkgs -->
### Subpackages
In the example shown above just a binary package is generated, but with some
@@ -1525,8 +1564,10 @@ destdir (`$DESTDIR`) to the `subpackage` destdir (`$PKGDESTDIR`).
Subpackages are processed always in alphabetical order; To force a custom order,
the `subpackages` variable can be declared with the wanted order.
+<!-- mdbook:endpage -->
<a id="pkgs_classes"></a>
+<!-- mdbook:page:pkg-classes -->
### Some package classes
<a id="pkgs_development"></a>
@@ -1709,8 +1750,10 @@ following variables:
cache during the install/removal of the package
- `font_dirs`: which should be set to the directory where the package
installs its fonts
+<!-- mdbook:endpage -->
<a id="pkg_rename"></a>
+<!-- mdbook:page:renaming-pkgs -->
### Renaming a package
- Create empty package of old name, depending on new package. This is
@@ -1721,8 +1764,10 @@ old version and increased revision.
- Edit references to package in other templates and common/shlibs.
- Don't set `replaces=`, it can result in removing both packages from
systems by xbps.
+<!-- mdbook:endpage -->
<a id="pkg_remove"></a>
+<!-- mdbook:page:removing-pkgs -->
### Removing a package
Follows a list of things that should be done to help guarantee that a
@@ -1752,8 +1797,10 @@ template. All removed subpkgs should be added too.
This will uninstall package from systems where it is installed.
- Remove the package from the repository index
or contact a team member that can do so.
+<!-- mdbook:endpage -->
<a id="xbps_triggers"></a>
+<!-- mdbook:page:triggers -->
### XBPS Triggers
XBPS triggers are a collection of snippets of code, provided by the `xbps-triggers`
@@ -2151,16 +2198,20 @@ During removal it uses `xmlcatmgr` to remove all catalogs passed to it by the
To include this trigger use the `sgml_entries` variable or/and the `xml_entries` variable,
as the trigger won't do anything unless either of them are defined.
+<!-- mdbook:endpage -->
<a id="documentation"></a>
+<!-- mdbook:page:void-docs -->
### Void specific documentation
When you want document details of package's configuration and usage specific to Void Linux,
not covered by upstream documentation, put notes into
`srcpkgs/<pkgname>/files/README.voidlinux` and install with
`vdoc "${FILESDIR}/README.voidlinux"`.
+<!-- mdbook:endpage -->
<a id="notes"></a>
+<!-- mdbook:page:notes -->
### Notes
- Make sure that all software is configured to use the `/usr` prefix.
@@ -2178,8 +2229,10 @@ the installed files (`./xbps-src show-files pkg`) before pushing new updates.
- Make sure that binaries are not stripped by the software, let xbps-src do this;
otherwise the `debug` packages won't have debugging symbols.
+<!-- mdbook:endpage -->
<a id="contributing"></a>
+<!-- mdbook:page:contributing -->
### Contributing via git
To get started, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) the void-linux `void-packages` git repository on GitHub and clone it:
@@ -2197,8 +2250,10 @@ to pull in new changes:
$ git remote add upstream https://github.com/void-linux/void-packages.git
$ git pull --rebase upstream master
+<!-- mdbook:endpage -->
<a id="help"></a>
+<!-- mdbook:page:help -->
### Help
If after reading this `manual` you still need some kind of help, please join
diff --git a/manual/book.toml b/manual/book.toml
new file mode 100644
index 0000000000000..8f15412495ebc
--- /dev/null
+++ b/manual/book.toml
@@ -0,0 +1,17 @@
+[book]
+authors = ["The Void Linux Team"]
+multilingual = false
+src = "src"
+title = "XBPS Source Packages Manual"
+
+[preprocessor.gen_manual]
+command = "python3 generate_mdbook.py"
+
+[output.html]
+# TODO: this should be a submodule or something
+# to avoid de-syncing with void-docs/src/theme
+theme = "src/theme"
+default-theme = "void-light"
+preferred-dark-theme = "void-dark"
+edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
+limit-results = 100
diff --git a/manual/generate_mdbook.py b/manual/generate_mdbook.py
new file mode 100644
index 0000000000000..259b067272a0f
--- /dev/null
+++ b/manual/generate_mdbook.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+from dataclasses import asdict, dataclass, field
+import json
+from pathlib import Path
+import re
+import sys
+from typing import Optional
+
+
+BEGCUT_RE = re.compile("<!-- mdbook:cut -->")
+ENDCUT_RE = re.compile(r"<!-- mdbook:endcut -->")
+
+BEGPAGE_RE = re.compile(r"<!-- mdbook:page:(?P<name>[^ ]+) -->")
+ENDPAGE_RE = re.compile(r"<!-- mdbook:endpage -->")
+
+
+@dataclass
+class Chapter:
+ name: str
+ content: str
+ path: str
+ source_path: str
+ number: Optional[list[int]] = None
+ sub_items: list['Chapter'] = field(default_factory=list)
+ parent_names: list[str] = field(default_factory=list)
+
+
+@dataclass
+class Section:
+ Chapter: Chapter
+
+
+@dataclass
+class Book:
+ sections: list[Section]
+
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ if sys.argv[1] == "supports":
+ raise SystemExit
+
+ doc = Path("Manual.md").read_text()
+
+ # remove TOC anchor links
+ doc = re.sub(r'<a id="[^"]+"></a>', "", doc)
+ # increase heading levels (Manual.md uses ### as the highest level)
+ doc = re.sub(r"^##(#+ .+)$", r"\1", doc, flags=re.MULTILINE)
+ # replace relative links with absolute ones
+ doc = re.sub(
+ r"\[(?P<text>[^\]]+)\]\(\./(?P<url>[^)]+)\)",
+ r"[\g<text>](https://github.com/void-linux/void-packages/blob/master/\g<url>)",
+ doc
+ )
+ if False:
+ print(doc)
+ raise SystemExit
+
+ sections = []
+ chapter = []
+ num = 1
+ heading = ""
+ filename = ""
+ in_section = False
+ in_cut = False
+
+ for lno, line in enumerate(doc.split("\n")):
+ if BEGCUT_RE.search(line):
+ in_cut = True
+ elif in_cut:
+ if ENDCUT_RE.search(line):
+ in_cut = False
+ elif BEGCUT_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-cut marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ elif m := BEGPAGE_RE.search(line):
+ filename = f"{m.group('name')}.md"
+ in_section = True
+ elif in_section:
+ if ENDPAGE_RE.search(line):
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+ num += 1
+ heading = ""
+ chapter = []
+ in_section = False
+ elif line.startswith("# ") and not heading:
+ _, _, heading = line.partition(" ")
+ chapter += [line]
+ elif BEGPAGE_RE.search(line):
+ raise SyntaxError(
+ "missing end-of-page marker",
+ ("Manual.md", lno+1, 1, line, lno+1, len(line))
+ )
+ else:
+ chapter += [line]
+
+ # get the last section
+ sections.append(
+ Section(
+ Chapter(
+ name=heading,
+ number=[num],
+ content="\n".join(chapter),
+ path=filename,
+ source_path=filename,
+ )
+ )
+ )
+
+ # mdBook requires this key in the emitted json, for reasons unknown
+ book = asdict(Book(sections)) | {"__non_exhaustive": None}
+ print(json.dumps(book))
diff --git a/manual/src/SUMMARY.md b/manual/src/SUMMARY.md
new file mode 100644
index 0000000000000..73fa82d6e79c1
--- /dev/null
+++ b/manual/src/SUMMARY.md
@@ -0,0 +1 @@
+<!-- leave this file empty. mdBook needs it but it will not be used -->
diff --git a/manual/src/theme/book.js b/manual/src/theme/book.js
new file mode 100644
index 0000000000000..d1a280f9eca34
--- /dev/null
+++ b/manual/src/theme/book.js
@@ -0,0 +1,119 @@
+"use strict";
+
+// Fix back button cache problem
+window.onunload = function () { };
+
+(function theme() {
+ var html = document.querySelector("html");
+ var themeToggleButton = document.getElementById("theme-toggle");
+
+ themeToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("void-light")) {
+ html.classList.replace("void-light", "void-dark");
+ localStorage.setItem('mdbook-theme', "void-dark");
+ } else {
+ html.classList.replace("void-dark", "void-light");
+ localStorage.setItem('mdbook-theme', "void-light");
+ }
+ });
+})();
+
+(function sidebar() {
+ var html = document.querySelector("html");
+ var sidebar = document.getElementById("sidebar");
+ var sidebarLinks = document.querySelectorAll('#sidebar a');
+ var sidebarToggleButton = document.getElementById("sidebar-toggle");
+ var firstContact = null;
+
+ function showSidebar() {
+ html.classList.remove('sidebar-hidden')
+ html.classList.add('sidebar-visible');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', 0);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', true);
+ sidebar.setAttribute('aria-hidden', false);
+ try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
+ }
+
+ function hideSidebar() {
+ html.classList.remove('sidebar-visible')
+ html.classList.add('sidebar-hidden');
+ Array.from(sidebarLinks).forEach(function (link) {
+ link.setAttribute('tabIndex', -1);
+ });
+ sidebarToggleButton.setAttribute('aria-expanded', false);
+ sidebar.setAttribute('aria-hidden', true);
+ try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { }
+ }
+
+ // Toggle sidebar
+ sidebarToggleButton.addEventListener('click', function sidebarToggle() {
+ if (html.classList.contains("sidebar-hidden")) {
+ showSidebar();
+ } else if (html.classList.contains("sidebar-visible")) {
+ hideSidebar();
+ } else {
+ if (getComputedStyle(sidebar)['transform'] === 'none') {
+ hideSidebar();
+ } else {
+ showSidebar();
+ }
+ }
+ });
+
+ document.addEventListener('touchstart', function (e) {
+ firstContact = {
+ x: e.touches[0].clientX,
+ time: Date.now()
+ };
+ }, { passive: true });
+
+ document.addEventListener('touchmove', function (e) {
+ if (!firstContact)
+ return;
+
+ var curX = e.touches[0].clientX;
+ var xDiff = curX - firstContact.x,
+ tDiff = Date.now() - firstContact.time;
+
+ if (tDiff < 250 && Math.abs(xDiff) >= 150) {
+ if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300))
+ showSidebar();
+ else if (xDiff < 0 && curX < 300)
+ hideSidebar();
+
+ firstContact = null;
+ }
+ }, { passive: true });
+
+ // Scroll sidebar to current active section
+ var activeSection = sidebar.querySelector(".active");
+ if (activeSection) {
+ sidebar.scrollTop = activeSection.offsetTop;
+ }
+})();
+
+(function chapterNavigation() {
+ document.addEventListener('keydown', function (e) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; }
+ if (window.search && window.search.hasFocus()) { return; }
+
+ switch (e.key) {
+ case 'ArrowRight':
+ e.preventDefault();
+ var nextButton = document.querySelector('.nav-chapters.next');
+ if (nextButton) {
+ window.location.href = nextButton.href;
+ }
+ break;
+ case 'ArrowLeft':
+ e.preventDefault();
+ var previousButton = document.querySelector('.nav-chapters.previous');
+ if (previousButton) {
+ window.location.href = previousButton.href;
+ }
+ break;
+ }
+ });
+})();
diff --git a/manual/src/theme/css/chrome.css b/manual/src/theme/css/chrome.css
new file mode 100644
index 0000000000000..544e7718ed9d2
--- /dev/null
+++ b/manual/src/theme/css/chrome.css
@@ -0,0 +1,484 @@
+/* CSS for UI elements (a.k.a. chrome) */
+
+@import 'variables.css';
+
+::-webkit-scrollbar {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+html {
+ scrollbar-color: var(--scrollbar) var(--bg);
+}
+#searchresults a,
+.content a:link,
+a:visited,
+a > .hljs {
+ color: var(--links);
+}
+
+/* Menu Bar */
+
+#menu-bar,
+#menu-bar-hover-placeholder {
+ z-index: 101;
+ margin: auto calc(0px - var(--page-padding));
+}
+#menu-bar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ background-color: var(--bg);
+ border-bottom-color: var(--bg);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+}
+#menu-bar.sticky,
+.js #menu-bar-hover-placeholder:hover + #menu-bar,
+.js #menu-bar:hover,
+.js.sidebar-visible #menu-bar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0 !important;
+}
+#menu-bar-hover-placeholder {
+ position: sticky;
+ position: -webkit-sticky;
+ top: 0;
+ height: var(--menu-bar-height);
+}
+#menu-bar.bordered {
+ border-bottom-color: var(--table-border-color);
+}
+#menu-bar i, #menu-bar .icon-button {
+ position: relative;
+ padding: 0 8px;
+ z-index: 10;
+ line-height: var(--menu-bar-height);
+ cursor: pointer;
+ transition: color 0.5s;
+}
+@media only screen and (max-width: 420px) {
+ #menu-bar i, #menu-bar .icon-button {
+ padding: 0 5px;
+ }
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ padding: 0;
+ color: inherit;
+}
+.icon-button i {
+ margin: 0;
+}
+
+.right-buttons {
+ margin: 0 15px;
+}
+.right-buttons a {
+ text-decoration: none;
+}
+
+.left-buttons {
+ display: flex;
+ margin: 0 5px;
+}
+.no-js .left-buttons {
+ display: none;
+}
+
+.menu-title {
+ display: inline-block;
+ font-weight: 200;
+ font-size: 2.4rem;
+ line-height: var(--menu-bar-height);
+ text-align: center;
+ margin: 0;
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.js .menu-title {
+ cursor: pointer;
+}
+
+.menu-bar,
+.menu-bar:visited,
+.nav-chapters,
+.nav-chapters:visited,
+.mobile-nav-chapters,
+.mobile-nav-chapters:visited,
+.menu-bar .icon-button,
+.menu-bar a i {
+ color: var(--icons);
+}
+
+.menu-bar i:hover,
+.menu-bar .icon-button:hover,
+.nav-chapters:hover,
+.mobile-nav-chapters i:hover {
+ color: var(--icons-hover);
+}
+
+/* Nav Icons */
+
+.nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ margin: 0;
+ max-width: 150px;
+ min-width: 90px;
+
+ display: flex;
+ justify-content: center;
+ align-content: center;
+ flex-direction: column;
+
+ transition: color 0.5s, background-color 0.5s;
+}
+
+.nav-chapters:hover {
+ text-decoration: none;
+ transition: color 0.15s, color 0.15s;
+}
+
+.nav-wrapper {
+ margin-top: 50px;
+ display: none;
+}
+
+.mobile-nav-chapters {
+ font-size: 2.5em;
+ text-align: center;
+ text-decoration: none;
+ width: 90px;
+ border-radius: 5px;
+ background-color: var(--sidebar-bg);
+}
+
+.previous {
+ float: left;
+}
+
+.next {
+ float: right;
+ right: var(--page-padding);
+}
+
+@media only screen and (max-width: 1080px) {
+ .nav-wide-wrapper { display: none; }
+ .nav-wrapper { display: block; }
+}
+
+@media only screen and (max-width: 1380px) {
+ .sidebar-visible .nav-wide-wrapper { display: none; }
+ .sidebar-visible .nav-wrapper { display: block; }
+}
+
+/* Inline code */
+
+:not(pre) > .hljs {
+ display: inline;
+ padding: 0.1em 0.3em;
+ border-radius: 3px;
+}
+
+:not(pre):not(a) > .hljs {
+ color: var(--inline-code-color);
+ overflow-x: initial;
+}
+
+a:hover > .hljs {
+ text-decoration: underline;
+}
+
+pre {
+ position: relative;
+}
+pre > .buttons {
+ position: absolute;
+ z-index: 100;
+ right: 5px;
+ top: 5px;
+
+ color: var(--sidebar-fg);
+ cursor: pointer;
+}
+pre > .buttons :hover {
+ color: var(--sidebar-active);
+}
+pre > .buttons i {
+ margin-left: 8px;
+}
+pre > .buttons button {
+ color: inherit;
+ background: transparent;
+ border: none;
+ cursor: inherit;
+}
+pre > .result {
+ margin-top: 10px;
+}
+
+/* Search */
+
+#searchresults a {
+ text-decoration: none;
+}
+
+mark {
+ border-radius: 2px;
+ padding: 0 3px 1px 3px;
+ margin: 0 -3px -1px -3px;
+ background-color: var(--search-mark-bg);
+ transition: background-color 300ms linear;
+ cursor: pointer;
+}
+
+mark.fade-out {
+ background-color: rgba(0,0,0,0) !important;
+ cursor: auto;
+}
+
+.searchbar-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+}
+
+#searchbar {
+ width: 100%;
+ margin: 5px auto 0px auto;
+ padding: 10px 16px;
+ transition: box-shadow 300ms ease-in-out;
+ border: 1px solid var(--searchbar-border-color);
+ border-radius: 3px;
+ background-color: var(--searchbar-bg);
+ color: var(--searchbar-fg);
+}
+#searchbar:focus,
+#searchbar.active {
+ box-shadow: 0 0 3px var(--searchbar-shadow-color);
+}
+
+.searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+ color: var(--searchresults-header-fg);
+}
+
+.searchresults-outer {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--content-max-width);
+ border-bottom: 1px dashed var(--searchresults-border-color);
+}
+
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults li.focus {
+ background-color: var(--searchresults-li-bg);
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+ul#searchresults span.teaser em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+/* Sidebar */
+
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: var(--sidebar-width);
+ font-size: 0.875em;
+ box-sizing: border-box;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior-y: contain;
+ background-color: var(--sidebar-bg);
+ color: var(--sidebar-fg);
+}
+.sidebar-resizing {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.js:not(.sidebar-resizing) .sidebar {
+ transition: transform 0.3s; /* Animation: slide away */
+}
+.sidebar code {
+ line-height: 2em;
+}
+/* .sidebar .sidebar-scrollbox {
+ overflow-y: auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 10px 10px;
+} */
+.sidebar .sidebar-resize-handle {
+ position: absolute;
+ cursor: col-resize;
+ width: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+.js .sidebar .sidebar-resize-handle {
+ cursor: col-resize;
+ width: 5px;
+}
+.sidebar-hidden .sidebar {
+ transform: translateX(calc(0px - var(--sidebar-width)));
+}
+.sidebar::-webkit-scrollbar {
+ background: var(--sidebar-bg);
+}
+.sidebar::-webkit-scrollbar-thumb {
+ background: var(--scrollbar);
+}
+
+.chapter {
+ list-style: none outside none;
+ padding-left: 0;
+ line-height: 2.2em;
+}
+
+.chapter ol {
+ width: 100%;
+}
+
+.chapter li {
+ display: flex;
+ color: var(--sidebar-non-existant);
+}
+.chapter li a {
+ display: block;
+ padding: 0;
+ text-decoration: none;
+ color: var(--sidebar-fg);
+}
+
+.chapter li a:hover {
+ color: var(--sidebar-active);
+}
+
+.chapter li a.active {
+ color: var(--sidebar-active);
+}
+
+.chapter li > a.toggle {
+ cursor: pointer;
+ display: block;
+ margin-left: auto;
+ padding: 0 10px;
+ user-select: none;
+ opacity: 0.68;
+}
+
+.chapter li > a.toggle div {
+ transition: transform 0.5s;
+}
+
+/* collapse the section */
+.chapter li:not(.expanded) + li > ol {
+ display: none;
+}
+
+.chapter li.chapter-item {
+ line-height: 1.5em;
+ margin-top: 0.6em;
+}
+
+.chapter li.expanded > a.toggle div {
+ transform: rotate(90deg);
+}
+
+.spacer {
+ width: 100%;
+ height: 3px;
+ margin: 5px 0px;
+}
+.chapter .spacer {
+ background-color: var(--sidebar-spacer);
+}
+
+@media (-moz-touch-enabled: 1), (pointer: coarse) {
+ .chapter li a { padding: 5px 0; }
+ .spacer { margin: 10px 0; }
+}
+
+.section {
+ list-style: none outside none;
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+
+/* Theme Menu Popup */
+
+.theme-popup {
+ position: absolute;
+ left: 10px;
+ top: var(--menu-bar-height);
+ z-index: 1000;
+ border-radius: 4px;
+ font-size: 0.7em;
+ color: var(--fg);
+ background: var(--theme-popup-bg);
+ border: 1px solid var(--theme-popup-border);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: none;
+}
+.theme-popup .default {
+ color: var(--icons);
+}
+.theme-popup .theme {
+ width: 100%;
+ border: 0;
+ margin: 0;
+ padding: 2px 10px;
+ line-height: 25px;
+ white-space: nowrap;
+ text-align: left;
+ cursor: pointer;
+ color: inherit;
+ background: inherit;
+ font-size: inherit;
+}
+.theme-popup .theme:hover {
+ background-color: var(--theme-hover);
+}
+.theme-popup .theme:hover:first-child,
+.theme-popup .theme:hover:last-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
diff --git a/manual/src/theme/css/general.css b/manual/src/theme/css/general.css
new file mode 100644
index 0000000000000..740ad0d140ef6
--- /dev/null
+++ b/manual/src/theme/css/general.css
@@ -0,0 +1,345 @@
+@import 'variables.css';
+
+body {
+ font-family: 'Ubuntu', sans-serif;
+ font-size: 1rem;
+ line-height: 1.5;
+ color: var(--fg);
+ margin: 0;
+ background-color: var(--bg);
+}
+h1, h2, h3, h4, h5, h6 { color: var(--fg); }
+a, a:visited {
+ color: var(--links);
+ text-decoration: none;
+}
+a:hover, a:visited:hover {
+ color: var(--links-hover);
+ text-decoration: underline;
+}
+
+code {
+ background: var(--inline-code-color);
+ padding: 2px 4px;
+ border-radius: 4px;
+ white-space: pre-wrap;
+ overflow-wrap: break-word;
+}
+pre code {
+ padding: 0;
+ border-radius: 0;
+}
+pre {
+ padding: .5em;
+ margin: 1em 0;
+ background: var(--inline-code-color);
+ border: 1px solid var(--code-border);
+ border-radius: 4px;
+}
+
+blockquote {
+ margin: 20px 0;
+ padding: 0 20px;
+ padding-left: 1em;
+ background: var(--quote-bg);
+ border: 1px solid var(--quote-border);
+ border-left: none;
+ border-right: none;
+}
+
+blockquote code {
+ background: var(--quote-code-bg);
+}
+
+li.js-unavailable {
+ background-color: #f6cf68;
+ border-radius: 10px;
+ margin-left: 1em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+table {
+ border-collapse: collapse;
+ display: block;
+ overflow-y: auto;
+ border: 1px var(--table-border-color) solid;
+}
+table td {
+ padding: 3px 20px;
+}
+table thead {
+ background: var(--table-header-bg);
+ color: var(--table-header-fg);
+}
+table thead td {
+ font-weight: 700;
+}
+table tbody tr:nth-child(2n) {
+ /* Alternate background colors for rows */
+ background: var(--table-alternate-bg);
+}
+
+svg {
+ position: relative;
+ top: .125em;
+ width: 1em;
+ height: auto;
+}
+
+.hidden {
+ display: none;
+}
+
+.icon-button {
+ border: none;
+ background: none;
+ cursor: pointer;
+ padding: 1em;
+}
+
+/* void navigation */
+
+#void-nav {
+ width: 100%;
+ min-height: 50px;
+ background: var(--nav-bg);
+ font-size: 14px;
+
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+#void-nav a,
+#void-nav button,
+#void-nav label {
+ fill: var(--nav-fg);
+ height: 50px;
+ min-height: 100%;
+ display: block;
+ line-height: 50px;
+ padding: 0 15px;
+ font-size: 1.2em;
+}
+#void-nav ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#void-nav ul#nav-right {
+ margin-left: auto;
+}
+
+#void-nav ul li {
+ display: inline-block;
+}
+#void-nav ul li a {
+ color: var(--nav-fg);
+ display: block;
+ padding: 0 15px;
+ line-height: 50px;
+ font-size: 1.2em;
+ text-decoration: none
+}
+#void-nav ul li a:hover,
+#void-nav ul li a:focus,
+#void-nav button:hover,
+#void-nav button:focus,
+#void-nav label:hover,
+#void-nav label:focus {
+ background: #000;
+}
+
+#skip-to-content {
+ position: absolute;
+ left: -999px;
+ top: -999px;
+}
+
+#skip-to-content:active,
+#skip-to-content:focus {
+ position: relative;
+ left: 0;
+ top: 0;
+}
+
+#icon-theme-light {
+ display: var(--theme-toggle-light);
+}
+#icon-theme-dark {
+ display: var(--theme-toggle-dark);
+}
+
+/* sidebar */
+
+.sidebar-hidden #sidebar {
+ display: none;
+}
+#sidebar {
+ padding: .5em;
+ background: var(--sidebar-bg);
+ font-size: 0.875em;
+ min-height: calc(100vh - 50px - 14px);
+}
+#sidebar ol {
+ list-style: none;
+ margin: 0;
+}
+#sidebar ol.chapter {
+ padding: 0;
+ line-height: 2.2em;
+}
+#sidebar ol.section {
+ padding-left: 20px;
+ line-height: 1.9em;
+}
+#sidebar a {
+ color: var(--sidebar-fg);
+ display: block;
+}
+#sidebar a:hover {
+ color: var(--sidebar-active);
+ text-decoration: none;
+}
+#sidebar a.active {
+ color: var(--sidebar-active);
+}
+
+#sidebar-toggle {
+ display: none;
+}
+
+/* search */
+
+#searchbar {
+ width: 100%;
+ padding: 10px 16px;
+ margin: 5px 0;
+ border-radius: 3px;
+ border: 1px solid var(--searchbar-border-color);
+}
+#searchresults-header {
+ font-weight: bold;
+ font-size: 1em;
+ padding: 18px 0 0 5px;
+}
+ul#searchresults {
+ list-style: none;
+ padding-left: 20px;
+}
+ul#searchresults li {
+ margin: 10px 0px;
+ padding: 2px;
+ border-radius: 2px;
+}
+ul#searchresults span.teaser {
+ display: block;
+ clear: both;
+ margin: 5px 0 0 20px;
+ font-size: 0.8em;
+}
+
+/* chapter navigation */
+
+#nav-wide-wrapper {
+ max-width: 800px;
+ margin: 0 auto;
+ margin-top: 50px;
+}
+.previous {
+ float: left;
+}
+.next {
+ float: right;
+ right: 15px;
+}
+.nav-chapters {
+ fill: var(--nav-arrow-fg);
+ text-align: center;
+ text-decoration: none;
+ display: block;
+ max-width: 150px;
+ min-width: 90px;
+}
+.nav-chapters:hover {
+ text-decoration: none;
+ fill: var(--nav-fg-hover);
+}
+
+.nav-chapters svg {
+ margin: 0 auto;
+ width: 1.5em;
+}
+.mobile-nav-chapters {
+ fill: var(--nav-arrow-fg);
+}
+.mobile-nav-chapters:hover {
+ fill: var(--nav-fg-hover);
+}
+
+/* layout */
+
+body {
+ box-sizing: border-box;
+}
+#content {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+#page-wrapper {
+ --content-padding: 10px;
+ padding: 0 var(--content-padding);
+ width: calc(100% - var(--content-padding) * 2);
+}
+#search-wrapper,
+#page-wrapper main {
+ width: 100%;
+ max-width: 800px;
+ margin: 0 auto;
+}
+#sidebar {
+ max-width: 300px;
+ flex-shrink: 0;
+}
+
+/* 300px + 800px + 2*90px + 15px */
+@media only screen and (min-width: 1295px) {
+ .sidebar-visible #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-visible .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+}
+/* 800px + 2*90px + 15px */
+@media only screen and (min-width: 995px) {
+ .sidebar-hidden #nav-wide-wrapper {
+ max-width: none;
+ margin: 0;
+ }
+ .sidebar-hidden .nav-chapters {
+ background: none;
+ position: fixed;
+ top: 50px;
+ bottom: 0;
+ margin: 0;
+ justify-content: center;
+ align-content: center;
+ display: flex;
+ flex-direction: column;
+ }
+ table {
+ display: table;
+ }
+}
diff --git a/manual/src/theme/css/print.css b/manual/src/theme/css/print.css
new file mode 100644
index 0000000000000..2970c2b6c7aba
--- /dev/null
+++ b/manual/src/theme/css/print.css
@@ -0,0 +1,79 @@
+
+#sidebar,
+#menu-bar,
+#void-nav,
+.nav-chapters,
+.mobile-nav-chapters {
+ display: none;
+}
+
+#page-wrapper.page-wrapper {
+ transform: none;
+ margin-left: 0px;
+ overflow-y: initial;
+}
+
+#content {
+ max-width: none;
+ margin: 0;
+ padding: 0;
+}
+
+.page {
+ overflow-y: initial;
+}
+
+code {
+ background-color: #ddd;
+ border-radius: 5px;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+
+pre {
+ background-color: #ddd;
+
+ /* Force background to be printed in Chrome */
+ -webkit-print-color-adjust: exact;
+}
+
+pre > .buttons {
+ z-index: 2;
+}
+
+a, a:visited, a:active, a:hover {
+ color: #4183c4;
+ text-decoration: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ page-break-inside: avoid;
+ page-break-after: avoid;
+}
+
+pre, code {
+ page-break-inside: avoid;
+ white-space: pre-wrap;
+}
+
+svg {
+ display: none !important;
+}
+
+table {
+ color: black;
+ border-color: black;
+ background-color: unset;
+}
+
+table thead tr {
+ color: black;
+ background-color: unset;
+}
+
+table tbody tr {
+ background-color: unset;
+}
+
diff --git a/manual/src/theme/css/variables.css b/manual/src/theme/css/variables.css
new file mode 100644
index 0000000000000..ea306becc5fb5
--- /dev/null
+++ b/manual/src/theme/css/variables.css
@@ -0,0 +1,107 @@
+
+/* Globals */
+
+:root {
+ --sidebar-width: 300px;
+ --page-padding: 15px;
+ --content-max-width: 750px;
+ --menu-bar-height: 50px;
+ --void-green: #478061;
+ --void-dark-green: #62b086;
+ --void-light: #fafafa;
+ --void-dark: #252525;
+}
+
+/* Themes */
+
+.void-light {
+ --bg: #ffffff;
+ --fg: #333;
+
+ --sidebar-bg: var(--void-light);
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: var(--void-green);
+ --nav-fg: var(--bg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #000;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #fdf6e3;
+ --code-border: #ccc;
+
+ --theme-toggle-light: none;
+ --theme-toggle-dark: inherit;
+
+ --quote-bg: #ebf4ef;
+ --quote-border: #d1e6da;
+ --quote-code-bg: var(--inline-code-color);
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: var(--void-light);
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
+
+.void-dark {
+ --bg: #222;
+ --fg: #ccc;
+
+ --sidebar-bg: #252525;
+ --sidebar-fg: var(--fg);
+ --sidebar-active: var(--links);
+
+ --nav-bg: #295340;
+ --nav-fg: var(--fg);
+ --nav-arrow-fg: var(--fg);
+ --nav-fg-hover: #fff;
+
+ --scrollbar: var(--sidebar-fg);
+
+ --icons: #737480;
+ --icons-hover: #b7b9cc;
+
+ --links: var(--void-dark-green);
+ --links-hover: var(--fg);
+
+ --inline-code-color: #353535;
+ --code-border: #111;
+
+ --theme-toggle-light: inherit;
+ --theme-toggle-dark: none;
+
+ --quote-bg: #293d35;
+ --quote-border: #22362e;
+ --quote-code-bg: #2a2a2a;
+
+ --table-border-color: var(--void-green);
+ --table-header-bg: var(--void-green);
+ --table-header-fg: #fff;
+ --table-alternate-bg: #2c2c2c;
+
+ --searchbar-border-color: #aaa;
+ --searchbar-bg: var(--bg);
+ --searchbar-fg: var(--fg);
+ --searchbar-shadow-color: #d4c89f;
+ --searchresults-header-fg: #666;
+ --searchresults-border-color: #888;
+ --searchresults-li-bg: #252932;
+ --search-mark-bg: #e3b171;
+}
diff --git a/manual/src/theme/favicon.png b/manual/src/theme/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ec045d08445cdd73c7413e01a89754827593f
GIT binary patch
literal 5800
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
literal 0
HcmV?d00001
diff --git a/manual/src/theme/index.hbs b/manual/src/theme/index.hbs
new file mode 100644
index 0000000000000..5679e803b1ba7
--- /dev/null
+++ b/manual/src/theme/index.hbs
@@ -0,0 +1,253 @@
+<!DOCTYPE HTML>
+<html lang="{{ language }}" class="sidebar-visible no-js {{ default_theme }}">
+ <head>
+ <!-- Book generated using mdBook -->
+ <meta charset="UTF-8">
+ <title>{{ title }}</title>
+ {{#if is_print }}
+ <meta name="robots" content="noindex" />
+ {{/if}}
+ {{#if base_url}}
+ <base href="{{ base_url }}">
+ {{/if}}
+
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="description" content="{{ description }}">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff" />
+
+ <link rel="shortcut icon" href="{{ path_to_root }}favicon.png">
+ <link rel="stylesheet" href="{{ path_to_root }}css/variables.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/general.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/chrome.css">
+ <link rel="stylesheet" href="{{ path_to_root }}css/print.css" media="print">
+ </head>
+ <body>
+ <!-- Provide site root to javascript -->
+ <script type="text/javascript">
+ var path_to_root = "{{ path_to_root }}";
+ var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
+ </script>
+ <!-- Work around some values being stored in localStorage wrapped in quotes -->
+ <script type="text/javascript">
+ try {
+ var theme = localStorage.getItem('mdbook-theme');
+ var sidebar = localStorage.getItem('mdbook-sidebar');
+
+ if (theme.startsWith('"') && theme.endsWith('"')) {
+ localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
+ }
+ if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
+ localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
+ }
+ } catch (e) { }
+ </script>
+
+ <!-- Set the theme before any content is loaded, prevents flash -->
+ <script type="text/javascript">
+ var theme;
+ try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+ if (theme === null || theme === undefined) { theme = default_theme; }
+ var html = document.querySelector('html');
+ html.classList.remove('no-js')
+ html.classList.remove('{{ default_theme }}')
+ html.classList.add(theme);
+ html.classList.add('js');
+ </script>
+
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <header>
+ <nav id="void-nav">
+ <ul>
+ <li><a id="skip-to-content" tabindex="1" href="#main">Skip to content</a></li>
+ <li>
+ <a id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z"/>
+ </svg>
+ </a>
+ </li>
+ <li>
+ <a id="theme-toggle" class="icon-button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
+ <svg id="icon-theme-light" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/>
+ </svg>
+ <svg id="icon-theme-dark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"/>
+ </svg>
+ </a>
+ </li>
+ {{#if print_enable}}
+ <li>
+ <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M448 192V77.25c0-8.49-3.37-16.62-9.37-22.63L393.37 9.37c-6-6-14.14-9.37-22.63-9.37H96C78.33 0 64 14.33 64 32v160c-35.35 0-64 28.65-64 64v112c0 8.84 7.16 16 16 16h48v96c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-96h48c8.84 0 16-7.16 16-16V256c0-35.35-28.65-64-64-64zm-64 256H128v-96h256v96zm0-224H128V64h192v48c0 8.84 7.16 16 16 16h48v96zm48 72c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if git_repository_edit_url}}
+ <li>
+ <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
+ <path d="M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"/>
+ </svg>
+ </a>
+ </li>
+ {{/if}}
+ {{#if search_enabled}}
+ <li>
+ <a id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+ <path d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46C10.79 14.43 9.21 15 7.5 15 3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/>
+ </svg>
+ </a>
+ </li>
+ <noscript>
+ <li class="js-unavailable">Search functionality requires JavaScript</li>
+ </noscript>
+ {{/if}}
+ </ul>
+ <ul id="nav-right">
+ <li><a href="https://www.voidlinux.org">Home</a></li>
+ <li><a href="https://www.voidlinux.org/news/">News</a></li>
+ <li><a href="https://www.voidlinux.org/download/">Download</a></li>
+ <li><a href="https://www.voidlinux.org/packages/">Packages</a></li>
+ <li><a href="https://docs.voidlinux.org">Documentation</a></li>
+ <li><a href="https://man.voidlinux.org/">Manual Pages</a></li>
+ <li><a href="https://github.com/void-linux">GitHub</a></li>
+ </ul>
+ </nav>
+ </header>
+
+ <div id="content">
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script type="text/javascript">
+ var html = document.querySelector('html');
+ var sidebar = 'hidden';
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ }
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <nav id="sidebar" aria-label="Table of contents">
+ {{#toc}}{{/toc}}
+ </nav>
+
+ <div id="page-wrapper" class="page-wrapper">
+
+
+ {{#if search_enabled}}
+ <div id="search-wrapper" class="hidden">
+ <form id="searchbar-outer" class="searchbar-outer">
+ <input type="search" name="search" id="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
+ </form>
+ <div id="searchresults-outer" class="searchresults-outer hidden">
+ <div id="searchresults-header" class="searchresults-header"></div>
+ <ul id="searchresults">
+ </ul>
+ </div>
+ </div>
+ {{/if}}
+
+ <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
+ <script type="text/javascript">
+ document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
+ document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
+ Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
+ link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
+ });
+ </script>
+
+ <main id="main">
+ {{{ content }}}
+ </main>
+
+ <nav class="nav-wrapper" aria-label="Page navigation">
+ <!-- Mobile navigation buttons -->
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+
+ <div style="clear: both"></div>
+ </nav>
+
+ <nav class="nav-wide-wrapper" aria-label="Page navigation">
+ {{#previous}}
+ <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M4 10l9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>
+ </svg>
+ </a>
+ {{/previous}}
+
+ {{#next}}
+ <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <path d="M7 1L5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>
+ </svg>
+ </a>
+ {{/next}}
+ </nav>
+ </div>
+ </div>
+
+ {{#if livereload}}
+ <!-- Livereload script (if served using the cli tool) -->
+ <script type="text/javascript">
+ var socket = new WebSocket("{{{livereload}}}");
+ socket.onmessage = function (event) {
+ if (event.data === "reload") {
+ socket.close();
+ location.reload(true); // force reload from server (not from cache)
+ }
+ };
+
+ window.onbeforeunload = function() {
+ socket.close();
+ }
+ </script>
+ {{/if}}
+
+ {{#if search_js}}
+ <script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script>
+ <script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script>
+ {{/if}}
+
+ <script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script>
+ {{#if is_print}}
+ <script type="text/javascript">
+ window.addEventListener('load', function() {
+ window.setTimeout(window.print, 100);
+ });
+ </script>
+ {{/if}}
+ </body>
+</html>
From 5912abd4cda57677c792f459b2c1267516357ae6 Mon Sep 17 00:00:00 2001
From: classabbyamp <dev@placeviolette.net>
Date: Fri, 1 Apr 2022 15:24:18 -0400
Subject: [PATCH 2/2] manual/: add linkcheck, CI for checking Manual.md changes
---
.github/workflows/manual.yml | 28 ++++++++++++++++++++++++++++
common/travis/manual-ci.sh | 10 ++++++++++
manual/book.toml | 7 ++++++-
3 files changed, 44 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/manual.yml
create mode 100755 common/travis/manual-ci.sh
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
new file mode 100644
index 0000000000000..dc7847e26545f
--- /dev/null
+++ b/.github/workflows/manual.yml
@@ -0,0 +1,28 @@
+name: Check Manual Changes
+
+on:
+ pull_request:
+ paths:
+ - 'Manual.md'
+ - 'manual/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ manual:
+ name: Check links
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/void-linux/void-musl:20231230R1
+ steps:
+ - name: Prepare container
+ run: |
+ xbps-install -Syu || xbps-install -Syu xbps
+ xbps-install -yu
+ xbps-install -y git bash mdBook mdbook-linkcheck
+ - name: Clone and checkout
+ uses: classabbyamp/treeless-checkout-action@v1
+ - run: ./common/travis/manual-ci.sh
+
diff --git a/common/travis/manual-ci.sh b/common/travis/manual-ci.sh
new file mode 100755
index 0000000000000..34281e42bf12a
--- /dev/null
+++ b/common/travis/manual-ci.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+echo "Checking links"
+RUST_LOG=linkcheck=debug mdbook build manual
+LINKCHECK=$?
+
+# Generate exit value
+if [ ! $LINKCHECK -eq 0 ] ; then
+ exit 2
+fi
diff --git a/manual/book.toml b/manual/book.toml
index 8f15412495ebc..2a98cbe327af3 100644
--- a/manual/book.toml
+++ b/manual/book.toml
@@ -5,7 +5,7 @@ src = "src"
title = "XBPS Source Packages Manual"
[preprocessor.gen_manual]
-command = "python3 generate_mdbook.py"
+command = "python3 manual/generate_mdbook.py"
[output.html]
# TODO: this should be a submodule or something
@@ -15,3 +15,8 @@ default-theme = "void-light"
preferred-dark-theme = "void-dark"
edit-url-template = "https://github.com/void-linux/void-packages/edit/master/Manual.md"
limit-results = 100
+
+[output.linkcheck]
+optional = true
+follow-web-links = true
+exclude = [ "https://docs.github.com/en/get-started/quickstart/fork-a-repo" ]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Manual: generate mdbook version
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
` (2 preceding siblings ...)
2024-02-12 20:47 ` classabbyamp
@ 2024-05-14 1:46 ` github-actions
2024-07-24 7:07 ` [PR PATCH] [Closed]: " classabbyamp
4 siblings, 0 replies; 6+ messages in thread
From: github-actions @ 2024-05-14 1:46 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 305 bytes --]
New comment by github-actions[bot] on void-packages repository
https://github.com/void-linux/void-packages/pull/48677#issuecomment-2109122689
Comment:
Pull Requests become stale 90 days after last activity and are closed 14 days after that. If this pull request is still relevant bump it or assign it.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PR PATCH] [Closed]: Manual: generate mdbook version
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
` (3 preceding siblings ...)
2024-05-14 1:46 ` github-actions
@ 2024-07-24 7:07 ` classabbyamp
4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2024-07-24 7:07 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 460 bytes --]
There's a closed pull request on the void-packages repository
Manual: generate mdbook version
https://github.com/void-linux/void-packages/pull/48677
Description:
#35856 rises from the ashes, this time with cleaner code and less reliance on the markdown!
still working on the theming, and I'd maybe like to do a go-through of the manual updating everything before or after this is merged
#### Testing the changes
- I tested the changes in this PR: **YES**
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-07-24 7:07 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-12 20:12 [PR PATCH] Manual: generate mdbook version classabbyamp
2024-02-12 20:45 ` [PR PATCH] [Updated] " classabbyamp
2024-02-12 20:46 ` classabbyamp
2024-02-12 20:47 ` classabbyamp
2024-05-14 1:46 ` github-actions
2024-07-24 7:07 ` [PR PATCH] [Closed]: " classabbyamp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).