Initial commit on EAN supplements; Relates to #71

This commit is contained in:
Christoph Oberhofer
2016-04-22 00:11:11 +02:00
parent 318681d66b
commit eb9a4ca4cb
5 changed files with 189 additions and 6 deletions
+2 -1
View File
@@ -1,6 +1,7 @@
function BarcodeReader(config) {
function BarcodeReader(config, supplements) {
this._row = [];
this.config = config || {};
this.supplements = supplements;
return this;
}
+46
View File
@@ -0,0 +1,46 @@
import EANReader from './ean_reader';
function EAN2Reader() {
EANReader.call(this);
}
var properties = {
FORMAT: {value: "ean_2", writeable: false}
};
EAN2Reader.prototype = Object.create(EANReader.prototype, properties);
EAN2Reader.prototype.constructor = EAN2Reader;
EAN2Reader.prototype.decode = function(row, start) {
this._row = row;
var counters = [0, 0, 0, 0],
codeFrequency = 0,
i = 0,
offset = start,
end = this._row.length,
code,
result = [];
for (i = 0; i < 2 && offset < end; i++) {
code = this._decodeCode(offset);
if (!code) {
return null;
}
result.push(code.code % 10);
if (code.code >= this.CODE_G_START) {
codeFrequency |= 1 << (1 - i);
}
if (i != 1) {
offset = this._nextSet(this._row, code.end);
offset = this._nextUnset(this._row, offset);
}
}
if (result.length != 2 || (result.reduce((sum, i) => sum + i, 0) % 4 !== codeFrequency)) {
return null;
}
console.log(result);
return offset;
};
export default EAN2Reader;
+79
View File
@@ -0,0 +1,79 @@
import EANReader from './ean_reader';
function EAN5Reader() {
EANReader.call(this);
}
var properties = {
FORMAT: {value: "ean_5", writeable: false}
};
const CHECK_DIGIT_ENCODINGS = [24, 20, 18, 17, 12, 6, 3, 10, 9, 5];
EAN5Reader.prototype = Object.create(EANReader.prototype, properties);
EAN5Reader.prototype.constructor = EAN5Reader;
EAN5Reader.prototype.decode = function(row, start) {
this._row = row;
var counters = [0, 0, 0, 0],
codeFrequency = 0,
i = 0,
offset = start,
end = this._row.length,
code,
result = [];
for (i = 0; i < 5 && offset < end; i++) {
code = this._decodeCode(offset);
if (!code) {
return null;
}
result.push(code.code % 10);
if (code.code >= this.CODE_G_START) {
codeFrequency |= 1 << (4 - i);
}
if (i != 4) {
offset = this._nextSet(this._row, code.end);
offset = this._nextUnset(this._row, offset);
}
}
if (result.length != 5) {
return null;
}
if (extensionChecksum(result) !== determineCheckDigit(codeFrequency)) {
return null;
}
console.log(result);
return offset;
};
function determineCheckDigit(codeFrequency) {
var i;
for (i = 0; i < 10; i++) {
if (codeFrequency === CHECK_DIGIT_ENCODINGS[i]) {
return i;
}
}
return null;
}
function extensionChecksum(result) {
var length = result.length,
sum = 0,
i;
for (i = length - 2; i >= 0; i -= 2) {
sum += result[i];
}
sum *= 3;
for (i = length - 1; i >= 0; i -= 2) {
sum += result[i];
}
sum *= 3;
return sum % 10;
}
export default EAN5Reader;
+48 -2
View File
@@ -1,7 +1,18 @@
import BarcodeReader from './barcode_reader';
import {merge} from 'lodash';
function EANReader(opts) {
BarcodeReader.call(this, opts);
function EANReader(opts, supplements) {
opts = merge(getDefaulConfig(), opts);
BarcodeReader.call(this, opts, supplements);
}
function getDefaulConfig() {
var config = {};
Object.keys(EANReader.CONFIG_KEYS).forEach(function(key) {
config[key] = EANReader.CONFIG_KEYS[key].default;
});
return config;
}
var properties = {
@@ -11,6 +22,7 @@ var properties = {
START_PATTERN: {value: [1 / 3 * 7, 1 / 3 * 7, 1 / 3 * 7]},
STOP_PATTERN: {value: [1 / 3 * 7, 1 / 3 * 7, 1 / 3 * 7]},
MIDDLE_PATTERN: {value: [1 / 5 * 7, 1 / 5 * 7, 1 / 5 * 7, 1 / 5 * 7, 1 / 5 * 7]},
EXTENSION_START_PATTERN: {value: [1 / 4 * 7, 1 / 4 * 7, 2 / 4 * 7]},
CODE_PATTERN: {value: [
[3, 2, 1, 1],
[2, 2, 2, 1],
@@ -301,6 +313,13 @@ EANReader.prototype._decode = function() {
return null;
}
if (this.supplements.length > 0) {
let ext = this._decodeExtensions(code.end);
if (!ext) {
return null;
}
}
return {
code: result.join(""),
start: startInfo.start,
@@ -311,6 +330,25 @@ EANReader.prototype._decode = function() {
};
};
EANReader.prototype._decodeExtensions = function(offset) {
var i,
start = this._nextSet(this._row, offset),
code = this._findPattern(this.EXTENSION_START_PATTERN, start, false, false),
result;
if (code === null) {
return null;
}
for (i = 0; i < this.supplements.length; i++) {
result = this.supplements[i].decode(this._row, code.end);
if (result !== null) {
return result;
}
}
return null;
};
EANReader.prototype._checksum = function(result) {
var sum = 0, i;
@@ -324,4 +362,12 @@ EANReader.prototype._checksum = function(result) {
return sum % 10 === 0;
};
EANReader.CONFIG_KEYS = {
supplements: {
'type': 'arrayOf(string)',
'default': [],
'description': 'Allowed extensions to be decoded (2 and/or 5)'
}
};
export default (EANReader);