Metadata-Version: 2.1
Name: graphparser
Version: 0.8.2
Summary: Parses a string of graph data
Home-page: https://github.com/pyprg/graphparser
Author: pyprg
Author-email: pyprg@outlook.com
Project-URL: Bug Tracker, https://github.com/pyprg/graphparser/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE

# graphparser

graphparser provides a primitive function for input of tiny graphs using a
string e.g. as a part of a Jupyter notebook. The function 'parse'
reads a multiline string and returns nodes and edges. Nodes and edges can have
attributes.

Nodes are defined by writing words. Edges are implicitely defined for
adjacent words (which are IDs of the nodes). Attributes are strings
of key value pairs separated by an equal sign. Attributes of nodes are
placed above or below the nodes they should be assigned to. Attributes of
edges are placed above or below the edges (space between two nodes).

Example_1
```
                distance=23km            temperature=220_K
node1                                   node2                           node3
 color=red          cost=48              price=45EUR age=10e6_d
 hight=20.0cm
```
However, the intention is to give some pseudo graphical support.
Non-word-chracters can be used to make the structure visible.

Example_2
```
                distance=23km            temperature=220_K
node1<<------------------------------->>node2<<----------------------->>node3
 color=red          cost=48              price=45EUR age=10e6_d
 hight=20.0cm
```

running `[*parse(Example_1)]` creates a list of node- and edge-data:
```
[('node', 'node1', ('node2',), {'color': 'red', 'hight': '20.0cm'}),
 ('edge', ('node1', 'node2'), {'distance': '23km', 'cost': '48'}),
 ('node', 'node2', ('node1', 'node3'),
     {'temperature': '220_K', 'price': '45EUR', 'age': '10e6_d'}),
 ('edge', ('node2', 'node3'), {}),
 ('node', 'node3', ('node2',), {})]
```

tuple of node-data:
    0. 'node'
    1. ID (name) of node
    2. tuple of adjacent nodes (IDs of nodes)
    3. dict of attributes

tuple of edge-data:
    0. 'edge'
    1. tuples of adjacent nodes (left_node, right_node)
    2. dict of attributes

One text line has either data of nodes or data of attributes. The type of
the first detected entity is the type of the complete line. Attributes placed
in node lines are skipped and vice versa. Lines starting with '#' are comments.
'Blank' lines are neither node- nor edge- nor comment-lines. At least one
'blank' line must exist between to node-lines (Arbitrary non-word characters
are possible). No 'blank' line exists between node-lines and
associated attributes. A tuple ('comment', text_line) is returned for
lines which are comments.

Example_3
```
                distance=23km            temperature=220_K
node1<<------------------------------->>node2<<----------------------->>node3
 color=red          cost=48              price=45EUR age=10e6_d
 hight=20.0cm

    ~~~        ~~~        ~~~        ~~~        ~~~        ~~~        ~~~

                distance=23km            temperature=220_K
node4<<------------------------------->>node5<<----------------------->>node6
 color=red          cost=48              price=45EUR age=10e6_d
 hight=20.0cm

```
The first character of the attribute is used to find the associated node/edge.
An attribute is associated to a node if the first character shares the
column with any character of a node otherwise it is assigned to the edge
between the nodes.
No edge is created when a node starts/ends with underscore. First and last
underscore of the node are not part of the ID (name). This gives the
chance to place nodes in one text line which have no relation.
Chains of attributes are attributes separated by a single comma or space. Again
the first character of the attribute sequence is used to find the associated
node/edge.

# object parser

The function 'make_objects' parses a multiline text and creates objects
according to argument 'type_data'. The syntax is similar to Python's
namedtuple syntax.

Example_4
```
mytuple(att=(1,2,"/a/"),att2=3)
```
