From 67bb9210196175888bcf6a1667481af3f8de4f8b Mon Sep 17 00:00:00 2001 From: Lars Jung Date: Wed, 24 Jul 2013 22:25:19 +0200 Subject: [PATCH] Refactors. Adds blank option. --- README.md | 6 ++++ src/jquery.qrcode.js | 75 +++++++++++++++++++++++++++++++------------- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 7c9e266..9d41c98 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,12 @@ Uses [QR Code Generator](http://www.d-project.com/qrcode/index.html) (MIT). Kudo ## Changelog + +### develop branch + +* ... + + ### v0.5.0 - *2013-07-23* * adds option to set error correction level diff --git a/src/jquery.qrcode.js b/src/jquery.qrcode.js index 8be8f84..c3517bd 100644 --- a/src/jquery.qrcode.js +++ b/src/jquery.qrcode.js @@ -6,35 +6,45 @@ (function ($) { 'use strict'; + + // Wrapper for the original QR code generator. + var QRCode = function (version, level, text) { + + try { + // `qrcode` is the single public function that will be defined by the `QR Code Generator` + // at the end of the file. + var qr = qrcode(version, level); + qr.addData(text); + qr.make(); + + this.version = version; + this.level = level; + this.text = text; + this.moduleCount = qr.getModuleCount(); + this.isDark = function (col, row) { return qr.isDark(col, row); }; + } catch (err) { + return null; + } + }, + // Check if canvas is available in the browser (as Modernizr does) - var canvasAvailable = (function () { + canvasAvailable = (function () { var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }()), - // Wrapper for the original QR code generator. - createQr = function (version, level, text) { - - // `qrcode` is the single public function that will be defined by the `QR Code Generator` - // at the end of the file. - var qr = qrcode(version, level); - qr.addData(text); - qr.make(); - - return qr; - }, - // Returns a minimal QR code for the given text starting with version `minVersion`. // Returns `null` if `text` is too long to be encoded in `maxVersion`. createBestQr = function (minVersion, maxVersion, level, text) { minVersion = Math.max(1, minVersion); maxVersion = Math.min(40, maxVersion); - for (var type = minVersion; type <= maxVersion; type += 1) { - try { - return createQr(type, level, text); - } catch (err) {} + for (var version = minVersion; version <= maxVersion; version += 1) { + var qr = new QRCode(version, level, text); + if (qr) { + return qr; + } } return null; @@ -50,6 +60,7 @@ settings_height = settings.height, settings_color = settings.color, settings_bgColor = settings.bgColor, + settings_blank = settings.blank, qr = createBestQr(settings.minVersion, settings.maxVersion, settings.ecLevel, settings.text), $canvas = $(canvas), @@ -61,15 +72,30 @@ } if (qr) { - var moduleCount = qr.getModuleCount(), + $canvas.data('qrcode', qr); + + var moduleCount = qr.moduleCount, moduleWidth = settings_width / moduleCount, moduleHeight = settings_height / moduleCount, - row, col; + row, col, + forceBlank = function () { return false; }; + + if (settings_blank) { + forceBlank = function (row, col) { + + var l = settings_left + col * moduleWidth, + t = settings_top + row * moduleHeight, + r = l + moduleWidth, + b = t + moduleHeight; + + return settings_blank.l <= r && l <= settings_blank.r && settings_blank.t <= b && t <= settings_blank.b; + }; + } ctx.beginPath(); for (row = 0; row < moduleCount; row += 1) { for (col = 0; col < moduleCount; col += 1) { - if (qr.isDark(row, col)) { + if (qr.isDark(row, col) && !forceBlank(row, col)) { ctx.rect(settings_left + col * moduleWidth, settings_top + row * moduleHeight, moduleWidth, moduleHeight); } } @@ -115,7 +141,9 @@ } if (qr) { - var moduleCount = qr.getModuleCount(), + $div.data('qrcode', qr); + + var moduleCount = qr.moduleCount, moduleWidth = math_floor(settings_width / moduleCount), moduleHeight = math_floor(settings_height / moduleCount), offsetLeft = math_floor(0.5 * (settings_width - moduleWidth * moduleCount)), @@ -186,7 +214,10 @@ bgColor: null, // the encoded text - text: 'no text' + text: 'no text', + + // blank space: {l, t, r, b} + blank: null }; // Register the plugin