Commits

Juha Mustonen committed 13f2201

Added includesh extension

Comments (0)

Files changed (35)

 - googlechart: embed charts by using Google Chart_
 - httpdomain: a domain for documenting RESTful HTTP APIs.
 - hyphenator: client-side hyphenation of HTML using hyphenator_
+- includesh: include shell scripts into documentation using includesh_
 - issuetracker: link to different issue trackers
 - lilypond: an extension inserting music scripts from Lilypond_ in PNG format.
 - mscgen: embed mscgen-formatted MSC (Message Sequence Chart)s.
 
 .. _exceltable: http://packages.python.org/sphinxcontrib-exceltable/
 
+.. _includesh: http://packages.python.org/sphinxcontrib-includesh/
+
 .. _YouTube: http://www.youtube.com/
 
 For contributors

includesh/CHANGES

+Release 0.1.0 (2011-10-27)
+--------------------------
+Initial release, under the name: :mod:`sphinxcontrib.includesh`. Initially the extension was introduced as a part of
+Rusty_
+
+.. :mode=rest:

includesh/LICENSE

+The MIT License
+
+Copyright (c) 2009 Juha Mustonen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+

includesh/MANIFEST.in

+include README
+include LICENSE
+include CHANGES.*
+Module ``sphinxcontrib.includesh`` is an extension for Sphinx_, that adds support for including shell scripts into
+documentation: 
+
+- Shell commands are turned into code-blocks, using bash highlight
+- Comments are turned into ReStructuredText blocks, allowing to use it's formatting rules.
+
+Example
+=======
+
+Shell scripts: install.sh::
+
+  #!/bin/bash
+
+  # Install required packages
+  sudo apt-get install python python-dev python-pip
+
+  # Install required python modules
+  #
+  # - Sphinx: Documentation 
+  # - sphinxcontrib-includesh: Extension
+  #
+  sudo pip install Sphinx sphinxcontrib-includesh
+
+Document: document.rst::
+
+  Installation
+  ============
+  Run following steps to install the software:
+
+  .. includesh:: install.sh
+
+Output: after processing::
+
+  Installation
+  ============
+  Run following steps to install the software:
+
+  Install required packages
+
+  .. code-block:: bash
+
+    sudo apt-get install python python-dev python-pip
+
+  Install required python modules
+  
+  - Sphinx: Documentation 
+  - sphinxcontrib-includesh: Extension
+ 
+  .. code-block:: bash
+ 
+    sudo pip install Sphinx sphinxcontrib-includesh
+  
+
+Resources
+=========
+
+- Documentation: http://packages.pypi.python.org/sphinxcontrib.exceltable
+- Bugs: http://bitbucket.org/birkenfeld/sphinx-contrib/
+
+
+.. _Sphinx: http://sphinx.pocoo.org/

includesh/doc/changelog.rst

+.. _changelog:
+
+.. _changes:
+
+Changelog
+=========
+This sections lists the notable changes done per release.
+
+.. contents::
+   :local:
+
+.. include:: ../CHANGES

includesh/doc/conf.py

+# -*- coding: utf-8 -*-
+#
+# rusty documentation build configuration file, created by
+# sphinx-quickstart on Tue Nov 11 18:08:47 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+import sphinx
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# General configuration
+# ---------------------
+
+#sys.path = [os.path.dirname(__file__)] + sys.path
+sys.path.append(os.path.abspath('..'))
+from sphinxcontrib import includesh
+
+# 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.doctest',
+  'sphinx.ext.todo',
+  'sphinxcontrib.includesh',
+]
+
+if sphinx.__version__.startswith('1.0'):
+  extensions.append('sphinx.ext.extlinks')
+  extlinks = {'issue': ('http://bitbucket.org/jmu/sphinxcontrib/issue/', 'issue ')}
+
+# Add pdfbuilder if rst2pdf is available
+try:
+  from rst2pdf import pdfbuilder
+  extensions.append('rst2pdf.pdfbuilder')
+
+  pdf_documents = [
+    ('index', 'sphinxcontrib.includesh.alt', u'Sphinx-contrib Includesh documentation',
+     u'Juha Mustonen'),
+  ]
+  pdf_stylesheets = ['sphinx', 'kerning']
+  pdf_break_level = 1
+except ImportError:
+  pass
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['static', '.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Includesh'
+copyright = u'2008-2011, %s' % includesh.__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 = includesh.__version__
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = ['example']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+highlight_language = 'bash'
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# Control whether todo lists are generated
+todo_include_todos = True
+
+rst_epilog = """
+.. |sphinx| replace:: Sphinx documentation framework
+.. include:: global.rst
+"""
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'rusty.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# 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 = 'static/includesh.png'
+
+# The name of an image file (within the static path) to use as 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']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# 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_use_modindex = 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, the reST sources are included in the HTML build as _sources/<name>.
+html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'rusty'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+latex_paper_size = 'a4'
+
+# The font size ('10pt', '11pt' or '12pt').
+latex_font_size = '12pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('index', 'rusty.tex', ur'Rusty documentation',
+   ur'Juha Mustonen', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+latex_logo = 'static/rusty_big.png'
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+latex_preamble = '''
+'''
+
+latex_elements = {
+  'fncychap': '\\usepackage[Bjarne]{fncychap}',
+  'fontpkg': '\\usepackage{palatino}'
+}
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+latex_use_modindex = False
+
+
+def setup(app):
+  app.add_description_unit('confval', 'confval', 'pair: %s; configuration value')
+  app.add_description_unit('bug', 'bug', 'pair: %s; bug')
+  app.add_description_unit('task', 'task', 'pair: %s; task')
+  app.add_description_unit('issue', 'issue', 'pair: %s; issue')

includesh/doc/devel.rst

+.. _devel:
+
+===========
+Development
+===========
+This section contains some information about module development - in a case you want to contribute to it.
+Which is welcome, btw.
+
+.. contents::
+   :local:
+
+.. index:: Building
+
+Building
+========
+Project uses distribute Since the package already
+contains the dependencies to Paver, the basic building can be done as follows::
+
+     python setup.py bdist_egg sdist sphinx_build
+
+.. index:: Testing
+
+.. _testing:
+
+Testing
+=======
+Project uses `nose`_ for unit testing, `coverage`_ for testing coverage reporting and `tox`_
+for compliance testing. To execute the tests, run:
+
+- Unittests: ``python setup.py test``
+- Compliance: ``tox``
+
+Project repository comes with ready-made configuration for both of the tools, which are used
+automatically.
+
+
+API
+====
+This section provides some further information about internals of the module:
+
+.. automodule:: sphinxcontrib.includesh
+
+.. autoclass:: sphinxcontrib.includesh.IncludeShellDirective
+
+.. autoclass:: sphinxcontrib.includesh.ShellConverter
+   :members:
+
+
+Licensing
+=========
+The software is licensed with liberal MIT license, making it suitable for both
+commercial and open source usage:
+
+    .. include:: ../LICENSE
+

includesh/doc/example/animals.xml

+<zoo>
+  <animal id="L353">
+    <name>Leo</name>
+    <species>Lion</species>
+  </animal>
+  <animal id="C665">
+    <name>Carl</name>
+    <species>Camel</species>
+  </animal>
+</zoo>

includesh/doc/example/app.conf

+#!/bin/sh
+## Application configuration file,
+## should be placed to /etc/app.conf
+
+# <changethese>
+
+# IP address to listen. If the value is ``0:0:0:0``, it 
+# binds itself to all addresses
+LISTEN_IP="0:0:0:0"
+
+# Port to listen to. The default is ``8080``
+LISTEN_PORT=8080
+
+# </changethese>
+
+## You should never need to change the configuration 
+## parameters listed below
+
+IMPL_CLASS="package.FooClass"
+
+

includesh/doc/example/app.sql

+SELECT * FROM BAR;
+
+-- TABLE: products start
+CREATE TABLE products (
+  id int(11) NOT NULL AUTO_INCREMENT,
+  ProductName varchar(40) NOT NULL,
+  SupplierID int(11) DEFAULT NULL,
+  CategoryID int(11) DEFAULT NULL,
+  QuantityPerUnit varchar(20) DEFAULT NULL,
+  UnitPrice decimal(19,4) DEFAULT NULL,
+  UnitsInStock smallint(6) DEFAULT NULL,
+  UnitsOnOrder smallint(6) DEFAULT NULL,
+  ReorderLevel smallint(6) DEFAULT NULL,
+  Discontinued tinyint(4) NOT NULL,
+  availableOnline bit(1) DEFAULT NULL,
+  PRIMARY KEY (ProductID)
+);
+-- TABLE: products end
+
+SELECT * FROM BAR;
+
+-- Create table if it does not exist already
+CREATE TABLE IF NOT EXISTS t1 (c1 CHAR(10)) SELECT 1, 2;
+
+
+-- Property table
+CREATE TABLE property (
+  id int(11) NOT NULL AUTO_INCREMENT,
+  -- Name of the property, e.g. 'color'
+  name varchar(40) NOT NULL,
+  -- Value of the property, e.g. 'red'
+  value varchar(140) NOT NULL,
+  PRIMARY KEY (id)
+);
+
+
+CREATE DATABASE hum;
+
+-- Property table
+CREATE TABLE bar (
+  id int(101) NOT NULL AUTO_INCREMENT,
+  value varchar(10) NOT NULL,
+  PRIMARY KEY (id)
+);
+
+CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL,
+  PRIMARY KEY(category, id)) ENGINE=INNODB;
+
+CREATE TABLE customer (id INT NOT NULL,
+                       PRIMARY KEY (id)) ENGINE=INNODB;
+
+CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
+                            product_category INT NOT NULL,
+                            product_id INT NOT NULL,
+                            customer_id INT NOT NULL,
+                            PRIMARY KEY(no),
+                            INDEX (product_category, product_id),
+                            FOREIGN KEY (product_category, product_id)
+                              REFERENCES product(category, id)
+                              ON UPDATE CASCADE ON DELETE RESTRICT,
+                            INDEX (customer_id),
+                            FOREIGN KEY (customer_id)
+                              REFERENCES customer(id)) ENGINE=INNODB;
+

includesh/doc/example/cartoons.xls

Binary file added.

includesh/doc/example/document.rst

+Installation of the application can be completed by running
+shell script named ``setup.sh``::
+
+  chmod +x setup.sh
+  ./setup.sh
+
+Alternatively, you can run each command manually:
+
+.. includesh:: setup.sh
+
+
+And you're down with installation. Next phase is to change
+the configuration::
+
+1. Place the initial configuration in ``/etc/app.conf``
+2. Open the config in editor and change as needed::
+  
+     vim /etc/app.conf
+     
+     
+   .. includesh:: app.conf
+      :start-after: <changethese>
+      :end-before:  </changethese>
+      
+      
+3. After finished, start the service::
+  
+     /etc/init.d/app start
+    
+

includesh/doc/example/document.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<countries>
+  <country id="finland">
+    <name>Finland</name>
+    <time>UTC+2</time>
+    <currency>euro</currency>
+  </country>
+  <country id="england">
+    <name>England</name>
+    <currency>pound</currency>
+    <time>UTC</time>
+  </country>
+</countries>

includesh/doc/example/memo.rst

+
+**Meeting minutes**
+
+:author: Alan Author
+:date: 2008-04-21
+
+.. IMPORTANT:: Action points
+
+    .. regxlist:: (AP|-->)+\s+(to)*\s*(?P<name>(\w|\s)+):\s*(?P<desc>(\w|\n|\s)*) 
+       :template: ${name}: ${desc}
+       :siblings:
+       :levelsup: 2
+  
+- Software building process is still hard, AP Sarah: improve building process
+- AP to Tom: document the building process
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean risus mauris, 
+  ultrices id, pretium sed, lobortis in, nisl. Nunc tincidunt neque vel libero 
+  hendrerit malesuada.
+- Pellentesque dolor augue, dapibus dictum, elementum quis, tincidunt consectetur, 
+  nunc. Sed vulputate dolor ut sem. In varius rutrum odio.   
+- Release needs to be ready for monday --> Sarah: create official release
+- Nunc sit amet neque sed lorem condimentum interdum. In hac habitasse platea dictumst. 
+  Vivamus vel libero eget lectus ultrices vestibulum.
+- Blah blah...

includesh/doc/example/regxlist.rst

+
+This is an example document that uses the ``regxlist`` directive. One of the 
+most obvious use cases is the release notes and generating the list of bug
+fixes.
+ 
+**Release X**
+
+Features:
+
+  .. regxlist:: Added:\s*(.*)
+     :siblings:
+     :levelsup: 2
+     :template: FEAT: ${0}
+
+Bug fixes:
+
+  .. regxlist:: Fixed (#\d+)(:\s*)(?P<desc>.*)
+     :siblings:
+     :levelsup: 2
+     :template: BUG: ${desc} (${0})
+   
+
+All changes:
+
+  - Fixed #2345: Crash while loading invalid document
+  - Fixed #3454: Configuration parameter is missing
+  - Added: Support for Vista
+  - Changed default configuration parameter for ``show_version`` to ``False`` 
+

includesh/doc/example/setup.sh

+#!/bin/sh
+##=============================================      
+## This is a application installation
+## script. The comments are formated using RST
+##=============================================
+# Installation consists from three phases:
+#
+# 1. Downloading files
+# 2. Installation
+# 3. Configuration
+#
+# Create temp directory
+CDATE=$(date +%Y-%m-%d)
+mkdir -P /tmp/$CDATE
+
+# .. _clear_temp:
+#
+# In case of existing files, delete the temporary files first
+rm -rf /tmp/$CDATA
+
+# Download the package and locate it to ``temp`` directory.
+# Finally, extract the package.
+cd /tmp/$CDATE
+wget http://server.com/downloads/package.tar.gz
+tar -xzf package.tar.gz
+
+# .. IMPORTANT::
+#
+#    In case of upgrade, :ref:`delete the temporary files <clear_temp>`.
+#
+
+# Open the config file in editor
+vim /etc/application.conf
+
+# Change the parameter ``listen_port`` if needed. The default value is: 8080:: 
+#
+#   listen_address = "0:0:0:0"
+#   listen_port = 8080
+#
+# Start the service to verify the configuration is valid
+service application start
+
+## 
+

includesh/doc/global.rst

+
+.. _Docutils: http://docutils.sourceforge.net/
+.. _Docutils directives: http://docutils.sourceforge.net/docs/ref/rst/directives.html
+.. _Paver: http://www.blueskyonmars.com/projects/paver/index.html
+.. _RST: http://docutils.sourceforge.net/
+.. _Sphinx: http://sphinx.pocoo.org/
+.. _Rusty: http://pypi.python.org/pypi/rusty
+.. _include: http://docutils.sourceforge.net/docs/ref/rst/directives.html#including-an-external-document-fragment
+.. _ReStructuredText: http://docutils.sourceforge.net/rst.html
+.. _BeautifulSoup: http://www.crummy.com/software/BeautifulSoup/
+.. _xlrd: http://www.python-excel.org/
+.. _tox: http://tox.readthedocs.org/en/latest/
+.. _nose: http://code.google.com/p/python-nose/
+.. _coverage: http://nedbatchelder.com/code/coverage/
+.. _sqlparse: http://code.google.com/p/python-sqlparse/

includesh/doc/glossary.rst

+Glossary
+========
+
+.. glossary::
+  :sorted:
+
+  directive
+    Directives are extension blocks that provides certain
+    functionality into document. A distinctive difference
+    with :term:`roles <role>` is that the latter are in-line
+    definitions.
+
+    .. code-block:: rst
+
+       RST document with directive:
+
+       .. directivename:: optional argument
+          :option1: opt value1
+          :option2:
+
+          content
+
+
+
+  role
+    In-line extensions. Usually used for defining part of the content:
+
+    .. code-block:: rst
+
+       Some text containing :rolename:`target-name` as well as
+       other kind of :rolename:`targets <target-name>`
+
+    .. code-block:: rst
+
+       Copy the :file:`app.conf` to :directory:`/etc/`
+
+
+  regexp
+    Regular expression: a specific textual syntax used to match with the string.
+    Powerful but somewhat complicated.
+
+    See `further information from Wikipedia <http://en.wikipedia.org/wiki/Regular_expression>`_.
+

includesh/doc/index.rst

+
+.. _includesh:
+
+================================================================
+Includesh -- Include shell scripts in documentation
+================================================================
+Module extends the standard `include`_ directive by making it
+possible to include shell scripts into documents, while providing following
+features listed below. See :ref:`includesh-usage` for detailed example
+how to use the extension.
+
+.. contents::
+   :local:
+
+Features
+========
+
+**Format conversion**
+  Given shell file is converted into RST format using following rules:
+
+  * Shell commands are turned into code-blocks, using bash highlight
+  * Comments are turned into RST format, allowing standard formating rules
+
+**Inclusion**
+  Only partial inclusion is supported by providing options:
+
+  * *start-after*: text to find in the external data file
+    Only the content after the first occurrence of the specified text will be included.
+
+  * *end-before*: text to find in the external data file
+    Only the content before the first occurrence of the specified text (but after any after text) will be included.
+
+  * *language*: scripting language the file contains
+    The information is passed to `Sphinx`_ and used for syntax highlighting
+
+  * *encoding*: name of text encoding
+    The text encoding of the external data file. Defaults to the document's encoding (if specified).
+
+**Exclusion**
+  Lines starting with double-comment character in shell file are skipped
+  while converting to document
+
+.. NOTE::
+   * Configuration parameter ``file_insertion_enabled`` *must not be
+     disabled* in order to use this directive.
+   * Do not put the inclusion flags (``start-after``, ``end-before``)
+     after the double-comment characters, as they won't be recognized.
+
+.. _includesh-usage:
+
+Usage
+=====
+The usage of the extension can be described best by showing
+a real world example:
+
+  Software installation consists from several steps of shell
+  commands - which are described in documentation, one by one.
+  However, to prevent user to run same installation steps manually,
+  one could create a complete shell script from the installations steps.
+
+  While easy-to-run script is nice, the user ends up running the script blindfolded -
+  without actually knowing what is happening as part of the installation process.
+  Thus, to increase the knowledge about the software, it would be good to
+  have the actual steps documented as well. Having same steps duplicated in
+  script and documents leads eventually in out-dated material.
+
+This directive helps to get best parts from both: having up-to-date setup script
+AND documentation. By generating the documentation from the script - and here's
+how:
+
+**Shell script: setup.sh**
+  Consider having shell script, that is used for example as
+  part of the installation process.
+
+
+  .. literalinclude:: example/setup.sh
+     :language: bash
+
+
+**Document: document.rst**
+  In the documentation, the shell script can be included as a
+  part of the documentation, by using ``includesh`` directive.
+  The path to script is relative to the document.
+
+  .. literalinclude:: example/document.rst
+     :language: rst
+
+
+**Output**
+  When the document is processed, the output is shown as follows
+  (compare the output with ``setup.sh`` script and ``document.rst``):
+
+    .. includesh:: example/setup.sh
+
+
+Module in detail
+================
+
+.. automodule:: sphinxcontrib.includesh
+
+.. autoclass:: sphinxcontrib.includesh.IncludeShellDirective
+
+.. autoclass:: sphinxcontrib.includesh.ShellConverter
+
+.. _`include`: http://docutils.sourceforge.net/docs/ref/rst/directives.html#including-an-external-document-fragment
+
+
+Index
+=====
+
+.. toctree::
+   :maxdepth: 2
+   :numbered:
+
+   devel
+   changelog
+   glossary
+
+.. toctree::
+   :hidden:
+
+   global
+

includesh/doc/overview.svg

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1052.3622"
+   height="744.09448"
+   id="svg3076"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="New document 3">
+  <defs
+     id="defs3078" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="412.68153"
+     inkscape:cy="308.71946"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="915"
+     inkscape:window-height="525"
+     inkscape:window-x="513"
+     inkscape:window-y="401"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3081">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-308.2677)">
+    <g
+       id="g3144">
+      <rect
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3107"
+         width="183.217"
+         height="230.85971"
+         x="83.89537"
+         y="472.64664" />
+      <text
+         xml:space="preserve"
+         style="font-size:59.64847183px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#339900;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+         x="137.3698"
+         y="632.63348"
+         id="text3109"
+         sodipodi:linespacing="100%"
+         transform="scale(0.92693956,1.078819)"><tspan
+           sodipodi:role="line"
+           id="tspan3111"
+           x="137.3698"
+           y="632.63348"
+           style="font-weight:bold;fill:#fb8b00">.xls</tspan></text>
+      <rect
+         y="556.27594"
+         x="97.367401"
+         height="30.141716"
+         width="77.180237"
+         id="rect3113"
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3115"
+         width="77.180237"
+         height="30.141716"
+         x="175.834"
+         y="556.27594" />
+      <rect
+         y="586.46991"
+         x="175.834"
+         height="30.141716"
+         width="77.180237"
+         id="rect3117"
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3119"
+         width="77.180237"
+         height="30.141716"
+         x="97.382889"
+         y="586.46991" />
+      <rect
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3128"
+         width="77.180237"
+         height="30.141716"
+         x="97.367401"
+         y="494.27591" />
+      <rect
+         y="494.27591"
+         x="175.834"
+         height="30.141716"
+         width="77.180237"
+         id="rect3130"
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3132"
+         width="77.180237"
+         height="30.141716"
+         x="175.834"
+         y="524.46991" />
+      <rect
+         y="524.46991"
+         x="97.382889"
+         height="30.141716"
+         width="77.180237"
+         id="rect3134"
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3136"
+         width="77.180237"
+         height="30.141716"
+         x="97.740028"
+         y="494.46991" />
+      <rect
+         y="525.06171"
+         x="175.834"
+         height="30.141716"
+         width="77.180237"
+         id="rect3138"
+         style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect3140"
+         width="77.180237"
+         height="30.141716"
+         x="175.834"
+         y="555.25574" />
+      <rect
+         y="585.97003"
+         x="97.97686"
+         height="30.141716"
+         width="77.180237"
+         id="rect3142"
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <rect
+       style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3163"
+       width="183.217"
+       height="230.85971"
+       x="743.59375"
+       y="472.64664" />
+    <rect
+       style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3177"
+       width="77.180237"
+       height="30.141716"
+       x="757.0658"
+       y="575.41876" />
+    <rect
+       y="575.41876"
+       x="835.53241"
+       height="30.141716"
+       width="77.180237"
+       id="rect3179"
+       style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3181"
+       width="77.180237"
+       height="30.141716"
+       x="835.53241"
+       y="605.61279" />
+    <rect
+       y="606.11786"
+       x="757.0813"
+       height="30.141716"
+       width="77.180237"
+       id="rect3183"
+       style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3185"
+       width="77.180237"
+       height="30.141716"
+       x="757.43842"
+       y="575.61279" />
+    <rect
+       y="605.69952"
+       x="835.53241"
+       height="30.141716"
+       width="77.180237"
+       id="rect3187"
+       style="fill:#339900;fill-opacity:1;stroke:#333333;stroke-width:7.862185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <g
+       id="g3244"
+       transform="translate(0,28)">
+      <path
+         transform="translate(0,308.2677)"
+         inkscape:connector-curvature="0"
+         id="path3240"
+         d="m 759.63471,196.5918 147.48228,0"
+         style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 759.63471,524.8595 147.48228,0"
+         id="path3242"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g3248"
+       transform="translate(0,154)">
+      <path
+         style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 759.63471,196.5918 147.48228,0"
+         id="path3250"
+         inkscape:connector-curvature="0"
+         transform="translate(0,308.2677)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3252"
+         d="m 759.63471,524.8595 147.48228,0"
+         style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="802.85712"
+       y="518.07648"
+       id="text3254"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3256"
+         x="802.85712"
+         y="518.07648">doc</tspan></text>
+    <rect
+       style="fill:#eeeeec;fill-opacity:1;stroke:#2e3436;stroke-width:7.38630056;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect3258"
+       width="353.74866"
+       height="129.32646"
+       x="331.42856"
+       y="518.61578" />
+  </g>
+</svg>

includesh/doc/rusty.json

+{
+  "embeddedFonts" : [ ],
+  "pageSetup" : {
+    "size": "A4",
+    "width": null,
+    "height": null,
+    "margin-top": "1cm",
+    "margin-bottom": "1cm",
+    "margin-left": "1cm",
+    "margin-right": "1cm",
+    "margin-gutter": "0cm",
+    "spacing-header": "5mm",
+    "spacing-footer": "5mm",
+    "firstTemplate": "oneColumn"
+  },
+  "pageTemplates" : {
+    "coverPage": {
+        "frames": [
+            ["0cm", "0cm", "100%", "100%"]
+        ],
+        "showHeader" : false,
+        "showFooter" : false
+    },
+    "oneColumn": {
+        "frames": [
+            ["0cm", "0cm", "100%", "100%"]
+        ]
+    },
+    "twoColumn": {
+        "frames": [
+            ["0cm", "0cm", "49%", "100%"],
+            ["51%", "0cm", "49%", "100%"]
+        ]
+    },
+    "cutePage": {
+        "frames": [
+            ["0%", "0%", "100%", "100%"]
+        ],
+        "showHeader" : true,
+        "showFooter" : true,
+        "defaultFooter" : "###Page###",
+        "defaultHeader" : "###Section###"
+    }
+  },
+  "fontsAlias" : {
+    "stdFont": "Helvetica",
+    "stdBold": "Helvetica-Bold",
+    "stdItalic": "Helvetica-Oblique",
+    "stdBoldItalic": "Helvetica-BoldOblique",
+    "stdSans": "Helvetica",
+    "stdSansBold": "Helvetica-Bold",
+    "stdSansItalic": "Helvetica-Oblique",
+    "stdSansBoldItalic": "Helvetica-BoldOblique",
+    "stdMono": "Courier",
+    "stdMonoItalic": "Courier-Oblique",
+    "stdMonoBold": "Courier-Bold",
+    "stdMonoBoldItalic": "Courier-BoldOblique",
+    "stdSerif": "Times-Roman"
+  },
+  "linkColor" : "navy",
+  "styles" : [
+    [ "base" , {
+      "parent": null,
+      "fontName": "stdFont",
+      "fontSize":10,
+      "leading":12,
+      "autoLeading": "max",
+      "leftIndent":0,
+      "rightIndent":0,
+      "firstLineIndent":0,
+      "alignment":"TA_LEFT",
+      "spaceBefore":0,
+      "spaceAfter":0,
+      "bulletFontName":"stdFont",
+      "bulletFontSize":10,
+      "bulletIndent":0,
+      "textColor": "black",
+      "backColor": null,
+      "wordWrap": null,
+      "borderWidth": 0,
+      "borderPadding": 0,
+      "borderColor": null,
+      "borderRadius": null,
+      "allowWidows": false,
+      "allowOrphans": false,
+      "hyphenation": false,
+      "kerning": false
+    }] ,
+    ["normal" , {
+      "parent": "base"
+    }],
+    ["title_reference" , {
+      "parent": "normal",
+      "fontName": "stdItalic"
+    }],
+    ["bodytext" , {
+      "parent": "normal",
+      "spaceBefore":6,
+      "spaceAfter":4,
+      "alignment": "TA_JUSTIFY",
+      "hyphenation": true
+    }],
+    ["toc" , {
+      "parent": "normal"
+    }],
+    ["toc1" , {
+      "parent": "toc",
+      "fontName": "stdBold"
+    }],
+    ["toc2" , {
+      "parent": "toc",
+      "leftIndent": 20
+    }],
+    ["toc3" , {
+      "parent": "toc",
+      "leftIndent": 40
+    }],
+    ["toc4" , {
+      "parent": "toc",
+      "leftIndent": 60
+    }],
+    ["toc5" , {
+      "parent": "toc",
+      "leftIndent": 80
+    }],
+    ["toc6" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc7" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc8" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc9" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc10" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc11" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc12" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc13" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc14" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["toc15" , {
+      "parent": "toc",
+      "leftIndent": 100
+    }],
+    ["footer" , {
+      "parent": "normal",
+      "alignment": "TA_CENTER"
+    }],
+    ["header" , {
+      "parent": "normal",
+      "alignment": "TA_CENTER"
+    }],
+    ["attribution" , {
+      "parent": "bodytext",
+      "alignment": "TA_RIGHT"
+    }],
+    ["figure" , {
+      "parent": "bodytext",
+      "alignment": "TA_CENTER"
+    }],
+    ["figure-caption" , {
+      "parent": "bodytext",
+      "fontName": "stdItalic",
+      "alignment": "TA_CENTER"
+    }],
+    ["figure-legend" , {
+      "parent": "bodytext",
+      "alignment": "TA_CENTER"
+    }],
+    ["bullet_list" , {
+      "parent": "bodytext",
+      "spaceBefore": 2
+    }],
+    ["bullet_list_item" , {
+      "parent": "bodytext"
+    }],
+    ["enumerated_list" , {
+      "parent": "bodytext",
+      "spaceBefore": 2
+    }],
+    ["enumerated_list_item" , {
+      "parent": "bodytext"
+    }],
+    ["definition_list_term" , {
+      "parent": "normal",
+      "fontName": "stdBold",
+      "spaceBefore": 4,
+      "spaceAfter": 0,
+      "keepWithNext": true
+    }],
+    ["definition_list_classifier" , {
+      "parent": "normal",
+      "fontName": "stdItalic"
+    }],
+    ["definition" , {
+      "parent": "bodytext",
+      "firstLineIndent": 0,
+      "bulletIndent": 0,
+      "spaceBefore": 0
+    }],
+    ["fieldname" , {
+      "parent": "bodytext",
+      "alignment": "TA_RIGHT",
+      "fontName": "stdBold"
+    }],
+    ["fieldvalue" , {
+      "parent": "normal"
+    }],
+    ["rubric" , {
+      "parent": "bodytext",
+      "textColor": "darkred",
+      "alignment": "TA_CENTER"
+    }],
+    ["italic" , {
+      "parent": "bodytext",
+      "fontName": "stdItalic"
+    }],
+    ["heading" , {
+      "parent": "normal",
+      "keepWithNext": true,
+      "spaceBefore": 12,
+      "spaceAfter": 6
+    }],
+    ["title" , {
+      "parent": "heading",
+      "fontName": "stdBold",
+      "fontSize": "200%",
+      "alignment": "TA_CENTER",
+      "keepWithNext": false,
+      "spaceAfter": 10
+    }],
+    ["subtitle" , {
+      "parent": "title",
+      "spaceBefore": 12,
+      "fontSize": "75%"
+    }],
+    ["heading1" , {
+      "parent": "heading",
+      "fontName": "stdBold",
+      "fontSize": "175%"
+    }],
+    ["heading2" , {
+      "parent": "heading",
+      "fontName": "stdBold",
+      "fontSize": "150%"
+    }],
+    ["heading3" , {
+      "parent": "heading",
+      "fontName": "stdBold",
+      "fontSize": "125%"
+    }],
+    ["heading4" , {
+      "parent": "heading",
+      "fontName": "stdBold"
+    }],
+    ["heading5" , {
+      "parent": "heading",
+      "fontName": "stdBold"
+    }],
+    ["heading6" , {
+      "parent": "heading",
+      "fontName": "stdBold"
+    }],
+    ["topic-title" , {
+      "parent": "heading3"
+    }],
+    ["sidebar-title" , {
+      "parent": "heading3"
+    }],
+    ["sidebar-subtitle" , {
+      "parent": "heading4"
+    }],
+    ["sidebar" , {
+      "float": "none",
+      "width": "100%",
+      "parent": "normal",
+      "backColor": "beige",
+      "borderColor": "darkgray",
+      "borderPadding": 8,
+      "borderWidth": 0.5
+    }],
+    ["admonition" , {
+      "float": "none",
+      "width": "90%",
+      "parent": "normal",
+      "backColor": "beige",
+      "borderColor": "darkgray",
+      "borderPadding": 8,
+      "borderWidth": 0.5,
+      "spaceBefore": 12,
+      "spaceAfter": 6
+    }],
+    ["attention" , {
+      "parent": "admonition"
+    }],
+    ["caution" , {
+      "parent": "admonition"
+    }],
+    ["danger" , {
+      "parent": "admonition"
+    }],
+    ["error" , {
+      "parent": "admonition"
+    }],
+    ["hint" , {
+      "parent": "admonition"
+    }],
+    ["important" , {
+      "parent": "admonition",
+      "backColor": "#edb63e"
+    }],
+    ["note" , {
+      "parent": "admonition",
+      "backColor": "#FFFF99",
+      "borderColor": "blue"
+    }],
+    ["tip" , {
+      "parent": "admonition",
+      "backColor": "#add0e2"
+    }],
+    ["warning" , {
+      "parent": "admonition",
+      "backColor": "#edb63e"
+    }],
+    ["admonition-title" , {
+      "parent": "heading3"
+    }],
+    ["admonition-heading" , {
+      "parent": "heading3"
+    }],
+    ["attention-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["caution-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["danger-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["error-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["hint-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["important-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["note-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["tip-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["warning-heading" , {
+      "parent": "admonition-heading"
+    }],
+    ["literal" , {
+      "parent": "normal",
+      "fontName": "stdMono",
+      "firstLineIndent": 0,
+      "hyphenation": false
+    }],
+    ["table" , {
+      "spaceBefore":6,
+      "spaceAfter":0,
+      "rowBackgrounds" : ["white","#E0E0E0"],
+      "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ],
+            [ "INNERGRID", [ 0, 0 ], [ -1, -1 ], 0.25, "black" ],
+            [ "BOX", [ 0, 0 ], [ -1, -1 ], 0.25, "black" ]
+      ]
+    }],
+    ["table-title" , {
+      "parent" : "heading4",
+      "alignment" : "TA_CENTER"
+    }],
+    ["table-heading" , {
+      "parent" : "heading",
+      "backColor" : "beige",
+      "alignment" : "TA_CENTER",
+      "valign" : "BOTTOM",
+      "borderPadding" : 0
+    }],
+    ["dedication" , {
+      "parent" : "normal"
+    }],
+    ["abstract" , {
+      "parent" : "normal"
+    }],
+    ["contents" , {
+      "parent" : "normal"
+    }],
+    ["tableofcontents" , {
+      "parent" : "normal"
+    }],
+    ["code" , {
+      "parent": "literal",
+      "leftIndent": 0,
+      "spaceBefore": 8,
+      "spaceAfter": 8,
+      "backColor": "#c8daec",
+      "borderColor": "darkgray",
+      "borderWidth": 0.5,
+      "borderPadding": 6
+    }],
+    ["pygments-n" , {"parent": "code"}],
+    ["pygments-nx" , {"parent": "code"}],
+    ["pygments-p" , {"parent": "code"}],
+    ["pygments-hll", {"parent": "code", "backColor": "#ffffcc"}],
+    ["pygments-c", {"textColor": "#008800", "parent": "code"}],
+    ["pygments-err", {"parent": "code"}],
+    ["pygments-k", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-o", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-cm", {"textColor": "#008800", "parent": "code"}],
+    ["pygments-cp", {"textColor": "#008800", "parent": "code"}],
+    ["pygments-c1", {"textColor": "#008800", "parent": "code"}],
+    ["pygments-cs", {"textColor": "#008800", "parent": "code"}],
+    ["pygments-gd", {"textColor": "#A00000", "parent": "code"}],
+    ["pygments-ge", {"parent": "code"}],
+    ["pygments-gr", {"textColor": "#FF0000", "parent": "code"}],
+    ["pygments-gh", {"textColor": "#000080", "parent": "code"}],
+    ["pygments-gi", {"textColor": "#00A000", "parent": "code"}],
+    ["pygments-go", {"textColor": "#808080", "parent": "code"}],
+    ["pygments-gp", {"textColor": "#000080", "parent": "code"}],
+    ["pygments-gs", {"parent": "code"}],
+    ["pygments-gu", {"textColor": "#800080", "parent": "code"}],
+    ["pygments-gt", {"textColor": "#0040D0", "parent": "code"}],
+    ["pygments-kc", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-kd", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-kn", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-kp", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-kr", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-kt", {"textColor": "#00BB00", "parent": "code"}],
+    ["pygments-m", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-s", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-na", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-nb", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-nc", {"textColor": "#0000FF", "parent": "code"}],
+    ["pygments-no", {"textColor": "#880000", "parent": "code"}],
+    ["pygments-nd", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-ni", {"textColor": "#999999", "parent": "code"}],
+    ["pygments-ne", {"textColor": "#D2413A", "parent": "code"}],
+    ["pygments-nf", {"textColor": "#00A000", "parent": "code"}],
+    ["pygments-nl", {"textColor": "#A0A000", "parent": "code"}],
+    ["pygments-nn", {"textColor": "#0000FF", "parent": "code"}],
+    ["pygments-nt", {"textColor": "#008000", "parent": "code"}],
+    ["pygments-nv", {"textColor": "#B8860B", "parent": "code"}],
+    ["pygments-ow", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-w", {"textColor": "#bbbbbb", "parent": "code"}],
+    ["pygments-mf", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-mh", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-mi", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-mo", {"textColor": "#666666", "parent": "code"}],
+    ["pygments-sb", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-sc", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-sd", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-s2", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-se", {"textColor": "#BB6622", "parent": "code"}],
+    ["pygments-sh", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-si", {"textColor": "#BB6688", "parent": "code"}],
+    ["pygments-sx", {"textColor": "#008000", "parent": "code"}],
+    ["pygments-sr", {"textColor": "#BB6688", "parent": "code"}],
+    ["pygments-s1", {"textColor": "#BB4444", "parent": "code"}],
+    ["pygments-ss", {"textColor": "#B8860B", "parent": "code"}],
+    ["pygments-bp", {"textColor": "#AA22FF", "parent": "code"}],
+    ["pygments-vc", {"textColor": "#B8860B", "parent": "code"}],
+    ["pygments-vg", {"textColor": "#B8860B", "parent": "code"}],
+    ["pygments-vi", {"textColor": "#B8860B", "parent": "code"}],
+    ["pygments-il", {"textColor": "#666666", "parent": "code"}],
+
+    ["descclassname", {"parent": "literal"}],
+    ["descname", {"parent": "literal"}],
+    ["optional", {"parent": "literal"}],
+
+    ["item_list", {
+      "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ],
+            [ "TOPPADDING", [ 0, 0 ], [ -1, -1 ], 0 ],
+            [ "BOTTOMPADDING", [ 0, 0 ], [ -1, -1 ], 0 ],
+            [ "RIGHTPADDING", [ 0, 0 ], [ 1, -1 ], 0 ]
+        ],
+        "colWidths": ["20pt",null]
+    }],
+    ["bullet_list", {
+       "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
+        ],
+        "colWidths": ["20",null]
+    }],
+     [ "endnote", {
+         "parent": "bodytext",
+         "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ]
+        ],
+        "colWidths": ["3cm",null]
+    }],
+    [ "field_list", {
+         "parent": "bodytext",
+         "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ],
+            [ "TOPPADDING", [ 0, 0 ], [ -1, -1 ], 0 ]
+        ],
+        "colWidths": ["3cm",null]
+    }],
+    [ "option_list", {
+         "commands": [
+            [ "VALIGN", [ 0, 0 ], [ -1, -1 ], "TOP" ],
+            [ "TOPPADDING", [ 0, 0 ], [ -1, -1 ], 0 ]
+        ],
+        "colWidths": [null,null]
+    }]
+  ]
+}
+

includesh/doc/rusty.svg

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="222.48572"
+   height="222.48572"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="rusty.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/juha/project/homegrown/xmltable/doc/static/logo.png"
+   inkscape:export-xdpi="32.490002"
+   inkscape:export-ydpi="32.490002"
+   version="1.0">
+  <defs
+     id="defs4">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3175">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3177" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3179" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="240.32077 : 278.08761 : 1"
+       inkscape:vp_y="6.4772564e-14 : 743.1685 : 0"
+       inkscape:vp_z="893.23205 : 869.25309 : 1"
+       inkscape:persp3d-origin="517.79605 : 902.40309 : 1"
+       id="perspective10" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3175"
+       id="radialGradient3183"
+       cx="285.93997"
+       cy="617.01569"
+       fx="285.93997"
+       fy="617.01569"
+       r="98.775726"
+       gradientTransform="matrix(1,0,0,1.1262468,0,-77.896228)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="215.45019"
+     inkscape:cy="206.28028"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1272"
+     inkscape:window-height="993"
+     inkscape:window-x="0"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-0.9636892,-0.7342432)">
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot2397"
+       style="font-size:36px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial"><flowRegion
+         id="flowRegion2399"><rect
+           id="rect2401"
+           width="28.571428"
+           height="68.571426"
+           x="228.57143"
+           y="495.21933" /></flowRegion><flowPara
+         id="flowPara2403"
+         style="font-size:64px;font-weight:bold">X</flowPara></flowRoot>    <g
+       id="g3189"
+       transform="translate(-448.50773,-52.527932)">
+      <path
+         transform="translate(215.71428,-41.428573)"
+         d="M 447.14286,205.93361 A 102.14286,102.14286 0 1 1 242.85714,205.93361 A 102.14286,102.14286 0 1 1 447.14286,205.93361 z"
+         sodipodi:ry="102.14286"
+         sodipodi:rx="102.14286"
+         sodipodi:cy="205.93361"
+         sodipodi:cx="345"
+         id="path2392"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ef6400;stroke-width:18.20000076;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         id="text3164"
+         d="M 497.63106,146.98429 C 496.54172,146.82093 495.47965,146.73923 494.44482,146.73919 C 487.41875,146.73923 483.90572,150.22502 483.90573,157.19659 L 483.90573,179.82704 L 472.38626,179.82704 L 472.38626,136.2818 L 483.25215,136.2818 L 483.25215,139.63144 C 483.25213,140.88418 483.27936,141.51054 483.33384,141.5105 C 483.3883,141.45607 483.46999,141.40161 483.57894,141.3471 C 485.75755,139.05959 487.44598,137.58902 488.64424,136.93539 C 490.55051,135.84612 493.0287,135.30147 496.07879,135.30142 C 496.56896,135.30147 497.08638,135.30147 497.63106,135.30142 L 497.63106,146.98429"
+         style="font-size:81.69838715px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ef6400;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+      <path
+         id="text3168"
+         d="M 533.31725,192.09244 L 522.45136,192.09244 L 522.45136,188.25261 C 522.45133,186.72758 522.4241,185.96506 522.36966,185.96506 C 522.36963,186.01953 522.3424,186.04676 522.28796,186.04676 C 519.40126,190.94866 514.98955,193.39961 509.05282,193.39961 C 504.96789,193.39961 501.5638,192.0652 498.84053,189.39639 C 495.73598,186.45525 494.18371,182.39757 494.18372,177.22333 L 494.18372,148.5472 L 505.70319,148.5472 L 505.70319,175.50767 C 505.70318,180.89977 508.15413,183.59581 513.05605,183.59581 C 515.9427,183.59581 518.14855,182.6699 519.67361,180.81806 C 521.19862,178.96624 521.96114,176.59699 521.96117,173.7103 L 521.96117,148.5472 L 533.31725,148.5472 L 533.31725,192.09244"
+         style="font-size:81.69838715px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ef6400;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+      <path
+         id="text3172"
+         d="M 580.27382,166.64913 C 580.27377,170.67959 579.37509,174.02922 577.57778,176.69803 C 575.5625,179.58471 572.73029,181.87226 569.08114,183.56069 C 565.64977,185.08573 562.02782,185.84825 558.21526,185.84825 C 541.22198,185.73931 532.5075,179.17622 532.07177,166.15894 L 543.91804,166.15894 C 544.02696,169.31795 545.38859,171.7689 548.00296,173.51179 C 550.29049,175.0913 553.14993,175.88105 556.58129,175.88104 C 559.74026,175.88105 562.49077,175.20023 564.83283,173.83858 C 567.22928,172.47696 568.42752,170.67959 568.42756,168.44649 C 568.48198,164.96071 565.43191,162.48253 559.27734,161.01194 C 549.09225,158.56101 543.37337,157.03598 542.12068,156.43683 C 536.02052,153.55018 532.99769,148.64828 533.05215,141.73112 C 533.10662,138.1909 534.0053,135.05913 535.7482,132.3358 C 537.54556,129.55811 540.2416,127.40672 543.83634,125.88163 C 547.26766,124.41112 550.99855,123.67583 555.02902,123.67577 C 561.1836,123.67583 566.41229,125.2281 570.71511,128.33258 C 575.61697,131.81843 578.20408,136.66587 578.47646,142.8749 L 566.71189,142.8749 C 566.43952,139.9338 565.10512,137.67348 562.70867,136.09393 C 560.58448,134.67787 558.0246,133.96982 555.02902,133.96977 C 552.41465,133.96982 550.09986,134.48724 548.08466,135.52204 C 545.63369,136.82926 544.38098,138.68109 544.32653,141.07753 C 544.32652,144.39997 547.43105,146.79646 553.64015,148.26699 C 564.09751,150.77244 569.87085,152.27024 570.96021,152.7604 C 577.16924,155.53817 580.27377,160.16774 580.27382,166.64913"
+         style="font-size:81.69838715px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ef6400;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+      <path
+         id="text3176"
+         d="M 621.76196,135.012 L 604.03341,135.012 L 604.03341,183.37744 L 591.69695,183.37744 L 591.69695,135.012 L 574.0501,135.012 L 574.0501,124.6363 L 621.76196,124.6363 L 621.76196,135.012"
+         style="font-size:81.69838715px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ef6400;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+      <path
+         id="text3180"
+         d="M 647.645,193.46146 C 647.64496,199.23481 645.57527,203.86438 641.43593,207.35019 C 637.6233,210.45471 633.0482,212.00698 627.7106,212.007 C 622.48188,212.00698 618.07018,210.48194 614.47546,207.43189 C 610.49947,204.00054 608.51147,199.31651 608.51148,193.37977 L 619.21397,193.37977 C 619.21395,196.15751 620.03093,198.33613 621.66492,199.91564 C 623.081,201.33173 624.87837,202.03978 627.05701,202.0398 C 629.45347,202.03978 631.5504,201.2228 633.34779,199.58884 C 635.25405,197.73701 636.2072,195.31329 636.20723,192.31769 L 636.20723,185.61842 C 635.39022,187.57918 633.89241,189.10422 631.71382,190.19353 C 629.58964,191.28284 627.19315,191.8275 624.52436,191.8275 C 620.27603,191.8275 616.65407,190.57479 613.65847,188.06937 C 610.22714,185.1827 608.51147,181.20672 608.51148,176.14141 L 608.51148,147.46527 L 620.03095,147.46527 L 620.03095,174.42574 C 620.03093,179.81785 622.48188,182.51389 627.3838,182.51388 C 629.99813,182.51389 632.12228,181.75137 633.75628,180.22633 C 635.39022,178.7013 636.2072,176.76778 636.20723,174.42574 L 636.20723,147.46527 L 647.645,147.46527 L 647.645,193.46146"
+         style="font-size:81.69838715px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ef6400;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+    </g>
+  </g>
+</svg>

includesh/doc/static/exceltable.png

Added
New image

includesh/doc/static/extensions.svg

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="extensions.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="452.9768"
+     inkscape:cy="1012.4554"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1120"
+     inkscape:window-height="785"
+     inkscape:window-x="0"
+     inkscape:window-y="64">
+    <sodipodi:guide
+       orientation="1,0"
+       position="0,802.85714"
+       id="guide2383" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="100,714.28571"
+       id="guide2385" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="200.0102,1008.6373"
+       id="guide2387" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="300,845.71429"
+       id="guide2389" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="230,962.85714"
+       id="guide2391" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="400,758.57143"
+       id="guide2393" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="502.04581,929.34034"
+       id="guide2395" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="600,765.71429"
+       id="guide2397" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="127.27922,1052.579"
+       id="guide2419" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="700,1042.8571"
+       id="guide2469" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g3447"
+       inkscape:export-filename="/home/juha/project/personal/rusty/doc/static/xmltable.png"
+       inkscape:export-xdpi="55.674393"
+       inkscape:export-ydpi="55.674393">
+      <rect
+         y="2.2831826"
+         x="2.5000002"
+         height="83.293289"
+         width="93.214287"
+         id="rect2421"
+         style="opacity:1;fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:4;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         transform="scale(0.9269396,1.078819)"
+         sodipodi:linespacing="100%"
+         id="text2457"
+         y="69.884491"
+         x="8.2314806"
+         style="font-size:30.3470192px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#339900;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial"
+         xml:space="preserve"><tspan
+           style="font-weight:bold;fill:#339900"
+           y="69.884491"
+           x="8.2314806"
+           id="tspan2459"
+           sodipodi:role="line">&lt;?xml</tspan></text>
+      <g
+         transform="matrix(0.9162196,0,0,0.8945436,-162.26162,60.124111)"
+         id="g2469">
+        <rect
+           style="opacity:1;fill:#ef6400;fill-opacity:1;stroke:#333333;stroke-width:4.41834307;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="rect2461"
+           width="42.857143"
+           height="17.142857"
+           x="187.30852"
+           y="-55.283195" />
+        <rect
+           y="-55.283195"
+           x="230.87996"
+           height="17.142857"
+           width="42.857143"
+           id="rect2463"
+           style="opacity:1;fill:#ef6400;fill-opacity:1;stroke:#333333;stroke-width:4.41834307;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <rect
+           style="opacity:1;fill:#ef6400;fill-opacity:1;stroke:#333333;stroke-width:4.41834307;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="rect2465"
+           width="42.857143"
+           height="17.142857"
+           x="230.87996"
+           y="-38.110603" />
+        <rect
+           y="-38.110603"
+           x="187.31712"
+           height="17.142857"
+           width="42.857143"
+           id="rect2467"
+           style="opacity:1;fill:#ef6400;fill-opacity:1;stroke:#333333;stroke-width:4.41834307;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      </g>
+    </g>
+    <g
+       id="g3457"
+       inkscape:export-filename="/home/juha/project/personal/rusty/doc/static/exceltable.png"
+       inkscape:export-xdpi="55.549999"
+       inkscape:export-ydpi="55.549999">
+      <rect
+         y="1.8034872"
+         x="102.25026"
+         height="83.293289"
+         width="93.214287"
+         id="rect2495"
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:4;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         transform="scale(0.9269396,1.078819)"
+         sodipodi:linespacing="100%"
+         id="text2497"
+         y="68.971703"
+         x="134.15117"
+         style="font-size:30.3470192px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#339900;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial"
+         xml:space="preserve"><tspan
+           style="font-weight:bold;fill:#fb8b00"
+           y="68.971703"
+           x="134.15117"
+           id="tspan2499"
+           sodipodi:role="line">.xls</tspan></text>
+      <rect
+         style="fill:#eeeeee;fill-opacity:1;stroke:#333333;stroke-width:4;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect2503"
+         width="39.266556"
+         height="15.335032"
+         x="109.10435"
+         y="10.191186" />
+      <rect
+         y="10.191186"
+         x="149.02536"