// Encoding documentation:
|
// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding
|
|
import encode from './encoder';
|
import Barcode from "../Barcode.js";
|
|
class UPC extends Barcode{
|
constructor(data, options){
|
// Add checksum if it does not exist
|
if(data.search(/^[0-9]{11}$/) !== -1){
|
data += checksum(data);
|
}
|
|
super(data, options);
|
|
this.displayValue = options.displayValue;
|
|
// Make sure the font is not bigger than the space between the guard bars
|
if(options.fontSize > options.width * 10){
|
this.fontSize = options.width * 10;
|
}
|
else{
|
this.fontSize = options.fontSize;
|
}
|
|
// Make the guard bars go down half the way of the text
|
this.guardHeight = options.height + this.fontSize / 2 + options.textMargin;
|
}
|
|
valid(){
|
return this.data.search(/^[0-9]{12}$/) !== -1 &&
|
this.data[11] == checksum(this.data);
|
}
|
|
encode(){
|
if(this.options.flat){
|
return this.flatEncoding();
|
}
|
else{
|
return this.guardedEncoding();
|
}
|
}
|
|
flatEncoding(){
|
var result = "";
|
|
result += "101";
|
result += encode(this.data.substr(0, 6), "LLLLLL");
|
result += "01010";
|
result += encode(this.data.substr(6, 6), "RRRRRR");
|
result += "101";
|
|
return {
|
data: result,
|
text: this.text
|
};
|
}
|
|
guardedEncoding(){
|
var result = [];
|
|
// Add the first digit
|
if(this.displayValue){
|
result.push({
|
data: "00000000",
|
text: this.text.substr(0, 1),
|
options: {textAlign: "left", fontSize: this.fontSize}
|
});
|
}
|
|
// Add the guard bars
|
result.push({
|
data: "101" + encode(this.data[0], "L"),
|
options: {height: this.guardHeight}
|
});
|
|
// Add the left side
|
result.push({
|
data: encode(this.data.substr(1, 5), "LLLLL"),
|
text: this.text.substr(1, 5),
|
options: {fontSize: this.fontSize}
|
});
|
|
// Add the middle bits
|
result.push({
|
data: "01010",
|
options: {height: this.guardHeight}
|
});
|
|
// Add the right side
|
result.push({
|
data: encode(this.data.substr(6, 5), "RRRRR"),
|
text: this.text.substr(6, 5),
|
options: {fontSize: this.fontSize}
|
});
|
|
// Add the end bits
|
result.push({
|
data: encode(this.data[11], "R") + "101",
|
options: {height: this.guardHeight}
|
});
|
|
// Add the last digit
|
if(this.displayValue){
|
result.push({
|
data: "00000000",
|
text: this.text.substr(11, 1),
|
options: {textAlign: "right", fontSize: this.fontSize}
|
});
|
}
|
|
return result;
|
}
|
}
|
|
// Calulate the checksum digit
|
// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit
|
export function checksum(number){
|
var result = 0;
|
|
var i;
|
for(i = 1; i < 11; i += 2){
|
result += parseInt(number[i]);
|
}
|
for(i = 0; i < 11; i += 2){
|
result += parseInt(number[i]) * 3;
|
}
|
|
return (10 - (result % 10)) % 10;
|
}
|
|
export default UPC;
|