/usr/lib/python3/dist-packages/graphviz/lang.py is in python3-graphviz 0.5.2-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # lang.py - dot language creation helpers
"""Quote strings to be valid DOT identifiers, assemble attributes."""
import re
from . import tools
__all__ = ['quote', 'quote_edge', 'attributes']
# http://www.graphviz.org/doc/info/lang.html
ID = re.compile(r'([a-zA-Z_][a-zA-Z0-9_]*|-?(\.\d+|\d+(\.\d*)?))$')
KEYWORD = re.compile(r'((node)|(edge)|(graph)|(digraph)|(subgraph)|(strict))$', re.IGNORECASE)
HTML_STRING = re.compile(r'<.*?>$', re.DOTALL)
COMPASS = re.compile(r'((n)|(ne)|(e)|(se)|(s)|(sw)|(w)|(nw)|(c)|(_))$')
def quote(identifier,
valid_id=ID.match, dot_keyword=KEYWORD.match, html=HTML_STRING.match):
"""Return DOT identifier from string, quote if needed.
>>> quote('')
'""'
>>> quote('spam')
'spam'
>>> quote('spam spam')
'"spam spam"'
>>> quote('-4.2')
'-4.2'
>>> quote('.42')
'.42'
>>> quote('<<b>spam</b>>')
'<<b>spam</b>>'
"""
if html(identifier):
pass
elif not valid_id(identifier) or dot_keyword(identifier):
return '"%s"' % identifier.replace('"', '\\"')
return identifier
def quote_edge(identifier):
"""Return DOT edge statement node_id from string, quote if needed.
>>> quote_edge('spam')
'spam'
>>> quote_edge('spam spam:eggs eggs')
'"spam spam":"eggs eggs"'
>>> quote_edge('spam:eggs:s')
'spam:eggs:s'
"""
node, _, rest = identifier.partition(':')
parts = [quote(node)]
if rest:
port, _, compass = rest.partition(':')
parts.append(quote(port))
if compass:
parts.append(compass)
return ':'.join(parts)
def attributes(label=None, kwargs=None, attributes=None, raw=None):
"""Return assembled DOT attributes string.
Sorts kwargs and attributes if they are plain dicts (to avoid
unpredictable order from hash randomization in Python 3.3+).
>>> attributes()
''
>>> attributes('spam spam', kwargs={'eggs':'eggs', 'ham': 'ham ham'})
' [label="spam spam" eggs=eggs ham="ham ham"]'
>>> attributes(kwargs={'spam': None, 'eggs': ''})
' [eggs=""]'
"""
if label is None:
result = []
else:
result = ['label=%s' % quote(label)]
if kwargs:
items = ['%s=%s' % (quote(k), quote(v))
for k, v in tools.mapping_items(kwargs) if v is not None]
result.extend(items)
if attributes:
if hasattr(attributes, 'items'):
attributes = tools.mapping_items(attributes)
items = ['%s=%s' % (quote(k), quote(v))
for k, v in attributes if v is not None]
result.extend(items)
if raw:
result.append(raw)
if not result:
return ''
return ' [%s]' % ' '.join(result)
|