javascript-barcode-reader
Version:
Simple & Fast Barcode decoder for Browser and Node.js
109 lines • 3.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.decoder = void 0;
const CHAR_SET = [
{ '100010100': '0' },
{ '101001000': '1' },
{ '101000100': '2' },
{ '101000010': '3' },
{ '100101000': '4' },
{ '100100100': '5' },
{ '100100010': '6' },
{ '101010000': '7' },
{ '100010010': '8' },
{ '100001010': '9' },
{ '110101000': 'A' },
{ '110100100': 'B' },
{ '110100010': 'C' },
{ '110010100': 'D' },
{ '110010010': 'E' },
{ '110001010': 'F' },
{ '101101000': 'G' },
{ '101100100': 'H' },
{ '101100010': 'I' },
{ '100110100': 'J' },
{ '100011010': 'K' },
{ '101011000': 'L' },
{ '101001100': 'M' },
{ '101000110': 'N' },
{ '100101100': 'O' },
{ '100010110': 'P' },
{ '110110100': 'Q' },
{ '110110010': 'R' },
{ '110101100': 'S' },
{ '110100110': 'T' },
{ '110010110': 'U' },
{ '110011010': 'V' },
{ '101101100': 'W' },
{ '101100110': 'X' },
{ '100110110': 'Y' },
{ '100111010': 'Z' },
{ '100101110': '-' },
{ '111010100': '.' },
{ '111010010': ' ' },
{ '111001010': '$' },
{ '101101110': '/' },
{ '101110110': '+' },
{ '110101110': '%' },
{ '100100110': '($)' },
{ '111011010': '(%)' },
{ '111010110': '(/)' },
{ '100110010': '(+)' },
{ '101011110': '*' },
];
function decoder(lines) {
const code = [];
const binary = [];
// remove termination bar
lines.pop();
const barThreshold = Math.ceil(lines.reduce((pre, item) => pre + item, 0) / lines.length);
const minBarWidth = Math.ceil(lines.reduce((pre, item) => {
if (item < barThreshold)
return (pre + item) / 2;
return pre;
}, 0));
// leave the padded *
for (let i = 0; i < lines.length; i += 1) {
let segment = lines[i];
while (segment > 0) {
if (i % 2 === 0) {
binary.push(1);
}
else {
binary.push(0);
}
segment -= minBarWidth;
}
}
for (let i = 0; i < binary.length; i += 9) {
const searcKey = binary.slice(i, i + 9).join('');
const char = CHAR_SET.filter(item => Object.keys(item)[0] === searcKey);
code.push(char[0][searcKey]);
}
if (code.shift() !== '*' || code.pop() !== '*')
return '';
const K = code.pop();
let sum = 0;
let letter;
let Value;
const findValue = (item) => Object.values(item)[0] === letter;
for (let i = code.length - 1; i >= 0; i -= 1) {
letter = code[i];
Value = CHAR_SET.indexOf(CHAR_SET.filter(findValue)[0]);
sum += Value * (1 + ((code.length - (i + 1)) % 20));
}
if (Object.values(CHAR_SET[sum % 47])[0] !== K)
return '';
const C = code.pop();
sum = 0;
for (let i = code.length - 1; i >= 0; i -= 1) {
letter = code[i];
Value = CHAR_SET.indexOf(CHAR_SET.filter(findValue)[0]);
sum += Value * (1 + ((code.length - (i + 1)) % 20));
}
if (Object.values(CHAR_SET[sum % 47])[0] !== C)
return '';
return code.join('');
}
exports.decoder = decoder;
//# sourceMappingURL=index.js.map