tt-mp
Version:
一套组件化、可复用、易扩展的头条小程序 UI 组件库
285 lines (272 loc) • 7.17 kB
JavaScript
/*
* 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 = tt.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
}