parseLines static method

VComponent parseLines(
  1. List<String> lines, {
  2. Property? customParser(
    1. String name,
    2. String definition
    )?,
})

Parses the component from the specified text lines.

Compare parse for details.

Implementation

static VComponent parseLines(
  List<String> lines, {
  Property? Function(String name, String definition)? customParser,
}) {
  final root = _createComponent(lines.first);
  var current = root;
  for (var i = 1; i < lines.length; i++) {
    final line = lines[i];
    try {
      if (line.startsWith('BEGIN:')) {
        final child = _createComponent(line, parent: current);
        current.children.add(child);
        current = child;
      } else if (line.startsWith('END:')) {
        final expected = 'END:${current.name}';
        if (line != expected) {
          throw FormatException('Received [$line] but expected [$expected]');
        }
        current.checkValidity();
        final parent = current.parent;
        if (parent != null) {
          current = parent;
        }
      } else {
        if (line.trim().isEmpty) {
          continue;
        }
        final property =
            Property.parseProperty(line, customParser: customParser);
        current.properties.add(property);
      }
    } on FormatException catch (e) {
      print('Error parsing line $i: "$line"');
      rethrow;
    }
  }

  return root;
}