extractunknown static method
Implementation
static Future<IDCardInfo> extractunknown(List<String> lines) async {
var idNumber;
var firstName;
var lastName;
var middleName;
var dob;
var fullName;
// GENERIC FALLBACK LOGIC (try to extract what we can)
// Try to extract DOB
final dobRegex = RegExp(
r'(\d{2})[ /-]([A-Z]{3})[ /-](\d{2,4})|(\d{2})[ /-](\d{2})[ /-](\d{2,4})',
);
for (final line in lines) {
final match = dobRegex.firstMatch(line.toUpperCase());
if (match != null) {
if (match.group(2) != null) {
final day = match.group(1);
final monStr = match.group(2);
final year = match.group(3);
final months = {
'JAN': '01',
'FEB': '02',
'MAR': '03',
'APR': '04',
'MAY': '05',
'JUN': '06',
'JUL': '07',
'AUG': '08',
'SEP': '09',
'OCT': '10',
'NOV': '11',
'DEC': '12',
};
final mon = months[monStr] ?? monStr;
dob = '$day-$mon-$year';
} else if (match.group(4) != null &&
match.group(5) != null &&
match.group(6) != null) {
dob = '${match.group(4)}-${match.group(5)}-${match.group(6)}';
}
break;
}
}
// Try to extract ID number (longest digit/letter sequence)
String idText = lines.join(' ');
final idMatch = RegExp(
r'[A-Z0-9]{10,}',
).firstMatch(idText.replaceAll(' ', ''));
if (idMatch != null) {
idNumber = idMatch.group(0);
}
// Try to extract name (first all-uppercase 2-3 word line)
for (final line in lines) {
final upper = line.toUpperCase().trim();
final parts = upper.split(RegExp(r'\s+'));
if ((parts.length == 2 || parts.length == 3) &&
RegExp(r'^[A-Z ]+$').hasMatch(upper)) {
lastName = parts[0].trim();
if (parts.length > 1) firstName = parts[1].trim();
if (parts.length > 2) middleName = parts[2].trim();
fullName = line.trim();
break;
}
}
return IDCardInfo(
firstName: firstName,
lastName: lastName,
middleName: middleName,
dateOfBirth: dob,
idNumber: idNumber,
);
}