write method
Implementation
void write(StringSink sink) {
String _escape(String input) {
if (_validName.hasMatch(input) &&
!_keywords.contains(input.toLowerCase())) {
return input;
}
return '"${input.replaceAll('"', '\\"')}"';
}
void _writeProps(Map<String, String> properties) {
if (properties.isNotEmpty) {
final props = properties.keys
.map((key) => '$key=${_escape(properties[key]!)}')
.toList(growable: false)
.join(', ');
sink.write(' [$props]');
}
}
void _writeGlobalProperties(String name, Map<String, String> properties) {
assert(_keywords.contains(name));
if (properties.isNotEmpty) {
sink.write(' $name');
_writeProps(properties);
sink.writeln(';');
}
}
sink.writeln('digraph $_name {');
_writeGlobalProperties('graph', _graphProperties);
_writeGlobalProperties('node', _nodeProperties);
_writeGlobalProperties('edge', _edgeProperties);
void _writeNode(_Node node) {
final entry = _escape(node.name);
sink.write(' $entry');
_writeProps(node.properties);
sink.writeln(';');
}
void _writeEdge(_Edge edge) {
final entry = _escape(edge.from);
sink.write(' $entry -> ${_escape(edge.to)}');
_writeProps(edge.properties);
sink.writeln(';');
}
for (var item in _items) {
if (item is _Edge) {
_writeEdge(item);
} else if (item is _Node) {
_writeNode(item);
} else if (item is _Blank) {
sink.writeln();
} else {
throw StateError('Unsupported - ${item.runtimeType} - $item');
}
}
sink.writeln('}');
}