From 2e240aa1476911045ac1d59ccb38a719cdc1670d Mon Sep 17 00:00:00 2001 From: ge Date: Fri, 30 Sep 2022 14:24:39 +0300 Subject: [PATCH] add README and docs --- README | 117 ++++++++++++++++++- docs/.gitignore | 2 + docs/Makefile | 36 ++++++ docs/content/cli.rst | 39 +++++++ docs/content/configuration.rst | 71 ++++++++++++ docs/content/data_sources.rst | 114 ++++++++++++++++++ docs/content/examples.rst | 199 ++++++++++++++++++++++++++++++++ docs/content/index.rst | 52 +++++++++ docs/content/install.rst | 48 ++++++++ docs/content/overview.rst | 13 +++ docs/content/quick_start.rst | 70 +++++++++++ docs/content/rst_extensions.rst | 47 ++++++++ docs/content/variables.rst | 130 +++++++++++++++++++++ docs/layouts/template.jinja2 | 68 +++++++++++ docs/settings.toml | 58 ++++++++++ docs/static/css/pygments/vs.css | 43 +++++++ docs/static/css/style.css | 74 ++++++++++++ docs/static/img/jinja.png | Bin 0 -> 23956 bytes docs/static/img/rst.png | Bin 0 -> 1060 bytes docs/static/img/rsw.svg | 20 ++++ 20 files changed, 1198 insertions(+), 3 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/content/cli.rst create mode 100644 docs/content/configuration.rst create mode 100644 docs/content/data_sources.rst create mode 100644 docs/content/examples.rst create mode 100644 docs/content/index.rst create mode 100644 docs/content/install.rst create mode 100644 docs/content/overview.rst create mode 100644 docs/content/quick_start.rst create mode 100644 docs/content/rst_extensions.rst create mode 100644 docs/content/variables.rst create mode 100644 docs/layouts/template.jinja2 create mode 100644 docs/settings.toml create mode 100644 docs/static/css/pygments/vs.css create mode 100644 docs/static/css/style.css create mode 100644 docs/static/img/jinja.png create mode 100644 docs/static/img/rst.png create mode 100644 docs/static/img/rsw.svg diff --git a/README b/README index ce0bf7f..30ece75 100644 --- a/README +++ b/README @@ -1,6 +1,117 @@ -reStructuredWeb -- static site generator. +===== +[rSW] +===== + +reStructuredWeb (rSW, reSW or rstW) -- is a highly customizable static site +generator for the reStructuredText markup language. Docs: -* https://nixhacks.net/rstw/ -* https://git/nxhs.cloud/ge/rstw_docs/ +* https://nixhacks.net/rsw/ +* https://git.nxhs.cloud/ge/rSW/src/branch/master/docs + +Installation +============ + +From PyPI +--------- + +:: + + pip install reSW + +From tarball +------------ + +:: + + pip install ./reSW-0.1.2.tar.gz + +Shell completion +---------------- + +:: + + pip install infi.docopt-completion + docopt-completion rsw + +Quick start +=========== + +1. Initialise site with following commands:: + + rsw init my_site + cd my_site + +2. Create first template and post. + + Template layouts/template.jinja2:: + + + + + + {{ page.title }} + + + {{ html | safe }} + + + + Post content/index.rst:: + + :title: Hello, World! + :date: 1970-01-01 + + ============= + Hello, World! + ============= + + Hello, there! This is my first site built with *re*\ **Structured**\ *Web*! + +3. Build your site:: + + rsw build + +Command Line Interface +====================== + +:: + + Usage: rsw init [--no-makefile] [] + rsw build [-c ] + rsw print [-c ] [--default] [--json] + rsw (-h | --help | -v | --version) + + Commands: + init initialise new site. + build build site. + print print configuration. + + Options: + -c , --config configuaration file. + -j, --json JSON output. + -d, --default print default config. + -M, --no-makefile do not create Makefile. + -h, --help print this help message and exit. + -v, --version print version and exit. + +Development +=========== + +Build Python package +-------------------- + +Variant 1:: + + pip install setuptools wheel twine + python setup.py sdist bdist_wheel + +Variant 2:: + + pip install -U build + python -m build + +Via Makefile (`build` package needed):: + + make build diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..dcb58ba --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +build/ +downloads/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..f346fac --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,36 @@ +# Makefile for reSW + +CONTENTDIR = content +STATICDIR = static +BUILDDIR = build +CONFIG = settings.toml + +all: build + +help: + @echo 'Build rSW site' + @echo + @echo 'Available targets:' + @echo + @echo ' build build HTML' + @echo ' serve run local HTTP server' + @echo ' css generate Pygments stylesheet' + @echo + @echo 'Run make without target to build html' + +build: + test -d "$(BUILDDIR)" && rm -rf "$(BUILDDIR)" || true + rsw build -c "$(CONFIG)" + +serve: + python -m http.server --directory $(BUILDDIR)/ --bind 0.0.0.0 8080 + +css: + mkdir -pv "$(STATICDIR)"/css/pygments + pygmentize -f html -S $(filter-out $@,$(MAKECMDGOALS)) -a .highlight \ + > "$(STATICDIR)"/css/pygments/$(filter-out $@,$(MAKECMDGOALS)).css + +%: + @: + +.PHONY: all help build serve css diff --git a/docs/content/cli.rst b/docs/content/cli.rst new file mode 100644 index 0000000..82e5d67 --- /dev/null +++ b/docs/content/cli.rst @@ -0,0 +1,39 @@ +:title: Command Line Interface +:date: 2022-09-30 + +====================== +Command Line Interface +====================== + +:: + + Usage: rsw init [--no-makefile] [] + rsw build [-c ] + rsw print [-c ] [--default] [--json] + rsw (-h | --help | -v | --version) + + Commands: + init initialise new site. + build build site. + print print configuration. + + Options: + -c , --config configuaration file. + -j, --json JSON output. + -d, --default print default config. + -M, --no-makefile do not create Makefile. + -h, --help print this help message and exit. + -v, --version print version and exit. + +Makefile usage +============== + +:: + + Available targets: + + build build HTML + serve run local HTTP server + css generate Pygments stylesheet + + Run make without target to build html diff --git a/docs/content/configuration.rst b/docs/content/configuration.rst new file mode 100644 index 0000000..cb481d7 --- /dev/null +++ b/docs/content/configuration.rst @@ -0,0 +1,71 @@ +:title: Configuration +:date: 2022-09-22 + +============= +Configuration +============= + +Dirs (``dirs``) +=============== + +build_dir + Default: build + +content_dir + Default: content + +templates_dir + Default: layouts + +static_dir + Default: static + + .. note:: + + Content of this diretory will be placed into site root. Use + subdirectories for files here, e.g. css/, img/, etc. + +Default settings for pages (``defaults``) +========================================= + +template + Default: template.jinja2 + + Default page template. + +type + Default: page + + Default article type. + +Custom site data (``site``) +=========================== + +datetime_format + Default: %Y-%m-%d + + See `Format Codes`_. + +Pygments (``pygments``) +======================= + +theme + Default: default + + Generate CSS style with following command:: + + make css style_name + + See `Pygments Styles`_ and `pygmentize`_. + +Docutils (``docutils``) +======================= + +See `Docutils Configuration`_. + +.. Links + +.. _Format Codes: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes +.. _Pygments Styles: https://pygments.org/styles/ +.. _pygmentize: https://pygments.org/docs/cmdline/ +.. _Docutils Configuration: https://docutils.sourceforge.io/docs/user/config.html diff --git a/docs/content/data_sources.rst b/docs/content/data_sources.rst new file mode 100644 index 0000000..cb9bf8a --- /dev/null +++ b/docs/content/data_sources.rst @@ -0,0 +1,114 @@ +:title: Data Sources +:date: 2022-09-22 + +============ +Data Sources +============ + +The diagram below shows the data sources and variables that can be used in +templates. + +:: + + ┌─────────────────┐ + │ settings.toml ├───► site, pygments_theme ──┐ + └─────────────────┘ │ + │ + ┌─────────────────┐ ┌────────▼────────┐ + │ *.rst ├───► page, html ───► template.jinja2 │ + └────────┬────────┘ └────────▲────────┘ + │ │ + ┌────────▼────────┐ │ + │ Aggregated data ├───► aggr ──────────────────┘ + └─────────────────┘ + +\*.rst Files +============ + +The \*.rst files contain a part with document attributes called Docinfo (see +`field lists`_ and `bibliographic elements`_) and a part with the content of +the article. + +You can come up with your own attributes. Attributes can contain only strings. + +There some special attributes used by rSW: + +============ =============== ========================= +Attribute Required Deafult +============ =============== ========================= +``type`` No page +``template`` No template.jinja2 +``date`` Yes None +``title`` No None +============ =============== ========================= + +type + Article type. Can be ​​post for blog posts or ``page`` for standalone + pages. + +template + The template to be used when rendering the HTML page. + + The attribute value must be the path to the template file relative to the + template directory. For example, the templates/index.jinja2 file would be: + + .. code-block:: rst + + :template: index.jinja2 + + The path to the templates directory and default template can be overridden + in **settings.toml**. + +date + Date in ISO format YYYY-MM-DD. This attribute is used to sort the list of + posts. The date format can be overridden in **settings.toml**. + +title + Title of the article. It is not required and is not processed by rSW in + any way, but it is desirable to fill it for use in templates. + +.. note:: + + The ``authors`` attribute is `special`_ and is not yet supported by rSW. + Using ``authors`` will result in an error when building the site. + +settings.toml +============= + +The configuration file has a special ``site`` section, all data from which is +passed to the template unchanged. + +The structure and data types can be arbitrary. The file uses the +`TOML `_ format. + +For example, in this way you can pass basic information about the site: + +.. code-block:: toml + + [site] + title = 'My site' + name = 'My awesome site' + description = 'Awesome site about awesome things' + datetime_format = '%d %b %Y' + +A special variable ``pygments_theme`` is also passed to the template from the +configuration file. It contains the value of ``pygments.theme``. + +Aggregated data +=============== + +A dictionary with aggregated data. This data is collected during site +generation before HTML-pages are rendered. + +Aggregated data contains lists of blog posts and standalone pages. + +The list of posts is sorted in descending order by date from the ``date`` +attribute. + +The next article will describe the use of this data in templates. + +.. Links + +.. _field lists: https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html\#field-lists +.. _bibliographic elements: https://docutils.sourceforge.io/docs/ref/doctree.html#bibliographic-elements +.. _special: https://docutils.sourceforge.io/docs/ref/doctree.html#authors diff --git a/docs/content/examples.rst b/docs/content/examples.rst new file mode 100644 index 0000000..0b09647 --- /dev/null +++ b/docs/content/examples.rst @@ -0,0 +1,199 @@ +:title: Examples +:date: 2022-09-30 + +======== +Examples +======== + +Blog site example +================= + +For the blog, we will need to create three template files and at least two +.rst files. + +Edit your **settings.toml**: + +.. code-block:: toml + + [defaults] + template = 'post.jinja2' + type = 'post' + + [site] + title = 'My Blog' + +Generate Pygments theme: + +.. code-block:: shell + + make css default + +Create basic template **layouts/base.jinja2**: + +.. code-block:: jinja + + + + + + + + {{ page.title }} | {{ site.title }} + + + {% block content %}{% endblock %} + + + +Home page template **layouts/index.jinja2**: + +.. code-block:: jinja + + {% extends "base.jinja2" %} + {% block content %} +

{{ site.title }}

+
    + {% for post in aggr.posts %} +
  • + {{ post.title }} + — {{ post.date }} +
  • + {% endfor %} +
+ {{ html | safe }} + {% endblock %} + +Posts tempalte **layouts/post.jinja2**: + +.. code-block:: jinja + + {% extends "base.jinja2" %} + {% block content %} + Back to the home page +
+ {{ html | safe }} +
+ {% endblock %} + +Create dummy home page **content/index.rst** with fields: + +.. code-block:: rst + + :title: Homepage + :date: 1970-01-01 + :type: page + :template: index.jinja2 + +Create first blog post **content/hello_world.rst**: + +.. code-block:: rst + + :title: Hello, World! + :date: 1970-01-01 + + ============= + Hello, World! + ============= + + Hello, there! This is my first site built with *re*\ **Structured**\ *Web*! + +Now build site: + +.. code-block:: shell + + make + make serve + +Page navigation +=============== + +This code is used on this site to organize pagination. + +**settings.toml**: + +.. code-block:: toml + + [site] + [[site.sidebar]] + title = 'First' + url = '/first.html' + + [[site.sidebar]] + title = 'Second' + url = '/second.html' + + [[site.sidebar]] + title = 'Third' + url = '/third.html' + +**layouts/template.jinja2**: + +.. code-block:: jinja + + {# Display Sidebar #} + Contents + + + {# Page content #} +
+ {{ html | safe }} +
+ + {# Pagination #} + {% for item in site.sidebar %} + {% if item.title == page.title %} + {% set current = site.sidebar.index(item) %} + {% set last = site.sidebar.index(site.sidebar[-1]) %} + {% if current == 0 %} + {# If curret page is a first page #} + + {{ site.sidebar[current+1].title }} --> + {% elif current == last %} + {# If curret page is a last page #} + + <-- {{ site.sidebar[current-1].title }} + {% else %} + + <-- {{ site.sidebar[current-1].title }} + + {{ site.sidebar[current+1].title }} --> + {% endif %} + {% endif %} + {% endfor %} + +**content/index.rst**: + +.. code-block:: rst + + :title: Homepage + :date: 1907-01-01 + + ======= + Welcome + ======= + + Hello, there! + +Page example e.g. **content/first.rst**: + +.. code-block:: rst + + :title: First + :date: 1907-01-01 + + ===== + First + ===== + + First page. + +.. note:: + + Page ``:title:`` and sidebar's ``title`` in **settings.toml** item must be + the same. Otherwise pagination not be displayed. diff --git a/docs/content/index.rst b/docs/content/index.rst new file mode 100644 index 0000000..f228af4 --- /dev/null +++ b/docs/content/index.rst @@ -0,0 +1,52 @@ +:title: reStructuredWeb +:date: 2022-09-22 + +|rSW| + +v0.1.2 + +reStructuredWeb (rSW, reSW or rstW) — is a highly customizable static site +generator for the *re*\ **Structured**\ *Text* markup language. + +Why another site generator? +=========================== + +Hundreds of static site generators have been written with varying degrees of +shittyness. Here are just some of the shortcomings of existing solutions: + +* Bad customization. If the task requires something that is not provided for + in regular themes, then you have to strain. Editing a theme is an adventure. +* Some of the solutions are extremely primitive and only fit narrow cases. + Others, on the contrary, are overcomplicated. +* There are very few generators with reStructuredText support. + +Why is reStructuredWeb better? +============================== + +* **Small codebase**. About ~300 lines in total. +* **Doesn't depend on the presentation layer**. rSW just takes data from + files and allows you to insert it into templates. + +That's all. In fact, this is enough for a static site generator. + +**rSW** is built on |Docutils|_ and |Jinja2|_. + +.. |rSW| image:: + /rsw/img/rsw.svg + :alt: [rSW] + :align: middle + :height: 3em + +.. |Docutils| image:: + /rsw/img/rst.png + :alt: Docutils + :align: middle + :width: 7em +.. _Docutils: https://docutils.sourceforge.io/ + +.. |Jinja2| image:: + /rsw/img/jinja.png + :alt: Jinja2 + :align: middle + :width: 3em +.. _Jinja2: https://jinja.palletsprojects.com/ diff --git a/docs/content/install.rst b/docs/content/install.rst new file mode 100644 index 0000000..e020870 --- /dev/null +++ b/docs/content/install.rst @@ -0,0 +1,48 @@ +:title: Installation +:date: 2022-09-22 + +============ +Installation +============ + +From PyPI +========= + +.. code-block:: shell + + pip install reSW + +From tarball +============ + +1. `Download`_ tarball (`alterntive link `_) + with prebuilt Python package. +2. Install via pip: + +.. code-block:: shell + + pip install ./reSW-0.1.2.tar.gz + +From Source +============ + +1. `Download`_ source or clone Git repo: + +.. code-block:: shell + + git clone https://git.nxhs.cloud/ge/rSW.git && cd rSW + +2. Install build deps: + +.. code-block:: shell + + pip install --update build + +3. Build and install Python package: + +.. code-block:: shell + + make + make install + +.. _Download: https://git.nxhs.cloud/ge/rSW/releases diff --git a/docs/content/overview.rst b/docs/content/overview.rst new file mode 100644 index 0000000..ce723f9 --- /dev/null +++ b/docs/content/overview.rst @@ -0,0 +1,13 @@ +:title: Overview +:date: 2022-09-22 + +======== +Overview +======== + +On this page, I will list the important features of the application that you +may be looking for. + +* You can create two types of pages: blog posts and standalone pages. +* Any page can use its own layout (template). +* You can pass arbitrary data to templates. See `Data Sources `_ diff --git a/docs/content/quick_start.rst b/docs/content/quick_start.rst new file mode 100644 index 0000000..d50e4af --- /dev/null +++ b/docs/content/quick_start.rst @@ -0,0 +1,70 @@ +:title: Quick Start +:date: 2022-09-22 + +=========== +Quick Start +=========== + +After installation you must have these file structure:: + + ./ + ├── content/ + ├── layouts/ + ├── Makefile + ├── settings.toml + └── static/ + +Articles mst be placed into content/ dir and have .rst extension. + +Also you can place article into subdirectory as following:: + + ./ + └── content/ +    └── hello_world/ +    └── index.rst + +You need to create page template first. + +Create **layouts/template.jinja2** with content: + +.. code-block:: jinja + + + + + + {{ page.title }} + + + {{ html | safe }} + + + +Now create first page **content/index.rst**: + +.. code-block:: rst + + :title: Hello, World! + :date: 1970-01-01 + + ============= + Hello, World! + ============= + + Hello, there! This is my first site built with *re*\ **Structured**\ *Web*! + +Build your site with command: + +.. code-block:: shell + + rsw build + # OR + make + +build/ directory will be created. Run local HTTP-server to view site: + +.. code-block:: text + + make serve + +Local server will be started at `http://127.0.0.1:8080/ `_. diff --git a/docs/content/rst_extensions.rst b/docs/content/rst_extensions.rst new file mode 100644 index 0000000..9dbb67b --- /dev/null +++ b/docs/content/rst_extensions.rst @@ -0,0 +1,47 @@ +:title: rST Extensions +:date: 2022-09-29 + +=========================== +reStructuredText Extensions +=========================== + +rSW includes support for a few directives and roles that are not part of +Docutils. + +code-block +========== + +Example: + +.. code-block:: text + + .. code-block:: python + + if __name__ == "__main__": + # [initialize] + app.start(":8000") + # [initialize] + +Result: + +.. code-block:: python + + if __name__ == "__main__": + # [initialize] + app.start(":8000") + # [initialize] + +TODO +==== + +In plan: + +* Fully featured ``code-block`` (as in `Sphinx`_) +* Deleted text (``) +* Inserted text (``) +* Keystrokes mark (``:kbd:``) +* Spoilers (`
`, ``) +* Table of Contents (``toctree``) +* Abbreviations (``:abbr:``) + +.. _Sphinx: https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block diff --git a/docs/content/variables.rst b/docs/content/variables.rst new file mode 100644 index 0000000..92e38c3 --- /dev/null +++ b/docs/content/variables.rst @@ -0,0 +1,130 @@ +:title: Variables +:date: 2022-09-22 + +========= +Variables +========= + +The following variables are passed to the template. Еach variable corresponds +to a data source, which is described in the previous article. + +``page``: dict + Dictonary with article attributes. Data structure example: + + .. code-block:: python + + page = { + 'title': 'Variables', + 'date': '2022-09-22', + } + + Note that the ``type`` and ``template`` keys are missing. These keys are + added implicitly. The ``page`` dict will always contain only the data + specified directly in the article. + + Here ``type`` and ``template`` fallbacks to defaults: + + .. code-block:: text + + 'template': `template.jinja2` + 'type': 'page', + + Usage example: + + .. code-block:: jinja + +

{{ page.title }}

+ +``site``: dict + Dict of values from ``site`` section from **settings.toml**. The structure + and data types can be arbitrary. + + This data can be used to add custom elements common to the entire site. + Below is an example of adding a list of links. + + .. code-block:: toml + + [site] + title = 'My awesome site' + description = 'Awesome site about awesome things' + + [[site.links]] + title = 'GitHub' + url = 'https://github.com/username' + + [[site.links]] + title = 'Twitter' + url = 'https://twitter.com/username' + + This data is serialized into a dictionary with the following structure: + + .. code-block:: python + + site = { + 'title': 'My awesome site', + 'description': 'Awesome site about awesome things', + 'links': [ + { + 'title': 'GitHub', + 'url': 'https://github.com/username', + }, + { + 'title': 'Twitter', + 'url': 'https://twitter.com/username', + } + ] + } + + In template: + + .. code-block:: jinja + + {% for link in site.links %} + {{ link.title }} + {% endfor %} + +``aggr``: dict + This dictonary contains list of posts and list of pages. The elements of + each list consist of dictionaries with strings. + + Structure of the ``aggr`` dictonary: + + .. code-block:: python + + aggr = { + 'posts': [ + { + 'title': 'Hello, World!', + 'date': '1970-01-01', + 'type': 'post' + }, + { + 'title': 'reStructuredText Example', + 'date': '1970-01-01', + 'type': 'post' + } + ], + 'pages': [ + { + 'title': 'Variables', + 'date': '2022-09-22' + } + ] + } + + These lists are applicable, for example, to display a list of posts on the + blog's main page. + +``pygments_theme``: str + A string containing the name of the Pygments theme. In **settings.toml**: + + .. code-block:: toml + + [pygments] + theme = 'rrt' + + The default theme is ``default``. An example of usage in a template: + + .. code-block:: jinja + + diff --git a/docs/layouts/template.jinja2 b/docs/layouts/template.jinja2 new file mode 100644 index 0000000..651a130 --- /dev/null +++ b/docs/layouts/template.jinja2 @@ -0,0 +1,68 @@ + + + + + + + + {{ page.title }} | {{ site.title }} + + + +
+ + +
+
+ {{ html | safe }} +
+ + + +
+
+ + + diff --git a/docs/settings.toml b/docs/settings.toml new file mode 100644 index 0000000..ce32cbe --- /dev/null +++ b/docs/settings.toml @@ -0,0 +1,58 @@ +[dirs] +build_dir = 'build/rsw' + +[pygments] +theme = 'vs' + +[site] +base_url = '/rsw' +title = 'Highly customizable static site generator for reStructuredText markup' +name = '[rSW]' + + [[site.links]] + title = '[Home]' + url = '/rsw' + + [[site.links]] + title = '[Docs]' + url = '/rsw/overview.html' + + [[site.links]] + title = '[Download]' + url = 'https://git.nxhs.cloud/ge/rSW' + + [[site.sidebar]] + title = 'Overview' + url = '/rsw/overview.html' + + [[site.sidebar]] + title = 'Installation' + url = '/rsw/install.html' + + [[site.sidebar]] + title = 'Quick Start' + url = '/rsw/quick_start.html' + + [[site.sidebar]] + title = 'Data Sources' + url = '/rsw/data_sources.html' + + [[site.sidebar]] + title = 'Variables' + url = '/rsw/variables.html' + + [[site.sidebar]] + title = 'Configuration' + url = '/rsw/configuration.html' + + [[site.sidebar]] + title = 'Command Line Interface' + url = '/rsw/cli.html' + + [[site.sidebar]] + title = 'rST Extensions' + url = '/rsw/rst_extensions.html' + + [[site.sidebar]] + title = 'Examples' + url = '/rsw/examples.html' diff --git a/docs/static/css/pygments/vs.css b/docs/static/css/pygments/vs.css new file mode 100644 index 0000000..b580acb --- /dev/null +++ b/docs/static/css/pygments/vs.css @@ -0,0 +1,43 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #ffffff; } +.highlight .c { color: #008000 } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #0000ff } /* Keyword */ +.highlight .ch { color: #008000 } /* Comment.Hashbang */ +.highlight .cm { color: #008000 } /* Comment.Multiline */ +.highlight .cp { color: #0000ff } /* Comment.Preproc */ +.highlight .cpf { color: #008000 } /* Comment.PreprocFile */ +.highlight .c1 { color: #008000 } /* Comment.Single */ +.highlight .cs { color: #008000 } /* Comment.Special */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gh { font-weight: bold } /* Generic.Heading */ +.highlight .gp { font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { font-weight: bold } /* Generic.Subheading */ +.highlight .kc { color: #0000ff } /* Keyword.Constant */ +.highlight .kd { color: #0000ff } /* Keyword.Declaration */ +.highlight .kn { color: #0000ff } /* Keyword.Namespace */ +.highlight .kp { color: #0000ff } /* Keyword.Pseudo */ +.highlight .kr { color: #0000ff } /* Keyword.Reserved */ +.highlight .kt { color: #2b91af } /* Keyword.Type */ +.highlight .s { color: #a31515 } /* Literal.String */ +.highlight .nc { color: #2b91af } /* Name.Class */ +.highlight .ow { color: #0000ff } /* Operator.Word */ +.highlight .sa { color: #a31515 } /* Literal.String.Affix */ +.highlight .sb { color: #a31515 } /* Literal.String.Backtick */ +.highlight .sc { color: #a31515 } /* Literal.String.Char */ +.highlight .dl { color: #a31515 } /* Literal.String.Delimiter */ +.highlight .sd { color: #a31515 } /* Literal.String.Doc */ +.highlight .s2 { color: #a31515 } /* Literal.String.Double */ +.highlight .se { color: #a31515 } /* Literal.String.Escape */ +.highlight .sh { color: #a31515 } /* Literal.String.Heredoc */ +.highlight .si { color: #a31515 } /* Literal.String.Interpol */ +.highlight .sx { color: #a31515 } /* Literal.String.Other */ +.highlight .sr { color: #a31515 } /* Literal.String.Regex */ +.highlight .s1 { color: #a31515 } /* Literal.String.Single */ +.highlight .ss { color: #a31515 } /* Literal.String.Symbol */ diff --git a/docs/static/css/style.css b/docs/static/css/style.css new file mode 100644 index 0000000..f2f977f --- /dev/null +++ b/docs/static/css/style.css @@ -0,0 +1,74 @@ +body { + font-family: 'Source Code Pro', monospace; + line-height: 1.3; + padding: 1rem; +} +a, a:visited { + color: #2003ee; +} +.flex { + display: flex; + flex-wrap: wrap; +} +.col-md-2 { + width: 15%; +} +.col-md-6 { + width: 50%; +} +@media (max-width: 768px) { + .flex { + flex-direction: column + } + .col-md-2, .col-md-6 { + width: 100%; + } +} +pre { + overflow-x: scroll; + overflow-y: hidden; +} +.pre { + font-size: 85%; +} +.highlight pre { + padding: 1rem; + border: 1px solid #000; +} +span.docutils.literal { + padding: 0 4px 2px 4px; + color: #a31515; + font-size: 80%; +} +span.docutils.literal span.pre { + font-size: 100%; +} +dt { + font-weight: bold; +} +table, th, td { + border: 1px solid; + border-collapse: collapse; + border-color: #000; + padding: 0 8px; +} +th { + font-weight: 600; +} +td p { + margin: .5rem 0; +} +hr { + color: #d0d7de; +} +.admonition { + padding: 0 1rem; + margin: .5rem 0; + border-left: 4px solid #000; +} +.admonition-title { + font-weight: bold; +} +.sidebar { + margin-right: 1rem; +} diff --git a/docs/static/img/jinja.png b/docs/static/img/jinja.png new file mode 100644 index 0000000000000000000000000000000000000000..34e024d7af6eb9194c7dbabdfe594478a27d7c37 GIT binary patch literal 23956 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 Rb^HJT002ovPDHLkV1nh7xLp7M literal 0 HcmV?d00001 diff --git a/docs/static/img/rst.png b/docs/static/img/rst.png new file mode 100644 index 0000000000000000000000000000000000000000..58a5e7e3a1cdbedf5a838d1dfee07dfe86c380da GIT binary patch literal 1060 zcmV+<1l#+GP)9L_t(|0iD6It{hhZ z0MK*q4!h&<;++l)P~J*32t{Bd3Kx;zM55pm=<BQRWl;5frJ=Rrmpy z=`x{mfy5YWX`GDbqM6+_8ym2n&vA8|QcCF^d^_4ZFN3%8G}^ngb``yY;GmR}yqQf} zb)j<*qDAn=Zb}qKtLTN+8~KG(t1((cvr8{od)4oY6KA5m$D!WnOEud2?`PelI_ zYA(At}xM~f0YZ@rBv+Pm)x>g38gCrF_Gm;D#zv`8h&JH=VgDq#G71c1?vU)^=&rv>IB}AF2==J1UD%H@{PB zoQWzlNmcLKx<-jV!jA`ogSDuFY%ju@%1%^?7T+2D&AWG2o4>~&4y~Ut)?}y!vw+c2 zBWeY;VDVi(GUo3K@zSp)rizZNu@@O9MvEO1sd3N>*$tQeAw15Z+vG422DYWUNTXH1 z8F8NYSQySrz85AJ`66G8oYSwmG+qjQsK~LCi=(bHt4F7DHtEQnS?G0XgiRC^HTNB4 zi{_D2NqnN;wW-HBDqLcU{-q+x$)Y5CofFT^2E`MzNEWi#e-%ySEn17o-Yz>aI+`rH zI$69ERci0i*&FrAEIBdw!d@|}Z22rf)Zhd9oyB1As$TD#-m~{rj052}42{J@&%Ek^ zfBL3BQ{Y+!e=MlI#vfKjgXzduC;ZxsBep|;vfBS)!q|=%8{?h9(nGC)d%zC=X zc-OG$hVzFt6ORVB*-UK9$ZE1lSdFqx8Mx?#$>kO{r6l*dTT1Cx#Wt@7=c#s+(7Uq1 eCWX#*^}hjpEL}K18Dwez0000[reStructuredWeb] \ No newline at end of file