parse method

Map<String, dynamic> parse({
  1. String? charset,
})

Implementation

Map<String, dynamic> parse({String? charset}) {
  final nodes = data.split(RegExp(r'\r?\n')).map(Node.parse).fold(
    <Node>[],
    _combine,
  );

  final list = nodes.fold(
    <Map<String, dynamic>>[],
    (List<Map<String, dynamic>> result, node) {
      if (result.isEmpty || node is BlockEnd) {
        result.add(<String, dynamic>{});
      }

      final item = result.last;

      if (node is Comment) {
        if (item['comments'] == null) {
          item['comments'] = <String, String>{};
        }

        item['comments'][node.type] = node.text;
      }

      if (node is Token) {
        if (node.type == 'msgstr') {
          if (!item.containsKey(node.type)) {
            item[node.type] = <String>[];
          }

          (item[node.type] as List).add(node.text);
        } else {
          item[node.type] = node.text;
        }
      }

      return result;
    },
  );

  final headers = <String, String>{};

  final head = list.tryFind((item) => item['msgctxt'] == null);

  if (head != null && head['msgstr'] != null) {
    final String comments = (head['msgstr'] as List).join();
    headers.addEntries(
      comments.split('\n').where((line) => line.contains(': ')).map(
        (line) {
          final delim = line.indexOf(': ');
          final key = line.substring(0, delim).toLowerCase();
          return MapEntry(key, line.substring(delim + 2));
        },
      ),
    );
  }

  final translations = <String, Map<String, dynamic>>{};

  for (final item in list) {
    final ctx = item['msgctxt'] as String? ?? '';
    final id = item['msgid'] as String? ?? '';

    if (!translations.containsKey(ctx)) {
      translations[ctx] = <String, dynamic>{};
    }

    translations[ctx]![id] = item;
  }

  return {
    'charset': charset,
    'headers': headers,
    'translations': translations,
  };
}