/// Local, explicit-label paste parsing. Raw pasted text is never retained. class BankPaste { BankPaste._(this.values, this.conflicts); final Map values; final Set conflicts; static BankPaste parse(String text) { final values = {}; final conflicts = {}; const labels = { 'бик': 'bik', 'bik': 'bik', 'счет': 'account', 'счёт': 'account', 'номер счета': 'account', 'номер счёта': 'account', 'account': 'account', 'account number': 'account', 'имя': 'firstName', 'first name': 'firstName', 'фамилия': 'lastName', 'last name': 'lastName', 'отчество': 'patronymic', 'patronymic': 'patronymic', 'получатель': 'holder', 'фио': 'holder', 'account holder': 'holder', 'банк': 'bank', 'bank': 'bank', 'корреспондентский счет': 'correspondent', 'корреспондентский счёт': 'correspondent', 'correspondent account': 'correspondent', }; for (final line in text.split(RegExp(r'[\r\n]+'))) { final match = RegExp(r'^\s*([^:=]+)\s*[:=]\s*(.+?)\s*$').firstMatch(line); if (match == null) continue; final key = labels[match[1]!.trim().toLowerCase()]; if (key == null) continue; var value = match[2]!.trim(); if (['bik', 'account', 'correspondent'].contains(key)) value = value.replaceAll(RegExp(r'\s'), ''); if (values.containsKey(key) && values[key] != value) conflicts.add(key); values[key] = value; } for (final key in conflicts) { values.remove(key); } return BankPaste._(Map.unmodifiable(values), Set.unmodifiable(conflicts)); } }