From a6868f83792331d3e12e776047699d903656c83a Mon Sep 17 00:00:00 2001 From: Daniel McCarney Date: Thu, 19 Dec 2024 17:43:33 -0500 Subject: [PATCH] add an API docs website powered by Zola This commit adds a Zola[0] website that can template the API docs JSON data into a nice website showing off our API. The choice of Zola (and the initial CSS/config) are inspired by the https://rustls.dev website which also uses Zola. To use: ``` cargo run --bin docgen > website/static/api.json cd website && zola serve open http://locahost:1111 ``` [0]: https://www.getzola.org/ --- .gitignore | 2 + website/README.md | 5 + website/config.toml | 18 +++ website/content/_index.md | 4 + website/static/GeneralSans-Variable.woff2 | Bin 0 -> 38132 bytes website/static/rustls-ferris.png | Bin 0 -> 498408 bytes website/static/style.css | 150 ++++++++++++++++++++++ website/templates/_api_section.html | 32 +++++ website/templates/base.html | 13 ++ website/templates/index.html | 34 +++++ website/templates/macros.html | 27 ++++ 11 files changed, 285 insertions(+) create mode 100644 website/README.md create mode 100644 website/config.toml create mode 100644 website/content/_index.md create mode 100644 website/static/GeneralSans-Variable.woff2 create mode 100644 website/static/rustls-ferris.png create mode 100644 website/static/style.css create mode 100644 website/templates/_api_section.html create mode 100644 website/templates/base.html create mode 100644 website/templates/index.html create mode 100644 website/templates/macros.html diff --git a/.gitignore b/.gitignore index b675f021..2db83dd3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ librustls/cmake-build* .idea .venv .vs +/website/static/api.json +/website/public diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..7e944229 --- /dev/null +++ b/website/README.md @@ -0,0 +1,5 @@ +Source for the website at `https://ffi.rustls.dev/` + +This uses [Zola](https://www.getzola.org/). + +Run `zola serve` in this directory to run a local copy. diff --git a/website/config.toml b/website/config.toml new file mode 100644 index 00000000..6498c85b --- /dev/null +++ b/website/config.toml @@ -0,0 +1,18 @@ +# The URL the site will be built for +base_url = "https://ffi.rustls.dev/" + +# Whether to automatically compile all Sass files in the sass directory +compile_sass = false + +# Whether to build a search index to be used later on by a JavaScript library +build_search_index = false + +[markdown] +# Whether to do syntax highlighting +# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola +highlight_code = true + +[slugify] +paths_keep_dates = true + +[extra] diff --git a/website/content/_index.md b/website/content/_index.md new file mode 100644 index 00000000..20c3eed3 --- /dev/null +++ b/website/content/_index.md @@ -0,0 +1,4 @@ ++++ +title = "rustls-ffi API docs" +template = "index.html" ++++ diff --git a/website/static/GeneralSans-Variable.woff2 b/website/static/GeneralSans-Variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..55e906ba3b2d415015f354c0627fbf2462353af4 GIT binary patch literal 38132 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