code:
#+TITLE: sucksmore
- - -
- - -
 who
====

- - -

 who is this sucksmore?
-----------------------

some use, clean kept, stali +more
some use, clean kept, stali +more

it's suckless stuff, but more.

suck[less] [and] s[ome] more.

- - -

 who is dis doin dis?
---------------------

various bods chewing the fat, hanging around in #witchlinux on irc.freenode.net

prolly peeps who suck more than the suckless guys.  (so keep expectations low)

- - -

 what
=====

an ootb [out of the box] distro [ free software distribution operating system ] mostly with the suckless/stali toolset, but oft the sucklessiest, and sometimes something that might suck less than even the suckless tools.

- - -

 what-not
---------

 not systemd
------------

this be tiny, like tiny enough one could hope to read the code.

 not dwm
--------

yes, no dwm, shocking, after just having been told it will have suckless tools.  ( tabbed and/or onepane are looking like the window manager candidates )

 not birch
----------

you might have thought "isnt this just like your birch idea?".

almost...  but no.  not really.  or at all.  birch is bedrock based, no gui.

sucksmore's stali-esq + additional thingymibobs all geared to push the minimal into the insane, but still useable.
(... useable in a sense, for the clever/brave/insane).

- - -

 what then
----------

 working notion of packages
---------------------------

+ surf
+ ii
+ tabbed

- - -

 why
====

iunno.  a whim.  a notion.  see where it goes, what gets learned, what gets made, who picks it up n learns what n does what n on n on the progress goes.  no more specific pragmatic why than that rly.

- - -

 how
====

 development plan
-----------------

leave this idea sitting on a shelf for a few years, always telling myself i'll get around to it, n that i intend to get around to it.  then eventually little by little, and a few big bursts, i'll pick up enough pieces to attain sufficient knowledge n skill to put the notion into action, past my equivocations n excuses n ineptitudes.  then eventually it will exist.

... or someone else might come along with much the same idea n make it.

- - -

 where
======

notabug.org & github, i presume.

- - -

 when
=====

no idea.  pure vapourware.


code:
#+TITLE: sucksmore

* what
some use, clean kept, stali+more
some use, clean kept, stali+more

repo_name: orbea/witch

license: mit


code:
witch sites
===========

since there is no official site, resulting from the philosophy of no central hierarchy or dictator, we will try to be helpfull enough to keep tabs on witch sites.

[http://tinyurl.com/witchlinux](http://tinyurl.com/witchlinux) - usually keeps reasonably up to date with some witch links, has a webchat to the irc channel.
[http://witch.fuge.it] - had some stuff ~ back in the day before it found its purpose as cloud torrent.
[http://invariability.net/witch] - down
puffinux forums - down - see the forum section (accessible through the tinyurl link)
[digit\'s other site\'s witch directory](http://ks392457.kimsufi.com/stuff/distros/witch/ has some witch stuff
[digit\'s git](https://github.com/Digit/witch) is where Digit keeps his main witchcraft efforts and a jumble of other stuff.  gives write access to well-intentioned competent regulars / full-timers.
[digit\'s gitorious](http://gitorious.org/witch#more) has a nice intro.
[wei2912\'s github witch repo] - down -  disapeared shortly after being given write access to Digit\'s github
[jony123\'s github](https://github.com/jony123/witch) has a nice old snapshot of Digit\'s github
[Digit\'s notabug.org git repo](https://notabug.org/Digit/witch) - active - where the fun rebegun
[Digit\'s nanoblogger blog for witch, called "broomtrail"](http://ks392457.kimsufi.com/broomtrail/) new - status uncertain
there are others too...

and again, to re-emphasise the point...
=======================================

no one of these sites is **THE** witch site.
any such site claiming to be such, is something completely different, and misses the point of witch.

other mentions
==============

http://kmandla.wordpress.com/2010/07/18/five-distros-for-fast-machines/

make your own
=============

that\'s not a command unto you, there\'s no obligation.  just a happy encouragement.

you can make your own witch site, repo, whatever.  the point is the freedom to do so, without asking permission.

stick the word "witch" on it somewhere if you like, incase you feel like that's needed to give you license to make it.

not necessary though.  nor is it even necessary you tell us about it.
we\'re not the bureau of witch, we\'re not the council, the H.Q., or any of that nonsense.

it is sad that we had become so dependent on authority to tell us when it is ok.
you are an adult (probably), not a child of the state, and even if you are a child of the state, or a real child, you can still go ahead and make any witch you like.
... and make any site too.

be it a blog, a repo, a general website full of the various accoutriments... whatever.  if u wanna do it, do it, and please tell us about it too, because of chinese proverbs about snapping twigs in forrests.


code:
/notin.egg-info/
__pycache__/

repo_name: mjakob/notin

path: .gitignore


code:
sudo: false
language: python
python:
  - "3.2"
  - "3.3"
  - "3.4"
  - "3.5"
  - "3.5-dev"
script: python setup.py test
notifications:
  email: false


code:
# Notin Change Log

## 0.1

Initial release.


code:
# notin [![Build Status](https://travis-ci.org/mjakob/notin.svg?branch=develop)](https://travis-ci.org/mjakob/notin)

Find all files in one directory that are not in another.

## Requirements

Python v3.2 or later, nothing more, nothing less!

## Installation

```ShellSession
$ pip install git+https://github.com/mjakob/notin.git
```

## Usage

Notin is a very simple tool that was created so the author could
remove a directory of old photos, after re-arranging them in a new
directory, without worrying about losing any of them. Given two
directories,

```ShellSession
$ tree
.
├── a
│   ├── c
│   │   └── same.txt
│   ├── different.txt
│   └── same.txt
└── b
    ├── d
    │   └── same.txt
    ├── different.txt
    ├── same.txt
    └── unique.txt

4 directories, 7 files
```

notin finds all files in the second directory that are not present in
the first.  Notin uses md5sums and cares little about the directory
structure and filenames.

```ShellSession
$ notin a b
b/different.txt
b/unique.txt
```

The full help output is:

```ShellSession
$ notin --help
usage: notin [-h] [-v] SOURCEDIR TARGETDIR

Find all files under TARGETDIR that are not under SOURCEDIR.

positional arguments:
  SOURCEDIR      a source directory
  TARGETDIR      a target directory to search for files not in SOURCEDIR

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  turn on verbose output to stderr
```

## License

Notin was written by Mattias Jakobsson and is release under the
[GNU General Public License version 3](LICENSE) or (at your option)
any later version.


code:
"""Find all files under TARGETDIR that are not under SOURCEDIR."""

import argparse
from functools import partial
import hashlib
import itertools
import os
import sys

def log(message, *args, **kwargs):
    """Print a log message to stderr prefixed with the executable name."""
    print(sys.argv[0] + ':', message.format(*args, **kwargs), file=sys.stderr)

def listfiles(top, log=None):
    """Return an iterator over all regular files in *top* dir.

    If *log* is given, it is called once for each directory visited
    with two keyword arguments:

    dirpath
        the path to the visited directory
    numfiles
        the number of files in the visited directory

    Symbolic links are not followed.

    """
    def listdir(walkentry):
        dirpath, _, filenames = walkentry
        if log:
            log(numfiles=len(filenames), dirpath=dirpath)
        return (os.path.join(dirpath, filename) for filename in filenames)

    return itertools.chain.from_iterable(map(listdir, os.walk(top)))

def md5sum(filename):
    """Return the md5 sum for a given file."""
    with open(filename, 'rb') as stream:
        return hashlib.md5(stream.read()).digest()

def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        'sourcedir', metavar='SOURCEDIR',
        help="a source directory",
    )
    parser.add_argument(
        'targetdir', metavar='TARGETDIR',
        help="a target directory to search for files not in SOURCEDIR",
    )
    parser.add_argument(
        '-v', '--verbose',
        dest='log',
        action='store_const',
        const=log,
        default=lambda *args, **kwargs: None,
        help="turn on verbose output to stderr",
    )
    args = parser.parse_args()

    args.log("Indexing files in {}", args.sourcedir)
    sourcelog = partial(args.log, "Hashing {numfiles} files in {dirpath}")
    sources = {
        md5sum(filename) for filename in listfiles(args.sourcedir, sourcelog)
        if not os.path.islink(filename) and os.path.isfile(filename)
    }
    args.log("Scaning {} for unique files", args.targetdir)
    targetlog = partial(args.log, "Checking {numfiles} files in {dirpath}")
    targets = (
        filename for filename in listfiles(args.targetdir, targetlog)
        if md5sum(filename) not in sources
    )
    for filename in targets:
        print(filename)


code:
#!/usr/bin/env python
"""Build and install Notin."""

from setuptools import setup

setup(
    # Metadata
    name='notin',
    version='0.2.dev1',
    description='Find files in one directory that are not in another',
    url='https://github.com/mjakob/notin',
    author='Mattias Jakobsson',
    author_email='mjakob422@gmail.com',
    license='GPLv3+',
    classifiers=[
        'Development Status :: 3 - Alpha',
        'Intended Audience :: System Administrators',
        'Topic :: System :: Systems Administration',
        'License :: OSI Approved :: '
            'GNU General Public License v3 or later (GPLv3+)',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.2',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
    ],
    keywords='system administration checksum',

    # Content
    py_modules=['notin'],
    entry_points={
        'console_scripts': [
            'notin = notin:main',
        ],
    },
    test_suite='tests',
)


code:
"""Unit and regression tests for Notin."""

import hashlib
import io
import os
import sys
import textwrap
import unittest

try:
    from unittest import mock
except ImportError:
    import mock

import pkg_resources

import notin

class CapturingTestCase(unittest.TestCase):

    """A test case that captures stderr."""

    def setUp(self):
        super(CapturingTestCase, self).setUp()
        self.stdout = sys.stdout = io.StringIO()
        self.stderr = sys.stderr = io.StringIO()

    def tearDown(self):
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__

class LogTests(CapturingTestCase):

    """Unit and regression tests for notin's log() function."""

    def test_simple_message(self):
        notin.log("some message")
        target_output = "{}: some message\n".format(sys.argv[0])
        self.assertEqual(self.stderr.getvalue(), target_output)

    def test_formated_message(self):
        notin.log("format: {} {keyword}", 'positional', keyword='keyword')
        target_output = "{}: format: positional keyword\n".format(sys.argv[0])
        self.assertEqual(self.stderr.getvalue(), target_output)

class DataTestCase(unittest.TestCase):

    """A test case with paths to data directories."""

    def setUp(self):
        super(DataTestCase, self).setUp()
        self.a = pkg_resources.resource_filename(__name__, 'data/a')
        self.b = pkg_resources.resource_filename(__name__, 'data/b')

class ListfilesTests(DataTestCase):

    """Unit and regression tests for notin's listfiles() function."""

    def test_list_a(self):
        self.assertEqual(list(sorted(notin.listfiles(self.a))), [
            os.path.join(self.a, 'c/same.txt'),
            os.path.join(self.a, 'different.txt'),
            os.path.join(self.a, 'same.txt'),
        ])

    def test_list_a_with_symlink_to_b(self):
        link = os.path.join(self.a, 'b')
        try:
            os.symlink(self.b, link)
        except (NotImplementedError, OSError):
            self.skipTest("unable to create symlink")
        try:
            self.assertEqual(list(sorted(notin.listfiles(self.a))), [
                os.path.join(self.a, 'c/same.txt'),
                os.path.join(self.a, 'different.txt'),
                os.path.join(self.a, 'same.txt'),
            ])
        finally:
            os.remove(link)

    def test_list_a_with_log(self):
        log = mock.Mock()
        list(notin.listfiles(self.a, log))
        log.assert_has_calls([
            mock.call(numfiles=2, dirpath=self.a),
            mock.call(numfiles=1, dirpath=os.path.join(self.a, 'c')),
        ])

class Md5sumTests(DataTestCase):

    """Unit and regression tests for notin's md5sum() function."""

    def test_on_same(self):
        md5sum = notin.md5sum(os.path.join(self.a, 'same.txt'))
        self.assertEqual(md5sum, hashlib.md5(b'abc\n').digest())
        other_md5sum = notin.md5sum(os.path.join(self.b, 'same.txt'))
        self.assertEqual(other_md5sum, md5sum)

    def test_on_different(self):
        md5sum = notin.md5sum(os.path.join(self.a, 'different.txt'))
        self.assertEqual(md5sum, hashlib.md5(b'acb\n').digest())
        other_md5sum = notin.md5sum(os.path.join(self.b, 'different.txt'))
        self.assertNotEqual(other_md5sum, md5sum)

class MainTests(DataTestCase, CapturingTestCase):

    """Unit and regression tests for notin's main() function."""

    def test_scan_a(self):
        sys.argv[1:] = [self.b, self.a]
        notin.main()
        sorted_stdout = list(sorted(self.stdout.getvalue().splitlines()))
        self.assertEqual(sorted_stdout, [
            os.path.join(self.a, 'different.txt'),
        ])
        self.assertEqual(self.stderr.getvalue(), "")

    def test_scan_a_with_verbose_flag(self):
        sys.argv[1:] = ['--verbose', self.b, self.a]
        notin.main()
        sorted_stdout = list(sorted(self.stdout.getvalue().splitlines()))
        self.assertEqual(sorted_stdout, [
            os.path.join(self.a, 'different.txt'),
        ])
        self.assertEqual(self.stderr.getvalue(), textwrap.dedent("""\
            {executable}: Indexing files in {b}
            {executable}: Hashing 3 files in {b}
            {executable}: Hashing 1 files in {bd}
            {executable}: Scaning {a} for unique files
            {executable}: Checking 2 files in {a}
            {executable}: Checking 1 files in {ac}
        """).format(
            executable=sys.argv[0],
            a=self.a, ac=os.path.join(self.a, 'c'),
            b=self.b, bd=os.path.join(self.b, 'd'),
        ))

    def test_scan_b(self):
        sys.argv[1:] = [self.a, self.b]
        notin.main()
        sorted_stdout = list(sorted(self.stdout.getvalue().splitlines()))
        self.assertEqual(sorted_stdout, [
            os.path.join(self.b, 'different.txt'),
            os.path.join(self.b, 'unique.txt'),
        ])
        self.assertEqual(self.stderr.getvalue(), "")

    def test_scan_b_with_verbose_flag(self):
        sys.argv[1:] = ['--verbose', self.a, self.b]
        notin.main()
        sorted_stdout = list(sorted(self.stdout.getvalue().splitlines()))
        self.assertEqual(sorted_stdout, [
            os.path.join(self.b, 'different.txt'),
            os.path.join(self.b, 'unique.txt'),
        ])
        self.assertEqual(self.stderr.getvalue(), textwrap.dedent("""\
            {executable}: Indexing files in {a}
            {executable}: Hashing 2 files in {a}
            {executable}: Hashing 1 files in {ac}
            {executable}: Scaning {b} for unique files
            {executable}: Checking 3 files in {b}
            {executable}: Checking 1 files in {bd}
        """).format(
            executable=sys.argv[0],
            a=self.a, ac=os.path.join(self.a, 'c'),
            b=self.b, bd=os.path.join(self.b, 'd'),
        ))


code:
/**/__pycache__

/articles/docbook/
/articles/html/
/articles/dokk.json

/documentation/output
/documentation/sources

/library/add/
/library/*.ttl
/library/*.yaml

/manpages/debian/binaries
/manpages/debian/man
/manpages/debian/testing
/manpages/debian/manpages.json
/manpages/debian/manpages.ttl
/manpages/debian/packages.url

/topics/topics.ttl

repo_name: DOKK/legacy

license: unknown


code:
This repository contains 3rd-party data to be imported into the DOKK graph.

`documentation`: software documentation.

`library`: books and documents. So far only PDFs.

`manpages`: a database of manpages extracted from Debian.

# Contact

- https://peers.community
- #peers on freenode
- https://freepo.st


code:
SHELL = /bin/bash
DOCS_DIR = $(realpath .)/sources
SPHINX_TEMPLATE = $(realpath .)/sphinx_template
HTML_OUTPUT_DIR = $(realpath .)/output/html
TAGS_OUTPUT = $(realpath .)/output/tags

# Which documentation to build. Use like this: make SOURCE=<id>
SOURCE=

${SOURCE}:
	@ # Do not print commands

	# Get docs info from JSON file to an array
	readarray -t DOCS < <(
		jq --raw-output --arg id $@ \
		   '.[] | select(.id == $$id) | .id, .name, .repository, .sphinx_dir, .tags' \
		   documentation.json
	)

	# Extract properties from array to named variable
	DOCS_ID=$${DOCS[0]}
	DOCS_NAME=$${DOCS[1]}
	DOCS_REPOSITORY=$${DOCS[2]}
	DOCS_SPHINXDIR=$${DOCS[3]}
	DOCS_TAGS=$${DOCS[4]}

	# Download source file (repository) if first time
	mkdir --parents ${DOCS_DIR}

	if [ ! -d "${DOCS_DIR}/$${DOCS_ID}" ]
	then
		git clone "$${DOCS_REPOSITORY}" "${DOCS_DIR}/$${DOCS_ID}"
	fi

	# Enter directory with source files
	cd "${DOCS_DIR}/$${DOCS_ID}"

	# Find tags to process
	releases=$$(git tag | grep -E "$${DOCS_TAGS}")

	# For every tag...
	for release in $${releases}
	do
		echo "Switching to tag: $${release}"
		git checkout $${release}

		sphinx-build	-c "${SPHINX_TEMPLATE}" \
				-b dirhtml \
				-D project="$${DOCS_NAME}" \
				-D release="$${release}" \
				"$${DOCS_SPHINXDIR}" \
				"${HTML_OUTPUT_DIR}/$${DOCS_ID}/$${release}"
	done

	# Convert the list of tags to a JSON array
	releases=$$(echo "$${releases}" | jq --raw-input '[.]' | jq --slurp --compact-output 'add')

	# Create list of tags
	TAGS_LIST=$$(echo '[]' | jq --argjson rel $${releases} --arg id $${DOCS_ID} '. + [{ "id": $$id, "rel": $$rel }]')

	# Put list of tags to file
	mkdir --parents ${TAGS_OUTPUT}
	echo "$${TAGS_LIST}" > "${TAGS_OUTPUT}/$${DOCS_ID}.json"

help:
	@echo "Usage: make SOURCE=<id>"

clean:
	rm --recursive --force sources output

.ONESHELL:
.SUFFIXES:
.PHONY: ${SOURCE} clean help
.DELETE_ON_ERROR:

path: documentation/Makefile


code:
# Dependencies

- cleancss
- dot
- doxygen
- libps
- libkvm
- libselinux
- libmd
- libz
- liblzma
- libbz2
- libcurses
- make
- node-clean-css
- node-less
- po4a
- pod2man


Bottle

sphinx_dir: docs/

Invoke

sphinx_dir: sites/docs/

PyCUDA

sphinx_dir: doc/source/

PyOpenCL

sphinx_dir: doc/

CouchDB

sphinx_dir: src/

Bugzilla

sphinx_dir: docs/en/rst/

Buildbot

sphinx_dir: master/docs/

Chaco

sphinx_dir: docs/source/

GSL Shell

sphinx_dir: doc/user-manual/

pygame

sphinx_dir: docs/reST/

SymPy

sphinx_dir: doc/src/

Varnish

sphinx_dir: doc/sphinx/

Alembic

sphinx_dir: docs/build/

Breathe

sphinx_dir: documentation/source/

Natural Language Toolkit

sphinx_dir: web/

Pylons

sphinx_dir: pylons/docs/en/

sphinx_dir: doc/manual-src/en/

latexindent.pl

sphinx_dir: documentation/

Linguistica 5

sphinx_dir: docs/sources/

pip

sphinx_dir: docs/html/

Mako

sphinx_dir: doc/build/

sphinx_dir: doc/sphinxman/source/

name: Bacterial Isolate Genome Sequence Database


code:
# -*- coding: utf-8 -*-
# Sphinx configuration: http://www.sphinx-doc.org/en/master/usage/configuration.html

import os, sys

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
here = os.path.abspath (os.path.dirname ('.'))
sys.path.insert (0, os.path.abspath (os.path.join (here, '..')))

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.intersphinx',
    'sphinx.ext.todo',
    'sphinx.ext.coverage',
    'sphinx.ext.viewcode',
    'repoze.sphinx.autointerface',
]

# Add any paths that contain templates here, relative to this directory.
templates_path = []

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = ''
description = ''
copyright = ''
author = ''

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = ''

# The full version, including alpha/beta/rc tags.
release = ''

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# These patterns also affect html_static_path and html_extra_path
exclude_patterns = ['_build']

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'dokk'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  These overwrite options defined in theme.conf.
html_theme_options = {
    'description': description,
}

# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = [ os.path.abspath ('./themes') ]

# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
# html_title = u'test vtest'

# A shorter title for the navigation bar.  Default is the same as html_title.
# html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None

# The name of an image file (relative to this directory) to use as a favicon of
# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
# html_static_path = ['_static']

# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
# html_extra_path = []

# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
# html_last_updated_fmt = None

# Custom sidebar templates, maps document names to template names.
html_sidebars = {
    '**': [
        #'navigation.html',
    ]
}

# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}

# If false, no module index is generated.
# html_domain_indices = True

# If false, no index is generated.
# html_use_index = True

# If true, the index is split into individual pages for each letter.
# html_split_index = False

# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True

# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None


code:
{#
    basic/domainindex.html
    ~~~~~~~~~~~~~~~~~~~~~~

    Template for domain indices (module index, ...).

    :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = indextitle %}
{% block extrahead %}
{{ super() }}
{% if not embedded and collapse_index %}

{% endif %}
{% endblock %}
{% block body %}

   {%- set groupid = idgen() %}

{{ indextitle }}

   {%- for (letter, entries) in content %}
   {{ letter }}
     {%- if not loop.last %} | {% endif %}
   {%- endfor %}

   {%- for letter, entries in content %}

       {{ letter }}

     {%- for (name, grouptype, page, anchor, extra, qualifier, description)
             in entries %}

       {% if grouptype == 1 -%}

           {%- endif %}
       {% if grouptype == 2 %}   {% endif %}
       {% if page %}{% endif -%}
       {{ name|e }}
       {%- if page %}{% endif %}
     {%- if extra %} ({{ extra|e }}){% endif -%}
     	{% if qualifier %}{{ qualifier|e }}:{% endif %}
       {{ description|e }}

     {%- endfor %}
   {%- endfor %}

{% endblock %}


code:
{% macro indexentries(firstname, links) %}

  {%- if links -%}

    {%- if links[0][0] %}{% endif -%}
    {{ firstname|e }}
    {%- if links[0][0] %}{% endif -%}

    {%- for ismain, link in links[1:] -%}
      , {% if ismain %}{% endif -%}
      [{{ loop.index }}]
      {%- if ismain %}{% endif -%}

    {%- endfor %}
  {%- else %}
    {{ firstname|e }}
  {%- endif %}

{% endmacro %}

{%- extends "layout.html" %}
{% set title = _('Index') %}
{% block body %}

{{ _('Index') }}

 {% for key, dummy in genindexentries -%}
 {{ key }}
 {% if not loop.last %}| {% endif %}
 {%- endfor %}

{%- for key, entries in genindexentries %}

{{ key }}

  {%- for column in entries|slice_index(2) if column %}

    {%- for entryname, (links, subitems, _) in column %}
      {{ indexentries(entryname, links) }}
      {%- if subitems %}

      {%- for subentryname, subentrylinks in subitems %}
        {{ indexentries(subentryname, subentrylinks) }}
      {%- endfor %}

      {%- endif -%}
    {%- endfor %}

  {%- endfor %}

{% endfor %}

{% endblock %}

{% block sidebarrel %}
{% if split_index %}

{{ _('Index') }}

{% for key, dummy in genindexentries -%}
   {{ key }}
     {% if not loop.last %}| {% endif %}
   {%- endfor %}

{{ _('Full index on one page') }}

{% endif %}
   {{ super() }}
{% endblock %}


code:
<!DOCTYPE html>

        <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />

        <title>{{ title|striptags|e }}{{ titlesuffix }}</title>

        {# CSS #}
        <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
        <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />

        {% if favicon %}
            <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
        {% endif %}

                    Documentation

{{ project }}

{{ release }}

            {% if logo %}

            {% endif %}

                {{ project }}

                {{ release }}

            {% if theme_description %}

                    {{ theme_description }}

            {% endif %}

            {# Templates defined in html_sidebars #}
            {% for a_template in sidebars %}
                {% include a_template %}
            {% endfor %}

            {# A callable yielding the global TOC tree containing the current
             # page, rendered as HTML bullet lists.
             # https://www.sphinx-doc.org/en/master/templating.html#toctree
             #}

                {{ toctree (collapse=true, includehidden=true, maxdepth=2) }}

            {# TODO: Add download links to PDF/EPUB/...

Download:

            #}

            {% block body %}{% endblock %}


code:
{% extends "layout.html" %}

{% block body %}
  {{ body }}
{% endblock %}


code:
{#
    basic/search.html
    ~~~~~~~~~~~~~~~~~

    Template for the search page.

    :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block extrahead %}

  {# this is used when loading the search index using $.ajax fails,
     such as on Chrome for documents on localhost #}

  {{ super() }}
{% endblock %}
{% block body %}

{{ _('Search') }}

    {% trans %}Please activate JavaScript to enable the search
    functionality.{% endtrans %}

    {% trans %}From here you can search these documents. Enter your search
    words into the box below and click "search". Note that the search
    function will automatically search for all of the words. Pages
    containing fewer words won't appear in the result list.{% endtrans %}

  <form action="" method="get">
    <input type="text" name="q" value="" />
    <input type="submit" value="{{ _('search') }}" />

  </form>
  {% if search_performed %}

{{ _('Search Results') }}

    {% if not search_results %}

{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}

    {% endif %}
  {% endif %}

  {% if search_results %}

    {% for href, caption, context in search_results %}

{{ caption }}

{{ context|e }}

    {% endfor %}

  {% endif %}

{% endblock %}


code:
/* RESET STYLES */

*
{
    -moz-box-sizing:    border-box;
    -webkit-box-sizing: border-box;
    box-sizing:         border-box;
}

html, body
{
    background-color: #fff;
    font-family:     OpenSans Regular, Helvetica Neue, Helvetica, Arial, sans-serif;
    height:          100%;
    margin:          0;
    padding:         0;
    width:           100%;
}

a, a:hover
{
    color:           #0645ad;
    text-decoration: underline dotted;
}

a:hover
{
    text-decoration: underline;
}

blockquote
{
    background-color: #f8f8f8;
    border-left:      5px solid #e9e9e9;
    font-size:        .85em;
    margin:           1em 0;
    padding:          .5em 1em;
}

blockquote cite
{
    color:      #999;
    display:    block;
    font-size:  .8em;
    margin-top: 1em;
}

blockquote cite:before
{
    content: "\2014 \2009";
}

img
{
    max-width: 100%;
}

pre
{
    font-family: Inconsolata, Hack, DejaVu Sans Mono, Courier New, monospace, sans-serif;
    white-space: pre-wrap;
    word-wrap:   break-word;
    text-align:  justify;
}

/* Inline code */
code
{
    background-color: #f5f5f5;
    border-radius:    3px;
    display:          inline-block;
    font-family:      Inconsolata, Hack, DejaVu Sans Mono, Courier New, monospace, sans-serif;
    font-size:        85%;
    line-height:      140%;
    margin:           0 .2em;
    padding:          .2em;
}

ul, ol
{
    margin: auto;
}

table
{
    border-collapse: collapse;
    margin:         2rem 0;
    max-width:      100%;
    text-align:     left;
}

    table > thead > th
    {
            color:       #039;
            font-weight: bold;
            padding:    1rem;
    }

    table > tr:nth-child(even)
    {
        background: #F7F9FF;
    }

    table > td
    {
        border-top:     1px solid #e8edff;
        padding:        .5rem 1rem;
        vertical-align: top;
    }

/* CUSTOM STYLES */

body
{
    display:               grid;
    grid-column-gap:       0;
    grid-template-columns: 25% auto;
}

    .navigation_sidebar
    {
        background-color: #f9f9f9;
        border-right: 1px solid #ccc;
        padding: 0 10%;
        position: relative;
    }

    .navigation_page
    {
        padding: 1rem;
        text-align: right;
    }

    .navigation_page > ul
    {
        margin: 0;
        padding: 0;
    }

        .navigation_page > ul > li
        {
            display: inline;
        }

        .navigation_page > ul > li + li:before {
            content: " » ";
        }

    .sidebar
    {
        background-color: #f9f9f9;
        border-right: 1px solid #ccc;
        padding: 1rem 10%;
        position: relative;
    }

        /* Highlight current page */
        .sidebar a.current
        {
            font-weight: bold;
            text-decoration: underline;
        }

        .sidebar a
        {
            color: #000;
            text-decoration: none;
        }

        .sidebar a:hover
        {
            text-decoration: underline dotted;
        }

        .sidebar > .toc ul
        {
            list-style-type: none;
            margin:          0;
            padding:         0;
        }

        .sidebar > .toc >  ul
        {
            border-bottom:  1px solid #ccc;
            margin-bottom:  2rem;
            padding-bottom: 2rem;
        }

            .sidebar > .toc >  ul ul
            {
                margin-bottom: .2rem;
            }

                .sidebar > .toc > ul ul > li
                {
                    margin-left: 1rem;
                }

                .sidebar > .toc >  ul ul > li:before
                {
                    content: "· ";
                    font-weight: bold;
                }

        .sidebar > .project_name
        {
            font-size: 1.5rem;
        }

        .sidebar > .toc
        {
            margin-top: 2rem;
        }

    .page
    {
        padding: 0 5% 10rem 5%;
    }

        .page *:hover > a.headerlink
        {
            display: inline-block;
        }

        .page a.headerlink
        {
            color:           #ddd;
            display:         none;
            padding:         0 4px;
            text-decoration: none;
        }

        .page a.headerlink:hover
        {
            color: #000;
        }

        .page h1
        {
            margin-top: 0;
        }

        .page .section > h2
        {
            border-bottom: 1px solid #ccc;
            margin-top: 3rem;
        }

/* Hide sidebar on small screens */
@media only screen and (max-width: 800px)
{
    body
    {
        grid-template-columns: auto;
    }

    .navigation_sidebar, .sidebar
    {
        display: none;
    }
}


code:
[theme]

inherit        = none
stylesheet     = dokk.css
pygments_style = sphinx

[options]

description = ''