view service/arduinoNode/dotrender.py @ 1283:d36cd59b145a

dhcpleases partial rewrite Ignore-this: 6a2b95612f0e3a2348397f2f068e5f58 darcs-hash:c0872b2f45c0c82492615f612e9655fdc48798c5
author drewp <drewp@bigasterisk.com>
date Sat, 20 Apr 2019 23:59:04 -0700
parents fbe72d44f15a
children
line wrap: on
line source

from rdflib import Literal, URIRef

def render(configGraph, boards):
    nodes = {} # uri: (nodeid, nodeline)
    edges = []

    serial = [0]
    def addNode(node):
        if node not in nodes or isinstance(node, Literal):
            id = 'node%s' % serial[0]
            if isinstance(node, URIRef):
                short = configGraph.qname(node)
            else:
                short = str(node)
            nodes[node] = (
                id,
                '%s [ label="%s", shape = record, color = blue ];' % (
                id, short))
            serial[0] += 1
        else:
            id = nodes[node][0]
        return id
    def addStmt(stmt):
        ns = addNode(stmt[0])
        no = addNode(stmt[2])
        edges.append('%s -> %s [ label="%s" ];' % (
            ns, no, configGraph.qname(stmt[1])))
    for b in boards:
        for stmt in b.currentGraph():
            # color these differently from config ones
            addStmt(stmt)
    for stmt in configGraph:
        addStmt(stmt)

    nodes = '\n'.join(line for _, line in nodes.values())
    edges = '\n'.join(edges)
    return '''
    digraph {
     graph [ranksep=0.4];
    node [fontsize=8, margin=0];
    edge[weight=1.2, fontsize=8, fontcolor="gray"];
    rankdir = LR;
    charset="utf-8";
    %(nodes)s
    %(edges)s
    }
    ''' % dict(nodes=nodes, edges=edges)