diff --git a/.eslintrc b/.eslintrc
index c1d9a91..e14a66b 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -5,30 +5,6 @@
es6: true
node: true
- ecmaFeatures:
- arrowFunctions: true
- binaryLiterals: true
- blockBindings: true
- classes: false
- defaultParams: true
- destructuring: true
- forOf: true
- generators: true
- globalReturn: true
- jsx: false
- modules: true
- objectLiteralComputedProperties: true
- objectLiteralDuplicateProperties: true
- objectLiteralShorthandMethods: true
- objectLiteralShorthandProperties: true
- octalLiterals: true
- regexUFlag: true
- regexYFlag: true
- spread: true
- superInFunctions: false
- templateStrings: true
- unicodeCodePointEscapes: true
-
rules:
array-bracket-spacing: [2, never]
arrow-parens: [2, as-needed]
@@ -62,7 +38,7 @@
max-depth: [1, 4]
max-len: [0, 80, 4]
max-nested-callbacks: [1, 3]
- max-params: [1, 5] ###
+ max-params: [1, 16] ###
max-statements: [1, 32] ###
new-cap: 0
new-parens: 2
diff --git a/README.md b/README.md
index 27a1f75..bd424fd 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,8 @@
[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
jQuery plugin to dynamically generate QR codes. Uses [QR Code Generator][qrcode] (MIT).
+There is a jQuery-free lib named [kjua][kjua] that works in all modern browsers
+with crisp codes on all devices.
## License
@@ -33,7 +35,8 @@ THE SOFTWARE.
[github]: https://github.com/lrsjng/jquery-qrcode
[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
-[web-img]: https://img.shields.io/badge/web-larsjung.de/qrcode-a0a060.svg?style=flat-square
+[web-img]: https://img.shields.io/badge/web-larsjung.de/jquery--qrcode-a0a060.svg?style=flat-square
[github-img]: https://img.shields.io/badge/github-lrsjng/jquery--qrcode-a0a060.svg?style=flat-square
[qrcode]: https://github.com/kazuhikoarase/qrcode-generator
+[kjua]: https://larsjung.de/kjua/
diff --git a/dist/jquery-qrcode.js b/dist/jquery-qrcode.js
index 3bb9d02..0236e41 100644
--- a/dist/jquery-qrcode.js
+++ b/dist/jquery-qrcode.js
@@ -1,2332 +1,2407 @@
-/*! jquery-qrcode v0.15.0 - https://larsjung.de/jquery-qrcode/ */
-(function (vendor_qrcode) {
- 'use strict';
-
- var jq = window.jQuery;
-
- // Check if canvas is available in the browser (as Modernizr does)
- var hasCanvas = (function () {
- var elem = document.createElement('canvas');
- return !!(elem.getContext && elem.getContext('2d'));
- }());
-
- // Wrapper for the original QR code generator.
- function createQRCode(text, level, version, quiet) {
- var qr = {};
-
- var vqr = vendor_qrcode(version, level);
- vqr.addData(text);
- vqr.make();
-
- quiet = quiet || 0;
-
- var qrModuleCount = vqr.getModuleCount();
- var quietModuleCount = vqr.getModuleCount() + 2 * quiet;
-
- function isDark(row, col) {
- row -= quiet;
- col -= quiet;
-
- if (row < 0 || row >= qrModuleCount || col < 0 || col >= qrModuleCount) {
- return false;
- }
- return vqr.isDark(row, col);
- }
-
- function addBlank(l, t, r, b) {
- var prevIsDark = qr.isDark;
- var moduleSize = 1 / quietModuleCount;
-
- qr.isDark = function (row, col) {
- var ml = col * moduleSize;
- var mt = row * moduleSize;
- var mr = ml + moduleSize;
- var mb = mt + moduleSize;
-
- return prevIsDark(row, col) && (l > mr || ml > r || t > mb || mt > b);
- };
- }
-
- qr.text = text;
- qr.level = level;
- qr.version = version;
- qr.moduleCount = quietModuleCount;
- qr.isDark = isDark;
- qr.addBlank = addBlank;
-
- return qr;
+/*! jquery-qrcode v0.16.0 - https://larsjung.de/jquery-qrcode/ */
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define("jquery-qrcode", [], factory);
+ else if(typeof exports === 'object')
+ exports["jquery-qrcode"] = factory();
+ else
+ root["jquery-qrcode"] = factory();
+})((typeof self !== 'undefined' ? self : this), function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var VQRCODE = __webpack_require__(1);
+
+var WIN = window; // eslint-disable-line no-undef
+
+var JQ = WIN.jQuery; // Check if canvas is available in the browser (as Modernizr does)
+
+var HAS_CANVAS = function () {
+ var el = WIN.document.createElement('canvas');
+ return !!(el.getContext && el.getContext('2d'));
+}();
+
+var is_img_el = function is_img_el(x) {
+ return x && typeof x.tagName === 'string' && x.tagName.toUpperCase() === 'IMG';
+}; // Wrapper for the original QR code generator.
+
+
+var create_qrcode = function create_qrcode(text, level, version, quiet) {
+ var qr = {};
+ var vqr = VQRCODE(version, level);
+ vqr.addData(text);
+ vqr.make();
+ quiet = quiet || 0;
+ var module_count = vqr.getModuleCount();
+ var quiet_module_count = module_count + 2 * quiet;
+
+ var is_dark = function is_dark(row, col) {
+ row -= quiet;
+ col -= quiet;
+ return row >= 0 && row < module_count && col >= 0 && col < module_count && vqr.isDark(row, col);
+ };
+
+ var add_blank = function add_blank(l, t, r, b) {
+ var prev_is_dark = qr.is_dark;
+ var module_size = 1 / quiet_module_count;
+
+ qr.is_dark = function (row, col) {
+ var ml = col * module_size;
+ var mt = row * module_size;
+ var mr = ml + module_size;
+ var mb = mt + module_size;
+ return prev_is_dark(row, col) && (l > mr || ml > r || t > mb || mt > b);
+ };
+ };
+
+ qr.text = text;
+ qr.level = level;
+ qr.version = version;
+ qr.module_count = quiet_module_count;
+ qr.is_dark = is_dark;
+ qr.add_blank = add_blank;
+ return qr;
+}; // Returns a minimal QR code for the given text starting with version `min_ver`.
+// Returns `undefined` if `text` is too long to be encoded in `max_ver`.
+
+
+var create_min_qrcode = function create_min_qrcode(text, level, min_ver, max_ver, quiet) {
+ min_ver = Math.max(1, min_ver || 1);
+ max_ver = Math.min(40, max_ver || 40);
+
+ for (var ver = min_ver; ver <= max_ver; ver += 1) {
+ try {
+ return create_qrcode(text, level, ver, quiet);
+ } catch (err) {
+ /* empty */
}
-
- // Returns a minimal QR code for the given text starting with version `minVersion`.
- // Returns `undefined` if `text` is too long to be encoded in `maxVersion`.
- function createMinQRCode(text, level, minVersion, maxVersion, quiet) {
- minVersion = Math.max(1, minVersion || 1);
- maxVersion = Math.min(40, maxVersion || 40);
- for (var version = minVersion; version <= maxVersion; version += 1) {
- try {
- return createQRCode(text, level, version, quiet);
- } catch (err) {/* empty */}
- }
- return undefined;
+ }
+
+ return undefined;
+};
+
+var draw_background_label = function draw_background_label(qr, context, settings) {
+ var size = settings.size;
+ var font = 'bold ' + settings.mSize * size + 'px ' + settings.fontname;
+ var ctx = JQ('')[0].getContext('2d');
+ ctx.font = font;
+ var w = ctx.measureText(settings.label).width;
+ var sh = settings.mSize;
+ var sw = w / size;
+ var sl = (1 - sw) * settings.mPosX;
+ var st = (1 - sh) * settings.mPosY;
+ var sr = sl + sw;
+ var sb = st + sh;
+ var pad = 0.01;
+
+ if (settings.mode === 1) {
+ // Strip
+ qr.add_blank(0, st - pad, size, sb + pad);
+ } else {
+ // Box
+ qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad);
+ }
+
+ context.fillStyle = settings.fontcolor;
+ context.font = font;
+ context.fillText(settings.label, sl * size, st * size + 0.75 * settings.mSize * size);
+};
+
+var draw_background_img = function draw_background_img(qr, context, settings) {
+ var size = settings.size;
+ var w = settings.image.naturalWidth || 1;
+ var h = settings.image.naturalHeight || 1;
+ var sh = settings.mSize;
+ var sw = sh * w / h;
+ var sl = (1 - sw) * settings.mPosX;
+ var st = (1 - sh) * settings.mPosY;
+ var sr = sl + sw;
+ var sb = st + sh;
+ var pad = 0.01;
+
+ if (settings.mode === 3) {
+ // Strip
+ qr.add_blank(0, st - pad, size, sb + pad);
+ } else {
+ // Box
+ qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad);
+ }
+
+ context.drawImage(settings.image, sl * size, st * size, sw * size, sh * size);
+};
+
+var draw_background = function draw_background(qr, context, settings) {
+ if (is_img_el(settings.background)) {
+ context.drawImage(settings.background, 0, 0, settings.size, settings.size);
+ } else if (settings.background) {
+ context.fillStyle = settings.background;
+ context.fillRect(settings.left, settings.top, settings.size, settings.size);
+ }
+
+ var mode = settings.mode;
+
+ if (mode === 1 || mode === 2) {
+ draw_background_label(qr, context, settings);
+ } else if (is_img_el(settings.image) && (mode === 3 || mode === 4)) {
+ draw_background_img(qr, context, settings);
+ }
+};
+
+var draw_modules_default = function draw_modules_default(qr, context, settings, left, top, width, row, col) {
+ if (qr.is_dark(row, col)) {
+ context.rect(left, top, width, width);
+ }
+};
+
+var draw_modules_rounded_dark = function draw_modules_rounded_dark(ctx, l, t, r, b, rad, nw, ne, se, sw) {
+ if (nw) {
+ ctx.moveTo(l + rad, t);
+ } else {
+ ctx.moveTo(l, t);
+ }
+
+ if (ne) {
+ ctx.lineTo(r - rad, t);
+ ctx.arcTo(r, t, r, b, rad);
+ } else {
+ ctx.lineTo(r, t);
+ }
+
+ if (se) {
+ ctx.lineTo(r, b - rad);
+ ctx.arcTo(r, b, l, b, rad);
+ } else {
+ ctx.lineTo(r, b);
+ }
+
+ if (sw) {
+ ctx.lineTo(l + rad, b);
+ ctx.arcTo(l, b, l, t, rad);
+ } else {
+ ctx.lineTo(l, b);
+ }
+
+ if (nw) {
+ ctx.lineTo(l, t + rad);
+ ctx.arcTo(l, t, r, t, rad);
+ } else {
+ ctx.lineTo(l, t);
+ }
+};
+
+var draw_modules_rounded_light = function draw_modules_rounded_light(ctx, l, t, r, b, rad, nw, ne, se, sw) {
+ if (nw) {
+ ctx.moveTo(l + rad, t);
+ ctx.lineTo(l, t);
+ ctx.lineTo(l, t + rad);
+ ctx.arcTo(l, t, l + rad, t, rad);
+ }
+
+ if (ne) {
+ ctx.moveTo(r - rad, t);
+ ctx.lineTo(r, t);
+ ctx.lineTo(r, t + rad);
+ ctx.arcTo(r, t, r - rad, t, rad);
+ }
+
+ if (se) {
+ ctx.moveTo(r - rad, b);
+ ctx.lineTo(r, b);
+ ctx.lineTo(r, b - rad);
+ ctx.arcTo(r, b, r - rad, b, rad);
+ }
+
+ if (sw) {
+ ctx.moveTo(l + rad, b);
+ ctx.lineTo(l, b);
+ ctx.lineTo(l, b - rad);
+ ctx.arcTo(l, b, l + rad, b, rad);
+ }
+};
+
+var draw_modules_rounded = function draw_modules_rounded(qr, context, settings, left, top, width, row, col) {
+ var is_dark = qr.is_dark;
+ var right = left + width;
+ var bottom = top + width;
+ var radius = settings.radius * width;
+ var rowT = row - 1;
+ var rowB = row + 1;
+ var colL = col - 1;
+ var colR = col + 1;
+ var center = is_dark(row, col);
+ var northwest = is_dark(rowT, colL);
+ var north = is_dark(rowT, col);
+ var northeast = is_dark(rowT, colR);
+ var east = is_dark(row, colR);
+ var southeast = is_dark(rowB, colR);
+ var south = is_dark(rowB, col);
+ var southwest = is_dark(rowB, colL);
+ var west = is_dark(row, colL);
+
+ if (center) {
+ draw_modules_rounded_dark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west);
+ } else {
+ draw_modules_rounded_light(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest);
+ }
+};
+
+var draw_modules = function draw_modules(qr, context, settings) {
+ var module_count = qr.module_count;
+ var module_size = settings.size / module_count;
+ var fn = draw_modules_default;
+ var row;
+ var col;
+
+ if (settings.radius > 0 && settings.radius <= 0.5) {
+ fn = draw_modules_rounded;
+ }
+
+ context.beginPath();
+
+ for (row = 0; row < module_count; row += 1) {
+ for (col = 0; col < module_count; col += 1) {
+ var l = settings.left + col * module_size;
+ var t = settings.top + row * module_size;
+ var w = module_size;
+ fn(qr, context, settings, l, t, w, row, col);
}
-
- function drawBackgroundLabel(qr, context, settings) {
- var size = settings.size;
- var font = 'bold ' + settings.mSize * size + 'px ' + settings.fontname;
- var ctx = jq('')[0].getContext('2d');
-
- ctx.font = font;
-
- var w = ctx.measureText(settings.label).width;
- var sh = settings.mSize;
- var sw = w / size;
- var sl = (1 - sw) * settings.mPosX;
- var st = (1 - sh) * settings.mPosY;
- var sr = sl + sw;
- var sb = st + sh;
- var pad = 0.01;
-
- if (settings.mode === 1) {
- // Strip
- qr.addBlank(0, st - pad, size, sb + pad);
- } else {
- // Box
- qr.addBlank(sl - pad, st - pad, sr + pad, sb + pad);
- }
-
- context.fillStyle = settings.fontcolor;
- context.font = font;
- context.fillText(settings.label, sl * size, st * size + 0.75 * settings.mSize * size);
+ }
+
+ if (is_img_el(settings.fill)) {
+ context.strokeStyle = 'rgba(0,0,0,0.5)';
+ context.lineWidth = 2;
+ context.stroke();
+ var prev = context.globalCompositeOperation;
+ context.globalCompositeOperation = 'destination-out';
+ context.fill();
+ context.globalCompositeOperation = prev;
+ context.clip();
+ context.drawImage(settings.fill, 0, 0, settings.size, settings.size);
+ context.restore();
+ } else {
+ context.fillStyle = settings.fill;
+ context.fill();
+ }
+}; // Draws QR code to the given `canvas` and returns it.
+
+
+var draw_on_canvas = function draw_on_canvas(canvas, settings) {
+ var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet);
+
+ if (!qr) {
+ return null;
+ }
+
+ var $canvas = JQ(canvas).data('qrcode', qr);
+ var context = $canvas[0].getContext('2d');
+ draw_background(qr, context, settings);
+ draw_modules(qr, context, settings);
+ return $canvas;
+}; // Returns a `canvas` element representing the QR code for the given settings.
+
+
+var create_canvas = function create_canvas(settings) {
+ var $canvas = JQ('').attr('width', settings.size).attr('height', settings.size);
+ return draw_on_canvas($canvas, settings);
+}; // Returns an `image` element representing the QR code for the given settings.
+
+
+var create_img = function create_img(settings) {
+ return JQ('').attr('src', create_canvas(settings)[0].toDataURL('image/png'));
+}; // Returns a `div` element representing the QR code for the given settings.
+
+
+var create_div = function create_div(settings) {
+ var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet);
+
+ if (!qr) {
+ return null;
+ } // some shortcuts to improve compression
+
+
+ var settings_size = settings.size;
+ var settings_bgColor = settings.background;
+ var math_floor = Math.floor;
+ var module_count = qr.module_count;
+ var module_size = math_floor(settings_size / module_count);
+ var offset = math_floor(0.5 * (settings_size - module_size * module_count));
+ var row;
+ var col;
+ var container_css = {
+ position: 'relative',
+ left: 0,
+ top: 0,
+ padding: 0,
+ margin: 0,
+ width: settings_size,
+ height: settings_size
+ };
+ var dark_css = {
+ position: 'absolute',
+ padding: 0,
+ margin: 0,
+ width: module_size,
+ height: module_size,
+ 'background-color': settings.fill
+ };
+ var $div = JQ('
'; + } - for (var i = 0; i < dcdata[r].length; i += 1) { - dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; - } - offset += dcCount; + qrHtml += ' |
'; - } + switch(mode) { + case QRMode.MODE_NUMBER : return 10; + case QRMode.MODE_ALPHA_NUM : return 9; + case QRMode.MODE_8BIT_BYTE : return 8; + case QRMode.MODE_KANJI : return 8; + default : + throw new Error('mode:' + mode); + } - qrHtml += ' |