parse method
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,
};
}