123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- * Copyright (c) 2014 Johannes Mittendorfer (http://johannes-mittendorfer.com)
- * Licensed under the MIT License (LICENSE.txt).
- *
- * Version 2.1.1
- * Build 2014-10-07
- */
- var EAN13, pluginName;
- pluginName = null;
- "use strict";
- EAN13 = (function() {
- EAN13.prototype.settings = {};
- EAN13.prototype.init = function() {
- var checkDigit, code;
- if (this.number.length === 12) {
- checkDigit = this.generateCheckDigit(this.number);
- this.number += checkDigit;
- }
- if (this.number.length === 13) {
- if (this.validate()) {
- this.settings.onValid.call();
- } else {
- this.settings.onInvalid.call();
- }
- code = this.getCode();
- return this.draw(code);
- } else {
- return this.settings.onError.call();
- }
- };
- EAN13.prototype.getCode = function() {
- var c_encoding, code, countries, i, parts, raw_number, x, y, z;
- x = ["0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011"];
- y = ["0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001", "0001001", "0010111"];
- z = ["1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100"];
- countries = ["xxxxxx", "xxyxyy", "xxyyxy", "xxyyyx", "xyxxyy", "xyyxxy", "xyyyxx", "xyxyxy", "xyxyyx", "xyyxyx"];
- code = "";
- c_encoding = countries[parseInt(this.number.substr(0, 1), 10)].split("");
- raw_number = this.number.substr(1);
- parts = raw_number.split("");
- i = 0;
- while (i < 6) {
- if (c_encoding[i] === "x") {
- code += x[parts[i]];
- } else {
- code += y[parts[i]];
- }
- i++;
- }
- i = 6;
- while (i < 12) {
- code += z[parts[i]];
- i++;
- }
- return code;
- };
- EAN13.prototype.clear = function(context) {
- return context.clearRect(0, 0, this.settings.width, this.settings.height);
- };
- EAN13.prototype.draw = function(code) {
- var border_height, chars, context, height, i, item_width, layout, left, lines, offset, prefix, width, x, _i, _ref;
- layout = {
- prefix_offset: 0.06,
- font_stretch: 0.073,
- border_line_height_number: 0.9,
- border_line_height: 1,
- line_height: 0.9,
- font_size: 0.15,
- font_y: 1.03,
- text_offset: 4.5
- };
- width = (this.settings.prefix ? this.settings.width - (this.settings.width * layout.prefix_offset) : this.settings.width);
- if (this.settings.number) {
- border_height = layout.border_line_height_number * this.settings.height;
- height = layout.line_height * border_height;
- } else {
- border_height = layout.border_line_height * this.settings.height;
- height = border_height;
- }
- item_width = width / 95;
- if (this.id) {
- context = wx.createCanvasContext(this.id, this.ctx);
- this.clear(context);
- context.setFillStyle(this.settings.color);
- left = this.settings.number && this.settings.prefix ? this.settings.width * layout.prefix_offset : 0;
- lines = code.split("");
- context.fillRect(left, 0, item_width, border_height);
- left = left + item_width * 2;
- context.fillRect(left, 0, item_width, border_height);
- left = left + item_width;
- i = 0;
- while (i < 42) {
- if (lines[i] === "1") {
- context.fillRect(left, 0, Math.floor(item_width) + 1, height);
- }
- left = left + item_width;
- i++;
- }
- left = left + item_width;
- context.fillRect(left, 0, item_width, border_height);
- left = left + item_width * 2;
- context.fillRect(left, 0, item_width, border_height);
- left = left + item_width * 2;
- i = 42;
- while (i < 84) {
- if (lines[i] === "1") {
- context.fillRect(left, 0, Math.floor(item_width) + 1, height);
- }
- left = left + item_width;
- i++;
- }
- context.fillRect(left, 0, item_width, border_height);
- left = left + item_width * 2;
- context.fillRect(left, 0, item_width, border_height);
- if (this.settings.number) {
- context.setFontSize(layout.font_size * height + "px monospace");
- prefix = this.number.substr(0, 1);
- if (this.settings.prefix) {
- context.fillText(prefix, 0, border_height * layout.font_y);
- }
- offset = item_width * layout.text_offset + (this.settings.prefix ? layout.prefix_offset * this.settings.width : 0);
- chars = this.number.substr(1, 6).split("");
- chars.forEach(function(value, key) {
- context.fillText(value, offset, border_height * layout.font_y);
- return offset += layout.font_stretch * width;
- });
- offset = 49 * item_width + (this.settings.prefix ? layout.prefix_offset * this.settings.width : 0) + layout.text_offset;
- chars = this.number.substr(7).split("")
- chars.forEach(function(value, key) {
- context.fillText(value, offset, border_height * layout.font_y);
- return offset += layout.font_stretch * width;
- });
- }
- if (this.settings.debug) {
- for (x = _i = 0, _ref = item_width * 2; _ref > 0 ? _i <= width : _i >= width; x = _i += _ref) {
- context.beginPath();
- context.rect(x, height * 0.4, item_width, height * 0.1);
- context.setFillStyle('red');
- context.fill();
- }
- }
- context.draw()
- return this.settings.onSuccess.call();
- } else {
- return this.settings.onError.call();
- }
- };
- EAN13.prototype.generateCheckDigit = function(number) {
- var chars, counter;
- counter = 0;
- chars = number.split("");
- chars.forEach(function(value, key) {
- if (key % 2 === 0) {
- return counter += parseInt(value, 10);
- } else {
- return counter += 3 * parseInt(value, 10);
- }
- });
- return 10 - (counter % 10) % 10;
- };
- EAN13.prototype.validate = function() {
- return parseInt(this.number.slice(-1), 10) === this.generateCheckDigit(this.number.slice(0, -1));
- };
- function EAN13(id, number, options, ctx) {
- var option;
- this.id = id;
- this.number = number;
- this.ctx = ctx
- this.settings = {
- width: 200,
- height: 100,
- number: true,
- prefix: true,
- color: "black",
- debug: false,
- onValid: function() {},
- onInvalid: function() {},
- onSuccess: function() {},
- onError: function() {}
- };
- if (options) {
- for (option in options) {
- this.settings[option] = options[option];
- }
- }
- this._name = pluginName;
- this.init();
- }
- return EAN13;
- })();
- if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
- module.exports = EAN13;
- }
|