瀏覽代碼

Updated docs

rparedis 5 年之前
父節點
當前提交
b5154365ca
共有 65 個文件被更改,包括 16641 次插入49 次删除
  1. 25 6
      __main__.py
  2. 0 20
      doc/index.rst
  3. 0 0
      docs/Makefile
  4. 二進制
      docs/_build/doctrees/environment.pickle
  5. 二進制
      docs/_build/doctrees/execute.doctree
  6. 二進制
      docs/_build/doctrees/formalisms/CBD.doctree
  7. 二進制
      docs/_build/doctrees/formalisms/create.doctree
  8. 二進制
      docs/_build/doctrees/index.doctree
  9. 二進制
      docs/_build/doctrees/modules.doctree
  10. 二進制
      docs/_build/doctrees/parser.doctree
  11. 4 0
      docs/_build/html/.buildinfo
  12. 1 0
      docs/_build/html/_downloads/9ae1485408cab692c778396ba5bd1b19/CBDLibrary.xml
  13. 二進制
      docs/_build/html/_images/custom-block.png
  14. 二進制
      docs/_build/html/_images/library.png
  15. 二進制
      docs/_build/html/_images/properties.png
  16. 53 0
      docs/_build/html/_modules/index.html
  17. 256 0
      docs/_build/html/_modules/parser.html
  18. 68 0
      docs/_build/html/_sources/execute.rst.txt
  19. 165 0
      docs/_build/html/_sources/formalisms/CBD.rst.txt
  20. 66 0
      docs/_build/html/_sources/formalisms/create.rst.txt
  21. 73 0
      docs/_build/html/_sources/index.rst.txt
  22. 7 0
      docs/_build/html/_sources/modules.rst.txt
  23. 7 0
      docs/_build/html/_sources/parser.rst.txt
  24. 二進制
      docs/_build/html/_static/alert_info_32.png
  25. 二進制
      docs/_build/html/_static/alert_warning_32.png
  26. 676 0
      docs/_build/html/_static/basic.css
  27. 二進制
      docs/_build/html/_static/bg-page.png
  28. 二進制
      docs/_build/html/_static/bullet_orange.png
  29. 315 0
      docs/_build/html/_static/doctools.js
  30. 10 0
      docs/_build/html/_static/documentation_options.js
  31. 二進制
      docs/_build/html/_static/file.png
  32. 376 0
      docs/_build/html/_static/haiku.css
  33. 10365 0
      docs/_build/html/_static/jquery.js
  34. 297 0
      docs/_build/html/_static/language_data.js
  35. 二進制
      docs/_build/html/_static/minus.png
  36. 二進制
      docs/_build/html/_static/plus.png
  37. 71 0
      docs/_build/html/_static/pygments.css
  38. 481 0
      docs/_build/html/_static/searchtools.js
  39. 13 0
      docs/_build/html/_static/styles.css
  40. 1692 0
      docs/_build/html/_static/underscore.js
  41. 144 0
      docs/_build/html/execute.html
  42. 231 0
      docs/_build/html/formalisms/CBD.html
  43. 151 0
      docs/_build/html/formalisms/create.html
  44. 151 0
      docs/_build/html/genindex.html
  45. 146 0
      docs/_build/html/index.html
  46. 59 0
      docs/_build/html/modules.html
  47. 二進制
      docs/_build/html/objects.inv
  48. 161 0
      docs/_build/html/parser.html
  49. 75 0
      docs/_build/html/py-modindex.html
  50. 82 0
      docs/_build/html/search.html
  51. 1 0
      docs/_build/html/searchindex.js
  52. 二進制
      docs/_figures/custom-block.png
  53. 二進制
      docs/_figures/library.png
  54. 二進制
      docs/_figures/properties.png
  55. 13 0
      docs/_static/styles.css
  56. 7 5
      doc/conf.py
  57. 68 0
      docs/execute.rst
  58. 165 0
      docs/formalisms/CBD.rst
  59. 66 0
      docs/formalisms/create.rst
  60. 73 0
      docs/index.rst
  61. 0 0
      docs/make.bat
  62. 7 0
      docs/modules.rst
  63. 7 0
      docs/parser.rst
  64. 9 11
      parser.py
  65. 4 7
      whishlist.txt

+ 25 - 6
__main__.py

@@ -1,4 +1,4 @@
-from parser import Parser, ParseException, parse_environment
+from src.parser import Parser, ParseException, parse_environment
 from jinja2 import Template
 import argparse
 import sys
@@ -40,7 +40,7 @@ class ListFormalisms(argparse.Action):
 argprs = argparse.ArgumentParser(description='Create model/simulation files from draw.io/diagrams.net XML files.')
 argprs.add_argument('input', type=str, help="The input file to convert.")
 argprs.add_argument("-F", "--formalism", required=True,
-                    help="The formalism for which you want to generate simulation files. "
+                    help="The formalism for which files must be generated. "
                          "Use -L or --list to show the available formalisms.")
 argprs.add_argument("-e", "--entry", default='', help="The topmost class to use in the simulation.")
 argprs.add_argument("-t", "--time", default=10, type=float, help="Total simulation time. (default: 10)")
@@ -70,6 +70,25 @@ try:
 		_locals = {}
 		exec(file.read(), {}, _locals)
 		setup = _locals["setup"]
+
+		default_setup_parser = {
+			"input class": "InputPort",
+			"output class": "OutputPort",
+			"class object xpath": ".//object/mxCell/mxGeometry/mxRectangle/../../..[@class_name]",
+			"special object xpath": ".//object/mxCell/mxGeometry/../..[@role]"
+		}
+		setup_parser = setup.get("parser", {})
+		setup_parser = {**default_setup_parser, **setup_parser}
+
+		default_setup_generator = {
+			"verify": [],
+			"ignore": [],
+			"environment": [],
+			"templates": []
+		}
+		setup_generator = setup.get("generator", {})
+		setup_generator = {**default_setup_generator, **setup_generator}
+
 except Exception as e:
 	print("[  ERROR  ] Could not load formalism.")
 	print(e)
@@ -78,9 +97,9 @@ except Exception as e:
 if args.verbose:
 	print("[  DEBUG  ] Parsing DrawIO File...")
 # Parse the drawio file
-parser = Parser(args.input, setup["parser"]["input class"], setup["parser"]["output class"], args.skip)
+parser = Parser(args.input, setup_parser, args.skip)
 nodes = list(parser.parse())
-for ver in setup["generator"]["verify"]:
+for ver in setup_generator["verify"]:
 	if not ver["function"](nodes):
 		raise ParseException(ver["error"])
 
@@ -88,11 +107,11 @@ for ver in setup["generator"]["verify"]:
 fields = {
 	"command": " ".join(sys.argv),
 	"nodes": nodes,
-	"ignore": setup["generator"]["ignore"],
+	"ignore": setup_generator["ignore"],
 	"time": args.time,
 	"imports": parser.get_imports()
 }
-for blueprint in setup["generator"]["templates"]:
+for blueprint in setup_generator["templates"]:
 	if blueprint.get("auto", True) or args.all:
 		loc = os.path.join(args.directory, blueprint["filename"])
 		if os.path.isfile(loc) and not blueprint.get("overwrite", True) and not args.force:

+ 0 - 20
doc/index.rst

@@ -1,20 +0,0 @@
-.. DrawioConvert documentation master file, created by
-   sphinx-quickstart on Tue Dec 29 15:01:45 2020.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to DrawioConvert's documentation!
-=========================================
-
-.. toctree::
-   :maxdepth: 2
-   :caption: Contents:
-
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`

doc/Makefile → docs/Makefile


二進制
docs/_build/doctrees/environment.pickle


二進制
docs/_build/doctrees/execute.doctree


二進制
docs/_build/doctrees/formalisms/CBD.doctree


二進制
docs/_build/doctrees/formalisms/create.doctree


二進制
docs/_build/doctrees/index.doctree


二進制
docs/_build/doctrees/modules.doctree


二進制
docs/_build/doctrees/parser.doctree


+ 4 - 0
docs/_build/html/.buildinfo

@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: e09b84a6ade6c2b2681806acd183d816
+tags: 645f666f9bcd5a90fca523b33c5a78b7

File diff suppressed because it is too large
+ 1 - 0
docs/_build/html/_downloads/9ae1485408cab692c778396ba5bd1b19/CBDLibrary.xml


二進制
docs/_build/html/_images/custom-block.png


二進制
docs/_build/html/_images/library.png


二進制
docs/_build/html/_images/properties.png


+ 53 - 0
docs/_build/html/_modules/index.html

@@ -0,0 +1,53 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Overview: module code &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="../_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="../_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+    <script type="text/javascript" src="../_static/jquery.js"></script>
+    <script type="text/javascript" src="../_static/underscore.js"></script>
+    <script type="text/javascript" src="../_static/doctools.js"></script>
+    <script type="text/javascript" src="../_static/language_data.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="../index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>Overview: module code</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="../index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <h1>All modules for which code is available</h1>
+<ul><li><a href="parser.html">parser</a></li>
+</ul>
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="../index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

File diff suppressed because it is too large
+ 256 - 0
docs/_build/html/_modules/parser.html


+ 68 - 0
docs/_build/html/_sources/execute.rst.txt

@@ -0,0 +1,68 @@
+How to Execute :code:`DrawioConvert`?
+=====================================
+
+The execution for :code:`DrawioConvert` is simple:
+
+.. code::
+
+    python3 __main__.py <INPUT> [ARGS]
+
+Where :code:`<INPUT>` represents the drawio file to parse and :code:`[ARGS]`
+any combination of the commandline arguments that can be used with this tool.
+
+Commandline Arguments
+---------------------
+
+.. list-table::
+    :widths: 10 15 30
+    :header-rows: 1
+
+    * - Short Flag
+      - Long Flag
+      - Description
+    * - :code:`-F`
+      - :code:`--formalism`
+      - The formalism for which files must be generated. This argument is
+        required.
+    * - :code:`-e`
+      - :code:`--entry`
+      - The topmost class to use in the simulation. May be required for some
+        formalisms, where simulation is top-level dependent.
+    * - :code:`t`
+      - :code:`--time`
+      - Total simulation time to use. Should only be set for experiment
+        files. Defaults to :code:`10` (time-units). While this flag is meant
+        to indicate the total time, some formalisms may use this as the
+        allowed amount of simulation steps.
+    * - :code:`-L`
+      - :code:`--list`
+      - Lists the available formalisms that can be used.
+    * - :code:`-s`
+      - :code:`--skip`
+      - Sometimes a visual model has some "placeholders" for future classes.
+        By default, these are generated as well, even if no contents are given.
+        The :code:`--skip` flag changes this behaviour by skipping empty blocks
+        in the generation.
+    * - :code:`-d`
+      - :code:`--directory`
+      - The location where the files should be generated. Defaults to :code:`./`
+        (the current directory).
+    * - :code:`-f`
+      - :code:`--force`
+      - Some formalisms may mark certain files as "protected". This is usually
+        done to prevent accidental removal of user code when programming
+        experiments. Hence, these files cannot be overwritten by the tool, unless
+        this flag is set.
+    * - :code:`-a`
+      - :code:`--all`
+      - Each formalism has their default set of files to be generated. However,
+        there may be some experimental or additional files that not all users
+        need. This flag allows the generation of **all** files of the formalism.
+    * - :code:`-v`
+      - :code:`--verbose`
+      - Prints additional debugging information.
+    * - :code:`-E`
+      - :code:`--enviroment`
+      - Occasionally, formalisms need other properties that can be set by the
+        user. This flag takes a comma-separated list of :code:`key=value` pairs
+        and applies them to the formalism specifics.

+ 165 - 0
docs/_build/html/_sources/formalisms/CBD.rst.txt

@@ -0,0 +1,165 @@
+CBD Formalism
+=============
+
+Causal Block Diagrams allow for finding solutions to mathematical problems.
+
+Setting up Drawio
+------------------
+In drawio, select :menuselection:`File --> Open Library` and load :file:`CBDLibrary.xml`
+(which can be found :download:`here <../../formalisms/CBD/CBDLibrary.xml>`).
+This provides a set of primitive CBD blocks that can be used in your models.
+Once included, it can be found at the top of the shapes library.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/library.png      |
+|                                          |
+|   CBD Library in the Sidebar             |
++------------------------------------------+
+
+.. _block-props:
+
+Block Properties
+----------------
+All blocks in the library have some block-specific properties that can be set by the user.
+Hovering over a component shows all non-empty properties that were set on this shape.
+
+There are several ways of accessing/modifying these properties:
+
+* Double Click with the left mouse button on a shape.
+* Click with right mouse button to open a shape's context menu.
+  Near the bottom of the list, select :menuselection:`Edit Data`.
+* Select the shape (left mouse button) and in the top of the right panel,
+  go to :menuselection:`Arrange --> Edit Data`.
+* Select the shape and press :kbd:`CTRL + M` or :kbd:`CMND + M`.
+
+.. warning:: Do not change the :code:`class_name` as the converter relies on this property.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/properties.png   |
+|                                          |
+|   Example of the Property Window (for a  |
+|   ConstantBlock)                         |
++------------------------------------------+
+
+
+.. _library:
+
+Working with Library Blocks
+---------------------------
+To guarantee a consistent visual appearance of CBD models,
+no blocks in the library, except for the Custom Block, can be resized.
+Every block has zero or more input and output ports. Input ports are represented by
+the :code:`InputPortBlock` (black triangle) and output ports by the :code:`OutputPortBlock`
+(white triangle). When selecting (left mouse button) a port, a small, movable,
+yellow/orange diamond-shaped anchor will appear in front of the port's name.
+The position of this label can be changed by dragging the anchor.
+The port name can be altered in the :menuselection:`Edit Data` window.
+
+.. For each of a CBD model's top-level :code:`OutputPortBlock` shapes, a :code:`signal` property
+    may be added (see :ref:`block-props`).
+    The :code:`drawio2cbd` will then generate code to produce a plot, using https://bokeh.org/.
+    Note that bokeh produces an HTML document which is rendered in a browser
+    and allows some user interaction with the plot.
+    The value of the :code:`signal` property on a top-level :code:`OutputPortBlock` should be the title
+    to be put on the plot. Multiple signals may be rendered onto the same plot.
+    For more complex CBD simulation result analysis and visualization, code should be added
+    at the bottom of the generated file.
+
+Each CBD block that is *not* a port may have the following properties:
+
+* :code:`ID` or :code:`id`: The drawio unique ID for this block. Note that drawio automatically
+  overwrites a property with the key :code:`id` by the value shown by :code:`ID` (upon saving the diagram).
+* :code:`block_name`: The name of the block. It is required that
+  all blocks have a unique name within a class. When omitted, the :code:`ID` is used.
+* :code:`class_name`: The type of block.
+
+  .. warning:: Do not change the :code:`class_name` as the converter relies on this property.
+               Changing it makes it so the block type changes as well in the simulation.
+
+* :code:`symbol`: The block symbol that must be rendered by MathJax/LaTeX. This is a purely
+  graphical attribute and is ignored by the script.
+
+Optionally, additional class parameters can be provided by adding more properties.
+Their values will be passed on as default values for the corresponding property as an argument, e.g., to
+use strings, enclose the value in "..." or '...', for :code:`None`, leave it empty or litterally type
+":code:`None`"...
+
+.. warning:: Make sure these values are expressions/rvalues! If not, the generated Python file will crash,
+              or cause some unexpected behavior. Furthermore, newlines may not be used in these values.
+
+Class parameters that cannot be used are: :code:`label` (prevented by drawio), :code:`id` (overwritten by
+drawio), :code:`placeholders` (prevented by drawio), :code:`symbol` (ignored by the converter)
+and :code:`__docstring__` (used for other purposes, see later).
+
+.. note:: Blocks with a variable number of inputs (i.e., the :code:`OrBlock` and the
+          :code:`AndBlock`) may still need additional ports to be placed/removed.
+
+
+.. _custom-block:
+
+Creating Custom CBD Blocks
+-------------------------------
+A custom hierarchical CBD block is constructed as a network of already provided blocks
+(which in their own right may be custom hierarchical blocks)
+using the :code:`Custom Block` element from :file:`CBDLibrary.xml`.
+This is a collapsible component in which a block diagram may be drawn.
+It has two important properties:
+
+* :code:`class_name`: The new class name for the custom block. Note that all class names must be unique!
+* :code:`block_name`: The name of an instance of the CBD model if it's the top-level CBD.
+
+Additional properties can be added to create custom class parameters.
+The same set of parameters that was discussed above cannot be set,
+with the exception of :code:`__docstring__`, which now allows adding documentation to custom blocks.
+
+The empty rectangle is a container for the custom hierachical block.
+Blocks can be dragged into the rectangular area and connected.
+:code:`InputPortBlock` and :code:`OutputPortBlock` are used to add inputs and outputs with
+their :code:`name` property set to the port's name.
+
+.. hint:: The :code:`Custom Block` component can, in constrast with all other blocks in the
+          library, be resized. This allows for larger hierarchical models to be created, as the
+          basic blocks cannot be resized.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/custom-block.png |
+|                                          |
+|   Custom Sine Generator Block with no    |
+|   Input Ports, a single Output Port and  |
+|   a Custom Graphical Representation      |
++------------------------------------------+
+
+Next, create a graphical representation of the block (i.e., what an instance
+block should look like when used in a block diagram), add the corresponding
+ports and set the property :code:`class_name` to the same class as that set in the
+:code:`Custom Block`. Make sure not to forget to add any class parameters that were
+added to the :code:`Custom Block`.
+
+.. hint:: This can be done easily by adding a predefined block and changing its
+          ports and properties to match the new custom block.
+
+.. note:: Only the :code:`Custom Block` components will be read by the converter.
+          Anything else is implicitly ignored. Furthermore, the script is page-independent,
+          meaning multiple pages may be used inside a single drawio document to maintain a
+          clean overview of the created models.
+
+Conversion
+----------
+To generate code from the created drawio files, execute the script with the :code:`-F CBD` flag.
+This tells :code:`DrawioConvert` to use the CBD formalism. Two files will be created:
+
+* :code:`model.py`: The model file, containing the code for the modelled blocks.
+* :code:`experiment.py`: The "protected" experiment file. You can feely add/remove parts of this file
+  without fear of it being overwritten next execution. Use the :code:`-f`/:code:`--force` flag to
+  force overwrite the file.
+
+It is possible to use continuous models, where they are discretized to a certain delta. This is
+customizeable using the :code:`-E`/:code:`--environment` flag. I.e. by setting :code:`-E delta=0.1`,
+it is possible to execute in steps of 0.1 time-units. Note how :code:`-t`/:code:`--time` identifies
+the total simulation time, **not** the amount of steps taken.

+ 66 - 0
docs/_build/html/_sources/formalisms/create.rst.txt

@@ -0,0 +1,66 @@
+How To Create Custom Formalisms?
+================================
+Each formalism represents a "block diagram", where components are connected
+via edges. Each edge is defined from a source "port class" to a target
+"port class". Ports usually have unique names to allow for identification and
+are located **inside** the blocks they connect.
+
+New components can be defined by a 1-level hierarchical composition of the
+model. I.e. a set of connected blocks that are "grouped" together.
+
+.. warning::
+    If the target for the code generation of a custom formalism does not
+    comply to the above description, this tool cannot be used.
+    :code:`DrawioConvert` currently only supports the described block diagram
+    structure.
+
+Structure
+---------
+Each formalism corresponds to a package in the :code:`./formalisms` directory.
+There, all additional (re)sources can be added. In the required
+:code:`__init__.py` file, the :code:`setup` variable bust be defined as a
+dictionary, with the following structure (names followed by an asterisk are
+required fields):
+
+* :code:`parser`: All components required for parsing drawio files.
+    * :code:`input class`: The class name used to identify input port in the
+      generated code. Defaults to :code:`"InputPort"`.
+    * :code:`output class`: The class name used to identify output ports in
+      the generated code. Defaults to :code:`"OutputPort"`.
+    * :code:`class object xpath`: The `xpath <https://www.w3.org/TR/xpath/>`_
+      definition of a path which identifies a "class object" in the drawio
+      XML-structure. More specifically, all elements that correspond to that
+      structure will be seen as custom classes. Defaults to:
+      :code:`".//object/mxCell/mxGeometry/mxRectangle/../../..[@class_name]"`.
+    * :code:`class special xpath`: The `xpath <https://www.w3.org/TR/xpath/>`_
+      definition of a path which identifies a "special object" in the drawio
+      XML-structure. More specifically, all elements that correspond to that
+      structure will be seen as elements with additional information for
+      the code generation. For instance, custom imports can be defined this
+      way. Defaults to: :code:`".//object/mxCell/mxGeometry/../..[@role]"`.
+* :code:`generator`: The setup information for the file generation.
+    * :code:`verify`: List of dictionaries that allow for simple assertion
+      checking. Each dictionary has the following elements:
+
+        - :code:`function`\*: A function that takes a single argument (the list
+          of :class:`parser.Node` objects generated from drawio) and returns
+          :code:`False` when the nodes are invalid.
+        - :code:`error`\*: The error message to display when :code:`function`
+          returns :code:`False`.
+    * :code:`ignore`: List of attribute names to ignore.
+    * :code:`environment`: List of allowed environment variables. These will
+      be defined with the :code:`-E`/:code:`--environment` flag.
+    * :code:`templates`: List of template files to be generated. These files
+      are defined by their own dictionaries with the following keys:
+
+        - :code:`filename`\*: The filename of the generated file. The template
+          file name is this value, appended with :code:`.jinja`, located in the
+          same directory as the :code:`__init__.py` file.
+        - :code:`overwrite`: When :code:`True`, this file may be overwritten
+          whenever a generation is called. Defaults to :code:`True`.
+        - :code:`auto`: When :code:`True`, this file will automatically be
+          generated by the script. Otherwise, the :code:`-a`/:code:`--all`
+          flag is required. Defaults to :code:`True`.
+        - :code:`entry`: Boolean value, indicative of whether or not the
+          :code:`-e`/:code:`--entry` flag must be set in order to generate this
+          file. Defaults to :code:`False`.

+ 73 - 0
docs/_build/html/_sources/index.rst.txt

@@ -0,0 +1,73 @@
+.. DrawioConvert documentation master file, created by
+   sphinx-quickstart on Tue Dec 29 15:01:45 2020.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to DrawioConvert's documentation!
+=========================================
+
+:code:`DrawioConvert` is a project that allows conversion from simple, yet
+structured `draw.io <https://www.diagrams.net>`_ diagrams to any kind of file.
+This usually provides a useful entrypoint for visual modelling of models that
+comply to a textual framework.
+
+Or, more specifically, this tool allows for the creation of graphical
+interfaces for code frameworks. Note that, while this tool was written in
+Python, any language is possible thanks to
+`Jinja 2 <https://jinja.palletsprojects.com/en/2.11.x/>`_.
+
+Requirements
+------------
+* Standard Libraries:
+   * :code:`xml` (for :code:`xml.etree.ElementTree`)
+   * :code:`urllib` (for :code:`urllib.parse.unquote`)
+   * :code:`argparse`
+   * :code:`base64`
+   * :code:`os`
+   * :code:`re`
+   * :code:`sys`
+   * :code:`zlib`
+* External Libraries:
+   * `Jinja 2 <https://jinja.palletsprojects.com/en/2.11.x/>`_
+   * Anything else that is required for the converted files to work.
+
+.. warning::
+     :code:`DrawioConvert` does not execute the converted files, but only
+     generates them! The user is required to install all components for the
+     formalisms they like to use themselves.
+
+How Does It Work?
+-----------------
+The core idea behind :code:`DrawioConvert` is the use of so-called "formalisms".
+These are generic descriptions of how certain drawio files can (and should) be
+interpreted. They are provided with some setup information, a few template
+files, a drawio library and some documentation on their usage. From any drawio
+file (made according to the specification identified by the formalism) a new
+one will be generated that is complient with the drawn diagram and the selected
+formalism.
+
+This also allows drawio to be used for any block-based modelling language for
+which a graphical representation can be given and code generation can be
+defined.
+
+Quick Links
+-----------
+.. toctree::
+   :maxdepth: 4
+
+   execute
+   formalisms/create
+
+Builtin Formalisms
+------------------
+.. toctree::
+   :maxdepth: 1
+
+   formalisms/CBD
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`

+ 7 - 0
docs/_build/html/_sources/modules.rst.txt

@@ -0,0 +1,7 @@
+src
+===
+
+.. toctree::
+   :maxdepth: 4
+
+   parser

+ 7 - 0
docs/_build/html/_sources/parser.rst.txt

@@ -0,0 +1,7 @@
+parser module
+=============
+
+.. automodule:: parser
+    :members:
+    :undoc-members:
+    :show-inheritance:

二進制
docs/_build/html/_static/alert_info_32.png


二進制
docs/_build/html/_static/alert_warning_32.png


+ 676 - 0
docs/_build/html/_static/basic.css

@@ -0,0 +1,676 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2019 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%;
+    word-wrap: break-word;
+    overflow-wrap : break-word;
+}
+
+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 #searchbox form.search {
+    overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    float: left;
+    width: 80%;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    float: left;
+    width: 20%;
+    border-left: none;
+    padding: 0.25em;
+    box-sizing: border-box;
+}
+
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- 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%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+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 ul {
+    margin-top: 0;
+    margin-bottom: 0;
+    list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+    padding-left: 0em;
+}
+
+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;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+    padding: 2px;
+    border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+    min-width: 59em;
+    max-width: 70em;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+    -moz-hyphens: auto;
+    -ms-hyphens: auto;
+    -webkit-hyphens: auto;
+    hyphens: auto;
+}
+
+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,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.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.align-center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+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.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;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.field-name {
+    -moz-hyphens: manual;
+    -ms-hyphens: manual;
+    -webkit-hyphens: manual;
+    hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist td {
+    vertical-align: top;
+}
+
+
+/* -- 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, span.highlighted {
+    background-color: #fbe54e;
+}
+
+rect.highlighted {
+    fill: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.sig-paren {
+    font-size: larger;
+}
+
+.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 */
+}
+
+span.pre {
+    -moz-hyphens: none;
+    -ms-hyphens: none;
+    -webkit-hyphens: none;
+    hyphens: none;
+}
+
+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;
+}
+
+div.code-block-caption {
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+div.code-block-caption + div > div.highlight > pre {
+    margin-top: 0;
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper div.highlight {
+    margin: 0;
+}
+
+code.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+code.descclassname {
+    background-color: transparent;
+}
+
+code.xref, a code {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+    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;
+}
+
+span.eqno a.headerlink {
+    position: relative;
+    left: 0px;
+    z-index: 1;
+}
+
+div.math:hover a.headerlink {
+    visibility: visible;
+}
+
+/* -- 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;
+    }
+}

二進制
docs/_build/html/_static/bg-page.png


二進制
docs/_build/html/_static/bullet_orange.png


+ 315 - 0
docs/_build/html/_static/doctools.js

@@ -0,0 +1,315 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+    "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+};
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s === 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node, addItems) {
+    if (node.nodeType === 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 &&
+          !jQuery(node.parentNode).hasClass(className) &&
+          !jQuery(node.parentNode).hasClass("nohighlight")) {
+        var span;
+        var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
+        if (isInSVG) {
+          span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+        } else {
+          span = document.createElement("span");
+          span.className = className;
+        }
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+        if (isInSVG) {
+          var bbox = span.getBBox();
+          var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+       	  rect.x.baseVal.value = bbox.x;
+          rect.y.baseVal.value = bbox.y;
+          rect.width.baseVal.value = bbox.width;
+          rect.height.baseVal.value = bbox.height;
+          rect.setAttribute('class', className);
+          var parentOfText = node.parentNode.parentNode;
+          addItems.push({
+              "parent": node.parentNode,
+              "target": rect});
+        }
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this, addItems);
+      });
+    }
+  }
+  var addItems = [];
+  var result = this.each(function() {
+    highlight(this, addItems);
+  });
+  for (var i = 0; i < addItems.length; ++i) {
+    jQuery(addItems[i].parent).before(addItems[i].target);
+  }
+  return result;
+};
+
+/*
+ * backward compatibility for jQuery.browser
+ * This will be supported until firefox bug is fixed.
+ */
+if (!jQuery.browser) {
+  jQuery.uaMatch = function(ua) {
+    ua = ua.toLowerCase();
+
+    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+      /(msie) ([\w.]+)/.exec(ua) ||
+      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+      [];
+
+    return {
+      browser: match[ 1 ] || "",
+      version: match[ 2 ] || "0"
+    };
+  };
+  jQuery.browser = {};
+  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initIndexTable();
+    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
+      this.initOnKeyListeners();
+    }
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated === 'undefined')
+      return string;
+    return (typeof translated === 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated === 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      if (!body.length) {
+        body = $('body');
+      }
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlighted');
+        });
+      }, 10);
+      $('<p class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+          .appendTo($('#searchbox'));
+    }
+  },
+
+  /**
+   * init the domain index toggle buttons
+   */
+  initIndexTable : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      $('tr.cg-' + idnum).toggle();
+      if (src.substr(-9) === 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('#searchbox .highlight-link').fadeOut(300);
+    $('span.highlighted').removeClass('highlighted');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this === '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  },
+
+  initOnKeyListeners: function() {
+    $(document).keyup(function(event) {
+      var activeElementType = document.activeElement.tagName;
+      // don't navigate when in search box or textarea
+      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
+        switch (event.keyCode) {
+          case 37: // left
+            var prevHref = $('link[rel="prev"]').prop('href');
+            if (prevHref) {
+              window.location.href = prevHref;
+              return false;
+            }
+          case 39: // right
+            var nextHref = $('link[rel="next"]').prop('href');
+            if (nextHref) {
+              window.location.href = nextHref;
+              return false;
+            }
+        }
+      }
+    });
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});

+ 10 - 0
docs/_build/html/_static/documentation_options.js

@@ -0,0 +1,10 @@
+var DOCUMENTATION_OPTIONS = {
+    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
+    VERSION: '0.2',
+    LANGUAGE: 'None',
+    COLLAPSE_INDEX: false,
+    FILE_SUFFIX: '.html',
+    HAS_SOURCE: true,
+    SOURCELINK_SUFFIX: '.txt',
+    NAVIGATION_WITH_KEYS: false,
+};

二進制
docs/_build/html/_static/file.png


+ 376 - 0
docs/_build/html/_static/haiku.css

@@ -0,0 +1,376 @@
+/*
+ * haiku.css_t
+ * ~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- haiku theme.
+ *
+ * Adapted from http://haiku-os.org/docs/Haiku-doc.css.
+ * Original copyright message:
+ *
+ *     Copyright 2008-2009, Haiku. All rights reserved.
+ *     Distributed under the terms of the MIT License.
+ *
+ *     Authors:
+ *              Francois Revol <revol@free.fr>
+ *              Stephan Assmus <superstippi@gmx.de>
+ *              Braden Ewing <brewin@gmail.com>
+ *              Humdinger <humdingerb@gmail.com>
+ *
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+html {
+    margin: 0px;
+    padding: 0px;
+    background: #FFF url(bg-page.png) top left repeat-x;
+}
+
+body {
+    line-height: 1.5;
+    margin: auto;
+    padding: 0px;
+    font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
+    min-width: 59em;
+    max-width: 70em;
+    color: #333333;
+}
+
+div.footer {
+    padding: 8px;
+    font-size: 11px;
+    text-align: center;
+    letter-spacing: 0.5px;
+}
+
+/* link colors and text decoration */
+
+a:link {
+    font-weight: bold;
+    text-decoration: none;
+    color: #dc3c01;
+}
+
+a:visited {
+    font-weight: bold;
+    text-decoration: none;
+    color: #892601;
+}
+
+a:hover, a:active {
+    text-decoration: underline;
+    color: #ff4500;
+}
+
+/* Some headers act as anchors, don't give them a hover effect */
+
+h1 a:hover, a:active {
+    text-decoration: none;
+    color: #0c3762;
+}
+
+h2 a:hover, a:active {
+    text-decoration: none;
+    color: #0c3762;
+}
+
+h3 a:hover, a:active {
+    text-decoration: none;
+    color: #0c3762;
+}
+
+h4 a:hover, a:active {
+    text-decoration: none;
+    color: #0c3762;
+}
+
+a.headerlink {
+    color: #a7ce38;
+    padding-left: 5px;
+}
+
+a.headerlink:hover {
+    color: #a7ce38;
+}
+
+/* basic text elements */
+
+div.content {
+    margin-top: 20px;
+    margin-left: 40px;
+    margin-right: 40px;
+    margin-bottom: 50px;
+    font-size: 0.9em;
+}
+
+/* heading and navigation */
+
+div.header {
+    position: relative;
+    left: 0px;
+    top: 0px;
+    height: 85px;
+    /* background: #eeeeee; */
+    padding: 0 40px;
+}
+div.header h1 {
+    font-size: 1.6em;
+    font-weight: normal;
+    letter-spacing: 1px;
+    color: #0c3762;
+    border: 0;
+    margin: 0;
+    padding-top: 15px;
+}
+div.header h1 a {
+    font-weight: normal;
+    color: #0c3762;
+}
+div.header h2 {
+    font-size: 1.3em;
+    font-weight: normal;
+    letter-spacing: 1px;
+    text-transform: uppercase;
+    color: #aaa;
+    border: 0;
+    margin-top: -3px;
+    padding: 0;
+}
+
+div.header img.rightlogo {
+    float: right;
+}
+
+
+div.title {
+    font-size: 1.3em;
+    font-weight: bold;
+    color: #0c3762;
+    border-bottom: dotted thin #e0e0e0;
+    margin-bottom: 25px;
+}
+div.topnav {
+    /* background: #e0e0e0; */
+}
+div.topnav p {
+    margin-top: 0;
+    margin-left: 40px;
+    margin-right: 40px;
+    margin-bottom: 0px;
+    text-align: right;
+    font-size: 0.8em;
+}
+div.bottomnav {
+    background: #eeeeee;
+}
+div.bottomnav p {
+    margin-right: 40px;
+    text-align: right;
+    font-size: 0.8em;
+}
+
+a.uplink {
+    font-weight: normal;
+}
+
+
+/* contents box */
+
+table.index {
+    margin: 0px 0px 30px 30px;
+    padding: 1px;
+    border-width: 1px;
+    border-style: dotted;
+    border-color: #e0e0e0;
+}
+table.index tr.heading {
+    background-color: #e0e0e0;
+    text-align: center;
+    font-weight: bold;
+    font-size: 1.1em;
+}
+table.index tr.index {
+    background-color: #eeeeee;
+}
+table.index td {
+    padding: 5px 20px;
+}
+
+table.index a:link, table.index a:visited {
+    font-weight: normal;
+    text-decoration: none;
+    color: #dc3c01;
+}
+table.index a:hover, table.index a:active {
+    text-decoration: underline;
+    color: #ff4500;
+}
+
+
+/* Haiku User Guide styles and layout */
+
+/* Rounded corner boxes */
+/* Common declarations */
+div.admonition {
+    -webkit-border-radius: 10px;
+    -khtml-border-radius: 10px;
+    -moz-border-radius: 10px;
+    border-radius: 10px;
+    border-style: dotted;
+    border-width: thin;
+    border-color: #dcdcdc;
+    padding: 10px 15px 10px 15px;
+    margin-bottom: 15px;
+    margin-top: 15px;
+}
+div.note {
+    padding: 10px 15px 10px 80px;
+    background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat;
+    min-height: 42px;
+}
+div.warning {
+    padding: 10px 15px 10px 80px;
+    background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat;
+    min-height: 42px;
+}
+div.seealso {
+    background: #e4ffde;
+}
+
+/* More layout and styles */
+h1 {
+    font-size: 1.3em;
+    font-weight: bold;
+    color: #0c3762;
+    border-bottom: dotted thin #e0e0e0;
+    margin-top: 30px;
+}
+
+h2 {
+    font-size: 1.2em;
+    font-weight: normal;
+    color: #0c3762;
+    border-bottom: dotted thin #e0e0e0;
+    margin-top: 30px;
+}
+
+h3 {
+    font-size: 1.1em;
+    font-weight: normal;
+    color: #0c3762;
+    margin-top: 30px;
+}
+
+h4 {
+    font-size: 1.0em;
+    font-weight: normal;
+    color: #0c3762;
+    margin-top: 30px;
+}
+
+p {
+    text-align: justify;
+}
+
+p.last {
+    margin-bottom: 0;
+}
+
+ol {
+    padding-left: 20px;
+}
+
+ul {
+    padding-left: 5px;
+    margin-top: 3px;
+}
+
+li {
+    line-height: 1.3;
+}
+
+div.content ul > li {
+    -moz-background-clip:border;
+    -moz-background-inline-policy:continuous;
+    -moz-background-origin:padding;
+    background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em;
+    list-style-image: none;
+    list-style-type: none;
+    padding: 0 0 0 1.666em;
+    margin-bottom: 3px;
+}
+
+td {
+    vertical-align: top;
+}
+
+code {
+    background-color: #e2e2e2;
+    font-size: 1.0em;
+    font-family: monospace;
+}
+
+pre {
+    border-color: #0c3762;
+    border-style: dotted;
+    border-width: thin;
+    margin: 0 0 12px 0;
+    padding: 0.8em;
+    background-color: #f0f0f0;
+}
+
+hr {
+    border-top: 1px solid #ccc;
+    border-bottom: 0;
+    border-right: 0;
+    border-left: 0;
+    margin-bottom: 10px;
+    margin-top: 20px;
+}
+
+/* printer only pretty stuff */
+@media print {
+    .noprint {
+        display: none;
+    }
+    /* for acronyms we want their definitions inlined at print time */
+    acronym[title]:after {
+        font-size: small;
+        content: " (" attr(title) ")";
+        font-style: italic;
+    }
+    /* and not have mozilla dotted underline */
+    acronym {
+        border: none;
+    }
+    div.topnav, div.bottomnav, div.header, table.index {
+        display: none;
+    }
+    div.content {
+        margin: 0px;
+        padding: 0px;
+    }
+    html {
+        background: #FFF;
+    }
+}
+
+.viewcode-back {
+    font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+    margin: -1px -10px;
+    padding: 0 12px;
+}
+
+/* math display */
+div.math p {
+    text-align: center;
+}

File diff suppressed because it is too large
+ 10365 - 0
docs/_build/html/_static/jquery.js


+ 297 - 0
docs/_build/html/_static/language_data.js

@@ -0,0 +1,297 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
+
+
+/* Non-minified version JS is _stemmer.js if file is provided */ 
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+
+
+
+var splitChars = (function() {
+    var result = {};
+    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
+         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
+         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
+         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
+         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
+         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
+         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
+         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
+         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
+         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
+    var i, j, start, end;
+    for (i = 0; i < singles.length; i++) {
+        result[singles[i]] = true;
+    }
+    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
+         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
+         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
+         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
+         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
+         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
+         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
+         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
+         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
+         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
+         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
+         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
+         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
+         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
+         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
+         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
+         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
+         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
+         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
+         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
+         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
+         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
+         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
+         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
+         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
+         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
+         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
+         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
+         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
+         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
+         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
+         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
+         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
+         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
+         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
+         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
+         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
+         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
+         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
+         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
+         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
+         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
+         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
+         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
+         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
+         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
+         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
+         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
+         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
+    for (i = 0; i < ranges.length; i++) {
+        start = ranges[i][0];
+        end = ranges[i][1];
+        for (j = start; j <= end; j++) {
+            result[j] = true;
+        }
+    }
+    return result;
+})();
+
+function splitQuery(query) {
+    var result = [];
+    var start = -1;
+    for (var i = 0; i < query.length; i++) {
+        if (splitChars[query.charCodeAt(i)]) {
+            if (start !== -1) {
+                result.push(query.slice(start, i));
+                start = -1;
+            }
+        } else if (start === -1) {
+            start = i;
+        }
+    }
+    if (start !== -1) {
+        result.push(query.slice(start));
+    }
+    return result;
+}
+
+

二進制
docs/_build/html/_static/minus.png


二進制
docs/_build/html/_static/plus.png


+ 71 - 0
docs/_build/html/_static/pygments.css

@@ -0,0 +1,71 @@
+pre { line-height: 125%; margin: 0; }
+td.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }
+td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #ffffff; }
+.highlight .c { color: #aaaaaa; font-style: italic } /* Comment */
+.highlight .err { color: #FF0000; background-color: #FFAAAA } /* Error */
+.highlight .k { color: #0000aa } /* Keyword */
+.highlight .ch { color: #aaaaaa; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #aaaaaa; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #4c8317 } /* Comment.Preproc */
+.highlight .cpf { color: #aaaaaa; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #aaaaaa; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #0000aa; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #aa0000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00aa00 } /* Generic.Inserted */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { color: #0000aa } /* Keyword.Constant */
+.highlight .kd { color: #0000aa } /* Keyword.Declaration */
+.highlight .kn { color: #0000aa } /* Keyword.Namespace */
+.highlight .kp { color: #0000aa } /* Keyword.Pseudo */
+.highlight .kr { color: #0000aa } /* Keyword.Reserved */
+.highlight .kt { color: #00aaaa } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #aa5500 } /* Literal.String */
+.highlight .na { color: #1e90ff } /* Name.Attribute */
+.highlight .nb { color: #00aaaa } /* Name.Builtin */
+.highlight .nc { color: #00aa00; text-decoration: underline } /* Name.Class */
+.highlight .no { color: #aa0000 } /* Name.Constant */
+.highlight .nd { color: #888888 } /* Name.Decorator */
+.highlight .ni { color: #880000; font-weight: bold } /* Name.Entity */
+.highlight .nf { color: #00aa00 } /* Name.Function */
+.highlight .nn { color: #00aaaa; text-decoration: underline } /* Name.Namespace */
+.highlight .nt { color: #1e90ff; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #aa0000 } /* Name.Variable */
+.highlight .ow { color: #0000aa } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #009999 } /* Literal.Number.Bin */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sa { color: #aa5500 } /* Literal.String.Affix */
+.highlight .sb { color: #aa5500 } /* Literal.String.Backtick */
+.highlight .sc { color: #aa5500 } /* Literal.String.Char */
+.highlight .dl { color: #aa5500 } /* Literal.String.Delimiter */
+.highlight .sd { color: #aa5500 } /* Literal.String.Doc */
+.highlight .s2 { color: #aa5500 } /* Literal.String.Double */
+.highlight .se { color: #aa5500 } /* Literal.String.Escape */
+.highlight .sh { color: #aa5500 } /* Literal.String.Heredoc */
+.highlight .si { color: #aa5500 } /* Literal.String.Interpol */
+.highlight .sx { color: #aa5500 } /* Literal.String.Other */
+.highlight .sr { color: #009999 } /* Literal.String.Regex */
+.highlight .s1 { color: #aa5500 } /* Literal.String.Single */
+.highlight .ss { color: #0000aa } /* Literal.String.Symbol */
+.highlight .bp { color: #00aaaa } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #00aa00 } /* Name.Function.Magic */
+.highlight .vc { color: #aa0000 } /* Name.Variable.Class */
+.highlight .vg { color: #aa0000 } /* Name.Variable.Global */
+.highlight .vi { color: #aa0000 } /* Name.Variable.Instance */
+.highlight .vm { color: #aa0000 } /* Name.Variable.Magic */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */

+ 481 - 0
docs/_build/html/_static/searchtools.js

@@ -0,0 +1,481 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+if (!Scorer) {
+  /**
+   * Simple result scoring code.
+   */
+  var Scorer = {
+    // Implement the following function to further tweak the score for each result
+    // The function takes a result array [filename, title, anchor, descr, score]
+    // and returns the new score.
+    /*
+    score: function(result) {
+      return result[4];
+    },
+    */
+
+    // query matches the full name of an object
+    objNameMatch: 11,
+    // or matches in the last dotted part of the object name
+    objPartialMatch: 6,
+    // Additive scores depending on the priority of the object
+    objPrio: {0:  15,   // used to be importantResults
+              1:  5,   // used to be objectResults
+              2: -5},  // used to be unimportantResults
+    //  Used when the priority is not in the mapping.
+    objPrioDefault: 0,
+
+    // query found in title
+    title: 15,
+    // query found in terms
+    term: 5
+  };
+}
+
+if (!splitQuery) {
+  function splitQuery(query) {
+    return query.split(/\s+/);
+  }
+}
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  loadIndex : function(url) {
+    $.ajax({type: "GET", url: url, data: null,
+            dataType: "script", cache: true,
+            complete: function(jqxhr, textstatus) {
+              if (textstatus != "success") {
+                document.getElementById("searchindexloader").src = url;
+              }
+            }});
+  },
+
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      var i;
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    }
+    pulse();
+  },
+
+  /**
+   * perform a search for something (or wait until index is loaded)
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.deferQuery(query);
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  query : function(query) {
+    var i;
+
+    // stem the searchterms and add them to the correct list
+    var stemmer = new Stemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = splitQuery(query);
+    var objectterms = [];
+    for (i = 0; i < tmp.length; i++) {
+      if (tmp[i] !== "") {
+          objectterms.push(tmp[i].toLowerCase());
+      }
+
+      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
+          tmp[i] === "") {
+        // skip this "word"
+        continue;
+      }
+      // stem the word
+      var word = stemmer.stemWord(tmp[i].toLowerCase());
+      // prevent stemmer from cutting word smaller than two chars
+      if(word.length < 3 && tmp[i].length >= 3) {
+        word = tmp[i];
+      }
+      var toAppend;
+      // select the correct list
+      if (word[0] == '-') {
+        toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$u.contains(toAppend, word))
+        toAppend.push(word);
+    }
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    // console.debug('SEARCH: searching for:');
+    // console.info('required: ', searchterms);
+    // console.info('excluded: ', excluded);
+
+    // prepare search
+    var terms = this._index.terms;
+    var titleterms = this._index.titleterms;
+
+    // array of [filename, title, anchor, descr, score]
+    var results = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    for (i = 0; i < objectterms.length; i++) {
+      var others = [].concat(objectterms.slice(0, i),
+                             objectterms.slice(i+1, objectterms.length));
+      results = results.concat(this.performObjectSearch(objectterms[i], others));
+    }
+
+    // lookup as search terms in fulltext
+    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
+
+    // let the scorer override scores with a custom scoring function
+    if (Scorer.score) {
+      for (i = 0; i < results.length; i++)
+        results[i][4] = Scorer.score(results[i]);
+    }
+
+    // now sort the results by score (in opposite order of appearance, since the
+    // display function below uses pop() to retrieve items) and then
+    // alphabetically
+    results.sort(function(a, b) {
+      var left = a[4];
+      var right = b[4];
+      if (left > right) {
+        return 1;
+      } else if (left < right) {
+        return -1;
+      } else {
+        // same score: sort alphabetically
+        left = a[1].toLowerCase();
+        right = b[1].toLowerCase();
+        return (left > right) ? -1 : ((left < right) ? 1 : 0);
+      }
+    });
+
+    // for debugging
+    //Search.lastresults = results.slice();  // a copy
+    //console.info('search results:', Search.lastresults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
+          // dirhtml builder
+          var dirname = item[0] + '/';
+          if (dirname.match(/\/index\/$/)) {
+            dirname = dirname.substring(0, dirname.length-6);
+          } else if (dirname == 'index/') {
+            dirname = '';
+          }
+          listItem.append($('<a/>').attr('href',
+            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
+            highlightstring + item[2]).html(item[1]));
+        } else {
+          // normal html builders
+          listItem.append($('<a/>').attr('href',
+            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+            highlightstring + item[2]).html(item[1]));
+        }
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
+          if (suffix === undefined) {
+            suffix = '.txt';
+          }
+          $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
+                  dataType: "text",
+                  complete: function(jqxhr, textstatus) {
+                    var data = jqxhr.responseText;
+                    if (data !== '' && data !== undefined) {
+                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
+                    }
+                    Search.output.append(listItem);
+                    listItem.slideDown(5, function() {
+                      displayNextItem();
+                    });
+                  }});
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  },
+
+  /**
+   * search for object names
+   */
+  performObjectSearch : function(object, otherterms) {
+    var filenames = this._index.filenames;
+    var docnames = this._index.docnames;
+    var objects = this._index.objects;
+    var objnames = this._index.objnames;
+    var titles = this._index.titles;
+
+    var i;
+    var results = [];
+
+    for (var prefix in objects) {
+      for (var name in objects[prefix]) {
+        var fullname = (prefix ? prefix + '.' : '') + name;
+        if (fullname.toLowerCase().indexOf(object) > -1) {
+          var score = 0;
+          var parts = fullname.split('.');
+          // check for different match types: exact matches of full name or
+          // "last name" (i.e. last dotted part)
+          if (fullname == object || parts[parts.length - 1] == object) {
+            score += Scorer.objNameMatch;
+          // matches in last name
+          } else if (parts[parts.length - 1].indexOf(object) > -1) {
+            score += Scorer.objPartialMatch;
+          }
+          var match = objects[prefix][name];
+          var objname = objnames[match[1]][2];
+          var title = titles[match[0]];
+          // If more than one term searched for, we require other words to be
+          // found in the name/title/description
+          if (otherterms.length > 0) {
+            var haystack = (prefix + ' ' + name + ' ' +
+                            objname + ' ' + title).toLowerCase();
+            var allfound = true;
+            for (i = 0; i < otherterms.length; i++) {
+              if (haystack.indexOf(otherterms[i]) == -1) {
+                allfound = false;
+                break;
+              }
+            }
+            if (!allfound) {
+              continue;
+            }
+          }
+          var descr = objname + _(', in ') + title;
+
+          var anchor = match[3];
+          if (anchor === '')
+            anchor = fullname;
+          else if (anchor == '-')
+            anchor = objnames[match[1]][1] + '-' + fullname;
+          // add custom score for some objects according to scorer
+          if (Scorer.objPrio.hasOwnProperty(match[2])) {
+            score += Scorer.objPrio[match[2]];
+          } else {
+            score += Scorer.objPrioDefault;
+          }
+          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
+        }
+      }
+    }
+
+    return results;
+  },
+
+  /**
+   * search for full-text terms in the index
+   */
+  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
+    var docnames = this._index.docnames;
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+
+    var i, j, file;
+    var fileMap = {};
+    var scoreMap = {};
+    var results = [];
+
+    // perform the search on the required terms
+    for (i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      var files = [];
+      var _o = [
+        {files: terms[word], score: Scorer.term},
+        {files: titleterms[word], score: Scorer.title}
+      ];
+
+      // no match but word was a required one
+      if ($u.every(_o, function(o){return o.files === undefined;})) {
+        break;
+      }
+      // found search word in contents
+      $u.each(_o, function(o) {
+        var _files = o.files;
+        if (_files === undefined)
+          return
+
+        if (_files.length === undefined)
+          _files = [_files];
+        files = files.concat(_files);
+
+        // set score for the word in each file to Scorer.term
+        for (j = 0; j < _files.length; j++) {
+          file = _files[j];
+          if (!(file in scoreMap))
+            scoreMap[file] = {}
+          scoreMap[file][word] = o.score;
+        }
+      });
+
+      // create the mapping
+      for (j = 0; j < files.length; j++) {
+        file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+          continue;
+
+      // ensure that none of the excluded terms is in the search result
+      for (i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            titleterms[excluded[i]] == file ||
+            $u.contains(terms[excluded[i]] || [], file) ||
+            $u.contains(titleterms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it to the result list
+      if (valid) {
+        // select one (max) score for the file.
+        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
+        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
+        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
+      }
+    }
+    return results;
+  },
+
+  /**
+   * helper function to return a node containing the
+   * search summary for a given text. keywords is a list
+   * of stemmed words, hlwords is the list of normal, unstemmed
+   * words. the first one is used to find the occurrence, the
+   * latter for highlighting it.
+   */
+  makeSearchSummary : function(text, keywords, hlwords) {
+    var textLower = text.toLowerCase();
+    var start = 0;
+    $.each(keywords, function() {
+      var i = textLower.indexOf(this.toLowerCase());
+      if (i > -1)
+        start = i;
+    });
+    start = Math.max(start - 120, 0);
+    var excerpt = ((start > 0) ? '...' : '') +
+      $.trim(text.substr(start, 240)) +
+      ((start + 240 - text.length) ? '...' : '');
+    var rv = $('<div class="context"></div>').text(excerpt);
+    $.each(hlwords, function() {
+      rv = rv.highlightText(this, 'highlighted');
+    });
+    return rv;
+  }
+};
+
+$(document).ready(function() {
+  Search.init();
+});

+ 13 - 0
docs/_build/html/_static/styles.css

@@ -0,0 +1,13 @@
+table.table-center {
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+}
+
+table.table-center td {
+    border-bottom: none;
+}
+
+table.table-center p.caption {
+    text-align: center;
+}

File diff suppressed because it is too large
+ 1692 - 0
docs/_build/html/_static/underscore.js


+ 144 - 0
docs/_build/html/execute.html

@@ -0,0 +1,144 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>How to Execute DrawioConvert? &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="How To Create Custom Formalisms?" href="formalisms/create.html" />
+    <link rel="prev" title="Welcome to DrawioConvert’s documentation!" href="index.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>How to Execute DrawioConvert?</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        «&#160;&#160;<a href="index.html">Welcome to DrawioConvert’s documentation!</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="index.html">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="formalisms/create.html">How To Create Custom Formalisms?</a>&#160;&#160;»
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="how-to-execute-drawioconvert">
+<h1>How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?<a class="headerlink" href="#how-to-execute-drawioconvert" title="Permalink to this headline">¶</a></h1>
+<p>The execution for <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> is simple:</p>
+<div class="code highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="n">__main__</span><span class="o">.</span><span class="n">py</span> <span class="o">&lt;</span><span class="n">INPUT</span><span class="o">&gt;</span> <span class="p">[</span><span class="n">ARGS</span><span class="p">]</span>
+</pre></div>
+</div>
+<p>Where <code class="code docutils literal notranslate"><span class="pre">&lt;INPUT&gt;</span></code> represents the drawio file to parse and <code class="code docutils literal notranslate"><span class="pre">[ARGS]</span></code>
+any combination of the commandline arguments that can be used with this tool.</p>
+<div class="section" id="commandline-arguments">
+<h2>Commandline Arguments<a class="headerlink" href="#commandline-arguments" title="Permalink to this headline">¶</a></h2>
+<table border="1" class="colwidths-given docutils">
+<colgroup>
+<col width="18%" />
+<col width="27%" />
+<col width="55%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Short Flag</th>
+<th class="head">Long Flag</th>
+<th class="head">Description</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td><code class="code docutils literal notranslate"><span class="pre">-F</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--formalism</span></code></td>
+<td>The formalism for which files must be generated. This argument is
+required.</td>
+</tr>
+<tr class="row-odd"><td><code class="code docutils literal notranslate"><span class="pre">-e</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--entry</span></code></td>
+<td>The topmost class to use in the simulation. May be required for some
+formalisms, where simulation is top-level dependent.</td>
+</tr>
+<tr class="row-even"><td><code class="code docutils literal notranslate"><span class="pre">t</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--time</span></code></td>
+<td>Total simulation time to use. Should only be set for experiment
+files. Defaults to <code class="code docutils literal notranslate"><span class="pre">10</span></code> (time-units). While this flag is meant
+to indicate the total time, some formalisms may use this as the
+allowed amount of simulation steps.</td>
+</tr>
+<tr class="row-odd"><td><code class="code docutils literal notranslate"><span class="pre">-L</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--list</span></code></td>
+<td>Lists the available formalisms that can be used.</td>
+</tr>
+<tr class="row-even"><td><code class="code docutils literal notranslate"><span class="pre">-s</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--skip</span></code></td>
+<td>Sometimes a visual model has some “placeholders” for future classes.
+By default, these are generated as well, even if no contents are given.
+The <code class="code docutils literal notranslate"><span class="pre">--skip</span></code> flag changes this behaviour by skipping empty blocks
+in the generation.</td>
+</tr>
+<tr class="row-odd"><td><code class="code docutils literal notranslate"><span class="pre">-d</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--directory</span></code></td>
+<td>The location where the files should be generated. Defaults to <code class="code docutils literal notranslate"><span class="pre">./</span></code>
+(the current directory).</td>
+</tr>
+<tr class="row-even"><td><code class="code docutils literal notranslate"><span class="pre">-f</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--force</span></code></td>
+<td>Some formalisms may mark certain files as “protected”. This is usually
+done to prevent accidental removal of user code when programming
+experiments. Hence, these files cannot be overwritten by the tool, unless
+this flag is set.</td>
+</tr>
+<tr class="row-odd"><td><code class="code docutils literal notranslate"><span class="pre">-a</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--all</span></code></td>
+<td>Each formalism has their default set of files to be generated. However,
+there may be some experimental or additional files that not all users
+need. This flag allows the generation of <strong>all</strong> files of the formalism.</td>
+</tr>
+<tr class="row-even"><td><code class="code docutils literal notranslate"><span class="pre">-v</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--verbose</span></code></td>
+<td>Prints additional debugging information.</td>
+</tr>
+<tr class="row-odd"><td><code class="code docutils literal notranslate"><span class="pre">-E</span></code></td>
+<td><code class="code docutils literal notranslate"><span class="pre">--enviroment</span></code></td>
+<td>Occasionally, formalisms need other properties that can be set by the
+user. This flag takes a comma-separated list of <code class="code docutils literal notranslate"><span class="pre">key=value</span></code> pairs
+and applies them to the formalism specifics.</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        «&#160;&#160;<a href="index.html">Welcome to DrawioConvert’s documentation!</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="index.html">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="formalisms/create.html">How To Create Custom Formalisms?</a>&#160;&#160;»
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 231 - 0
docs/_build/html/formalisms/CBD.html

@@ -0,0 +1,231 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>CBD Formalism &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="../_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="../_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+    <script type="text/javascript" src="../_static/jquery.js"></script>
+    <script type="text/javascript" src="../_static/underscore.js"></script>
+    <script type="text/javascript" src="../_static/doctools.js"></script>
+    <script type="text/javascript" src="../_static/language_data.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="prev" title="How To Create Custom Formalisms?" href="create.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="../index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>CBD Formalism</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        «&#160;&#160;<a href="create.html">How To Create Custom Formalisms?</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="../index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="cbd-formalism">
+<h1>CBD Formalism<a class="headerlink" href="#cbd-formalism" title="Permalink to this headline">¶</a></h1>
+<p>Causal Block Diagrams allow for finding solutions to mathematical problems.</p>
+<div class="section" id="setting-up-drawio">
+<h2>Setting up Drawio<a class="headerlink" href="#setting-up-drawio" title="Permalink to this headline">¶</a></h2>
+<p>In drawio, select <span class="menuselection">File ‣ Open Library</span> and load <code class="file docutils literal notranslate"><span class="pre">CBDLibrary.xml</span></code>
+(which can be found <a class="reference download internal" download="" href="../_downloads/9ae1485408cab692c778396ba5bd1b19/CBDLibrary.xml"><code class="xref download docutils literal notranslate"><span class="pre">here</span></code></a>).
+This provides a set of primitive CBD blocks that can be used in your models.
+Once included, it can be found at the top of the shapes library.</p>
+<table border="1" class="table-center docutils">
+<colgroup>
+<col width="100%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><div class="first last figure" id="id1">
+<img alt="../_images/library.png" src="../_images/library.png" />
+<p class="caption"><span class="caption-text">CBD Library in the Sidebar</span></p>
+</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="block-properties">
+<span id="block-props"></span><h2>Block Properties<a class="headerlink" href="#block-properties" title="Permalink to this headline">¶</a></h2>
+<p>All blocks in the library have some block-specific properties that can be set by the user.
+Hovering over a component shows all non-empty properties that were set on this shape.</p>
+<p>There are several ways of accessing/modifying these properties:</p>
+<ul class="simple">
+<li>Double Click with the left mouse button on a shape.</li>
+<li>Click with right mouse button to open a shape’s context menu.
+Near the bottom of the list, select <span class="menuselection">Edit Data</span>.</li>
+<li>Select the shape (left mouse button) and in the top of the right panel,
+go to <span class="menuselection">Arrange ‣ Edit Data</span>.</li>
+<li>Select the shape and press <kbd class="kbd docutils literal notranslate">CTRL + M</kbd> or <kbd class="kbd docutils literal notranslate">CMND + M</kbd>.</li>
+</ul>
+<div class="admonition warning">
+<p class="first admonition-title">Warning</p>
+<p class="last">Do not change the <code class="code docutils literal notranslate"><span class="pre">class_name</span></code> as the converter relies on this property.</p>
+</div>
+<table border="1" class="table-center docutils">
+<colgroup>
+<col width="100%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><div class="first last figure" id="id2">
+<img alt="../_images/properties.png" src="../_images/properties.png" />
+<p class="caption"><span class="caption-text">Example of the Property Window (for a
+ConstantBlock)</span></p>
+</div>
+</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="working-with-library-blocks">
+<span id="library"></span><h2>Working with Library Blocks<a class="headerlink" href="#working-with-library-blocks" title="Permalink to this headline">¶</a></h2>
+<p>To guarantee a consistent visual appearance of CBD models,
+no blocks in the library, except for the Custom Block, can be resized.
+Every block has zero or more input and output ports. Input ports are represented by
+the <code class="code docutils literal notranslate"><span class="pre">InputPortBlock</span></code> (black triangle) and output ports by the <code class="code docutils literal notranslate"><span class="pre">OutputPortBlock</span></code>
+(white triangle). When selecting (left mouse button) a port, a small, movable,
+yellow/orange diamond-shaped anchor will appear in front of the port’s name.
+The position of this label can be changed by dragging the anchor.
+The port name can be altered in the <span class="menuselection">Edit Data</span> window.</p>
+<p>Each CBD block that is <em>not</em> a port may have the following properties:</p>
+<ul>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">ID</span></code> or <code class="code docutils literal notranslate"><span class="pre">id</span></code>: The drawio unique ID for this block. Note that drawio automatically
+overwrites a property with the key <code class="code docutils literal notranslate"><span class="pre">id</span></code> by the value shown by <code class="code docutils literal notranslate"><span class="pre">ID</span></code> (upon saving the diagram).</p>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">block_name</span></code>: The name of the block. It is required that
+all blocks have a unique name within a class. When omitted, the <code class="code docutils literal notranslate"><span class="pre">ID</span></code> is used.</p>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">class_name</span></code>: The type of block.</p>
+<div class="admonition warning">
+<p class="first admonition-title">Warning</p>
+<p class="last">Do not change the <code class="code docutils literal notranslate"><span class="pre">class_name</span></code> as the converter relies on this property.
+Changing it makes it so the block type changes as well in the simulation.</p>
+</div>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">symbol</span></code>: The block symbol that must be rendered by MathJax/LaTeX. This is a purely
+graphical attribute and is ignored by the script.</p>
+</li>
+</ul>
+<p>Optionally, additional class parameters can be provided by adding more properties.
+Their values will be passed on as default values for the corresponding property as an argument, e.g., to
+use strings, enclose the value in “…” or ‘…’, for <code class="code docutils literal notranslate"><span class="pre">None</span></code>, leave it empty or litterally type
+“<code class="code docutils literal notranslate"><span class="pre">None</span></code>”…</p>
+<div class="admonition warning">
+<p class="first admonition-title">Warning</p>
+<p class="last">Make sure these values are expressions/rvalues! If not, the generated Python file will crash,
+or cause some unexpected behavior. Furthermore, newlines may not be used in these values.</p>
+</div>
+<p>Class parameters that cannot be used are: <code class="code docutils literal notranslate"><span class="pre">label</span></code> (prevented by drawio), <code class="code docutils literal notranslate"><span class="pre">id</span></code> (overwritten by
+drawio), <code class="code docutils literal notranslate"><span class="pre">placeholders</span></code> (prevented by drawio), <code class="code docutils literal notranslate"><span class="pre">symbol</span></code> (ignored by the converter)
+and <code class="code docutils literal notranslate"><span class="pre">__docstring__</span></code> (used for other purposes, see later).</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Blocks with a variable number of inputs (i.e., the <code class="code docutils literal notranslate"><span class="pre">OrBlock</span></code> and the
+<code class="code docutils literal notranslate"><span class="pre">AndBlock</span></code>) may still need additional ports to be placed/removed.</p>
+</div>
+</div>
+<div class="section" id="creating-custom-cbd-blocks">
+<span id="custom-block"></span><h2>Creating Custom CBD Blocks<a class="headerlink" href="#creating-custom-cbd-blocks" title="Permalink to this headline">¶</a></h2>
+<p>A custom hierarchical CBD block is constructed as a network of already provided blocks
+(which in their own right may be custom hierarchical blocks)
+using the <code class="code docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">Block</span></code> element from <code class="file docutils literal notranslate"><span class="pre">CBDLibrary.xml</span></code>.
+This is a collapsible component in which a block diagram may be drawn.
+It has two important properties:</p>
+<ul class="simple">
+<li><code class="code docutils literal notranslate"><span class="pre">class_name</span></code>: The new class name for the custom block. Note that all class names must be unique!</li>
+<li><code class="code docutils literal notranslate"><span class="pre">block_name</span></code>: The name of an instance of the CBD model if it’s the top-level CBD.</li>
+</ul>
+<p>Additional properties can be added to create custom class parameters.
+The same set of parameters that was discussed above cannot be set,
+with the exception of <code class="code docutils literal notranslate"><span class="pre">__docstring__</span></code>, which now allows adding documentation to custom blocks.</p>
+<p>The empty rectangle is a container for the custom hierachical block.
+Blocks can be dragged into the rectangular area and connected.
+<code class="code docutils literal notranslate"><span class="pre">InputPortBlock</span></code> and <code class="code docutils literal notranslate"><span class="pre">OutputPortBlock</span></code> are used to add inputs and outputs with
+their <code class="code docutils literal notranslate"><span class="pre">name</span></code> property set to the port’s name.</p>
+<div class="admonition hint">
+<p class="first admonition-title">Hint</p>
+<p class="last">The <code class="code docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">Block</span></code> component can, in constrast with all other blocks in the
+library, be resized. This allows for larger hierarchical models to be created, as the
+basic blocks cannot be resized.</p>
+</div>
+<table border="1" class="table-center docutils">
+<colgroup>
+<col width="100%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><div class="first last figure" id="id3">
+<img alt="../_images/custom-block.png" src="../_images/custom-block.png" />
+<p class="caption"><span class="caption-text">Custom Sine Generator Block with no
+Input Ports, a single Output Port and
+a Custom Graphical Representation</span></p>
+</div>
+</td>
+</tr>
+</tbody>
+</table>
+<p>Next, create a graphical representation of the block (i.e., what an instance
+block should look like when used in a block diagram), add the corresponding
+ports and set the property <code class="code docutils literal notranslate"><span class="pre">class_name</span></code> to the same class as that set in the
+<code class="code docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">Block</span></code>. Make sure not to forget to add any class parameters that were
+added to the <code class="code docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">Block</span></code>.</p>
+<div class="admonition hint">
+<p class="first admonition-title">Hint</p>
+<p class="last">This can be done easily by adding a predefined block and changing its
+ports and properties to match the new custom block.</p>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Only the <code class="code docutils literal notranslate"><span class="pre">Custom</span> <span class="pre">Block</span></code> components will be read by the converter.
+Anything else is implicitly ignored. Furthermore, the script is page-independent,
+meaning multiple pages may be used inside a single drawio document to maintain a
+clean overview of the created models.</p>
+</div>
+</div>
+<div class="section" id="conversion">
+<h2>Conversion<a class="headerlink" href="#conversion" title="Permalink to this headline">¶</a></h2>
+<p>To generate code from the created drawio files, execute the script with the <code class="code docutils literal notranslate"><span class="pre">-F</span> <span class="pre">CBD</span></code> flag.
+This tells <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> to use the CBD formalism. Two files will be created:</p>
+<ul class="simple">
+<li><code class="code docutils literal notranslate"><span class="pre">model.py</span></code>: The model file, containing the code for the modelled blocks.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">experiment.py</span></code>: The “protected” experiment file. You can feely add/remove parts of this file
+without fear of it being overwritten next execution. Use the <code class="code docutils literal notranslate"><span class="pre">-f</span></code>/<code class="code docutils literal notranslate"><span class="pre">--force</span></code> flag to
+force overwrite the file.</li>
+</ul>
+<p>It is possible to use continuous models, where they are discretized to a certain delta. This is
+customizeable using the <code class="code docutils literal notranslate"><span class="pre">-E</span></code>/<code class="code docutils literal notranslate"><span class="pre">--environment</span></code> flag. I.e. by setting <code class="code docutils literal notranslate"><span class="pre">-E</span> <span class="pre">delta=0.1</span></code>,
+it is possible to execute in steps of 0.1 time-units. Note how <code class="code docutils literal notranslate"><span class="pre">-t</span></code>/<code class="code docutils literal notranslate"><span class="pre">--time</span></code> identifies
+the total simulation time, <strong>not</strong> the amount of steps taken.</p>
+</div>
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        «&#160;&#160;<a href="create.html">How To Create Custom Formalisms?</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="../index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 151 - 0
docs/_build/html/formalisms/create.html

@@ -0,0 +1,151 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>How To Create Custom Formalisms? &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="../_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="../_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+    <script type="text/javascript" src="../_static/jquery.js"></script>
+    <script type="text/javascript" src="../_static/underscore.js"></script>
+    <script type="text/javascript" src="../_static/doctools.js"></script>
+    <script type="text/javascript" src="../_static/language_data.js"></script>
+    <link rel="index" title="Index" href="../genindex.html" />
+    <link rel="search" title="Search" href="../search.html" />
+    <link rel="next" title="CBD Formalism" href="CBD.html" />
+    <link rel="prev" title="How to Execute DrawioConvert?" href="../execute.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="../index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>How To Create Custom Formalisms?</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        «&#160;&#160;<a href="../execute.html">How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="../index.html">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="CBD.html">CBD Formalism</a>&#160;&#160;»
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="how-to-create-custom-formalisms">
+<h1>How To Create Custom Formalisms?<a class="headerlink" href="#how-to-create-custom-formalisms" title="Permalink to this headline">¶</a></h1>
+<p>Each formalism represents a “block diagram”, where components are connected
+via edges. Each edge is defined from a source “port class” to a target
+“port class”. Ports usually have unique names to allow for identification and
+are located <strong>inside</strong> the blocks they connect.</p>
+<p>New components can be defined by a 1-level hierarchical composition of the
+model. I.e. a set of connected blocks that are “grouped” together.</p>
+<div class="admonition warning">
+<p class="first admonition-title">Warning</p>
+<p class="last">If the target for the code generation of a custom formalism does not
+comply to the above description, this tool cannot be used.
+<code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> currently only supports the described block diagram
+structure.</p>
+</div>
+<div class="section" id="structure">
+<h2>Structure<a class="headerlink" href="#structure" title="Permalink to this headline">¶</a></h2>
+<p>Each formalism corresponds to a package in the <code class="code docutils literal notranslate"><span class="pre">./formalisms</span></code> directory.
+There, all additional (re)sources can be added. In the required
+<code class="code docutils literal notranslate"><span class="pre">__init__.py</span></code> file, the <code class="code docutils literal notranslate"><span class="pre">setup</span></code> variable bust be defined as a
+dictionary, with the following structure (names followed by an asterisk are
+required fields):</p>
+<ul>
+<li><dl class="first docutils">
+<dt><code class="code docutils literal notranslate"><span class="pre">parser</span></code>: All components required for parsing drawio files.</dt>
+<dd><ul class="first last simple">
+<li><code class="code docutils literal notranslate"><span class="pre">input</span> <span class="pre">class</span></code>: The class name used to identify input port in the
+generated code. Defaults to <code class="code docutils literal notranslate"><span class="pre">&quot;InputPort&quot;</span></code>.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">output</span> <span class="pre">class</span></code>: The class name used to identify output ports in
+the generated code. Defaults to <code class="code docutils literal notranslate"><span class="pre">&quot;OutputPort&quot;</span></code>.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">class</span> <span class="pre">object</span> <span class="pre">xpath</span></code>: The <a class="reference external" href="https://www.w3.org/TR/xpath/">xpath</a>
+definition of a path which identifies a “class object” in the drawio
+XML-structure. More specifically, all elements that correspond to that
+structure will be seen as custom classes. Defaults to:
+<code class="code docutils literal notranslate"><span class="pre">&quot;.//object/mxCell/mxGeometry/mxRectangle/../../..[&#64;class_name]&quot;</span></code>.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">class</span> <span class="pre">special</span> <span class="pre">xpath</span></code>: The <a class="reference external" href="https://www.w3.org/TR/xpath/">xpath</a>
+definition of a path which identifies a “special object” in the drawio
+XML-structure. More specifically, all elements that correspond to that
+structure will be seen as elements with additional information for
+the code generation. For instance, custom imports can be defined this
+way. Defaults to: <code class="code docutils literal notranslate"><span class="pre">&quot;.//object/mxCell/mxGeometry/../..[&#64;role]&quot;</span></code>.</li>
+</ul>
+</dd>
+</dl>
+</li>
+<li><dl class="first docutils">
+<dt><code class="code docutils literal notranslate"><span class="pre">generator</span></code>: The setup information for the file generation.</dt>
+<dd><ul class="first last">
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">verify</span></code>: List of dictionaries that allow for simple assertion
+checking. Each dictionary has the following elements:</p>
+<blockquote>
+<div><ul class="simple">
+<li><code class="code docutils literal notranslate"><span class="pre">function</span></code>*: A function that takes a single argument (the list
+of <a class="reference internal" href="../parser.html#parser.Node" title="parser.Node"><code class="xref py py-class docutils literal notranslate"><span class="pre">parser.Node</span></code></a> objects generated from drawio) and returns
+<code class="code docutils literal notranslate"><span class="pre">False</span></code> when the nodes are invalid.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">error</span></code>*: The error message to display when <code class="code docutils literal notranslate"><span class="pre">function</span></code>
+returns <code class="code docutils literal notranslate"><span class="pre">False</span></code>.</li>
+</ul>
+</div></blockquote>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">ignore</span></code>: List of attribute names to ignore.</p>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">environment</span></code>: List of allowed environment variables. These will
+be defined with the <code class="code docutils literal notranslate"><span class="pre">-E</span></code>/<code class="code docutils literal notranslate"><span class="pre">--environment</span></code> flag.</p>
+</li>
+<li><p class="first"><code class="code docutils literal notranslate"><span class="pre">templates</span></code>: List of template files to be generated. These files
+are defined by their own dictionaries with the following keys:</p>
+<blockquote>
+<div><ul class="simple">
+<li><code class="code docutils literal notranslate"><span class="pre">filename</span></code>*: The filename of the generated file. The template
+file name is this value, appended with <code class="code docutils literal notranslate"><span class="pre">.jinja</span></code>, located in the
+same directory as the <code class="code docutils literal notranslate"><span class="pre">__init__.py</span></code> file.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">overwrite</span></code>: When <code class="code docutils literal notranslate"><span class="pre">True</span></code>, this file may be overwritten
+whenever a generation is called. Defaults to <code class="code docutils literal notranslate"><span class="pre">True</span></code>.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">auto</span></code>: When <code class="code docutils literal notranslate"><span class="pre">True</span></code>, this file will automatically be
+generated by the script. Otherwise, the <code class="code docutils literal notranslate"><span class="pre">-a</span></code>/<code class="code docutils literal notranslate"><span class="pre">--all</span></code>
+flag is required. Defaults to <code class="code docutils literal notranslate"><span class="pre">True</span></code>.</li>
+<li><code class="code docutils literal notranslate"><span class="pre">entry</span></code>: Boolean value, indicative of whether or not the
+<code class="code docutils literal notranslate"><span class="pre">-e</span></code>/<code class="code docutils literal notranslate"><span class="pre">--entry</span></code> flag must be set in order to generate this
+file. Defaults to <code class="code docutils literal notranslate"><span class="pre">False</span></code>.</li>
+</ul>
+</div></blockquote>
+</li>
+</ul>
+</dd>
+</dl>
+</li>
+</ul>
+</div>
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        «&#160;&#160;<a href="../execute.html">How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?</a>
+        &#160;&#160;::&#160;&#160;
+        <a class="uplink" href="../index.html">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="CBD.html">CBD Formalism</a>&#160;&#160;»
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 151 - 0
docs/_build/html/genindex.html

@@ -0,0 +1,151 @@
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Index &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="#" />
+    <link rel="search" title="Search" href="search.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>Index</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ <a href="#A"><strong>A</strong></a>
+ | <a href="#C"><strong>C</strong></a>
+ | <a href="#D"><strong>D</strong></a>
+ | <a href="#G"><strong>G</strong></a>
+ | <a href="#I"><strong>I</strong></a>
+ | <a href="#N"><strong>N</strong></a>
+ | <a href="#P"><strong>P</strong></a>
+ 
+</div>
+<h2 id="A">A</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node.add_connection">add_connection() (parser.Node method)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node.add_input">add_input() (parser.Node method)</a>
+</li>
+      <li><a href="parser.html#parser.Node.add_output">add_output() (parser.Node method)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="C">C</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Parser.create_node">create_node() (parser.Parser method)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="D">D</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Parser.decode_and_deflate">decode_and_deflate() (parser.Parser static method)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="G">G</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node.get_connections">get_connections() (parser.Node method)</a>
+</li>
+      <li><a href="parser.html#parser.Parser.get_imports">get_imports() (parser.Parser method)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node.get_inputs">get_inputs() (parser.Node method)</a>
+</li>
+      <li><a href="parser.html#parser.Node.get_outputs">get_outputs() (parser.Node method)</a>
+</li>
+      <li><a href="parser.html#parser.Node.get_properties_string">get_properties_string() (parser.Node method)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="I">I</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.IGNORE">IGNORE (in module parser)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node.is_empty">is_empty() (parser.Node method)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="N">N</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Node">Node (class in parser)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+<h2 id="P">P</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.Parser.parse">parse() (parser.Parser method)</a>
+</li>
+      <li><a href="parser.html#parser.parse_environment">parse_environment() (in module parser)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="parser.html#parser.ParseException">ParseException</a>
+</li>
+      <li><a href="parser.html#parser.Parser">Parser (class in parser)</a>
+</li>
+      <li><a href="parser.html#module-parser">parser (module)</a>
+</li>
+  </ul></td>
+</tr></table>
+
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 146 - 0
docs/_build/html/index.html

@@ -0,0 +1,146 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Welcome to DrawioConvert’s documentation! &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+    <link rel="next" title="How to Execute DrawioConvert?" href="execute.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="#">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>Welcome to DrawioConvert’s documentation!</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="#">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="execute.html">How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?</a>&#160;&#160;»
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="welcome-to-drawioconvert-s-documentation">
+<h1>Welcome to DrawioConvert’s documentation!<a class="headerlink" href="#welcome-to-drawioconvert-s-documentation" title="Permalink to this headline">¶</a></h1>
+<p><code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> is a project that allows conversion from simple, yet
+structured <a class="reference external" href="https://www.diagrams.net">draw.io</a> diagrams to any kind of file.
+This usually provides a useful entrypoint for visual modelling of models that
+comply to a textual framework.</p>
+<p>Or, more specifically, this tool allows for the creation of graphical
+interfaces for code frameworks. Note that, while this tool was written in
+Python, any language is possible thanks to
+<a class="reference external" href="https://jinja.palletsprojects.com/en/2.11.x/">Jinja 2</a>.</p>
+<div class="section" id="requirements">
+<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li><dl class="first docutils">
+<dt>Standard Libraries:</dt>
+<dd><ul class="first last">
+<li><code class="code docutils literal notranslate"><span class="pre">xml</span></code> (for <code class="code docutils literal notranslate"><span class="pre">xml.etree.ElementTree</span></code>)</li>
+<li><code class="code docutils literal notranslate"><span class="pre">urllib</span></code> (for <code class="code docutils literal notranslate"><span class="pre">urllib.parse.unquote</span></code>)</li>
+<li><code class="code docutils literal notranslate"><span class="pre">argparse</span></code></li>
+<li><code class="code docutils literal notranslate"><span class="pre">base64</span></code></li>
+<li><code class="code docutils literal notranslate"><span class="pre">os</span></code></li>
+<li><code class="code docutils literal notranslate"><span class="pre">re</span></code></li>
+<li><code class="code docutils literal notranslate"><span class="pre">sys</span></code></li>
+<li><code class="code docutils literal notranslate"><span class="pre">zlib</span></code></li>
+</ul>
+</dd>
+</dl>
+</li>
+<li><dl class="first docutils">
+<dt>External Libraries:</dt>
+<dd><ul class="first last">
+<li><a class="reference external" href="https://jinja.palletsprojects.com/en/2.11.x/">Jinja 2</a></li>
+<li>Anything else that is required for the converted files to work.</li>
+</ul>
+</dd>
+</dl>
+</li>
+</ul>
+<div class="admonition warning">
+<p class="first admonition-title">Warning</p>
+<p class="last"><code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> does not execute the converted files, but only
+generates them! The user is required to install all components for the
+formalisms they like to use themselves.</p>
+</div>
+</div>
+<div class="section" id="how-does-it-work">
+<h2>How Does It Work?<a class="headerlink" href="#how-does-it-work" title="Permalink to this headline">¶</a></h2>
+<p>The core idea behind <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code> is the use of so-called “formalisms”.
+These are generic descriptions of how certain drawio files can (and should) be
+interpreted. They are provided with some setup information, a few template
+files, a drawio library and some documentation on their usage. From any drawio
+file (made according to the specification identified by the formalism) a new
+one will be generated that is complient with the drawn diagram and the selected
+formalism.</p>
+<p>This also allows drawio to be used for any block-based modelling language for
+which a graphical representation can be given and code generation can be
+defined.</p>
+</div>
+<div class="section" id="quick-links">
+<h2>Quick Links<a class="headerlink" href="#quick-links" title="Permalink to this headline">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="execute.html">How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="execute.html#commandline-arguments">Commandline Arguments</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="formalisms/create.html">How To Create Custom Formalisms?</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="formalisms/create.html#structure">Structure</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div class="section" id="builtin-formalisms">
+<h2>Builtin Formalisms<a class="headerlink" href="#builtin-formalisms" title="Permalink to this headline">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="formalisms/CBD.html">CBD Formalism</a></li>
+</ul>
+</div>
+</div>
+</div>
+<div class="section" id="indices-and-tables">
+<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></li>
+<li><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></li>
+<li><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></li>
+</ul>
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="#">Contents</a>
+        &#160;&#160;::&#160;&#160;
+        <a href="execute.html">How to Execute <code class="code docutils literal notranslate"><span class="pre">DrawioConvert</span></code>?</a>&#160;&#160;»
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 59 - 0
docs/_build/html/modules.html

@@ -0,0 +1,59 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>src &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>src</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="src">
+<h1>src<a class="headerlink" href="#src" title="Permalink to this headline">¶</a></h1>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="parser.html">parser module</a></li>
+</ul>
+</div>
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

二進制
docs/_build/html/objects.inv


+ 161 - 0
docs/_build/html/parser.html

@@ -0,0 +1,161 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>parser module &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" /> 
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>parser module</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <div class="section" id="module-parser">
+<span id="parser-module"></span><h1>parser module<a class="headerlink" href="#module-parser" title="Permalink to this headline">¶</a></h1>
+<p>Test</p>
+<dl class="data">
+<dt id="parser.IGNORE">
+<code class="descclassname">parser.</code><code class="descname">IGNORE</code><em class="property"> = ['id', 'label', 'placeholders', 'signal', 'class_name']</em><a class="headerlink" href="#parser.IGNORE" title="Permalink to this definition">¶</a></dt>
+<dd><p>Properties to ignore when parsing.</p>
+</dd></dl>
+
+<dl class="class">
+<dt id="parser.Node">
+<em class="property">class </em><code class="descclassname">parser.</code><code class="descname">Node</code><span class="sig-paren">(</span><em>id</em>, <em>class_name</em>, <em>properties</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
+<dt id="parser.Node.add_connection">
+<code class="descname">add_connection</code><span class="sig-paren">(</span><em>source</em>, <em>target</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.add_connection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.add_connection" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.add_input">
+<code class="descname">add_input</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.add_input"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.add_input" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.add_output">
+<code class="descname">add_output</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.add_output"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.add_output" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.get_connections">
+<code class="descname">get_connections</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.get_connections"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.get_connections" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.get_inputs">
+<code class="descname">get_inputs</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.get_inputs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.get_inputs" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.get_outputs">
+<code class="descname">get_outputs</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.get_outputs"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.get_outputs" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.get_properties_string">
+<code class="descname">get_properties_string</code><span class="sig-paren">(</span><em>ignore=[]</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.get_properties_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.get_properties_string" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Node.is_empty">
+<code class="descname">is_empty</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Node.is_empty"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Node.is_empty" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="parser.ParseException">
+<em class="property">exception </em><code class="descclassname">parser.</code><code class="descname">ParseException</code><span class="sig-paren">(</span><em>message</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#ParseException"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.ParseException" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
+<p>Semantic exceptions when parsing.</p>
+</dd></dl>
+
+<dl class="class">
+<dt id="parser.Parser">
+<em class="property">class </em><code class="descclassname">parser.</code><code class="descname">Parser</code><span class="sig-paren">(</span><em>filename</em>, <em>setup</em>, <em>ignore_empty_nodes=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Parser"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Parser" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
+<dt id="parser.Parser.create_node">
+<code class="descname">create_node</code><span class="sig-paren">(</span><em>root</em>, <em>attr</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Parser.create_node"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Parser.create_node" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="staticmethod">
+<dt id="parser.Parser.decode_and_deflate">
+<em class="property">static </em><code class="descname">decode_and_deflate</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Parser.decode_and_deflate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Parser.decode_and_deflate" title="Permalink to this definition">¶</a></dt>
+<dd><p>Draw.io compresses each page as follows:
+First, all data is url-encoded
+Next, it is compressed/deflated
+Finally, it is encoded according to base64.</p>
+<p>To obtain the page data, we have to do the reverse.</p>
+<dl class="docutils">
+<dt>Returns:</dt>
+<dd>Uncompressed and decoded data as a string.</dd>
+</dl>
+</dd></dl>
+
+<dl class="method">
+<dt id="parser.Parser.get_imports">
+<code class="descname">get_imports</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Parser.get_imports"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Parser.get_imports" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="parser.Parser.parse">
+<code class="descname">parse</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#Parser.parse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.Parser.parse" title="Permalink to this definition">¶</a></dt>
+<dd><p>Does the actual file parsing.</p>
+<p>If the file is compressed, we uncompress and work from there.
+If it wasn’t compressed, we can work with the whole tree.</p>
+<dl class="docutils">
+<dt>Returns:</dt>
+<dd>A list of Node objects, representing the drawio file.</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="parser.parse_environment">
+<code class="descclassname">parser.</code><code class="descname">parse_environment</code><span class="sig-paren">(</span><em>vars</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/parser.html#parse_environment"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#parser.parse_environment" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 75 - 0
docs/_build/html/py-modindex.html

@@ -0,0 +1,75 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Python Module Index &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="search.html" />
+ 
+
+    <script type="text/javascript">
+      DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
+    </script>
+
+
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>Python Module Index</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+
+   <h1>Python Module Index</h1>
+
+   <div class="modindex-jumpbox">
+   <a href="#cap-p"><strong>p</strong></a>
+   </div>
+
+   <table class="indextable modindextable">
+     <tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
+     <tr class="cap" id="cap-p"><td></td><td>
+       <strong>p</strong></td><td></td></tr>
+     <tr>
+       <td></td>
+       <td>
+       <a href="parser.html#module-parser"><code class="xref">parser</code></a></td><td>
+       <em></em></td></tr>
+   </table>
+
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

+ 82 - 0
docs/_build/html/search.html

@@ -0,0 +1,82 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Search &#8212; DrawioConvert 0.2 documentation</title>
+    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    <link rel="stylesheet" type="text/css" href="_static/styles.css" />
+    
+    <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
+    <script type="text/javascript" src="_static/searchtools.js"></script>
+    <link rel="index" title="Index" href="genindex.html" />
+    <link rel="search" title="Search" href="#" />
+  <script type="text/javascript">
+    jQuery(function() { Search.loadIndex("searchindex.js"); });
+  </script>
+  
+  <script type="text/javascript" id="searchindexloader"></script>
+   
+
+  </head><body>
+      <div class="header" role="banner"><h1 class="heading"><a href="index.html">
+          <span>DrawioConvert 0.2 documentation</span></a></h1>
+        <h2 class="heading"><span>Search</span></h2>
+      </div>
+      <div class="topnav" role="navigation" aria-label="top navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+      <div class="content">
+        
+        
+  <h1 id="search-documentation">Search</h1>
+  <div id="fallback" class="admonition warning">
+  <script type="text/javascript">$('#fallback').hide();</script>
+  <p>
+    Please activate JavaScript to enable the search
+    functionality.
+  </p>
+  </div>
+  <p>
+    From here you can search these documents. Enter your search
+    words into the box below and click "search". Note that the search
+    function will automatically search for all of the words. Pages
+    containing fewer words won't appear in the result list.
+  </p>
+  <form action="" method="get">
+    <input type="text" name="q" value="" />
+    <input type="submit" value="search" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  
+  <div id="search-results">
+  
+  </div>
+
+      </div>
+      <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+      
+        <p>
+        <a class="uplink" href="index.html">Contents</a>
+        </p>
+
+      </div>
+
+    <div class="footer" role="contentinfo">
+        &#169; Copyright 2020, Randy Paredis.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.5.
+    </div>
+  </body>
+</html>

File diff suppressed because it is too large
+ 1 - 0
docs/_build/html/searchindex.js


二進制
docs/_figures/custom-block.png


二進制
docs/_figures/library.png


二進制
docs/_figures/properties.png


+ 13 - 0
docs/_static/styles.css

@@ -0,0 +1,13 @@
+table.table-center {
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+}
+
+table.table-center td {
+    border-bottom: none;
+}
+
+table.table-center p.caption {
+    text-align: center;
+}

+ 7 - 5
doc/conf.py

@@ -11,10 +11,9 @@
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
+import os
+import sys
+sys.path.insert(0, os.path.abspath('../src'))
 
 
 # -- Project information -----------------------------------------------------
@@ -77,7 +76,7 @@ pygments_style = None
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'alabaster'
+html_theme = 'haiku'
 
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
@@ -89,6 +88,9 @@ html_theme = 'alabaster'
 # 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']
+html_css_files = [
+    'styles.css',
+]
 
 # Custom sidebar templates, must be a dictionary that maps document names
 # to template names.

+ 68 - 0
docs/execute.rst

@@ -0,0 +1,68 @@
+How to Execute :code:`DrawioConvert`?
+=====================================
+
+The execution for :code:`DrawioConvert` is simple:
+
+.. code::
+
+    python3 __main__.py <INPUT> [ARGS]
+
+Where :code:`<INPUT>` represents the drawio file to parse and :code:`[ARGS]`
+any combination of the commandline arguments that can be used with this tool.
+
+Commandline Arguments
+---------------------
+
+.. list-table::
+    :widths: 10 15 30
+    :header-rows: 1
+
+    * - Short Flag
+      - Long Flag
+      - Description
+    * - :code:`-F`
+      - :code:`--formalism`
+      - The formalism for which files must be generated. This argument is
+        required.
+    * - :code:`-e`
+      - :code:`--entry`
+      - The topmost class to use in the simulation. May be required for some
+        formalisms, where simulation is top-level dependent.
+    * - :code:`t`
+      - :code:`--time`
+      - Total simulation time to use. Should only be set for experiment
+        files. Defaults to :code:`10` (time-units). While this flag is meant
+        to indicate the total time, some formalisms may use this as the
+        allowed amount of simulation steps.
+    * - :code:`-L`
+      - :code:`--list`
+      - Lists the available formalisms that can be used.
+    * - :code:`-s`
+      - :code:`--skip`
+      - Sometimes a visual model has some "placeholders" for future classes.
+        By default, these are generated as well, even if no contents are given.
+        The :code:`--skip` flag changes this behaviour by skipping empty blocks
+        in the generation.
+    * - :code:`-d`
+      - :code:`--directory`
+      - The location where the files should be generated. Defaults to :code:`./`
+        (the current directory).
+    * - :code:`-f`
+      - :code:`--force`
+      - Some formalisms may mark certain files as "protected". This is usually
+        done to prevent accidental removal of user code when programming
+        experiments. Hence, these files cannot be overwritten by the tool, unless
+        this flag is set.
+    * - :code:`-a`
+      - :code:`--all`
+      - Each formalism has their default set of files to be generated. However,
+        there may be some experimental or additional files that not all users
+        need. This flag allows the generation of **all** files of the formalism.
+    * - :code:`-v`
+      - :code:`--verbose`
+      - Prints additional debugging information.
+    * - :code:`-E`
+      - :code:`--enviroment`
+      - Occasionally, formalisms need other properties that can be set by the
+        user. This flag takes a comma-separated list of :code:`key=value` pairs
+        and applies them to the formalism specifics.

+ 165 - 0
docs/formalisms/CBD.rst

@@ -0,0 +1,165 @@
+CBD Formalism
+=============
+
+Causal Block Diagrams allow for finding solutions to mathematical problems.
+
+Setting up Drawio
+------------------
+In drawio, select :menuselection:`File --> Open Library` and load :file:`CBDLibrary.xml`
+(which can be found :download:`here <../../formalisms/CBD/CBDLibrary.xml>`).
+This provides a set of primitive CBD blocks that can be used in your models.
+Once included, it can be found at the top of the shapes library.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/library.png      |
+|                                          |
+|   CBD Library in the Sidebar             |
++------------------------------------------+
+
+.. _block-props:
+
+Block Properties
+----------------
+All blocks in the library have some block-specific properties that can be set by the user.
+Hovering over a component shows all non-empty properties that were set on this shape.
+
+There are several ways of accessing/modifying these properties:
+
+* Double Click with the left mouse button on a shape.
+* Click with right mouse button to open a shape's context menu.
+  Near the bottom of the list, select :menuselection:`Edit Data`.
+* Select the shape (left mouse button) and in the top of the right panel,
+  go to :menuselection:`Arrange --> Edit Data`.
+* Select the shape and press :kbd:`CTRL + M` or :kbd:`CMND + M`.
+
+.. warning:: Do not change the :code:`class_name` as the converter relies on this property.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/properties.png   |
+|                                          |
+|   Example of the Property Window (for a  |
+|   ConstantBlock)                         |
++------------------------------------------+
+
+
+.. _library:
+
+Working with Library Blocks
+---------------------------
+To guarantee a consistent visual appearance of CBD models,
+no blocks in the library, except for the Custom Block, can be resized.
+Every block has zero or more input and output ports. Input ports are represented by
+the :code:`InputPortBlock` (black triangle) and output ports by the :code:`OutputPortBlock`
+(white triangle). When selecting (left mouse button) a port, a small, movable,
+yellow/orange diamond-shaped anchor will appear in front of the port's name.
+The position of this label can be changed by dragging the anchor.
+The port name can be altered in the :menuselection:`Edit Data` window.
+
+.. For each of a CBD model's top-level :code:`OutputPortBlock` shapes, a :code:`signal` property
+    may be added (see :ref:`block-props`).
+    The :code:`drawio2cbd` will then generate code to produce a plot, using https://bokeh.org/.
+    Note that bokeh produces an HTML document which is rendered in a browser
+    and allows some user interaction with the plot.
+    The value of the :code:`signal` property on a top-level :code:`OutputPortBlock` should be the title
+    to be put on the plot. Multiple signals may be rendered onto the same plot.
+    For more complex CBD simulation result analysis and visualization, code should be added
+    at the bottom of the generated file.
+
+Each CBD block that is *not* a port may have the following properties:
+
+* :code:`ID` or :code:`id`: The drawio unique ID for this block. Note that drawio automatically
+  overwrites a property with the key :code:`id` by the value shown by :code:`ID` (upon saving the diagram).
+* :code:`block_name`: The name of the block. It is required that
+  all blocks have a unique name within a class. When omitted, the :code:`ID` is used.
+* :code:`class_name`: The type of block.
+
+  .. warning:: Do not change the :code:`class_name` as the converter relies on this property.
+               Changing it makes it so the block type changes as well in the simulation.
+
+* :code:`symbol`: The block symbol that must be rendered by MathJax/LaTeX. This is a purely
+  graphical attribute and is ignored by the script.
+
+Optionally, additional class parameters can be provided by adding more properties.
+Their values will be passed on as default values for the corresponding property as an argument, e.g., to
+use strings, enclose the value in "..." or '...', for :code:`None`, leave it empty or litterally type
+":code:`None`"...
+
+.. warning:: Make sure these values are expressions/rvalues! If not, the generated Python file will crash,
+              or cause some unexpected behavior. Furthermore, newlines may not be used in these values.
+
+Class parameters that cannot be used are: :code:`label` (prevented by drawio), :code:`id` (overwritten by
+drawio), :code:`placeholders` (prevented by drawio), :code:`symbol` (ignored by the converter)
+and :code:`__docstring__` (used for other purposes, see later).
+
+.. note:: Blocks with a variable number of inputs (i.e., the :code:`OrBlock` and the
+          :code:`AndBlock`) may still need additional ports to be placed/removed.
+
+
+.. _custom-block:
+
+Creating Custom CBD Blocks
+-------------------------------
+A custom hierarchical CBD block is constructed as a network of already provided blocks
+(which in their own right may be custom hierarchical blocks)
+using the :code:`Custom Block` element from :file:`CBDLibrary.xml`.
+This is a collapsible component in which a block diagram may be drawn.
+It has two important properties:
+
+* :code:`class_name`: The new class name for the custom block. Note that all class names must be unique!
+* :code:`block_name`: The name of an instance of the CBD model if it's the top-level CBD.
+
+Additional properties can be added to create custom class parameters.
+The same set of parameters that was discussed above cannot be set,
+with the exception of :code:`__docstring__`, which now allows adding documentation to custom blocks.
+
+The empty rectangle is a container for the custom hierachical block.
+Blocks can be dragged into the rectangular area and connected.
+:code:`InputPortBlock` and :code:`OutputPortBlock` are used to add inputs and outputs with
+their :code:`name` property set to the port's name.
+
+.. hint:: The :code:`Custom Block` component can, in constrast with all other blocks in the
+          library, be resized. This allows for larger hierarchical models to be created, as the
+          basic blocks cannot be resized.
+
+.. rst-class:: table-center
+
++------------------------------------------+
+| .. figure:: ../_figures/custom-block.png |
+|                                          |
+|   Custom Sine Generator Block with no    |
+|   Input Ports, a single Output Port and  |
+|   a Custom Graphical Representation      |
++------------------------------------------+
+
+Next, create a graphical representation of the block (i.e., what an instance
+block should look like when used in a block diagram), add the corresponding
+ports and set the property :code:`class_name` to the same class as that set in the
+:code:`Custom Block`. Make sure not to forget to add any class parameters that were
+added to the :code:`Custom Block`.
+
+.. hint:: This can be done easily by adding a predefined block and changing its
+          ports and properties to match the new custom block.
+
+.. note:: Only the :code:`Custom Block` components will be read by the converter.
+          Anything else is implicitly ignored. Furthermore, the script is page-independent,
+          meaning multiple pages may be used inside a single drawio document to maintain a
+          clean overview of the created models.
+
+Conversion
+----------
+To generate code from the created drawio files, execute the script with the :code:`-F CBD` flag.
+This tells :code:`DrawioConvert` to use the CBD formalism. Two files will be created:
+
+* :code:`model.py`: The model file, containing the code for the modelled blocks.
+* :code:`experiment.py`: The "protected" experiment file. You can feely add/remove parts of this file
+  without fear of it being overwritten next execution. Use the :code:`-f`/:code:`--force` flag to
+  force overwrite the file.
+
+It is possible to use continuous models, where they are discretized to a certain delta. This is
+customizeable using the :code:`-E`/:code:`--environment` flag. I.e. by setting :code:`-E delta=0.1`,
+it is possible to execute in steps of 0.1 time-units. Note how :code:`-t`/:code:`--time` identifies
+the total simulation time, **not** the amount of steps taken.

+ 66 - 0
docs/formalisms/create.rst

@@ -0,0 +1,66 @@
+How To Create Custom Formalisms?
+================================
+Each formalism represents a "block diagram", where components are connected
+via edges. Each edge is defined from a source "port class" to a target
+"port class". Ports usually have unique names to allow for identification and
+are located **inside** the blocks they connect.
+
+New components can be defined by a 1-level hierarchical composition of the
+model. I.e. a set of connected blocks that are "grouped" together.
+
+.. warning::
+    If the target for the code generation of a custom formalism does not
+    comply to the above description, this tool cannot be used.
+    :code:`DrawioConvert` currently only supports the described block diagram
+    structure.
+
+Structure
+---------
+Each formalism corresponds to a package in the :code:`./formalisms` directory.
+There, all additional (re)sources can be added. In the required
+:code:`__init__.py` file, the :code:`setup` variable bust be defined as a
+dictionary, with the following structure (names followed by an asterisk are
+required fields):
+
+* :code:`parser`: All components required for parsing drawio files.
+    * :code:`input class`: The class name used to identify input port in the
+      generated code. Defaults to :code:`"InputPort"`.
+    * :code:`output class`: The class name used to identify output ports in
+      the generated code. Defaults to :code:`"OutputPort"`.
+    * :code:`class object xpath`: The `xpath <https://www.w3.org/TR/xpath/>`_
+      definition of a path which identifies a "class object" in the drawio
+      XML-structure. More specifically, all elements that correspond to that
+      structure will be seen as custom classes. Defaults to:
+      :code:`".//object/mxCell/mxGeometry/mxRectangle/../../..[@class_name]"`.
+    * :code:`class special xpath`: The `xpath <https://www.w3.org/TR/xpath/>`_
+      definition of a path which identifies a "special object" in the drawio
+      XML-structure. More specifically, all elements that correspond to that
+      structure will be seen as elements with additional information for
+      the code generation. For instance, custom imports can be defined this
+      way. Defaults to: :code:`".//object/mxCell/mxGeometry/../..[@role]"`.
+* :code:`generator`: The setup information for the file generation.
+    * :code:`verify`: List of dictionaries that allow for simple assertion
+      checking. Each dictionary has the following elements:
+
+        - :code:`function`\*: A function that takes a single argument (the list
+          of :class:`parser.Node` objects generated from drawio) and returns
+          :code:`False` when the nodes are invalid.
+        - :code:`error`\*: The error message to display when :code:`function`
+          returns :code:`False`.
+    * :code:`ignore`: List of attribute names to ignore.
+    * :code:`environment`: List of allowed environment variables. These will
+      be defined with the :code:`-E`/:code:`--environment` flag.
+    * :code:`templates`: List of template files to be generated. These files
+      are defined by their own dictionaries with the following keys:
+
+        - :code:`filename`\*: The filename of the generated file. The template
+          file name is this value, appended with :code:`.jinja`, located in the
+          same directory as the :code:`__init__.py` file.
+        - :code:`overwrite`: When :code:`True`, this file may be overwritten
+          whenever a generation is called. Defaults to :code:`True`.
+        - :code:`auto`: When :code:`True`, this file will automatically be
+          generated by the script. Otherwise, the :code:`-a`/:code:`--all`
+          flag is required. Defaults to :code:`True`.
+        - :code:`entry`: Boolean value, indicative of whether or not the
+          :code:`-e`/:code:`--entry` flag must be set in order to generate this
+          file. Defaults to :code:`False`.

+ 73 - 0
docs/index.rst

@@ -0,0 +1,73 @@
+.. DrawioConvert documentation master file, created by
+   sphinx-quickstart on Tue Dec 29 15:01:45 2020.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to DrawioConvert's documentation!
+=========================================
+
+:code:`DrawioConvert` is a project that allows conversion from simple, yet
+structured `draw.io <https://www.diagrams.net>`_ diagrams to any kind of file.
+This usually provides a useful entrypoint for visual modelling of models that
+comply to a textual framework.
+
+Or, more specifically, this tool allows for the creation of graphical
+interfaces for code frameworks. Note that, while this tool was written in
+Python, any language is possible thanks to
+`Jinja 2 <https://jinja.palletsprojects.com/en/2.11.x/>`_.
+
+Requirements
+------------
+* Standard Libraries:
+   * :code:`xml` (for :code:`xml.etree.ElementTree`)
+   * :code:`urllib` (for :code:`urllib.parse.unquote`)
+   * :code:`argparse`
+   * :code:`base64`
+   * :code:`os`
+   * :code:`re`
+   * :code:`sys`
+   * :code:`zlib`
+* External Libraries:
+   * `Jinja 2 <https://jinja.palletsprojects.com/en/2.11.x/>`_
+   * Anything else that is required for the converted files to work.
+
+.. warning::
+     :code:`DrawioConvert` does not execute the converted files, but only
+     generates them! The user is required to install all components for the
+     formalisms they like to use themselves.
+
+How Does It Work?
+-----------------
+The core idea behind :code:`DrawioConvert` is the use of so-called "formalisms".
+These are generic descriptions of how certain drawio files can (and should) be
+interpreted. They are provided with some setup information, a few template
+files, a drawio library and some documentation on their usage. From any drawio
+file (made according to the specification identified by the formalism) a new
+one will be generated that is complient with the drawn diagram and the selected
+formalism.
+
+This also allows drawio to be used for any block-based modelling language for
+which a graphical representation can be given and code generation can be
+defined.
+
+Quick Links
+-----------
+.. toctree::
+   :maxdepth: 4
+
+   execute
+   formalisms/create
+
+Builtin Formalisms
+------------------
+.. toctree::
+   :maxdepth: 1
+
+   formalisms/CBD
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`

doc/make.bat → docs/make.bat


+ 7 - 0
docs/modules.rst

@@ -0,0 +1,7 @@
+src
+===
+
+.. toctree::
+   :maxdepth: 4
+
+   parser

+ 7 - 0
docs/parser.rst

@@ -0,0 +1,7 @@
+parser module
+=============
+
+.. automodule:: parser
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 9 - 11
parser.py

@@ -1,3 +1,4 @@
+"""Test"""
 import xml.etree.ElementTree as ET
 from urllib.parse import unquote
 import base64
@@ -55,13 +56,12 @@ class Node:
 
 
 class Parser:
-	def __init__(self, filename,
-	             input_port_class_name="InputPortBlock",
-	             output_port_class_name="OutputPortBlock",
-	             ignore_empty_nodes=False):
+	def __init__(self, filename, setup, ignore_empty_nodes=False):
 		self.filename = filename
-		self.input_class = input_port_class_name
-		self.output_class = output_port_class_name
+		self.input_class = setup["input class"]
+		self.output_class = setup["output class"]
+		self.class_object_path = setup["class object xpath"]
+		self.special_object_path = setup["special object xpath"]
 		self.ignore_empty_nodes = ignore_empty_nodes
 		self.__signals = {}
 		self.__imports = []
@@ -97,19 +97,17 @@ class Parser:
 		tree = ET.parse(self.filename)
 		root = tree.getroot()
 		compressed = len(root.findall(".//mxGraphModel")) == 0
-		class_object_path = ".//object/mxCell/mxGeometry/mxRectangle/../../..[@class_name]"
-		special_object_path = ".//object/mxCell/mxGeometry/../..[@role]"
 		if compressed:
 			# If compressed, first decode base64, then deflate, then url decode
 			pages = root.findall(".//diagram")
 			for page in pages: # Decoding happens pagewise
 				nroot = self.decode_and_deflate(page.text)
-				objects = nroot.findall(class_object_path)
+				objects = nroot.findall(self.class_object_path)
 				for obj in objects:
 					res = self.create_node(nroot, obj.attrib)
 					if res is not None:
 						yield res
-				special = nroot.findall(special_object_path)
+				special = nroot.findall(self.special_object_path)
 				for obj in special:
 					if obj.attrib["role"] == "import":
 						module = obj.attrib["module"]
@@ -119,7 +117,7 @@ class Parser:
 						else:
 							self.__imports.append(f"import {module}")
 		else:
-			objects = root.findall(class_object_path)
+			objects = root.findall(self.class_object_path)
 			for obj in objects:
 				res = self.create_node(root, obj.attrib)
 				if res is not None:

+ 4 - 7
whishlist.txt

@@ -6,13 +6,6 @@ A list of features that are wanted in this tool:
     -p/--print: print everything to the console instead of to files
 
 * Allow Renaming of files? => Via tabs?
-
-* Allow global variables/code? => Model specific; so no flag
-
-* Allow setting of drawio xpath => Formalism-specific; set in setup file
-
-* Sphinx documentation
-
 * multiple pages: unique names?
   ---> I agree, it should be nice to actually split up these models graphically, yet
        a commandline argument to toggle this behaviour seems in order. I only see this
@@ -22,3 +15,7 @@ A list of features that are wanted in this tool:
        it is now page-independent.
        TODO: ask Joeri
 
+* Allow global variables/code? => Model specific; so no flag
+
+* Clean up __main__ module
+