everything in src for packaging purposes
This commit is contained in:
@ -1,15 +0,0 @@
|
||||
.SUFFIXES:
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: html
|
||||
|
||||
generate:
|
||||
python ./generate.py
|
||||
|
||||
html: generate
|
||||
make -C ./build all
|
||||
|
||||
clean:
|
||||
make -C ./build clean
|
||||
|
@ -1,18 +0,0 @@
|
||||
SRC=$(wildcard *.txt)
|
||||
HTMLFRAGMENT=$(addsuffix .html, $(basename $(SRC)))
|
||||
|
||||
.SUFFIXES:
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: html
|
||||
|
||||
html: $(HTMLFRAGMENT)
|
||||
|
||||
%.html: %.txt
|
||||
./rst2html.py --stylesheet ./style.css $< > $@
|
||||
|
||||
clean:
|
||||
rm -f *.html
|
||||
rm -f *.txt
|
||||
|
@ -1,540 +0,0 @@
|
||||
/*
|
||||
* basic.css
|
||||
* ~~~~~~~~~
|
||||
*
|
||||
* Sphinx stylesheet -- basic theme.
|
||||
*
|
||||
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* -- main layout ----------------------------------------------------------- */
|
||||
|
||||
div.clearer {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
/* -- relbar ---------------------------------------------------------------- */
|
||||
|
||||
div.related {
|
||||
width: 100%;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.related h3 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.related ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 10px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.related li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div.related li.right {
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/* -- sidebar --------------------------------------------------------------- */
|
||||
|
||||
div.sphinxsidebarwrapper {
|
||||
padding: 10px 5px 0 10px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
float: left;
|
||||
width: 230px;
|
||||
margin-left: -100%;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul ul,
|
||||
div.sphinxsidebar ul.want-points {
|
||||
margin-left: 20px;
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul ul {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar form {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #98dbcc;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="text"] {
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="submit"] {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* -- search page ----------------------------------------------------------- */
|
||||
|
||||
ul.search {
|
||||
margin: 10px 0 0 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul.search li {
|
||||
padding: 5px 0 5px 20px;
|
||||
background-image: url(file.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 7px;
|
||||
}
|
||||
|
||||
ul.search li a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.search li div.context {
|
||||
color: #888;
|
||||
margin: 2px 0 0 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul.keywordmatches li.goodmatch a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- index page ------------------------------------------------------------ */
|
||||
|
||||
table.contentstable {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
table.contentstable p.biglink {
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
a.biglink {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
span.linkdescr {
|
||||
font-style: italic;
|
||||
padding-top: 5px;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
/* -- general index --------------------------------------------------------- */
|
||||
|
||||
table.indextable {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.indextable td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.indextable dl, table.indextable dd {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
table.indextable tr.pcap {
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
table.indextable tr.cap {
|
||||
margin-top: 10px;
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
img.toggler {
|
||||
margin-right: 3px;
|
||||
margin-top: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
div.modindex-jumpbox {
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
margin: 1em 0 1em 0;
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
div.genindex-jumpbox {
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
margin: 1em 0 1em 0;
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
/* -- general body styles --------------------------------------------------- */
|
||||
|
||||
a.headerlink {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
h1:hover > a.headerlink,
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
h4:hover > a.headerlink,
|
||||
h5:hover > a.headerlink,
|
||||
h6:hover > a.headerlink,
|
||||
dt:hover > a.headerlink {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
div.body p.caption {
|
||||
text-align: inherit;
|
||||
}
|
||||
|
||||
div.body td {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.field-list ul {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.first {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
p.rubric {
|
||||
margin-top: 30px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left;
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right;
|
||||
float: right;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* -- sidebars -------------------------------------------------------------- */
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em;
|
||||
border: 1px solid #ddb;
|
||||
padding: 7px 7px 0 7px;
|
||||
background-color: #ffe;
|
||||
width: 40%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
p.sidebar-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- topics ---------------------------------------------------------------- */
|
||||
|
||||
div.topic {
|
||||
border: 1px solid #ccc;
|
||||
padding: 7px 7px 0 7px;
|
||||
margin: 10px 0 10px 0;
|
||||
}
|
||||
|
||||
p.topic-title {
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
/* -- admonitions ----------------------------------------------------------- */
|
||||
|
||||
div.admonition {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
div.admonition dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.admonition dl {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
margin: 0px 10px 5px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.body p.centered {
|
||||
text-align: center;
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
/* -- tables ---------------------------------------------------------------- */
|
||||
|
||||
table.docutils {
|
||||
border: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table.docutils td, table.docutils th {
|
||||
padding: 1px 8px 1px 5px;
|
||||
border-top: 0;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 1px solid #aaa;
|
||||
}
|
||||
|
||||
table.field-list td, table.field-list th {
|
||||
border: 0 !important;
|
||||
}
|
||||
|
||||
table.footnote td, table.footnote th {
|
||||
border: 0 !important;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
table.citation td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* -- other body styles ----------------------------------------------------- */
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha;
|
||||
}
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha;
|
||||
}
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman;
|
||||
}
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
dd p {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
dd ul, dd table {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-top: 3px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
dt:target, .highlighted {
|
||||
background-color: #fbe54e;
|
||||
}
|
||||
|
||||
dl.glossary dt {
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.field-list ul {
|
||||
margin: 0;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.field-list p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.refcount {
|
||||
color: #060;
|
||||
}
|
||||
|
||||
.optional {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
.versionmodified {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.system-message {
|
||||
background-color: #fda;
|
||||
padding: 5px;
|
||||
border: 3px solid red;
|
||||
}
|
||||
|
||||
.footnote:target {
|
||||
background-color: #ffa;
|
||||
}
|
||||
|
||||
.line-block {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.line-block .line-block {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 1.5em;
|
||||
}
|
||||
|
||||
.guilabel, .menuselection {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.accelerator {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.classifier {
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
abbr, acronym {
|
||||
border-bottom: dotted 1px;
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
/* -- code displays --------------------------------------------------------- */
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
overflow-y: hidden; /* fixes display issues on Chrome browsers */
|
||||
}
|
||||
|
||||
td.linenos pre {
|
||||
padding: 5px 0px;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
table.highlighttable {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
table.highlighttable td {
|
||||
padding: 0 0.5em 0 0.5em;
|
||||
}
|
||||
|
||||
tt.descname {
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
tt.descclassname {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
tt.xref, a tt {
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.viewcode-link {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
float: right;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
margin: -1px -10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
/* -- math display ---------------------------------------------------------- */
|
||||
|
||||
img.math {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
div.body div.math p {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
span.eqno {
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* -- printout stylesheet --------------------------------------------------- */
|
||||
|
||||
@media print {
|
||||
div.document,
|
||||
div.documentwrapper,
|
||||
div.bodywrapper {
|
||||
margin: 0 !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar,
|
||||
div.related,
|
||||
div.footer,
|
||||
#top-link {
|
||||
display: none;
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# unproudly borrowed from David Goodger's rst2html.py
|
||||
|
||||
""" A minimal front end to the Docutils Publisher, producing HTML with a
|
||||
`config` role
|
||||
"""
|
||||
|
||||
try:
|
||||
import locale
|
||||
locale.setlocale(locale.LC_ALL, '')
|
||||
except:
|
||||
pass
|
||||
|
||||
from docutils.core import publish_cmdline, default_description
|
||||
# ____________________________________________________________
|
||||
from docutils import nodes, utils
|
||||
from docutils.parsers.rst import roles
|
||||
|
||||
# ____________________________________________________________
|
||||
#register a :config: ReST link role for use in documentation
|
||||
def config_reference_role(role, rawtext, text, lineno, inliner,
|
||||
options={}, content=[]):
|
||||
basename = text
|
||||
refuri = "report/build" + basename + '.html'
|
||||
roles.set_classes(options)
|
||||
node = nodes.reference(rawtext, utils.unescape(text), refuri=refuri,
|
||||
**options)
|
||||
return [node], []
|
||||
|
||||
roles.register_local_role('config', config_reference_role)
|
||||
# ____________________________________________________________
|
||||
|
||||
|
||||
description = ('Generates (X)HTML documents from standalone reStructuredText '
|
||||
'sources. ' + default_description)
|
||||
|
||||
publish_cmdline(writer_name='html', description=description)
|
||||
|
@ -1,795 +0,0 @@
|
||||
/*
|
||||
* rtd.css
|
||||
* ~~~~~~~~~~~~~~~
|
||||
*
|
||||
* Sphinx stylesheet -- sphinxdoc theme. Originally created by
|
||||
* Armin Ronacher for Werkzeug.
|
||||
*
|
||||
* Customized for ReadTheDocs by Eric Pierce & Eric Holscher
|
||||
*
|
||||
* :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* RTD colors
|
||||
* light blue: #e8ecef
|
||||
* medium blue: #8ca1af
|
||||
* dark blue: #465158
|
||||
* dark grey: #444444
|
||||
*
|
||||
* white hover: #d1d9df;
|
||||
* medium blue hover: #697983;
|
||||
* green highlight: #8ecc4c
|
||||
* light blue (project bar): #e8ecef
|
||||
*/
|
||||
|
||||
@import url("basic.css");
|
||||
|
||||
/* PAGE LAYOUT -------------------------------------------------------------- */
|
||||
|
||||
body {
|
||||
font: 100%/1.5 "ff-meta-web-pro-1","ff-meta-web-pro-2",Arial,"Helvetica Neue",sans-serif;
|
||||
text-align: center;
|
||||
color: black;
|
||||
background-color: #465158;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.document {
|
||||
text-align: left;
|
||||
background-color: #e8ecef;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
background-color: #ffffff;
|
||||
border-left: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
margin: 0 0 0 16em;
|
||||
}
|
||||
|
||||
div.body {
|
||||
margin: 0;
|
||||
padding: 0.5em 1.3em;
|
||||
min-width: 20em;
|
||||
}
|
||||
|
||||
div.related {
|
||||
font-size: 1em;
|
||||
background-color: #465158;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: left;
|
||||
width: 100%;
|
||||
background-color: #e8ecef;
|
||||
}
|
||||
|
||||
|
||||
/* HEADINGS --------------------------------------------------------------- */
|
||||
|
||||
h1 {
|
||||
margin: 0;
|
||||
padding: 0.7em 0 0.3em 0;
|
||||
font-size: 1.5em;
|
||||
line-height: 1.15;
|
||||
color: #111;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 2em 0 0.2em 0;
|
||||
font-size: 1.35em;
|
||||
padding: 0;
|
||||
color: #465158;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 1em 0 -0.3em 0;
|
||||
font-size: 1.2em;
|
||||
color: #6c818f;
|
||||
}
|
||||
|
||||
div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
|
||||
color: black;
|
||||
}
|
||||
|
||||
h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
|
||||
display: none;
|
||||
margin: 0 0 0 0.3em;
|
||||
padding: 0 0.2em 0 0.2em;
|
||||
color: #aaa !important;
|
||||
}
|
||||
|
||||
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
|
||||
h5:hover a.anchor, h6:hover a.anchor {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
|
||||
h5 a.anchor:hover, h6 a.anchor:hover {
|
||||
color: #777;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
|
||||
/* LINKS ------------------------------------------------------------------ */
|
||||
|
||||
/* Normal links get a pseudo-underline */
|
||||
a {
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
/* Links in sidebar, TOC, index trees and tables have no underline */
|
||||
.sphinxsidebar a,
|
||||
.toctree-wrapper a,
|
||||
.indextable a,
|
||||
#indices-and-tables a {
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Most links get an underline-effect when hovered */
|
||||
a:hover,
|
||||
div.toctree-wrapper a:hover,
|
||||
.indextable a:hover,
|
||||
#indices-and-tables a:hover {
|
||||
color: #111;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid #111;
|
||||
}
|
||||
|
||||
/* Footer links */
|
||||
div.footer a {
|
||||
color: #86989B;
|
||||
text-decoration: none;
|
||||
border: none;
|
||||
}
|
||||
div.footer a:hover {
|
||||
color: #a6b8bb;
|
||||
text-decoration: underline;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Permalink anchor (subtle grey with a red hover) */
|
||||
div.body a.headerlink {
|
||||
color: #ccc;
|
||||
font-size: 1em;
|
||||
margin-left: 6px;
|
||||
padding: 0 4px 0 4px;
|
||||
text-decoration: none;
|
||||
border: none;
|
||||
}
|
||||
div.body a.headerlink:hover {
|
||||
color: #c60f0f;
|
||||
border: none;
|
||||
}
|
||||
|
||||
|
||||
/* NAVIGATION BAR --------------------------------------------------------- */
|
||||
|
||||
div.related ul {
|
||||
height: 2.5em;
|
||||
}
|
||||
|
||||
div.related ul li {
|
||||
margin: 0;
|
||||
padding: 0.65em 0;
|
||||
float: left;
|
||||
display: block;
|
||||
color: white; /* For the >> separators */
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
div.related ul li.right {
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
color: transparent; /* Hide the | separators */
|
||||
}
|
||||
|
||||
/* "Breadcrumb" links in nav bar */
|
||||
div.related ul li a {
|
||||
order: none;
|
||||
background-color: inherit;
|
||||
font-weight: bold;
|
||||
margin: 6px 0 6px 4px;
|
||||
line-height: 1.75em;
|
||||
color: #ffffff;
|
||||
padding: 0.4em 0.8em;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
}
|
||||
/* previous / next / modules / index links look more like buttons */
|
||||
div.related ul li.right a {
|
||||
margin: 0.375em 0;
|
||||
background-color: #697983;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 0.5);
|
||||
border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
}
|
||||
/* All navbar links light up as buttons when hovered */
|
||||
div.related ul li a:hover {
|
||||
background-color: #8ca1af;
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
}
|
||||
/* Take extra precautions for tt within links */
|
||||
a tt,
|
||||
div.related ul li a tt {
|
||||
background: inherit !important;
|
||||
color: inherit !important;
|
||||
}
|
||||
|
||||
|
||||
/* SIDEBAR ---------------------------------------------------------------- */
|
||||
|
||||
div.sphinxsidebarwrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
margin: 0;
|
||||
margin-left: -100%;
|
||||
float: left;
|
||||
top: 3em;
|
||||
left: 0;
|
||||
padding: 0 1em;
|
||||
width: 14em;
|
||||
font-size: 1em;
|
||||
text-align: left;
|
||||
background-color: #e8ecef;
|
||||
}
|
||||
|
||||
div.sphinxsidebar img {
|
||||
max-width: 12em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3,
|
||||
div.sphinxsidebar h4,
|
||||
div.sphinxsidebar p.logo {
|
||||
margin: 1.2em 0 0.3em 0;
|
||||
font-size: 1em;
|
||||
padding: 0;
|
||||
color: #222222;
|
||||
font-family: "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 a {
|
||||
color: #444444;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul,
|
||||
div.sphinxsidebar p {
|
||||
margin-top: 0;
|
||||
padding-left: 0;
|
||||
line-height: 130%;
|
||||
background-color: #e8ecef;
|
||||
}
|
||||
|
||||
/* No bullets for nested lists, but a little extra indentation */
|
||||
div.sphinxsidebar ul ul {
|
||||
list-style-type: none;
|
||||
margin-left: 1.5em;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* A little top/bottom padding to prevent adjacent links' borders
|
||||
* from overlapping each other */
|
||||
div.sphinxsidebar ul li {
|
||||
padding: 1px 0;
|
||||
}
|
||||
|
||||
/* A little left-padding to make these align with the ULs */
|
||||
div.sphinxsidebar p.topless {
|
||||
padding-left: 0 0 0 1em;
|
||||
}
|
||||
|
||||
/* Make these into hidden one-liners */
|
||||
div.sphinxsidebar ul li,
|
||||
div.sphinxsidebar p.topless {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
/* ...which become visible when hovered */
|
||||
div.sphinxsidebar ul li:hover,
|
||||
div.sphinxsidebar p.topless:hover {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Search text box and "Go" button */
|
||||
#searchbox {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 1em;
|
||||
background: #ddd;
|
||||
padding: 0.5em;
|
||||
border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
}
|
||||
#searchbox h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Make search box and button abut and have a border */
|
||||
input,
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #999;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* Search textbox */
|
||||
input[type="text"] {
|
||||
margin: 0;
|
||||
padding: 0 3px;
|
||||
height: 20px;
|
||||
width: 144px;
|
||||
border-top-left-radius: 3px;
|
||||
border-bottom-left-radius: 3px;
|
||||
-moz-border-radius-topleft: 3px;
|
||||
-moz-border-radius-bottomleft: 3px;
|
||||
-webkit-border-top-left-radius: 3px;
|
||||
-webkit-border-bottom-left-radius: 3px;
|
||||
}
|
||||
/* Search button */
|
||||
input[type="submit"] {
|
||||
margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */
|
||||
height: 22px;
|
||||
color: #444;
|
||||
background-color: #e8ecef;
|
||||
padding: 1px 4px;
|
||||
font-weight: bold;
|
||||
border-top-right-radius: 3px;
|
||||
border-bottom-right-radius: 3px;
|
||||
-moz-border-radius-topright: 3px;
|
||||
-moz-border-radius-bottomright: 3px;
|
||||
-webkit-border-top-right-radius: 3px;
|
||||
-webkit-border-bottom-right-radius: 3px;
|
||||
}
|
||||
input[type="submit"]:hover {
|
||||
color: #ffffff;
|
||||
background-color: #8ecc4c;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.searchtip {
|
||||
clear: both;
|
||||
padding: 0.5em 0 0 0;
|
||||
background: #ddd;
|
||||
color: #666;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Sidebar links are unusual */
|
||||
div.sphinxsidebar li a,
|
||||
div.sphinxsidebar p a {
|
||||
background: #e8ecef; /* In case links overlap main content */
|
||||
border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border: 1px solid transparent; /* To prevent things jumping around on hover */
|
||||
padding: 0 5px 0 5px;
|
||||
}
|
||||
div.sphinxsidebar li a:hover,
|
||||
div.sphinxsidebar p a:hover {
|
||||
color: #111;
|
||||
text-decoration: none;
|
||||
border: 1px solid #888;
|
||||
}
|
||||
div.sphinxsidebar p.logo a {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* Tweak any link appearing in a heading */
|
||||
div.sphinxsidebar h3 a {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* OTHER STUFF ------------------------------------------------------------ */
|
||||
|
||||
cite, code, tt {
|
||||
font-family: 'Consolas', 'Deja Vu Sans Mono',
|
||||
'Bitstream Vera Sans Mono', monospace;
|
||||
font-size: 0.95em;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
tt {
|
||||
background-color: #f2f2f2;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
tt.descname, tt.descclassname, tt.xref {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid #abc;
|
||||
margin: 2em;
|
||||
}
|
||||
|
||||
|
||||
pre, #_fontwidthtest {
|
||||
font-family: 'Consolas', 'Deja Vu Sans Mono',
|
||||
'Bitstream Vera Sans Mono', monospace;
|
||||
margin: 1em 2em;
|
||||
font-size: 0.95em;
|
||||
letter-spacing: 0.015em;
|
||||
line-height: 120%;
|
||||
padding: 0.5em;
|
||||
border: 1px solid #ccc;
|
||||
background-color: #eee;
|
||||
border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
}
|
||||
|
||||
pre a {
|
||||
color: inherit;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
td.linenos pre {
|
||||
margin: 1em 0em;
|
||||
}
|
||||
|
||||
td.code pre {
|
||||
margin: 1em 0em;
|
||||
}
|
||||
|
||||
div.quotebar {
|
||||
background-color: #f8f8f8;
|
||||
max-width: 250px;
|
||||
float: right;
|
||||
padding: 2px 7px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
margin: 0 -0.5em 0 -0.5em;
|
||||
}
|
||||
|
||||
table td, table th {
|
||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||
}
|
||||
|
||||
|
||||
/* ADMONITIONS AND WARNINGS ------------------------------------------------- */
|
||||
|
||||
/* Shared by admonitions, warnings and sidebars */
|
||||
div.admonition,
|
||||
div.warning,
|
||||
div.sidebar {
|
||||
font-size: 0.9em;
|
||||
margin: 2em;
|
||||
padding: 0;
|
||||
/*
|
||||
border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
*/
|
||||
}
|
||||
div.admonition p,
|
||||
div.warning p,
|
||||
div.sidebar p {
|
||||
margin: 0.5em 1em 0.5em 1em;
|
||||
padding: 0;
|
||||
}
|
||||
div.admonition pre,
|
||||
div.warning pre,
|
||||
div.sidebar pre {
|
||||
margin: 0.4em 1em 0.4em 1em;
|
||||
}
|
||||
div.admonition p.admonition-title,
|
||||
div.warning p.admonition-title,
|
||||
div.sidebar p.sidebar-title {
|
||||
margin: 0;
|
||||
padding: 0.1em 0 0.1em 0.5em;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
div.admonition ul, div.admonition ol,
|
||||
div.warning ul, div.warning ol,
|
||||
div.sidebar ul, div.sidebar ol {
|
||||
margin: 0.1em 0.5em 0.5em 3em;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/* Admonitions and sidebars only */
|
||||
div.admonition, div.sidebar {
|
||||
border: 1px solid #609060;
|
||||
background-color: #e9ffe9;
|
||||
}
|
||||
div.admonition p.admonition-title,
|
||||
div.sidebar p.sidebar-title {
|
||||
background-color: #70A070;
|
||||
border-bottom: 1px solid #609060;
|
||||
}
|
||||
|
||||
|
||||
/* Warnings only */
|
||||
div.warning {
|
||||
border: 1px solid #900000;
|
||||
background-color: #ffe9e9;
|
||||
}
|
||||
div.warning p.admonition-title {
|
||||
background-color: #b04040;
|
||||
border-bottom: 1px solid #900000;
|
||||
}
|
||||
|
||||
|
||||
/* Sidebars only */
|
||||
div.sidebar {
|
||||
max-width: 30%;
|
||||
}
|
||||
|
||||
|
||||
|
||||
div.versioninfo {
|
||||
margin: 1em 0 0 0;
|
||||
border: 1px solid #ccc;
|
||||
background-color: #DDEAF0;
|
||||
padding: 8px;
|
||||
line-height: 1.3em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
|
||||
'Verdana', sans-serif;
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
background-color: #f4debf;
|
||||
border-top: 1px solid #ac9;
|
||||
border-bottom: 1px solid #ac9;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin: 1em 0 2.5em 0;
|
||||
}
|
||||
|
||||
/* Highlight target when you click an internal link */
|
||||
dt:target {
|
||||
background: #ffe080;
|
||||
}
|
||||
/* Don't highlight whole divs */
|
||||
div.highlight {
|
||||
background: transparent;
|
||||
}
|
||||
/* But do highlight spans (so search results can be highlighted) */
|
||||
span.highlight {
|
||||
background: #ffe080;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
background-color: #465158;
|
||||
color: #eeeeee;
|
||||
padding: 0 2em 2em 2em;
|
||||
clear: both;
|
||||
font-size: 0.8em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.8em 0 0.5em 0;
|
||||
}
|
||||
|
||||
.section p img.math {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
.section p img {
|
||||
margin: 1em 2em;
|
||||
}
|
||||
|
||||
|
||||
/* MOBILE LAYOUT -------------------------------------------------------------- */
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
|
||||
h1, h2, h3, h4, h5 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 1.25em;
|
||||
}
|
||||
|
||||
div.bodywrapper a.headerlink, #indices-and-tables h1 a {
|
||||
color: #e6e6e6;
|
||||
font-size: 80%;
|
||||
float: right;
|
||||
line-height: 1.8;
|
||||
position: absolute;
|
||||
right: -0.7em;
|
||||
visibility: inherit;
|
||||
}
|
||||
|
||||
div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-size: 0.7em;
|
||||
overflow: auto;
|
||||
word-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
div.related ul {
|
||||
height: 2.5em;
|
||||
padding: 0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.related ul li {
|
||||
clear: both;
|
||||
color: #465158;
|
||||
padding: 0.2em 0;
|
||||
}
|
||||
|
||||
div.related ul li:last-child {
|
||||
border-bottom: 1px dotted #8ca1af;
|
||||
padding-bottom: 0.4em;
|
||||
margin-bottom: 1em;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.related ul li a {
|
||||
color: #465158;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
div.related ul li a:hover {
|
||||
background: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
div.related ul li.right {
|
||||
clear: none;
|
||||
padding: 0.65em 0;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
div.related ul li.right a {
|
||||
color: #fff;
|
||||
padding-right: 0.8em;
|
||||
}
|
||||
|
||||
div.related ul li.right a:hover {
|
||||
background-color: #8ca1af;
|
||||
}
|
||||
|
||||
div.body {
|
||||
clear: both;
|
||||
min-width: 0;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0 0 0 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
float: none;
|
||||
margin: 0;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="text"] {
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="submit"] {
|
||||
height: 2em;
|
||||
margin-left: 0.5em;
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.searchtip {
|
||||
background: inherit;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul li, div.sphinxsidebar p.topless {
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.bodywrapper img {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: none;
|
||||
}
|
||||
|
||||
div.admonition, div.warning, pre, blockquote {
|
||||
margin-left: 0em;
|
||||
margin-right: 0em;
|
||||
}
|
||||
|
||||
.body p img {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#searchbox {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.related:not(:first-child) li {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.related:not(:first-child) li.right {
|
||||
display: block;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
padding: 1em;
|
||||
}
|
||||
|
||||
.rtd_doc_footer .badge {
|
||||
float: none;
|
||||
margin: 1em auto;
|
||||
position: static;
|
||||
}
|
||||
|
||||
.rtd_doc_footer .badge.revsys-inline {
|
||||
margin-right: auto;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
table.indextable {
|
||||
display: block;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.indextable tr {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.indextable td {
|
||||
display: block;
|
||||
padding: 0;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.indextable td dt {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
ul.search {
|
||||
margin-left: 0.25em;
|
||||
}
|
||||
|
||||
ul.search li div.context {
|
||||
font-size: 90%;
|
||||
line-height: 1.1;
|
||||
margin-bottom: 1;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
from os.path import dirname, join
|
||||
from rst import Rest, Paragraph, Strong, OrderedListItem, ListItem, Title, Link, Transition
|
||||
from rst import Directive, Em, Quote, Text
|
||||
from tiramisu.option import *
|
||||
from tiramisu.config import *
|
||||
#from makerestdoc import *
|
||||
|
||||
docdir = join(dirname(__file__), 'build')
|
||||
|
||||
def make_rst_file(filename, rstcontent):
|
||||
fh = file(filename, 'w')
|
||||
fh.write(rstcontent.text())
|
||||
fh.close()
|
||||
|
||||
def descr_content(path, prefix, descr, root=False):
|
||||
content = Rest()
|
||||
title = Title(abovechar="", belowchar="=")
|
||||
if root:
|
||||
title.join(Text("Configuration's overview for: "), Quote(descr._name))
|
||||
else:
|
||||
title.join(Text("Group's overview for: "), Quote(descr._name))
|
||||
content.add(title)
|
||||
content.add(ListItem().join(Strong("name:"), Text(descr._name)))
|
||||
if not root:
|
||||
content.add(ListItem().join(Strong("path:"), Text(path)))
|
||||
content.add(ListItem().join(Strong("description:"), Text(descr.doc)))
|
||||
if not root:
|
||||
content.add(ListItem().join(Strong("container:"), Text(prefix)))
|
||||
if not root:
|
||||
content.add(ListItem().join(Strong("type:"), Text(descr.group_type)))
|
||||
if not root:
|
||||
content.add(ListItem().join(Strong("requirements:"), Text(str(descr._requires))))
|
||||
content.add(ListItem().join(Strong("is hidden:"), Text(str(descr._is_hidden()))))
|
||||
content.add(ListItem().join(Strong("is disabled:"), Text(str(descr._is_disabled()))))
|
||||
content.add(Transition())
|
||||
content.add(Title(abovechar="", belowchar="-").join(Text("Ordered list of childrens for:"), Text(path)))
|
||||
for opt in descr._children:
|
||||
name = opt._name
|
||||
link = Link(name + ":", join(path + '.' + name + ".html"))
|
||||
# because of SympLink opt
|
||||
if hasattr(opt, 'doc'):
|
||||
doc = opt.doc
|
||||
else:
|
||||
doc = name
|
||||
content.add(OrderedListItem(link, Text(opt.doc)))
|
||||
content.add(Transition())
|
||||
content.add(Paragraph(Link("back to index", "index.html")))
|
||||
make_rst_file(join(docdir, path + '.txt'), content)
|
||||
if root:
|
||||
make_rst_file(join(docdir, 'index.txt'), content)
|
||||
|
||||
def opt_rst_content(path, prefix, descr, value):
|
||||
content = Rest()
|
||||
title = Title(abovechar="", belowchar="=")
|
||||
title.join(Text("Configuration's option overview for: "), Quote(descr._name))
|
||||
content.add(title)
|
||||
content.add(ListItem().join(Strong("name:"), Text(descr._name)))
|
||||
content.add(ListItem().join(Strong("value:"), Text(str(value))))
|
||||
content.add(ListItem().join(Strong("path:"), Text(path)))
|
||||
content.add(ListItem().join(Strong("container:"), Text(prefix)))
|
||||
if isinstance(descr, ChoiceOption):
|
||||
content.add(ListItem().join(Strong("possible values:"), Text(str(descr.values))))
|
||||
if not isinstance(descr, SymLinkOption):
|
||||
content.add(ListItem().join(Strong("type:"), Text(str(descr.opt_type))))
|
||||
content.add(ListItem().join(Strong("default:"), Text(str(descr.getdefault()))))
|
||||
content.add(ListItem().join(Strong("description:"), Text(str(descr.getdoc()))))
|
||||
content.add(ListItem().join(Strong("requirements:"), Text(str(descr._requires))))
|
||||
content.add(ListItem().join(Strong("is hidden:"), Text(str(descr._is_hidden()))))
|
||||
content.add(ListItem().join(Strong("is disabled:"), Text(str(descr._is_disabled()))))
|
||||
content.add(ListItem().join(Strong("is frozen:"), Text(str(descr._frozen))))
|
||||
content.add(ListItem().join(Strong("is multi:"), Text(str(descr.multi))))
|
||||
content.add(ListItem().join(Strong("is mandatory:"), Text(str(descr.is_mandatory()))))
|
||||
else:
|
||||
content.add(ListItem().join(Strong("links to:"), Text(str(descr.path))))
|
||||
content.add(Transition())
|
||||
content.add(Paragraph(Link("back to container", join(prefix + ".html"))))
|
||||
make_rst_file(join(docdir, path + '.txt'), content)
|
||||
|
||||
def make_rest_overview(cfg, title=True):
|
||||
rootname = cfg._cfgimpl_descr._name
|
||||
descr_content(rootname, rootname, cfg._cfgimpl_descr, root=True)
|
||||
#cfg.cfgimpl_read_write()
|
||||
cfg._cfgimpl_disabled = False
|
||||
cfg._cfgimpl_hidden = False
|
||||
for path in cfg.getpaths(include_groups=True, allpaths=True):
|
||||
child = cfg.unwrap_from_path(path)
|
||||
fullpath = rootname + '.' + path
|
||||
prefix = fullpath.rsplit(".", 1)[0]
|
||||
if isinstance(child, OptionDescription):
|
||||
descr_content(fullpath, prefix, child)
|
||||
else:
|
||||
value = getattr(cfg, path)
|
||||
opt_rst_content(fullpath, prefix, child, value)
|
||||
|
||||
if __name__ == '__main__':
|
||||
from test_config_big_example import get_example_config
|
||||
make_rest_overview(get_example_config())
|
||||
# ____________________________________________________________
|
||||
|
@ -1,115 +0,0 @@
|
||||
from tiramisu.config import Config
|
||||
from tiramisu import option
|
||||
# we shall keep extendable types out of the reach of unexceptional guys like us
|
||||
# horror __metaclass__ = extendabletype
|
||||
|
||||
def get_fullpath(opt, path):
|
||||
if path:
|
||||
return "%s.%s" % (path, opt._name)
|
||||
else:
|
||||
return opt._name
|
||||
|
||||
class Option:
|
||||
def make_rest_doc(self, path=""):
|
||||
fullpath = get_fullpath(self, path)
|
||||
result = Rest(
|
||||
Title(fullpath, abovechar="=", belowchar="="),
|
||||
ListItem(Strong("name:"), self._name),
|
||||
ListItem(Strong("description:"), self.doc))
|
||||
return result
|
||||
|
||||
class ChoiceOption(Option, option.ChoiceOption):
|
||||
def make_rest_doc(self, path=""):
|
||||
content = super(ChoiceOption, self).make_rest_doc(path)
|
||||
content.add(ListItem(Strong("option type:"), "choice option"))
|
||||
content.add(ListItem(Strong("possible values:"),
|
||||
*[ListItem(str(val)) for val in self.values]))
|
||||
if self.default is not None:
|
||||
content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
|
||||
# requirements = []
|
||||
#
|
||||
# for val in self.values:
|
||||
# if val not in self._requires:
|
||||
# continue
|
||||
# req = self._requires[val]
|
||||
# requirements.append(ListItem("value '%s' requires:" % (val, ),
|
||||
# *[ListItem(Link(opt, opt + ".html"),
|
||||
# "to be set to '%s'" % (rval, ))
|
||||
# for (opt, rval) in req]))
|
||||
# if requirements:
|
||||
# content.add(ListItem(Strong("requirements:"), *requirements))
|
||||
return content
|
||||
|
||||
class BoolOption(Option, option.BoolOption):
|
||||
def make_rest_doc(self, path=""):
|
||||
content = super(BoolOption, self).make_rest_doc(path)
|
||||
fullpath = get_fullpath(self, path)
|
||||
content.add(ListItem(Strong("option type:"), "boolean option"))
|
||||
if self.default is not None:
|
||||
content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
# if self._requires is not None:
|
||||
# requirements = [ListItem(Link(opt, opt + ".html"),
|
||||
# "must be set to '%s'" % (rval, ))
|
||||
# for (opt, rval) in self._requires]
|
||||
# if requirements:
|
||||
# content.add(ListItem(Strong("requirements:"), *requirements))
|
||||
return content
|
||||
|
||||
class IntOption(Option, option.IntOption):
|
||||
def make_rest_doc(self, path=""):
|
||||
content = super(IntOption, self).make_rest_doc(path)
|
||||
content.add(ListItem(Strong("option type:"), "integer option"))
|
||||
if self.default is not None:
|
||||
content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
return content
|
||||
|
||||
class FloatOption(Option, option.FloatOption):
|
||||
def make_rest_doc(self, path=""):
|
||||
content = super(FloatOption, self).make_rest_doc(path)
|
||||
content.add(ListItem(Strong("option type:"), "float option"))
|
||||
if self.default is not None:
|
||||
content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
return content
|
||||
|
||||
class StrOption(Option, option.StrOption):
|
||||
def make_rest_doc(self, path=""):
|
||||
content = super(StrOption, self).make_rest_doc(path)
|
||||
content.add(ListItem(Strong("option type:"), "string option"))
|
||||
if self.default is not None:
|
||||
content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
return content
|
||||
|
||||
#class ArbitraryOption:
|
||||
# def make_rest_doc(self, path=""):
|
||||
# content = super(ArbitraryOption, self).make_rest_doc(path)
|
||||
# content.add(ListItem(Strong("option type:"),
|
||||
# "arbitrary option (mostly internal)"))
|
||||
# if self.default is not None:
|
||||
# content.add(ListItem(Strong("default:"), str(self.default)))
|
||||
# elif self.defaultfactory is not None:
|
||||
# content.add(ListItem(Strong("factory for the default value:"),
|
||||
# str(self.defaultfactory)))
|
||||
# return content
|
||||
|
||||
class OptionDescription(option.OptionDescription):
|
||||
def make_rest_doc(self, path=""):
|
||||
fullpath = get_fullpath(self, path)
|
||||
content = Rest(
|
||||
Title(fullpath, abovechar="=", belowchar="="))
|
||||
toctree = []
|
||||
for child in self._children:
|
||||
subpath = fullpath + "." + child._name
|
||||
toctree.append(subpath)
|
||||
content.add(Directive("toctree", *toctree, **{'maxdepth': 4}))
|
||||
content.join(
|
||||
ListItem(Strong("name:"), self._name),
|
||||
ListItem(Strong("description:"), self.doc))
|
||||
stack = []
|
||||
curr = content
|
||||
# config = Config(self)
|
||||
return content
|
||||
|
||||
# ____________________________________________________________
|
||||
|
||||
|
410
report/rst.py
410
report/rst.py
@ -1,410 +0,0 @@
|
||||
# unproudly borrowed from pypy :
|
||||
# http://codespeak.net/svn/pypy/trunk/pypy/tool/rest/rst.py
|
||||
""" reStructuredText generation tools
|
||||
|
||||
provides an api to build a tree from nodes, which can be converted to
|
||||
ReStructuredText on demand
|
||||
|
||||
note that not all of ReST is supported, a usable subset is offered, but
|
||||
certain features aren't supported, and also certain details (like how links
|
||||
are generated, or how escaping is done) can not be controlled
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def escape(txt):
|
||||
"""escape ReST markup"""
|
||||
if not isinstance(txt, str) and not isinstance(txt, unicode):
|
||||
txt = str(txt)
|
||||
# XXX this takes a very naive approach to escaping, but it seems to be
|
||||
# sufficient...
|
||||
for c in '\\*`|:_':
|
||||
txt = txt.replace(c, '\\%s' % (c,))
|
||||
return txt
|
||||
|
||||
class RestError(Exception):
|
||||
""" raised on containment errors (wrong parent) """
|
||||
|
||||
class AbstractMetaclass(type):
|
||||
def __new__(cls, *args):
|
||||
obj = super(AbstractMetaclass, cls).__new__(cls, *args)
|
||||
parent_cls = obj.parentclass
|
||||
if parent_cls is None:
|
||||
return obj
|
||||
if not isinstance(parent_cls, list):
|
||||
class_list = [parent_cls]
|
||||
else:
|
||||
class_list = parent_cls
|
||||
if obj.allow_nesting:
|
||||
class_list.append(obj)
|
||||
|
||||
for _class in class_list:
|
||||
if not _class.allowed_child:
|
||||
_class.allowed_child = {obj:True}
|
||||
else:
|
||||
_class.allowed_child[obj] = True
|
||||
return obj
|
||||
|
||||
class AbstractNode(object):
|
||||
""" Base class implementing rest generation
|
||||
"""
|
||||
sep = ''
|
||||
__metaclass__ = AbstractMetaclass
|
||||
parentclass = None # this exists to allow parent to know what
|
||||
# children can exist
|
||||
allow_nesting = False
|
||||
allowed_child = {}
|
||||
defaults = {}
|
||||
|
||||
_reg_whitespace = re.compile('\s+')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.parent = None
|
||||
self.children = []
|
||||
for child in args:
|
||||
self._add(child)
|
||||
for arg in kwargs:
|
||||
setattr(self, arg, kwargs[arg])
|
||||
|
||||
def join(self, *children):
|
||||
""" add child nodes
|
||||
|
||||
returns a reference to self
|
||||
"""
|
||||
for child in children:
|
||||
self._add(child)
|
||||
return self
|
||||
|
||||
def add(self, child):
|
||||
""" adds a child node
|
||||
|
||||
returns a reference to the child
|
||||
"""
|
||||
self._add(child)
|
||||
return child
|
||||
|
||||
def _add(self, child):
|
||||
if child.__class__ not in self.allowed_child:
|
||||
raise RestError("%r cannot be child of %r" % \
|
||||
(child.__class__, self.__class__))
|
||||
self.children.append(child)
|
||||
child.parent = self
|
||||
|
||||
def __getitem__(self, item):
|
||||
return self.children[item]
|
||||
|
||||
def __setitem__(self, item, value):
|
||||
self.children[item] = value
|
||||
|
||||
def text(self):
|
||||
""" return a ReST string representation of the node """
|
||||
return self.sep.join([child.text() for child in self.children])
|
||||
|
||||
def wordlist(self):
|
||||
""" return a list of ReST strings for this node and its children """
|
||||
return [self.text()]
|
||||
|
||||
class Rest(AbstractNode):
|
||||
""" Root node of a document """
|
||||
|
||||
sep = "\n\n"
|
||||
def __init__(self, *args, **kwargs):
|
||||
AbstractNode.__init__(self, *args, **kwargs)
|
||||
self.links = {}
|
||||
|
||||
def render_links(self, check=False):
|
||||
"""render the link attachments of the document"""
|
||||
assert not check, "Link checking not implemented"
|
||||
if not self.links:
|
||||
return ""
|
||||
link_texts = []
|
||||
# XXX this could check for duplicates and remove them...
|
||||
for link, target in self.links.iteritems():
|
||||
link_texts.append(".. _`%s`: %s" % (escape(link), target))
|
||||
return "\n" + "\n".join(link_texts) + "\n\n"
|
||||
|
||||
def text(self):
|
||||
outcome = []
|
||||
if (isinstance(self.children[0], Transition) or
|
||||
isinstance(self.children[-1], Transition)):
|
||||
raise ValueError, ('document must not begin or end with a '
|
||||
'transition')
|
||||
for child in self.children:
|
||||
outcome.append(child.text())
|
||||
|
||||
# always a trailing newline
|
||||
text = self.sep.join([i for i in outcome if i]) + "\n"
|
||||
return text + self.render_links()
|
||||
|
||||
class Transition(AbstractNode):
|
||||
""" a horizontal line """
|
||||
parentclass = Rest
|
||||
|
||||
def __init__(self, char='-', width=80, *args, **kwargs):
|
||||
self.char = char
|
||||
self.width = width
|
||||
super(Transition, self).__init__(*args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
return (self.width - 1) * self.char
|
||||
|
||||
class Paragraph(AbstractNode):
|
||||
""" simple paragraph """
|
||||
|
||||
parentclass = Rest
|
||||
sep = " "
|
||||
indent = ""
|
||||
# FIXME
|
||||
width = 880
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
# make shortcut
|
||||
args = list(args)
|
||||
for num, arg in enumerate(args):
|
||||
if isinstance(arg, str):
|
||||
args[num] = Text(arg)
|
||||
super(Paragraph, self).__init__(*args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
texts = []
|
||||
for child in self.children:
|
||||
texts += child.wordlist()
|
||||
|
||||
buf = []
|
||||
outcome = []
|
||||
lgt = len(self.indent)
|
||||
|
||||
def grab(buf):
|
||||
outcome.append(self.indent + self.sep.join(buf))
|
||||
|
||||
texts.reverse()
|
||||
while texts:
|
||||
next = texts[-1]
|
||||
if not next:
|
||||
texts.pop()
|
||||
continue
|
||||
if lgt + len(self.sep) + len(next) <= self.width or not buf:
|
||||
buf.append(next)
|
||||
lgt += len(next) + len(self.sep)
|
||||
texts.pop()
|
||||
else:
|
||||
grab(buf)
|
||||
lgt = len(self.indent)
|
||||
buf = []
|
||||
grab(buf)
|
||||
return "\n".join(outcome)
|
||||
|
||||
class SubParagraph(Paragraph):
|
||||
""" indented sub paragraph """
|
||||
|
||||
indent = " "
|
||||
|
||||
class Title(Paragraph):
|
||||
""" title element """
|
||||
|
||||
parentclass = Rest
|
||||
belowchar = "="
|
||||
abovechar = ""
|
||||
|
||||
def text(self):
|
||||
txt = self._get_text()
|
||||
lines = []
|
||||
if self.abovechar:
|
||||
lines.append(self.abovechar * len(txt))
|
||||
lines.append(txt)
|
||||
if self.belowchar:
|
||||
lines.append(self.belowchar * len(txt))
|
||||
return "\n".join(lines)
|
||||
|
||||
def _get_text(self):
|
||||
txt = []
|
||||
for node in self.children:
|
||||
txt += node.wordlist()
|
||||
return ' '.join(txt)
|
||||
|
||||
class AbstractText(AbstractNode):
|
||||
parentclass = [Paragraph, Title]
|
||||
start = ""
|
||||
end = ""
|
||||
def __init__(self, _text):
|
||||
self._text = _text
|
||||
|
||||
def text(self):
|
||||
text = self.escape(self._text)
|
||||
return self.start + text + self.end
|
||||
|
||||
def escape(self, text):
|
||||
if not isinstance(text, str) and not isinstance(text, unicode):
|
||||
text = str(text)
|
||||
if self.start:
|
||||
text = text.replace(self.start, '\\%s' % (self.start,))
|
||||
if self.end and self.end != self.start:
|
||||
text = text.replace(self.end, '\\%s' % (self.end,))
|
||||
return text
|
||||
|
||||
class Text(AbstractText):
|
||||
def wordlist(self):
|
||||
text = escape(self._text)
|
||||
return self._reg_whitespace.split(text)
|
||||
|
||||
class LiteralBlock(AbstractText):
|
||||
parentclass = Rest
|
||||
start = '::\n\n'
|
||||
|
||||
def text(self):
|
||||
if not self._text.strip():
|
||||
return ''
|
||||
text = self.escape(self._text).split('\n')
|
||||
for i, line in enumerate(text):
|
||||
if line.strip():
|
||||
text[i] = ' %s' % (line,)
|
||||
return self.start + '\n'.join(text)
|
||||
|
||||
class Em(AbstractText):
|
||||
start = "*"
|
||||
end = "*"
|
||||
|
||||
class Strong(AbstractText):
|
||||
start = "**"
|
||||
end = "**"
|
||||
|
||||
class Quote(AbstractText):
|
||||
start = '``'
|
||||
end = '``'
|
||||
|
||||
class Anchor(AbstractText):
|
||||
start = '_`'
|
||||
end = '`'
|
||||
|
||||
class Footnote(AbstractText):
|
||||
def __init__(self, note, symbol=False):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class Citation(AbstractText):
|
||||
def __init__(self, text, cite):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class ListItem(Paragraph):
|
||||
allow_nesting = True
|
||||
item_chars = '*+-'
|
||||
|
||||
def text(self):
|
||||
idepth = self.get_indent_depth()
|
||||
indent = self.indent + (idepth + 1) * ' '
|
||||
txt = '\n\n'.join(self.render_children(indent))
|
||||
ret = []
|
||||
item_char = self.item_chars[idepth]
|
||||
ret += [indent[len(item_char)+1:], item_char, ' ', txt[len(indent):]]
|
||||
return ''.join(ret)
|
||||
|
||||
def render_children(self, indent):
|
||||
txt = []
|
||||
buffer = []
|
||||
def render_buffer(fro, to):
|
||||
if not fro:
|
||||
return
|
||||
p = Paragraph(indent=indent, *fro)
|
||||
p.parent = self.parent
|
||||
to.append(p.text())
|
||||
for child in self.children:
|
||||
if isinstance(child, AbstractText):
|
||||
buffer.append(child)
|
||||
else:
|
||||
if buffer:
|
||||
render_buffer(buffer, txt)
|
||||
buffer = []
|
||||
txt.append(child.text())
|
||||
|
||||
render_buffer(buffer, txt)
|
||||
return txt
|
||||
|
||||
def get_indent_depth(self):
|
||||
depth = 0
|
||||
current = self
|
||||
while (current.parent is not None and
|
||||
isinstance(current.parent, ListItem)):
|
||||
depth += 1
|
||||
current = current.parent
|
||||
return depth
|
||||
|
||||
class OrderedListItem(ListItem):
|
||||
item_chars = ["#."] * 5
|
||||
|
||||
class DListItem(ListItem):
|
||||
item_chars = None
|
||||
def __init__(self, term, definition, *args, **kwargs):
|
||||
self.term = term
|
||||
super(DListItem, self).__init__(definition, *args, **kwargs)
|
||||
|
||||
def text(self):
|
||||
idepth = self.get_indent_depth()
|
||||
indent = self.indent + (idepth + 1) * ' '
|
||||
txt = '\n\n'.join(self.render_children(indent))
|
||||
ret = []
|
||||
ret += [indent[2:], self.term, '\n', txt]
|
||||
return ''.join(ret)
|
||||
|
||||
class Link(AbstractText):
|
||||
start = '`'
|
||||
end = '`_'
|
||||
|
||||
def __init__(self, _text, target):
|
||||
self._text = _text
|
||||
self.target = target
|
||||
self.rest = None
|
||||
|
||||
def text(self):
|
||||
if self.rest is None:
|
||||
self.rest = self.find_rest()
|
||||
if self.rest.links.get(self._text, self.target) != self.target:
|
||||
raise ValueError('link name %r already in use for a different '
|
||||
'target' % (self.target,))
|
||||
self.rest.links[self._text] = self.target
|
||||
return AbstractText.text(self)
|
||||
|
||||
def find_rest(self):
|
||||
# XXX little overkill, but who cares...
|
||||
next = self
|
||||
while next.parent is not None:
|
||||
next = next.parent
|
||||
return next
|
||||
|
||||
class InternalLink(AbstractText):
|
||||
start = '`'
|
||||
end = '`_'
|
||||
|
||||
class LinkTarget(Paragraph):
|
||||
def __init__(self, name, target):
|
||||
self.name = name
|
||||
self.target = target
|
||||
|
||||
def text(self):
|
||||
return ".. _`%s`:%s\n" % (self.name, self.target)
|
||||
|
||||
class Substitution(AbstractText):
|
||||
def __init__(self, text, **kwargs):
|
||||
raise NotImplemented('XXX')
|
||||
|
||||
class Directive(Paragraph):
|
||||
indent = ' '
|
||||
def __init__(self, name, *args, **options):
|
||||
self.name = name
|
||||
self.content = args
|
||||
super(Directive, self).__init__()
|
||||
self.options = options
|
||||
|
||||
def text(self):
|
||||
# XXX not very pretty...
|
||||
txt = '.. %s::' % (self.name,)
|
||||
options = '\n'.join([' :%s: %s' % (k, v) for (k, v) in
|
||||
self.options.iteritems()])
|
||||
if options:
|
||||
txt += '\n%s' % (options,)
|
||||
|
||||
if self.content:
|
||||
txt += '\n'
|
||||
for item in self.content:
|
||||
txt += '\n ' + item
|
||||
|
||||
return txt
|
||||
|
@ -1,27 +0,0 @@
|
||||
# coding: utf-8
|
||||
from tiramisu.config import *
|
||||
from tiramisu.option import *
|
||||
|
||||
all_modules = ['amon', 'sphynx', 'zephir']
|
||||
|
||||
gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
|
||||
gcdummy = BoolOption('dummy', 'dummy', default=False)
|
||||
objspaceoption = ChoiceOption('objspace', 'Object space',
|
||||
['std', 'thunk'], 'std')
|
||||
booloption = BoolOption('bool', 'Test boolean option', default=True)
|
||||
intoption = IntOption('int', 'Test int option', default=0)
|
||||
floatoption = FloatOption('float', 'Test float option', default=2.3)
|
||||
stroption = StrOption('str', 'Test string option', default="abc")
|
||||
boolop = BoolOption('boolop', 'Test boolean option op', default=True)
|
||||
wantref_option = BoolOption('wantref', 'Test requires', default=False)
|
||||
wantframework_option = BoolOption('wantframework', 'Test requires',
|
||||
default=False)
|
||||
|
||||
gcgroup = OptionDescription('gc', 'doc pour gc', [gcoption, gcdummy, floatoption])
|
||||
descr = OptionDescription('essai', 'une éééééé doc pour essai', [gcgroup, booloption, objspaceoption,
|
||||
wantref_option, stroption,
|
||||
wantframework_option,
|
||||
intoption, boolop])
|
||||
|
||||
def get_example_config():
|
||||
return Config(descr)
|
Reference in New Issue
Block a user