write method

void write(
  1. StringSink sink
)

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('}');
}