diff --git a/src/utils/mrz.ts b/src/utils/mrz.ts index 7428eea6..95ed8b1b 100644 --- a/src/utils/mrz.ts +++ b/src/utils/mrz.ts @@ -139,6 +139,13 @@ function mrzCleanResult(obj: Record) { return obj; } +function mrzFieldExtract(expression: RegExp, line: string) { + if (expression.test(line)) { + return expression.exec(line)?.groups || {}; + } + return {}; +} + export function checkSum(data: string) { if (!/[0-9A-Z<]/.test(data)) return null; @@ -159,11 +166,9 @@ export function checkSum(data: string) { export function parseType1(mrz: MRZ) { const result: Record = {}; - mrz.zone.forEach((line, i) => { - if (MRZ_TD_1[i].test(line)) { - Object.assign(result, MRZ_TD_1[i].exec(line)?.groups); - } - }); + mrz.zone.forEach((line, i) => + Object.assign(result, mrzFieldExtract(MRZ_TD_1[i], line)), + ); return { mrz, result: mrzCleanResult(result) }; } @@ -171,11 +176,9 @@ export function parseType1(mrz: MRZ) { export function parseType2(mrz: MRZ) { const result: Record = {}; - mrz.zone.forEach((line, i) => { - if (MRZ_TD_2[i].test(line)) { - Object.assign(result, MRZ_TD_2[i].exec(line)?.groups); - } - }); + mrz.zone.forEach((line, i) => + Object.assign(result, mrzFieldExtract(MRZ_TD_2[i], line)), + ); return { mrz, result: mrzCleanResult(result) }; } @@ -183,11 +186,9 @@ export function parseType2(mrz: MRZ) { export function parseType3(mrz: MRZ) { const result: Record = {}; - mrz.zone.forEach((line, i) => { - if (MRZ_TD_3[i].test(line)) { - Object.assign(result, MRZ_TD_3[i].exec(line)?.groups); - } - }); + mrz.zone.forEach((line, i) => + Object.assign(result, mrzFieldExtract(MRZ_TD_3[i], line)), + ); return { mrz, result: mrzCleanResult(result) }; } diff --git a/src/utils/ocr.ts b/src/utils/ocr.ts index 10487e65..6c01f4a9 100644 --- a/src/utils/ocr.ts +++ b/src/utils/ocr.ts @@ -26,13 +26,13 @@ export function parseResultMRZ(result: RecognizeResult) { .split(/[\s\r\n]+/) .filter((v) => /[A-Z0-9<]{30,}/.test(v)); - if (zone.length === 3 && zone[0].length === 30) { - return parseMRZ({ type: 'TD1', zone }); - } else if (zone.length === 2 && zone[0].length === 36) { - return parseMRZ({ type: 'TD2', zone }); - } else if (zone.length === 2 && zone[0].length === 44) { + if (zone.length === 2 && zone[0].length >= 44) { return parseMRZ({ type: 'TD3', zone }); + } else if (zone.length === 2 && zone[0].length >= 36) { + return parseMRZ({ type: 'TD2', zone }); + } else if (zone.length === 3 && zone[0].length >= 30) { + return parseMRZ({ type: 'TD1', zone }); } else { - return null; + return { mrz: { type: 'UNKNOWN', zone }, result: null }; } }