123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- // 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;
|