aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-12-20 20:20:07 +0100
committerDavid Robillard <d@drobilla.net>2020-12-21 09:48:06 +0100
commitf95f22013d51133ec1a7b1554878ff354b9f0f21 (patch)
tree2f65c78412fa9a083bc82e49480ba206fa14a689 /doc
parentfabf7113483ffd70024df989de3aa9361146d60c (diff)
downloadserd-f95f22013d51133ec1a7b1554878ff354b9f0f21.tar.gz
serd-f95f22013d51133ec1a7b1554878ff354b9f0f21.tar.bz2
serd-f95f22013d51133ec1a7b1554878ff354b9f0f21.zip
Generate documentation with Sphinx
Diffstat (limited to 'doc')
-rw-r--r--doc/_static/custom.css95
-rw-r--r--doc/_templates/about.html57
-rw-r--r--doc/c/Doxyfile33
-rw-r--r--doc/c/index.rst5
-rw-r--r--doc/c/overview.rst22
-rw-r--r--doc/c/reference.rst11
-rw-r--r--doc/c/wscript42
-rw-r--r--doc/conf.py.in86
-rw-r--r--doc/footer.html20
-rw-r--r--doc/header.html46
-rw-r--r--doc/index.html.in35
-rw-r--r--doc/layout.xml194
-rw-r--r--doc/mainpage.md15
-rw-r--r--doc/serd.rst11
-rw-r--r--doc/style.css808
15 files changed, 362 insertions, 1118 deletions
diff --git a/doc/_static/custom.css b/doc/_static/custom.css
new file mode 100644
index 00000000..60aa759e
--- /dev/null
+++ b/doc/_static/custom.css
@@ -0,0 +1,95 @@
+div.document {
+ margin: 0;
+}
+
+div.body {
+ margin-top: 2em;
+}
+
+div.sphinxsidebarwrapper {
+ background: #EEE;
+}
+
+div.sphinxsidebarwrapper p.blurb {
+ text-align: center;
+}
+
+div.sphinxsidebarwrapper span.logo {
+ display: block;
+ text-align: center;
+ font-family: Georgia, serif;
+ padding: 0;
+ font-size: 180%;
+}
+
+div.sphinxsidebar a {
+ border-width: 0;
+}
+
+div.sphinxsidebar li {
+ color: #444;
+}
+
+div.section {
+ margin-top: 2.5em;
+}
+
+a.reference {
+ border-bottom: none;
+}
+
+code.xref {
+ font-weight: normal;
+ background-color: #F8F8F8;
+ padding: 0.1em 0 0.1em 0;
+}
+
+div.section > dl.c > dt:first-child,
+div.section > dl.cpp > dt:first-child {
+ background-color: #F8F8F8;
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.9em;
+ font-weight: normal;
+ margin-bottom: 0.5em;
+ padding: 0.1em 0 0.1em 0;
+}
+
+tt.descname, tt.descclassname, code.descname, code.descclassname {
+ font-size: 0.9em;
+}
+
+dl.member {
+ margin-top: 0.5em;
+}
+
+dl.enumerator {
+ margin-top: 0.5em;
+}
+
+dl.field-list > dt {
+ padding-left: 0;
+}
+
+pre, tt, code {
+ background-color: #F8F8F8;
+}
+
+.toctree-l1 {
+ margin-top: 1.0em;
+}
+
+img.logo {
+ width: 6em;
+}
+
+.class {
+ padding-top: 1.5em;
+}
+
+.exception {
+ padding-top: 1.5em;
+}
+
+.class > dd > dl.function {
+ padding-top: 1.0em;
+}
diff --git a/doc/_templates/about.html b/doc/_templates/about.html
new file mode 100644
index 00000000..5bbadbe9
--- /dev/null
+++ b/doc/_templates/about.html
@@ -0,0 +1,57 @@
+{% if theme_logo %}
+<p class="logo">
+ <a href="{{ pathto(master_doc) }}">
+ <img class="logo" src="{{ pathto('_static/' ~ theme_logo, 1) }}" alt="Logo"/>
+ {% if theme_logo_name|lower == 'true' %}
+ <span class="logo logo-name">{{ project }}</span>
+ {% endif %}
+ </a>
+</p>
+{% else %}
+<h1 class="logo"><a href="{{ pathto(master_doc) }}">{{ project }}</a></h1>
+{% endif %}
+
+{% if theme_description %}
+<p class="blurb">{{ theme_description }}</p>
+{% endif %}
+
+{% if theme_github_user and theme_github_repo %}
+{% if theme_github_button|lower == 'true' %}
+<p>
+<iframe src="https://ghbtns.com/github-btn.html?user={{ theme_github_user }}&repo={{ theme_github_repo }}&type={{ theme_github_type }}&count={{ theme_github_count }}&size=large&v=2"
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
+</p>
+{% endif %}
+{% endif %}
+
+{% if theme_travis_button|lower != 'false' %}
+{% if theme_travis_button|lower == 'true' %}
+ {% set path = theme_github_user + '/' + theme_github_repo %}
+{% else %}
+ {% set path = theme_travis_button %}
+{% endif %}
+<p>
+<a class="badge" href="https://travis-ci.org/{{ path }}">
+ <img
+ alt="https://secure.travis-ci.org/{{ path }}.svg?branch={{ theme_badge_branch }}"
+ src="https://secure.travis-ci.org/{{ path }}.svg?branch={{ theme_badge_branch }}"
+ />
+</a>
+</p>
+{% endif %}
+
+{% if theme_codecov_button|lower != 'false' %}
+{% if theme_codecov_button|lower == 'true' %}
+ {% set path = theme_github_user + '/' + theme_github_repo %}
+{% else %}
+ {% set path = theme_codecov_button %}
+{% endif %}
+<p>
+<a class="badge" href="https://codecov.io/github/{{ path }}">
+ <img
+ alt="https://codecov.io/github/{{ path }}/coverage.svg?branch={{ theme_badge_branch }}"
+ src="https://codecov.io/github/{{ path }}/coverage.svg?branch={{ theme_badge_branch }}"
+ />
+</a>
+</p>
+{% endif %}
diff --git a/doc/c/Doxyfile b/doc/c/Doxyfile
new file mode 100644
index 00000000..a88f8ce8
--- /dev/null
+++ b/doc/c/Doxyfile
@@ -0,0 +1,33 @@
+PROJECT_NAME = Serd
+PROJECT_BRIEF = "A lightweight library for RDF storage and serialisation"
+
+QUIET = YES
+WARN_AS_ERROR = NO
+WARN_IF_UNDOCUMENTED = NO
+WARN_NO_PARAMDOC = NO
+
+JAVADOC_AUTOBRIEF = YES
+
+CASE_SENSE_NAMES = YES
+HIDE_IN_BODY_DOCS = YES
+REFERENCES_LINK_SOURCE = NO
+
+GENERATE_HTML = NO
+GENERATE_LATEX = NO
+GENERATE_XML = YES
+XML_PROGRAMLISTING = NO
+SHOW_FILES = NO
+
+MACRO_EXPANSION = YES
+PREDEFINED = SERD_ALLOCATED \
+ SERD_API \
+ SERD_CONST_FUNC= \
+ SERD_DEPRECATED_BY(x)= \
+ SERD_DISABLE_DEPRECATED \
+ SERD_NONNULL= \
+ SERD_NULLABLE= \
+ SERD_PURE_FUNC=
+
+INPUT = ../../include/serd/serd.h
+
+OUTPUT_DIRECTORY = .
diff --git a/doc/c/index.rst b/doc/c/index.rst
new file mode 100644
index 00000000..3fe14ca6
--- /dev/null
+++ b/doc/c/index.rst
@@ -0,0 +1,5 @@
+.. toctree::
+
+ serd
+ overview
+ reference
diff --git a/doc/c/overview.rst b/doc/c/overview.rst
new file mode 100644
index 00000000..95862368
--- /dev/null
+++ b/doc/c/overview.rst
@@ -0,0 +1,22 @@
+########
+Overview
+########
+
+.. default-domain:: c
+.. highlight:: c
+
+The API revolves around two main types: the :doc:`api/reader`,
+which reads text and fires callbacks,
+and the :doc:`api/writer`,
+which writes text when driven by corresponding functions.
+Both work in a streaming fashion but still support pretty-printing,
+so the pair can be used to pretty-print, translate,
+or otherwise process arbitrarily large documents very quickly.
+The context of a stream is tracked by the :doc:`api/env`,
+which stores the current base URI and set of namespace prefixes.
+
+The complete API is declared in ``serd.h``:
+
+.. code-block:: c
+
+ #include <serd/serd.h>
diff --git a/doc/c/reference.rst b/doc/c/reference.rst
new file mode 100644
index 00000000..70de0603
--- /dev/null
+++ b/doc/c/reference.rst
@@ -0,0 +1,11 @@
+#############
+API Reference
+#############
+
+This section contains the generated documentation for all symbols in the public
+API.
+
+.. toctree::
+
+ api/serd
+
diff --git a/doc/c/wscript b/doc/c/wscript
new file mode 100644
index 00000000..1132f197
--- /dev/null
+++ b/doc/c/wscript
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+def build(bld):
+ dox_to_sphinx = bld.path.find_node("../../scripts/dox_to_sphinx.py")
+ index_xml = bld.path.get_bld().make_node("xml/index.xml")
+
+ files = [
+ ("../../resources/serd.svg", "sphinx/_static/serd.svg"),
+ ("../_static/custom.css", "sphinx/_static/custom.css"),
+ ("../_templates/about.html", "sphinx/_templates/about.html"),
+ ("../serd.rst", "sphinx/serd.rst"),
+ ("index.rst", "sphinx/index.rst"),
+ ("overview.rst", "sphinx/overview.rst"),
+ ("reference.rst", "sphinx/reference.rst"),
+ ]
+
+ # Run Doxygen to generate XML documentation
+ bld(features="doxygen", doxyfile="Doxyfile")
+
+ # Substitute variables to make Sphinx configuration file
+ bld(features="subst",
+ source="../conf.py.in",
+ target="sphinx/conf.py",
+ SERD_VERSION=bld.env.SERD_VERSION)
+
+ # Copy static documentation files to Sphinx build directory
+ for f in files:
+ bld(features="subst", is_copy=True, source=f[0], target=f[1])
+
+ # Generate Sphinx markup from Doxygen XML
+ bld.add_group()
+ bld(rule="${PYTHON} " + dox_to_sphinx.abspath() + " -f ${SRC} ${TGT}",
+ source=index_xml,
+ target="sphinx/api/")
+
+ # Run Sphinx to generate HTML documentation
+ doc_dir = bld.env.DOCDIR + "/serd-%s/" % bld.env.SERD_MAJOR_VERSION
+ bld(features="sphinx",
+ sphinx_source=bld.path.get_bld().make_node("sphinx"),
+ sphinx_output_format="singlehtml",
+ sphinx_options=["-E", "-q"],
+ install_path=doc_dir + "c/singlehtml/")
diff --git a/doc/conf.py.in b/doc/conf.py.in
new file mode 100644
index 00000000..224b6e77
--- /dev/null
+++ b/doc/conf.py.in
@@ -0,0 +1,86 @@
+# Project information
+
+project = "Serd"
+copyright = "2020, David Robillard"
+author = "David Robillard"
+release = "@SERD_VERSION@"
+
+# General configuration
+
+language = "en"
+
+extensions = [
+ # 'sphinx_rtd_theme',
+]
+
+# Enable nitpicky mode to get warnings about broken links
+# Unfortunately this means we need to explicitly ignore everything external
+nitpicky = True
+_opaque = [
+ "FILE",
+ "SerdByteSinkImpl",
+ "SerdByteSourceImpl",
+ "SerdCursorImpl",
+ "SerdEnvImpl",
+ "SerdIterImpl",
+ "SerdModelImpl",
+ "SerdNodeImpl",
+ "SerdNodesImpl",
+ "SerdRangeImpl",
+ "SerdReaderImpl",
+ "SerdSinkImpl",
+ "SerdStatementImpl",
+ "SerdWorldImpl",
+ "SerdWriterImpl",
+ "int64_t",
+ "size_t",
+ "uint32_t",
+ "uint8_t",
+ "uintptr_t",
+ "va_list",
+]
+
+nitpick_ignore = list(map(lambda x: ("c:identifier", x), _opaque))
+
+templates_path = ["_templates"]
+
+pygments_style = "friendly"
+
+# HTML output
+
+exclude_patterns = ["xml"]
+html_static_path = ["_static"]
+
+html_theme = "alabaster"
+# html_theme = "sphinx_rtd_theme"
+
+if html_theme == "alabaster":
+
+ html_theme_options = {
+ "description": "A lightweight library for RDF storage and serialisation",
+ "donate_url": "http://drobilla.net/pages/donate.html",
+ # "github_repo": "serd",
+ # "github_user": "lv2",
+ "logo": "serd.svg",
+ "logo_name": True,
+ "logo_text_align": "center",
+ "page_width": "80em - 20em",
+ "sidebar_width": "24em",
+ }
+
+ html_sidebars = {
+ "**": [
+ "about.html",
+ "localtoc.html",
+ "donate.html",
+ ]
+ }
+
+elif html_theme == "sphinx_rtd_theme":
+
+ html_theme_options = {
+ "sticky_navigation": False,
+ "collapse_navigation": False,
+ "navigation_depth": 4,
+ "display_version": True,
+ }
diff --git a/doc/footer.html b/doc/footer.html
deleted file mode 100644
index 0dc69197..00000000
--- a/doc/footer.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!-- HTML footer for doxygen 1.8.15-->
-<!-- start footer part -->
-<!--BEGIN GENERATE_TREEVIEW-->
-<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- $navpath
- <li class="footer">$generatedby
- <a href="http://www.doxygen.org/index.html">Doxygen $doxygenversion</li>
- </ul>
-</div>
-<!--END GENERATE_TREEVIEW-->
-<!--BEGIN !GENERATE_TREEVIEW-->
-<div id="footer">
- <address class="footer">$generatedby
- <a href="http://www.doxygen.org/">Doxygen</a> $doxygenversion
- </address>
-</div>
-<!--END !GENERATE_TREEVIEW-->
-</body>
-</html>
diff --git a/doc/header.html b/doc/header.html
deleted file mode 100644
index b907bc8b..00000000
--- a/doc/header.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
- <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
- <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
- $extrastylesheet
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-
- <!--BEGIN TITLEAREA-->
- <div id="titlearea">
- <div id="header">
- <div id="titlebox">
- <!--BEGIN PROJECT_LOGO-->
- <div id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></div>
- <!--END PROJECT_LOGO-->
- <!--BEGIN PROJECT_NAME-->
- <h1 id="title">$projectname</h1>
- <!--END PROJECT_NAME-->
- <!--BEGIN PROJECT_BRIEF-->
- <div id="shortdesc">$projectbrief</div>
- <!--END PROJECT_BRIEF-->
- </div>
- <div id="metabox">
- <table id="meta">
- <!--BEGIN PROJECT_NUMBER-->
- <tr><th>Version</th><td>$projectnumber</td></tr>
- <!--END PROJECT_NUMBER-->
- </table>
- </div>
- </div>
- </div>
- <!--END TITLEAREA-->
- <!-- end header part -->
-
- <!-- Fake static menu from Doxygen 1.8.15 -->
- <div id="staticnavrow" class="tabs">
- <ul class="tablist">
- <li><a href="index.html"><span>Main&#160;Page</span></a></li>
- <li><a href="modules.html"><span>Modules</span></a></li>
- <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
- </ul>
- </div>
diff --git a/doc/index.html.in b/doc/index.html.in
deleted file mode 100644
index 55d2d1e7..00000000
--- a/doc/index.html.in
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <title>Serd</title>
- <link href="doc/html/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="top">
- <div id="titlearea">
- <div id="header">
- <div id="titlebox">
- <h1 id="title">Serd</h1>
- <div id="shortdesc">A lightweight library for RDF storage and serialisation</div>
- </div>
- <div id="metabox">
- <table id="meta">
- <tr><th>Version</th><td>@SERD_VERSION@</td></tr>
- </table>
- </div>
- </div>
- </div>
-
- <div id="navrow1" class="tabs" />
- <ul class="tablist" />
- </div>
-
- <ul>
- <li><a href="doc/html/index.html">API Documentation</a></li>
- <li><a href="coverage/index.html">Test Coverage</a></li>
- </ul>
-
- <div id="footer" />
- </body>
-</html>
diff --git a/doc/layout.xml b/doc/layout.xml
deleted file mode 100644
index 4744245e..00000000
--- a/doc/layout.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<doxygenlayout version="1.0">
- <!-- Generated by doxygen 1.8.13 -->
- <!-- Navigation index tabs for HTML output -->
- <navindex>
- <tab type="mainpage" visible="yes" title=""/>
- <tab type="pages" visible="yes" title="" intro=""/>
- <tab type="modules" visible="yes" title="" intro=""/>
- <tab type="namespaces" visible="yes" title="">
- <tab type="namespacelist" visible="yes" title="" intro=""/>
- <tab type="namespacemembers" visible="yes" title="" intro=""/>
- </tab>
- <tab type="classes" visible="yes" title="">
- <tab type="classlist" visible="yes" title="" intro=""/>
- <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
- <tab type="hierarchy" visible="yes" title="" intro=""/>
- <tab type="classmembers" visible="yes" title="" intro=""/>
- </tab>
- <tab type="files" visible="yes" title="">
- <tab type="filelist" visible="yes" title="" intro=""/>
- <tab type="globals" visible="yes" title="" intro=""/>
- </tab>
- <tab type="examples" visible="yes" title="" intro=""/>
- </navindex>
-
- <!-- Layout definition for a class page -->
- <class>
- <briefdescription visible="yes"/>
- <detaileddescription title=""/>
- <includes visible="$SHOW_INCLUDE_FILES"/>
- <inheritancegraph visible="$CLASS_GRAPH"/>
- <collaborationgraph visible="$COLLABORATION_GRAPH"/>
- <memberdecl>
- <nestedclasses visible="yes" title=""/>
- <publictypes title=""/>
- <services title=""/>
- <interfaces title=""/>
- <publicslots title=""/>
- <signals title=""/>
- <publicmethods title=""/>
- <publicstaticmethods title=""/>
- <publicattributes title=""/>
- <publicstaticattributes title=""/>
- <protectedtypes title=""/>
- <protectedslots title=""/>
- <protectedmethods title=""/>
- <protectedstaticmethods title=""/>
- <protectedattributes title=""/>
- <protectedstaticattributes title=""/>
- <packagetypes title=""/>
- <packagemethods title=""/>
- <packagestaticmethods title=""/>
- <packageattributes title=""/>
- <packagestaticattributes title=""/>
- <properties title=""/>
- <events title=""/>
- <privatetypes title=""/>
- <privateslots title=""/>
- <privatemethods title=""/>
- <privatestaticmethods title=""/>
- <privateattributes title=""/>
- <privatestaticattributes title=""/>
- <friends title=""/>
- <related title="" subtitle=""/>
- <membergroups visible="yes"/>
- </memberdecl>
- <memberdef>
- <inlineclasses title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <services title=""/>
- <interfaces title=""/>
- <constructors title=""/>
- <functions title=""/>
- <related title=""/>
- <variables title=""/>
- <properties title=""/>
- <events title=""/>
- </memberdef>
- <allmemberslink visible="yes"/>
- <usedfiles visible="$SHOW_USED_FILES"/>
- <authorsection visible="yes"/>
- </class>
-
- <!-- Layout definition for a namespace page -->
- <namespace>
- <briefdescription visible="yes"/>
- <detaileddescription title=""/>
- <memberdecl>
- <nestednamespaces visible="yes" title=""/>
- <constantgroups visible="yes" title=""/>
- <classes visible="yes" title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <functions title=""/>
- <variables title=""/>
- <membergroups visible="yes"/>
- </memberdecl>
- <memberdef>
- <inlineclasses title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <functions title=""/>
- <variables title=""/>
- </memberdef>
- <authorsection visible="yes"/>
- </namespace>
-
- <!-- Layout definition for a file page -->
- <file>
- <briefdescription visible="yes"/>
- <includes visible="$SHOW_INCLUDE_FILES"/>
- <includegraph visible="$INCLUDE_GRAPH"/>
- <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
- <sourcelink visible="yes"/>
- <memberdecl>
- <classes visible="yes" title=""/>
- <namespaces visible="yes" title=""/>
- <constantgroups visible="yes" title=""/>
- <defines title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <functions title=""/>
- <variables title=""/>
- <membergroups visible="yes"/>
- </memberdecl>
- <detaileddescription title=""/>
- <memberdef>
- <inlineclasses title=""/>
- <defines title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <functions title=""/>
- <variables title=""/>
- </memberdef>
- <authorsection/>
- </file>
-
- <!-- Layout definition for a group page -->
- <group>
- <briefdescription visible="yes"/>
- <detaileddescription title=""/>
- <groupgraph visible="$GROUP_GRAPHS"/>
- <memberdecl>
- <nestedgroups visible="yes" title=""/>
- <dirs visible="yes" title=""/>
- <files visible="yes" title=""/>
- <namespaces visible="yes" title=""/>
- <classes visible="yes" title=""/>
- <defines title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <enumvalues title=""/>
- <functions title=""/>
- <variables title=""/>
- <signals title=""/>
- <publicslots title=""/>
- <protectedslots title=""/>
- <privateslots title=""/>
- <events title=""/>
- <properties title=""/>
- <friends title=""/>
- <membergroups visible="yes"/>
- </memberdecl>
- <memberdef>
- <pagedocs/>
- <inlineclasses title=""/>
- <defines title=""/>
- <typedefs title=""/>
- <enums title=""/>
- <enumvalues title=""/>
- <functions title=""/>
- <variables title=""/>
- <signals title=""/>
- <publicslots title=""/>
- <protectedslots title=""/>
- <privateslots title=""/>
- <events title=""/>
- <properties title=""/>
- <friends title=""/>
- </memberdef>
- <authorsection visible="yes"/>
- </group>
-
- <!-- Layout definition for a directory page -->
- <directory>
- <briefdescription visible="yes"/>
- <directorygraph visible="yes"/>
- <memberdecl>
- <dirs visible="yes"/>
- <files visible="yes"/>
- </memberdecl>
- <detaileddescription title=""/>
- </directory>
-</doxygenlayout>
diff --git a/doc/mainpage.md b/doc/mainpage.md
deleted file mode 100644
index 33ba7ec0..00000000
--- a/doc/mainpage.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Serd is a lightweight and dependency-free C library for RDF serialisation which
-supports [Turtle], [NTriples], [NQuads], and [TriG].
-
-The complete API is documented in the [serd](@ref serd) group. It revolves
-around two main types: @ref SerdReader, which reads text and fires callbacks,
-and @ref SerdWriter, which writes text when driven by corresponding functions.
-Both work in a streaming fashion but still support pretty-printing, so the pair
-can be used to pretty-print, translate, or otherwise process arbitrarily large
-documents very quickly. The stream context is maintained by @ref SerdEnv,
-which stores the current base URI and set of namespace prefixes.
-
-[Turtle]: http://www.w3.org/TR/turtle/
-[NTriples]: http://www.w3.org/TR/n-triples/
-[NQuads]: http://www.w3.org/TR/n-quads/
-[TriG]: http://www.w3.org/TR/trig/
diff --git a/doc/serd.rst b/doc/serd.rst
new file mode 100644
index 00000000..e90a8368
--- /dev/null
+++ b/doc/serd.rst
@@ -0,0 +1,11 @@
+####
+Serd
+####
+
+Serd is a lightweight and dependency-free C library for RDF serialisation which
+supports Turtle_, NTriples_, NQuads_, and TriG_.
+
+.. _Turtle: http://www.w3.org/TR/turtle/
+.. _NTriples: http://www.w3.org/TR/n-triples/
+.. _NQuads: http://www.w3.org/TR/n-quads/
+.. _TriG: http://www.w3.org/TR/trig/
diff --git a/doc/style.css b/doc/style.css
deleted file mode 100644
index 2092dab0..00000000
--- a/doc/style.css
+++ /dev/null
@@ -1,808 +0,0 @@
-body {
- background: #FFF;
- color: #222;
- font-style: normal;
- line-height: 1.6em;
- margin-left: auto;
- margin-right: auto;
- padding: 1em;
- max-width: 60em;
- font-family: "SF Pro Text", Verdana, "DejaVu Sans", sans-serif;
- text-rendering: optimizeLegibility;
-}
-
-h1 {
- font-size: 1.68em;
- font-weight: 500;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- line-height: 2em;
- margin: 0 0 0.25em 0;
-}
-
-h2 {
- line-height: 1.68em;
- font-size: 1.41em;
- font-weight: 600;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- margin: 1.25em 0 0.5em 0;
-}
-
-h3 {
- line-height: 1.41em;
- font-size: 1.18em;
- font-weight: 600;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- margin: 1.25em 0 0.5em 0;
-}
-
-h4 {
- line-height: 1.18em;
- font-size: 1em;
- font-weight: 600;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- margin: 1.25em 0 0.5em 0;
-}
-
-h5, h6 {
- font-size: 0.7em;
- font-weight: 600;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- margin: 1.25em 0 0.5em 0;
-}
-
-a {
- color: #546E00;
- text-decoration: none;
-}
-
-h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
- color: #444;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-h1 a:link, h2 a:link, h3 a:link, h4 a:link, h5 a:link, h6 a:link {
- color: #444;
-}
-
-h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited {
- color: #444;
-}
-
-p {
- margin: 0.5em 0 0.5em 0;
-}
-
-dt {
- font-weight: 600;
-}
-
-dd {
- margin-left: 2em;
-}
-
-caption {
- font-weight: 700;
-}
-
-.title, #projectname {
- line-height: 1.0125em;
- margin: 0.75em 0 0 0;
-}
-
-.titlearea .header .titlebox, #projectname {
- font-size: 1.68em;
- font-weight: 400;
- margin-bottom: 0.25em;
- margin-top: 0;
-}
-
-#header {
- padding: 0 0 0.5em 0;
- border-bottom: 1px solid #EEE;
-}
-
-.header .headertitle .title {
- line-height: 1.68em;
- font-size: 1.68em;
- font-weight: 600;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
-}
-
-.ingroups {
- display: none;
-}
-
-.title .ingroups a {
- font-size: small;
- margin-left: 1em;
-}
-
-#titlebox, #metabox {
- display: inline-block;
-}
-
-#titlebox {
- display: inline-block;
- width: 75%;
- left: 0;
- top: 0;
-}
-
-#title {
- margin-bottom: 0.25em;
- line-height: 1.25em;
- font-size: 2.5em;
- color: #333;
- font-weight: 600;
-}
-
-.PageDoc {
- margin-top: 1.5em;
-}
-
-.PageDoc .header .headertitle .title {
- display: none;
-}
-
-#shortdesc {
- margin: 0;
- color: #666;
- display: inline-block;
- font-style: italic;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- padding: 0;
-}
-
-#titlearea {
- margin: 0.25em auto 0 auto;
- padding: 0;
- position: relative;
- clear: both;
- line-height: 1em;
-}
-
-.legend {
- font-size: small;
- text-align: center;
-}
-
-.version {
- font-size: small;
- text-align: center;
-}
-
-div.qindex,div.navtab {
- background-color: #EBEFF6;
- border: 1px solid #A3B4D7;
- text-align: center;
- margin: 2px;
- padding: 2px;
-}
-
-div.navtab {
- margin-right: 15px;
-}
-
-.contents a:visited {
- color: #344E00;
-}
-
-a.qindexHL {
- background-color: #9CAFD4;
- color: #FFF;
- border: 1px double #869DCA;
-}
-
-code {
- color: #444;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
-}
-
-dl.el {
- margin-left: -1cm;
-}
-
-.fragment {
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
-}
-
-pre.fragment {
- border: 1px solid #C4C4C4;
- background-color: #F9F9F9;
- padding: 0.5em;
- overflow: auto;
-}
-
-div.ah {
- background-color: #000;
- font-weight: 700;
- color: #FFF;
- margin-bottom: 3px;
- margin-top: 3px;
- padding: 0.2em;
- border: thin solid #333;
-}
-
-div.groupHeader {
- margin-left: 16px;
- margin-top: 12px;
- margin-bottom: 6px;
- font-weight: 700;
-}
-
-a + h2.groupheader {
- display: none;
-}
-
-div.groupText {
- margin-left: 16px;
- font-style: italic;
-}
-
-div.contents, #content {
- max-width: 60em;
- margin-left: auto;
- margin-right: auto;
-}
-
-.groupheader + p {
- font-style: italic;
- color: #666;
- margin: 0 0 1em 0;
-}
-
-td.indexkey {
- background-color: #EBEFF6;
- font-weight: 700;
- border: 1px solid #C4CFE5;
- margin: 2px 0;
- padding: 2px 10px;
-}
-
-td.indexvalue {
- background-color: #EBEFF6;
- border: 1px solid #C4CFE5;
- padding: 2px 10px;
- margin: 2px 0;
-}
-
-table.memname {
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
- border-spacing: 0;
-}
-
-table.memname tbody tr:last-child {
- display: none;
-}
-
-table.memname tbody tr:only-child {
- display: table-cell;
-}
-
-table.memname tbody tr:nth-last-child(2)::after {
- content: ")";
-}
-
-tr.memlist {
- background-color: #EEF1F7;
-}
-
-p.formulaDsp {
- text-align: center;
-}
-
-img.formulaInl {
- vertical-align: middle;
-}
-
-div.center {
- text-align: center;
- margin-top: 0;
- margin-bottom: 0;
- padding: 0;
-}
-
-div.center img {
- border: 0;
-}
-
-address.footer {
- text-align: right;
-}
-
-img.footer {
- border: 0;
- vertical-align: middle;
-}
-
-span.keyword {
- color: #586E75;
-}
-
-span.keywordtype {
- color: #546E00;
-}
-
-span.keywordflow {
- color: #586E75;
-}
-
-span.comment {
- color: #6C71C4;
-}
-
-span.preprocessor {
- color: #D33682;
-}
-
-span.stringliteral {
- color: #CB4B16;
-}
-
-span.charliteral {
- color: #CB4B16;
-}
-
-td.tiny {
- font-size: x-small;
-}
-
-.dirtab {
- padding: 4px;
- border-collapse: collapse;
- border: 1px solid #A3B4D7;
-}
-
-th.dirtab {
- background: #EBEFF6;
- font-weight: 700;
-}
-
-hr {
- height: 0;
- border: none;
- border-top: 1px solid #DDD;
- margin: 2em 0;
-}
-
-#footer {
- bottom: 0;
- clear: both;
- font-size: x-small;
- margin: 2em 0 0;
- padding: 0 1em 1em 1em;
- vertical-align: top;
- color: #888;
-}
-
-td.ititle {
- padding-bottom: 0.75em;
-}
-
-table.memberdecls {
- border-spacing: 0.125em;
- line-height: 1.3em;
-}
-
-.mdescLeft,.mdescRight,.memItemLeft,.memItemRight,.memTemplItemLeft,.memTemplItemRight,.memTemplParams {
- margin: 0;
- padding: 0;
-}
-
-.mdescLeft,.mdescRight {
- color: #555;
-}
-
-.memItemLeft,.memItemRight,.memTemplParams {
- border: 0;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
-}
-
-.memItemLeft,.memTemplItemLeft {
- white-space: nowrap;
- padding-left: 2em;
-}
-
-.memItemLeft a.el {
- font-weight: bold;
-}
-
-.memTemplParams {
- color: #464646;
- white-space: nowrap;
-}
-
-td.memSeparator {
- display: none;
-}
-
-td.mlabels-right {
- color: #B4C342;
- font-weight: normal;
- margin-left: 1em;
-}
-
-.memtitle {
- display: none;
-}
-
-.memtemplate {
- color: #888;
- font-style: italic;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
- font-size: small;
-}
-
-.memnav {
- background-color: #EEE;
- border: 1px solid #B4C342;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
-}
-
-.memitem {
- padding: 0.5em 0.5em 0.25em 0.5em;
- margin: 1em 0 2em 0;
-}
-
-.memproto {
- border-bottom: 1px solid #EEE;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
- font-size: 1.09em;
- font-weight: 600;
- line-height: 1.41em;
- margin-bottom: 0.25em;
- padding-bottom: 0.125em;
-}
-
-.memproto .paramname {
- font-style: normal;
- padding-right: 0.25em;
-}
-
-.memdoc {
- padding: 0;
-}
-
-.memdoc > p:first-child, .memdoc .textblock > p:first-child {
- font-style: italic;
- color: #444;
- margin-bottom: 0.75em;
-}
-
-.paramkey {
- text-align: right;
-}
-
-.paramtype {
- color: #666;
- padding: 0 0.25em 0 0.25em;
- white-space: nowrap;
-}
-
-.params .paramname {
- color: #111;
- white-space: nowrap;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
- font-style: italic;
- padding-right: 0.5em;
- vertical-align: top;
-}
-
-.fieldname {
- color: #000;
-}
-
-.fieldtable {
- margin-top: 1.0em;
- border-collapse: collapse;
-}
-
-.fieldtable tbody tr:first-child {
- display: none;
-}
-
-td.fieldname {
- vertical-align: top;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
-}
-
-td.fielddoc {
- padding: 0.125em 0.5em 0 0.25em;
- vertical-align: top;
-}
-
-.fieldtable tbody tr td {
- border-top: 1px dashed #DDD;
- border-bottom: 1px dashed #DDD;
-}
-
-td.fieldtype {
- color: #666;
- padding: 0 0.5em 0 0;
- vertical-align: top;
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
-}
-
-td.fielddoc p {
- margin: 0;
- padding: 0 0.5em 0 0;
-}
-
-p.reference {
- font-size: x-small;
- font-style: italic;
-}
-
-.ftvtree {
- font-family: "DejaVu Sans", Verdana, Helvetica, Arial, sans-serif;
- margin: 0;
-}
-
-.directory {
- margin: 0.5em;
-}
-
-.directory h3 {
- margin: 0;
- margin-top: 1em;
- font-size: 11pt;
-}
-
-.directory > h3 {
- margin-top: 0;
-}
-
-.directory p {
- margin: 0;
- white-space: nowrap;
-}
-
-.directory div {
- display: none;
- margin: 0;
-}
-
-.directory img {
- vertical-align: -30%;
-}
-
-td.entry {
- font-family: "DejaVu Sans", Verdana, Helvetica, Arial, sans-serif;
- font-weight: 400;
- padding-right: 1em;
-}
-
-.arrow {
- color: #CCC;
- user-select: none;
- font-size: 80%;
- display: inline-block;
- width: 16px;
- height: 22px;
- vertical-align: top;
-}
-
-td.entry b {
- font-family: "DejaVu Sans", Verdana, Helvetica, Arial, sans-serif;
- font-weight: 400;
- font-size: 130%;
-}
-
-.directory-alt {
- font-size: 100%;
- font-weight: bold;
-}
-
-.directory-alt h3 {
- margin: 0;
- margin-top: 1em;
- font-size: 11pt;
-}
-
-.directory-alt > h3 {
- margin-top: 0;
-}
-
-.directory-alt p {
- margin: 0;
- white-space: nowrap;
-}
-
-.directory-alt div {
- display: none;
- margin: 0;
-}
-
-.directory-alt img {
- vertical-align: -30%;
-}
-
-div.dynheader {
- margin-top: 8px;
-}
-
-address {
- font-style: normal;
- color: #444;
-}
-
-table.doxtable {
- border-collapse: collapse;
- margin: 0.5em;
-}
-
-table.doxtable td,table.doxtable th {
- border: 1px solid #DDD;
- padding: 3px 7px 2px;
-}
-
-table.doxtable th {
- background-color: #F3F3F3;
- color: #000;
- padding-bottom: 4px;
- padding-top: 5px;
- text-align: left;
- font-weight: bold;
-}
-
-.tabsearch {
- top: 0;
- left: 10px;
- height: 36px;
- z-index: 101;
- overflow: hidden;
- font-size: 13px;
-}
-
-div.navpath {
- color: #DDD;
-}
-
-.navpath ul {
- overflow: hidden;
- margin: 0;
- padding: 0;
-}
-
-.navpath li {
- float: left;
- padding-left: 0;
- margin-left: 0.5em;
- padding-right: 1em;
-}
-
-.navpath a {
- display: block;
- text-decoration: none;
- outline: none;
-}
-
-div.summary {
- font-size: small;
- font-family: "DejaVu Sans", Verdana, Helvetica, Arial, sans-serif;
- margin: 0;
- padding: 0.25em 0;
- display: none;
-}
-
-div.summary a {
- white-space: nowrap;
-}
-
-#metabox {
- display: inline-block;
- font-size: x-small;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- position: absolute;
- right: 0;
- bottom: 0.25em;
- color: #666;
- font-style: italic;
-}
-
-#meta {
- border-style: hidden;
- margin-right: 0.25em;
-}
-
-#meta tr, #meta th, #meta td {
- background-color: transparent;
- border: 0;
- margin: 0;
- font-weight: normal;
-}
-
-#meta th {
- text-align: right;
-}
-
-#meta th::after {
- content: ":";
-}
-
-div.line {
- font-family: "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace, fixed;
- line-height: 1.4em;
- white-space: pre-wrap;
-}
-
-.glow {
- background-color: #2AA198;
- box-shadow: 0 0 10px #2AA198;
-}
-
-span.lineno {
- padding-right: 4px;
- text-align: right;
- border-right: 2px solid #546E00;
- background-color: #E8E8E8;
- white-space: pre;
-}
-
-span.lineno a {
- background-color: #D8D8D8;
-}
-
-span.lineno a:hover {
- background-color: #C8C8C8;
-}
-
-.tabs, .tabs2, .navpath {
- padding: 0.25em 0;
- font-size: small;
- font-family: Helvetica, Arial, "DejaVu Sans Condensed", Verdana, sans-serif;
- margin: 0;
-}
-
-th {
- text-align: left;
- font-size: 110%;
- font-weight: 500;
-}
-
-.mlabel {
- padding: 0.125em;
-}
-
-#navrow1, #navrow2 {
- /* Disable menu from Doxygen 1.8.15, it is faked in the template */
- display: none;
-}
-
-.tablist {
- margin: 0;
- padding: 0;
- display: table;
-}
-
-.tablist li {
- display: table-cell;
- line-height: 2em;
- list-style: none;
- border-bottom: 0;
-}
-
-.tablist a {
- display: block;
- padding: 0 1em 0 0;
- text-decoration: none;
- outline: none;
-}
-
-.tabs3 .tablist a {
- padding: 0 10px;
-}
-
-.tablist li.current a {
- color: #222;
-}
-
-span.icon {
- display: none;
-}