qrcode.vue
Advanced tools
Comparing version 3.4.1 to 3.5.0
import { PropType } from 'vue'; | ||
export type Level = 'L' | 'M' | 'Q' | 'H'; | ||
export type RenderAs = 'canvas' | 'svg'; | ||
declare const QrcodeVue: import("vue").DefineComponent<{ | ||
export type ImageSettings = { | ||
src: string; | ||
x?: number; | ||
y?: number; | ||
height: number; | ||
width: number; | ||
excavate?: boolean; | ||
}; | ||
export declare const QrcodeSvg: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ | ||
value: { | ||
type: StringConstructor; | ||
required: boolean; | ||
default: string; | ||
}; | ||
size: { | ||
type: NumberConstructor; | ||
default: number; | ||
}; | ||
level: { | ||
type: PropType<Level>; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
}; | ||
background: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
foreground: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
margin: { | ||
type: NumberConstructor; | ||
required: boolean; | ||
default: number; | ||
}; | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, { | ||
[key: string]: any; | ||
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ | ||
value: { | ||
type: StringConstructor; | ||
required: boolean; | ||
default: string; | ||
}; | ||
size: { | ||
type: NumberConstructor; | ||
default: number; | ||
}; | ||
level: { | ||
type: PropType<Level>; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
}; | ||
background: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
foreground: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
margin: { | ||
type: NumberConstructor; | ||
required: boolean; | ||
default: number; | ||
}; | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>> & Readonly<{}>, { | ||
value: string; | ||
size: number; | ||
level: Level; | ||
background: string; | ||
foreground: string; | ||
margin: number; | ||
imageSettings: ImageSettings; | ||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; | ||
export declare const QrcodeCanvas: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ | ||
value: { | ||
type: StringConstructor; | ||
required: boolean; | ||
default: string; | ||
}; | ||
size: { | ||
type: NumberConstructor; | ||
default: number; | ||
}; | ||
level: { | ||
type: PropType<Level>; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
}; | ||
background: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
foreground: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
margin: { | ||
type: NumberConstructor; | ||
required: boolean; | ||
default: number; | ||
}; | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, { | ||
[key: string]: any; | ||
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ | ||
value: { | ||
type: StringConstructor; | ||
required: boolean; | ||
default: string; | ||
}; | ||
size: { | ||
type: NumberConstructor; | ||
default: number; | ||
}; | ||
level: { | ||
type: PropType<Level>; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
}; | ||
background: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
foreground: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
margin: { | ||
type: NumberConstructor; | ||
required: boolean; | ||
default: number; | ||
}; | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>> & Readonly<{}>, { | ||
value: string; | ||
size: number; | ||
level: Level; | ||
background: string; | ||
foreground: string; | ||
margin: number; | ||
imageSettings: ImageSettings; | ||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; | ||
declare const QrcodeVue: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ | ||
renderAs: { | ||
@@ -22,3 +184,3 @@ type: PropType<RenderAs>; | ||
type: PropType<Level>; | ||
default: string; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
@@ -39,3 +201,8 @@ }; | ||
}; | ||
}, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{ | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ | ||
renderAs: { | ||
@@ -58,3 +225,3 @@ type: PropType<RenderAs>; | ||
type: PropType<Level>; | ||
default: string; | ||
default: "L"; | ||
validator: (l: any) => boolean; | ||
@@ -75,3 +242,8 @@ }; | ||
}; | ||
}>>, { | ||
imageSettings: { | ||
type: PropType<ImageSettings>; | ||
required: boolean; | ||
default: () => {}; | ||
}; | ||
}>> & Readonly<{}>, { | ||
value: string; | ||
@@ -83,4 +255,5 @@ size: number; | ||
margin: number; | ||
imageSettings: ImageSettings; | ||
renderAs: RenderAs; | ||
}, {}>; | ||
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; | ||
export default QrcodeVue; |
/*! | ||
* qrcode.vue v3.4.1 | ||
* A Vue.js component to generate QRCode. | ||
* © 2017-2023 @scopewu(https://github.com/scopewu) | ||
* qrcode.vue v3.5.0 | ||
* A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 | ||
* © 2017-PRESENT @scopewu(https://github.com/scopewu) | ||
* MIT License. | ||
*/ | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('vue')) : | ||
typeof define === 'function' && define.amd ? define(['vue'], factory) : | ||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.QrcodeVue = factory(global.Vue)); | ||
})(this, (function (vue) { 'use strict'; | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) : | ||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.QrcodeVue = {}, global.Vue)); | ||
})(this, (function (exports, vue) { 'use strict'; | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
/****************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
/* global Reflect, Promise, SuppressedError, Symbol */ | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
/* global Reflect, Promise, SuppressedError, Symbol */ | ||
var __assign = function() { | ||
__assign = Object.assign || function __assign(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
var __assign = function() { | ||
__assign = Object.assign || function __assign(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
}; | ||
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { | ||
var e = new Error(message); | ||
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; | ||
}; | ||
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { | ||
var e = new Error(message); | ||
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; | ||
}; | ||
/* | ||
* QR Code generator library (TypeScript) | ||
* | ||
* Copyright (c) Project Nayuki. (MIT License) | ||
* https://www.nayuki.io/page/qr-code-generator-library | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy of | ||
* this software and associated documentation files (the "Software"), to deal in | ||
* the Software without restriction, including without limitation the rights to | ||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||
* the Software, and to permit persons to whom the Software is furnished to do so, | ||
* subject to the following conditions: | ||
* - The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* - The Software is provided "as is", without warranty of any kind, express or | ||
* implied, including but not limited to the warranties of merchantability, | ||
* fitness for a particular purpose and noninfringement. In no event shall the | ||
* authors or copyright holders be liable for any claim, damages or other | ||
* liability, whether in an action of contract, tort or otherwise, arising from, | ||
* out of or in connection with the Software or the use or other dealings in the | ||
* Software. | ||
*/ | ||
var qrcodegen; | ||
(function (qrcodegen) { | ||
/*---- QR Code symbol class ----*/ | ||
/* | ||
* QR Code generator library (TypeScript) | ||
* A QR Code symbol, which is a type of two-dimension barcode. | ||
* Invented by Denso Wave and described in the ISO/IEC 18004 standard. | ||
* Instances of this class represent an immutable square grid of dark and light cells. | ||
* The class provides static factory functions to create a QR Code from text or binary data. | ||
* The class covers the QR Code Model 2 specification, supporting all versions (sizes) | ||
* from 1 to 40, all 4 error correction levels, and 4 character encoding modes. | ||
* | ||
* Copyright (c) Project Nayuki. (MIT License) | ||
* https://www.nayuki.io/page/qr-code-generator-library | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy of | ||
* this software and associated documentation files (the "Software"), to deal in | ||
* the Software without restriction, including without limitation the rights to | ||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||
* the Software, and to permit persons to whom the Software is furnished to do so, | ||
* subject to the following conditions: | ||
* - The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* - The Software is provided "as is", without warranty of any kind, express or | ||
* implied, including but not limited to the warranties of merchantability, | ||
* fitness for a particular purpose and noninfringement. In no event shall the | ||
* authors or copyright holders be liable for any claim, damages or other | ||
* liability, whether in an action of contract, tort or otherwise, arising from, | ||
* out of or in connection with the Software or the use or other dealings in the | ||
* Software. | ||
* Ways to create a QR Code object: | ||
* - High level: Take the payload data and call QrCode.encodeText() or QrCode.encodeBinary(). | ||
* - Mid level: Custom-make the list of segments and call QrCode.encodeSegments(). | ||
* - Low level: Custom-make the array of data codeword bytes (including | ||
* segment headers and final padding, excluding error correction codewords), | ||
* supply the appropriate version number, and call the QrCode() constructor. | ||
* (Note that all ways require supplying the desired error correction level.) | ||
*/ | ||
var qrcodegen; | ||
(function (qrcodegen) { | ||
/*---- QR Code symbol class ----*/ | ||
/* | ||
* A QR Code symbol, which is a type of two-dimension barcode. | ||
* Invented by Denso Wave and described in the ISO/IEC 18004 standard. | ||
* Instances of this class represent an immutable square grid of dark and light cells. | ||
* The class provides static factory functions to create a QR Code from text or binary data. | ||
* The class covers the QR Code Model 2 specification, supporting all versions (sizes) | ||
* from 1 to 40, all 4 error correction levels, and 4 character encoding modes. | ||
* | ||
* Ways to create a QR Code object: | ||
* - High level: Take the payload data and call QrCode.encodeText() or QrCode.encodeBinary(). | ||
* - Mid level: Custom-make the list of segments and call QrCode.encodeSegments(). | ||
* - Low level: Custom-make the array of data codeword bytes (including | ||
* segment headers and final padding, excluding error correction codewords), | ||
* supply the appropriate version number, and call the QrCode() constructor. | ||
* (Note that all ways require supplying the desired error correction level.) | ||
*/ | ||
var QrCode = /** @class */ (function () { | ||
/*-- Constructor (low level) and fields --*/ | ||
// Creates a new QR Code with the given version number, | ||
// error correction level, data codeword bytes, and mask number. | ||
// This is a low-level API that most users should not use directly. | ||
// A mid-level API is the encodeSegments() function. | ||
function QrCode( | ||
// The version number of this QR Code, which is between 1 and 40 (inclusive). | ||
// This determines the size of this barcode. | ||
version, | ||
// The error correction level used in this QR Code. | ||
errorCorrectionLevel, dataCodewords, msk) { | ||
this.version = version; | ||
this.errorCorrectionLevel = errorCorrectionLevel; | ||
// The modules of this QR Code (false = light, true = dark). | ||
// Immutable after constructor finishes. Accessed through getModule(). | ||
this.modules = []; | ||
// Indicates function modules that are not subjected to masking. Discarded when constructor finishes. | ||
this.isFunction = []; | ||
// Check scalar arguments | ||
if (version < QrCode.MIN_VERSION || version > QrCode.MAX_VERSION) | ||
throw new RangeError("Version value out of range"); | ||
if (msk < -1 || msk > 7) | ||
throw new RangeError("Mask value out of range"); | ||
this.size = version * 4 + 17; | ||
// Initialize both grids to be size*size arrays of Boolean false | ||
var row = []; | ||
for (var i = 0; i < this.size; i++) | ||
row.push(false); | ||
for (var i = 0; i < this.size; i++) { | ||
this.modules.push(row.slice()); // Initially all light | ||
this.isFunction.push(row.slice()); | ||
} | ||
// Compute ECC, draw modules | ||
this.drawFunctionPatterns(); | ||
var allCodewords = this.addEccAndInterleave(dataCodewords); | ||
this.drawCodewords(allCodewords); | ||
// Do masking | ||
if (msk == -1) { // Automatically choose best mask | ||
var minPenalty = 1000000000; | ||
for (var i = 0; i < 8; i++) { | ||
this.applyMask(i); | ||
this.drawFormatBits(i); | ||
var penalty = this.getPenaltyScore(); | ||
if (penalty < minPenalty) { | ||
msk = i; | ||
minPenalty = penalty; | ||
} | ||
this.applyMask(i); // Undoes the mask due to XOR | ||
var QrCode = /** @class */ (function () { | ||
/*-- Constructor (low level) and fields --*/ | ||
// Creates a new QR Code with the given version number, | ||
// error correction level, data codeword bytes, and mask number. | ||
// This is a low-level API that most users should not use directly. | ||
// A mid-level API is the encodeSegments() function. | ||
function QrCode( | ||
// The version number of this QR Code, which is between 1 and 40 (inclusive). | ||
// This determines the size of this barcode. | ||
version, | ||
// The error correction level used in this QR Code. | ||
errorCorrectionLevel, dataCodewords, msk) { | ||
this.version = version; | ||
this.errorCorrectionLevel = errorCorrectionLevel; | ||
// The modules of this QR Code (false = light, true = dark). | ||
// Immutable after constructor finishes. Accessed through getModule(). | ||
this.modules = []; | ||
// Indicates function modules that are not subjected to masking. Discarded when constructor finishes. | ||
this.isFunction = []; | ||
// Check scalar arguments | ||
if (version < QrCode.MIN_VERSION || version > QrCode.MAX_VERSION) | ||
throw new RangeError("Version value out of range"); | ||
if (msk < -1 || msk > 7) | ||
throw new RangeError("Mask value out of range"); | ||
this.size = version * 4 + 17; | ||
// Initialize both grids to be size*size arrays of Boolean false | ||
var row = []; | ||
for (var i = 0; i < this.size; i++) | ||
row.push(false); | ||
for (var i = 0; i < this.size; i++) { | ||
this.modules.push(row.slice()); // Initially all light | ||
this.isFunction.push(row.slice()); | ||
} | ||
// Compute ECC, draw modules | ||
this.drawFunctionPatterns(); | ||
var allCodewords = this.addEccAndInterleave(dataCodewords); | ||
this.drawCodewords(allCodewords); | ||
// Do masking | ||
if (msk == -1) { // Automatically choose best mask | ||
var minPenalty = 1000000000; | ||
for (var i = 0; i < 8; i++) { | ||
this.applyMask(i); | ||
this.drawFormatBits(i); | ||
var penalty = this.getPenaltyScore(); | ||
if (penalty < minPenalty) { | ||
msk = i; | ||
minPenalty = penalty; | ||
} | ||
this.applyMask(i); // Undoes the mask due to XOR | ||
} | ||
assert(0 <= msk && msk <= 7); | ||
this.mask = msk; | ||
this.applyMask(msk); // Apply the final choice of mask | ||
this.drawFormatBits(msk); // Overwrite old format bits | ||
this.isFunction = []; | ||
} | ||
/*-- Static factory functions (high level) --*/ | ||
// Returns a QR Code representing the given Unicode text string at the given error correction level. | ||
// As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer | ||
// Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible | ||
// QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the | ||
// ecl argument if it can be done without increasing the version. | ||
QrCode.encodeText = function (text, ecl) { | ||
var segs = qrcodegen.QrSegment.makeSegments(text); | ||
return QrCode.encodeSegments(segs, ecl); | ||
}; | ||
// Returns a QR Code representing the given binary data at the given error correction level. | ||
// This function always encodes using the binary segment mode, not any text mode. The maximum number of | ||
// bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output. | ||
// The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version. | ||
QrCode.encodeBinary = function (data, ecl) { | ||
var seg = qrcodegen.QrSegment.makeBytes(data); | ||
return QrCode.encodeSegments([seg], ecl); | ||
}; | ||
/*-- Static factory functions (mid level) --*/ | ||
// Returns a QR Code representing the given segments with the given encoding parameters. | ||
// The smallest possible QR Code version within the given range is automatically | ||
// chosen for the output. Iff boostEcl is true, then the ECC level of the result | ||
// may be higher than the ecl argument if it can be done without increasing the | ||
// version. The mask number is either between 0 to 7 (inclusive) to force that | ||
// mask, or -1 to automatically choose an appropriate mask (which may be slow). | ||
// This function allows the user to create a custom sequence of segments that switches | ||
// between modes (such as alphanumeric and byte) to encode text in less space. | ||
// This is a mid-level API; the high-level API is encodeText() and encodeBinary(). | ||
QrCode.encodeSegments = function (segs, ecl, minVersion, maxVersion, mask, boostEcl) { | ||
if (minVersion === void 0) { minVersion = 1; } | ||
if (maxVersion === void 0) { maxVersion = 40; } | ||
if (mask === void 0) { mask = -1; } | ||
if (boostEcl === void 0) { boostEcl = true; } | ||
if (!(QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= QrCode.MAX_VERSION) | ||
|| mask < -1 || mask > 7) | ||
throw new RangeError("Invalid value"); | ||
// Find the minimal version number to use | ||
var version; | ||
var dataUsedBits; | ||
for (version = minVersion;; version++) { | ||
var dataCapacityBits_1 = QrCode.getNumDataCodewords(version, ecl) * 8; // Number of data bits available | ||
var usedBits = QrSegment.getTotalBits(segs, version); | ||
if (usedBits <= dataCapacityBits_1) { | ||
dataUsedBits = usedBits; | ||
break; // This version number is found to be suitable | ||
} | ||
if (version >= maxVersion) // All versions in the range could not fit the given data | ||
throw new RangeError("Data too long"); | ||
assert(0 <= msk && msk <= 7); | ||
this.mask = msk; | ||
this.applyMask(msk); // Apply the final choice of mask | ||
this.drawFormatBits(msk); // Overwrite old format bits | ||
this.isFunction = []; | ||
} | ||
/*-- Static factory functions (high level) --*/ | ||
// Returns a QR Code representing the given Unicode text string at the given error correction level. | ||
// As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer | ||
// Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible | ||
// QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the | ||
// ecl argument if it can be done without increasing the version. | ||
QrCode.encodeText = function (text, ecl) { | ||
var segs = qrcodegen.QrSegment.makeSegments(text); | ||
return QrCode.encodeSegments(segs, ecl); | ||
}; | ||
// Returns a QR Code representing the given binary data at the given error correction level. | ||
// This function always encodes using the binary segment mode, not any text mode. The maximum number of | ||
// bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output. | ||
// The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version. | ||
QrCode.encodeBinary = function (data, ecl) { | ||
var seg = qrcodegen.QrSegment.makeBytes(data); | ||
return QrCode.encodeSegments([seg], ecl); | ||
}; | ||
/*-- Static factory functions (mid level) --*/ | ||
// Returns a QR Code representing the given segments with the given encoding parameters. | ||
// The smallest possible QR Code version within the given range is automatically | ||
// chosen for the output. Iff boostEcl is true, then the ECC level of the result | ||
// may be higher than the ecl argument if it can be done without increasing the | ||
// version. The mask number is either between 0 to 7 (inclusive) to force that | ||
// mask, or -1 to automatically choose an appropriate mask (which may be slow). | ||
// This function allows the user to create a custom sequence of segments that switches | ||
// between modes (such as alphanumeric and byte) to encode text in less space. | ||
// This is a mid-level API; the high-level API is encodeText() and encodeBinary(). | ||
QrCode.encodeSegments = function (segs, ecl, minVersion, maxVersion, mask, boostEcl) { | ||
if (minVersion === void 0) { minVersion = 1; } | ||
if (maxVersion === void 0) { maxVersion = 40; } | ||
if (mask === void 0) { mask = -1; } | ||
if (boostEcl === void 0) { boostEcl = true; } | ||
if (!(QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= QrCode.MAX_VERSION) | ||
|| mask < -1 || mask > 7) | ||
throw new RangeError("Invalid value"); | ||
// Find the minimal version number to use | ||
var version; | ||
var dataUsedBits; | ||
for (version = minVersion;; version++) { | ||
var dataCapacityBits_1 = QrCode.getNumDataCodewords(version, ecl) * 8; // Number of data bits available | ||
var usedBits = QrSegment.getTotalBits(segs, version); | ||
if (usedBits <= dataCapacityBits_1) { | ||
dataUsedBits = usedBits; | ||
break; // This version number is found to be suitable | ||
} | ||
// Increase the error correction level while the data still fits in the current version number | ||
for (var _i = 0, _a = [QrCode.Ecc.MEDIUM, QrCode.Ecc.QUARTILE, QrCode.Ecc.HIGH]; _i < _a.length; _i++) { // From low to high | ||
var newEcl = _a[_i]; | ||
if (boostEcl && dataUsedBits <= QrCode.getNumDataCodewords(version, newEcl) * 8) | ||
ecl = newEcl; | ||
if (version >= maxVersion) // All versions in the range could not fit the given data | ||
throw new RangeError("Data too long"); | ||
} | ||
// Increase the error correction level while the data still fits in the current version number | ||
for (var _i = 0, _a = [QrCode.Ecc.MEDIUM, QrCode.Ecc.QUARTILE, QrCode.Ecc.HIGH]; _i < _a.length; _i++) { // From low to high | ||
var newEcl = _a[_i]; | ||
if (boostEcl && dataUsedBits <= QrCode.getNumDataCodewords(version, newEcl) * 8) | ||
ecl = newEcl; | ||
} | ||
// Concatenate all segments to create the data bit string | ||
var bb = []; | ||
for (var _b = 0, segs_1 = segs; _b < segs_1.length; _b++) { | ||
var seg = segs_1[_b]; | ||
appendBits(seg.mode.modeBits, 4, bb); | ||
appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb); | ||
for (var _c = 0, _d = seg.getData(); _c < _d.length; _c++) { | ||
var b = _d[_c]; | ||
bb.push(b); | ||
} | ||
// Concatenate all segments to create the data bit string | ||
var bb = []; | ||
for (var _b = 0, segs_1 = segs; _b < segs_1.length; _b++) { | ||
var seg = segs_1[_b]; | ||
appendBits(seg.mode.modeBits, 4, bb); | ||
appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb); | ||
for (var _c = 0, _d = seg.getData(); _c < _d.length; _c++) { | ||
var b = _d[_c]; | ||
bb.push(b); | ||
} | ||
} | ||
assert(bb.length == dataUsedBits); | ||
// Add terminator and pad up to a byte if applicable | ||
var dataCapacityBits = QrCode.getNumDataCodewords(version, ecl) * 8; | ||
assert(bb.length <= dataCapacityBits); | ||
appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb); | ||
appendBits(0, (8 - bb.length % 8) % 8, bb); | ||
assert(bb.length % 8 == 0); | ||
// Pad with alternating bytes until data capacity is reached | ||
for (var padByte = 0xEC; bb.length < dataCapacityBits; padByte ^= 0xEC ^ 0x11) | ||
appendBits(padByte, 8, bb); | ||
// Pack bits into bytes in big endian | ||
var dataCodewords = []; | ||
while (dataCodewords.length * 8 < bb.length) | ||
dataCodewords.push(0); | ||
bb.forEach(function (b, i) { | ||
return dataCodewords[i >>> 3] |= b << (7 - (i & 7)); | ||
}); | ||
// Create the QR Code object | ||
return new QrCode(version, ecl, dataCodewords, mask); | ||
}; | ||
/*-- Accessor methods --*/ | ||
// Returns the color of the module (pixel) at the given coordinates, which is false | ||
// for light or true for dark. The top left corner has the coordinates (x=0, y=0). | ||
// If the given coordinates are out of bounds, then false (light) is returned. | ||
QrCode.prototype.getModule = function (x, y) { | ||
return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x]; | ||
}; | ||
QrCode.prototype.getModules = function () { | ||
return this.modules; | ||
}; | ||
/*-- Private helper methods for constructor: Drawing function modules --*/ | ||
// Reads this object's version field, and draws and marks all function modules. | ||
QrCode.prototype.drawFunctionPatterns = function () { | ||
// Draw horizontal and vertical timing patterns | ||
for (var i = 0; i < this.size; i++) { | ||
this.setFunctionModule(6, i, i % 2 == 0); | ||
this.setFunctionModule(i, 6, i % 2 == 0); | ||
} | ||
// Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) | ||
this.drawFinderPattern(3, 3); | ||
this.drawFinderPattern(this.size - 4, 3); | ||
this.drawFinderPattern(3, this.size - 4); | ||
// Draw numerous alignment patterns | ||
var alignPatPos = this.getAlignmentPatternPositions(); | ||
var numAlign = alignPatPos.length; | ||
for (var i = 0; i < numAlign; i++) { | ||
for (var j = 0; j < numAlign; j++) { | ||
// Don't draw on the three finder corners | ||
if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0)) | ||
this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]); | ||
} | ||
assert(bb.length == dataUsedBits); | ||
// Add terminator and pad up to a byte if applicable | ||
var dataCapacityBits = QrCode.getNumDataCodewords(version, ecl) * 8; | ||
assert(bb.length <= dataCapacityBits); | ||
appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb); | ||
appendBits(0, (8 - bb.length % 8) % 8, bb); | ||
assert(bb.length % 8 == 0); | ||
// Pad with alternating bytes until data capacity is reached | ||
for (var padByte = 0xEC; bb.length < dataCapacityBits; padByte ^= 0xEC ^ 0x11) | ||
appendBits(padByte, 8, bb); | ||
// Pack bits into bytes in big endian | ||
var dataCodewords = []; | ||
while (dataCodewords.length * 8 < bb.length) | ||
dataCodewords.push(0); | ||
bb.forEach(function (b, i) { | ||
return dataCodewords[i >>> 3] |= b << (7 - (i & 7)); | ||
} | ||
// Draw configuration data | ||
this.drawFormatBits(0); // Dummy mask value; overwritten later in the constructor | ||
this.drawVersion(); | ||
}; | ||
// Draws two copies of the format bits (with its own error correction code) | ||
// based on the given mask and this object's error correction level field. | ||
QrCode.prototype.drawFormatBits = function (mask) { | ||
// Calculate error correction code and pack bits | ||
var data = this.errorCorrectionLevel.formatBits << 3 | mask; // errCorrLvl is uint2, mask is uint3 | ||
var rem = data; | ||
for (var i = 0; i < 10; i++) | ||
rem = (rem << 1) ^ ((rem >>> 9) * 0x537); | ||
var bits = (data << 10 | rem) ^ 0x5412; // uint15 | ||
assert(bits >>> 15 == 0); | ||
// Draw first copy | ||
for (var i = 0; i <= 5; i++) | ||
this.setFunctionModule(8, i, getBit(bits, i)); | ||
this.setFunctionModule(8, 7, getBit(bits, 6)); | ||
this.setFunctionModule(8, 8, getBit(bits, 7)); | ||
this.setFunctionModule(7, 8, getBit(bits, 8)); | ||
for (var i = 9; i < 15; i++) | ||
this.setFunctionModule(14 - i, 8, getBit(bits, i)); | ||
// Draw second copy | ||
for (var i = 0; i < 8; i++) | ||
this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i)); | ||
for (var i = 8; i < 15; i++) | ||
this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i)); | ||
this.setFunctionModule(8, this.size - 8, true); // Always dark | ||
}; | ||
// Draws two copies of the version bits (with its own error correction code), | ||
// based on this object's version field, iff 7 <= version <= 40. | ||
QrCode.prototype.drawVersion = function () { | ||
if (this.version < 7) | ||
return; | ||
// Calculate error correction code and pack bits | ||
var rem = this.version; // version is uint6, in the range [7, 40] | ||
for (var i = 0; i < 12; i++) | ||
rem = (rem << 1) ^ ((rem >>> 11) * 0x1F25); | ||
var bits = this.version << 12 | rem; // uint18 | ||
assert(bits >>> 18 == 0); | ||
// Draw two copies | ||
for (var i = 0; i < 18; i++) { | ||
var color = getBit(bits, i); | ||
var a = this.size - 11 + i % 3; | ||
var b = Math.floor(i / 3); | ||
this.setFunctionModule(a, b, color); | ||
this.setFunctionModule(b, a, color); | ||
} | ||
}; | ||
// Draws a 9*9 finder pattern including the border separator, | ||
// with the center module at (x, y). Modules can be out of bounds. | ||
QrCode.prototype.drawFinderPattern = function (x, y) { | ||
for (var dy = -4; dy <= 4; dy++) { | ||
for (var dx = -4; dx <= 4; dx++) { | ||
var dist = Math.max(Math.abs(dx), Math.abs(dy)); // Chebyshev/infinity norm | ||
var xx = x + dx; | ||
var yy = y + dy; | ||
if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size) | ||
this.setFunctionModule(xx, yy, dist != 2 && dist != 4); | ||
} | ||
} | ||
}; | ||
// Draws a 5*5 alignment pattern, with the center module | ||
// at (x, y). All modules must be in bounds. | ||
QrCode.prototype.drawAlignmentPattern = function (x, y) { | ||
for (var dy = -2; dy <= 2; dy++) { | ||
for (var dx = -2; dx <= 2; dx++) | ||
this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1); | ||
} | ||
}; | ||
// Sets the color of a module and marks it as a function module. | ||
// Only used by the constructor. Coordinates must be in bounds. | ||
QrCode.prototype.setFunctionModule = function (x, y, isDark) { | ||
this.modules[y][x] = isDark; | ||
this.isFunction[y][x] = true; | ||
}; | ||
/*-- Private helper methods for constructor: Codewords and masking --*/ | ||
// Returns a new byte string representing the given data with the appropriate error correction | ||
// codewords appended to it, based on this object's version and error correction level. | ||
QrCode.prototype.addEccAndInterleave = function (data) { | ||
var ver = this.version; | ||
var ecl = this.errorCorrectionLevel; | ||
if (data.length != QrCode.getNumDataCodewords(ver, ecl)) | ||
throw new RangeError("Invalid argument"); | ||
// Calculate parameter numbers | ||
var numBlocks = QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver]; | ||
var blockEccLen = QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver]; | ||
var rawCodewords = Math.floor(QrCode.getNumRawDataModules(ver) / 8); | ||
var numShortBlocks = numBlocks - rawCodewords % numBlocks; | ||
var shortBlockLen = Math.floor(rawCodewords / numBlocks); | ||
// Split data into blocks and append ECC to each block | ||
var blocks = []; | ||
var rsDiv = QrCode.reedSolomonComputeDivisor(blockEccLen); | ||
for (var i = 0, k = 0; i < numBlocks; i++) { | ||
var dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1)); | ||
k += dat.length; | ||
var ecc = QrCode.reedSolomonComputeRemainder(dat, rsDiv); | ||
if (i < numShortBlocks) | ||
dat.push(0); | ||
blocks.push(dat.concat(ecc)); | ||
} | ||
// Interleave (not concatenate) the bytes from every block into a single sequence | ||
var result = []; | ||
var _loop_1 = function (i) { | ||
blocks.forEach(function (block, j) { | ||
// Skip the padding byte in short blocks | ||
if (i != shortBlockLen - blockEccLen || j >= numShortBlocks) | ||
result.push(block[i]); | ||
}); | ||
// Create the QR Code object | ||
return new QrCode(version, ecl, dataCodewords, mask); | ||
}; | ||
/*-- Accessor methods --*/ | ||
// Returns the color of the module (pixel) at the given coordinates, which is false | ||
// for light or true for dark. The top left corner has the coordinates (x=0, y=0). | ||
// If the given coordinates are out of bounds, then false (light) is returned. | ||
QrCode.prototype.getModule = function (x, y) { | ||
return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x]; | ||
}; | ||
QrCode.prototype.getModules = function () { | ||
return this.modules; | ||
}; | ||
/*-- Private helper methods for constructor: Drawing function modules --*/ | ||
// Reads this object's version field, and draws and marks all function modules. | ||
QrCode.prototype.drawFunctionPatterns = function () { | ||
// Draw horizontal and vertical timing patterns | ||
for (var i = 0; i < this.size; i++) { | ||
this.setFunctionModule(6, i, i % 2 == 0); | ||
this.setFunctionModule(i, 6, i % 2 == 0); | ||
} | ||
// Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) | ||
this.drawFinderPattern(3, 3); | ||
this.drawFinderPattern(this.size - 4, 3); | ||
this.drawFinderPattern(3, this.size - 4); | ||
// Draw numerous alignment patterns | ||
var alignPatPos = this.getAlignmentPatternPositions(); | ||
var numAlign = alignPatPos.length; | ||
for (var i = 0; i < numAlign; i++) { | ||
for (var j = 0; j < numAlign; j++) { | ||
// Don't draw on the three finder corners | ||
if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0)) | ||
this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]); | ||
for (var i = 0; i < blocks[0].length; i++) { | ||
_loop_1(i); | ||
} | ||
assert(result.length == rawCodewords); | ||
return result; | ||
}; | ||
// Draws the given sequence of 8-bit codewords (data and error correction) onto the entire | ||
// data area of this QR Code. Function modules need to be marked off before this is called. | ||
QrCode.prototype.drawCodewords = function (data) { | ||
if (data.length != Math.floor(QrCode.getNumRawDataModules(this.version) / 8)) | ||
throw new RangeError("Invalid argument"); | ||
var i = 0; // Bit index into the data | ||
// Do the funny zigzag scan | ||
for (var right = this.size - 1; right >= 1; right -= 2) { // Index of right column in each column pair | ||
if (right == 6) | ||
right = 5; | ||
for (var vert = 0; vert < this.size; vert++) { // Vertical counter | ||
for (var j = 0; j < 2; j++) { | ||
var x = right - j; // Actual x coordinate | ||
var upward = ((right + 1) & 2) == 0; | ||
var y = upward ? this.size - 1 - vert : vert; // Actual y coordinate | ||
if (!this.isFunction[y][x] && i < data.length * 8) { | ||
this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7)); | ||
i++; | ||
} | ||
// If this QR Code has any remainder bits (0 to 7), they were assigned as | ||
// 0/false/light by the constructor and are left unchanged by this method | ||
} | ||
} | ||
// Draw configuration data | ||
this.drawFormatBits(0); // Dummy mask value; overwritten later in the constructor | ||
this.drawVersion(); | ||
}; | ||
// Draws two copies of the format bits (with its own error correction code) | ||
// based on the given mask and this object's error correction level field. | ||
QrCode.prototype.drawFormatBits = function (mask) { | ||
// Calculate error correction code and pack bits | ||
var data = this.errorCorrectionLevel.formatBits << 3 | mask; // errCorrLvl is uint2, mask is uint3 | ||
var rem = data; | ||
for (var i = 0; i < 10; i++) | ||
rem = (rem << 1) ^ ((rem >>> 9) * 0x537); | ||
var bits = (data << 10 | rem) ^ 0x5412; // uint15 | ||
assert(bits >>> 15 == 0); | ||
// Draw first copy | ||
for (var i = 0; i <= 5; i++) | ||
this.setFunctionModule(8, i, getBit(bits, i)); | ||
this.setFunctionModule(8, 7, getBit(bits, 6)); | ||
this.setFunctionModule(8, 8, getBit(bits, 7)); | ||
this.setFunctionModule(7, 8, getBit(bits, 8)); | ||
for (var i = 9; i < 15; i++) | ||
this.setFunctionModule(14 - i, 8, getBit(bits, i)); | ||
// Draw second copy | ||
for (var i = 0; i < 8; i++) | ||
this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i)); | ||
for (var i = 8; i < 15; i++) | ||
this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i)); | ||
this.setFunctionModule(8, this.size - 8, true); // Always dark | ||
}; | ||
// Draws two copies of the version bits (with its own error correction code), | ||
// based on this object's version field, iff 7 <= version <= 40. | ||
QrCode.prototype.drawVersion = function () { | ||
if (this.version < 7) | ||
return; | ||
// Calculate error correction code and pack bits | ||
var rem = this.version; // version is uint6, in the range [7, 40] | ||
for (var i = 0; i < 12; i++) | ||
rem = (rem << 1) ^ ((rem >>> 11) * 0x1F25); | ||
var bits = this.version << 12 | rem; // uint18 | ||
assert(bits >>> 18 == 0); | ||
// Draw two copies | ||
for (var i = 0; i < 18; i++) { | ||
var color = getBit(bits, i); | ||
var a = this.size - 11 + i % 3; | ||
var b = Math.floor(i / 3); | ||
this.setFunctionModule(a, b, color); | ||
this.setFunctionModule(b, a, color); | ||
} | ||
}; | ||
// Draws a 9*9 finder pattern including the border separator, | ||
// with the center module at (x, y). Modules can be out of bounds. | ||
QrCode.prototype.drawFinderPattern = function (x, y) { | ||
for (var dy = -4; dy <= 4; dy++) { | ||
for (var dx = -4; dx <= 4; dx++) { | ||
var dist = Math.max(Math.abs(dx), Math.abs(dy)); // Chebyshev/infinity norm | ||
var xx = x + dx; | ||
var yy = y + dy; | ||
if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size) | ||
this.setFunctionModule(xx, yy, dist != 2 && dist != 4); | ||
} | ||
assert(i == data.length * 8); | ||
}; | ||
// XORs the codeword modules in this QR Code with the given mask pattern. | ||
// The function modules must be marked and the codeword bits must be drawn | ||
// before masking. Due to the arithmetic of XOR, calling applyMask() with | ||
// the same mask value a second time will undo the mask. A final well-formed | ||
// QR Code needs exactly one (not zero, two, etc.) mask applied. | ||
QrCode.prototype.applyMask = function (mask) { | ||
if (mask < 0 || mask > 7) | ||
throw new RangeError("Mask value out of range"); | ||
for (var y = 0; y < this.size; y++) { | ||
for (var x = 0; x < this.size; x++) { | ||
var invert = void 0; | ||
switch (mask) { | ||
case 0: | ||
invert = (x + y) % 2 == 0; | ||
break; | ||
case 1: | ||
invert = y % 2 == 0; | ||
break; | ||
case 2: | ||
invert = x % 3 == 0; | ||
break; | ||
case 3: | ||
invert = (x + y) % 3 == 0; | ||
break; | ||
case 4: | ||
invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0; | ||
break; | ||
case 5: | ||
invert = x * y % 2 + x * y % 3 == 0; | ||
break; | ||
case 6: | ||
invert = (x * y % 2 + x * y % 3) % 2 == 0; | ||
break; | ||
case 7: | ||
invert = ((x + y) % 2 + x * y % 3) % 2 == 0; | ||
break; | ||
default: throw new Error("Unreachable"); | ||
} | ||
if (!this.isFunction[y][x] && invert) | ||
this.modules[y][x] = !this.modules[y][x]; | ||
} | ||
}; | ||
// Draws a 5*5 alignment pattern, with the center module | ||
// at (x, y). All modules must be in bounds. | ||
QrCode.prototype.drawAlignmentPattern = function (x, y) { | ||
for (var dy = -2; dy <= 2; dy++) { | ||
for (var dx = -2; dx <= 2; dx++) | ||
this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1); | ||
} | ||
}; | ||
// Sets the color of a module and marks it as a function module. | ||
// Only used by the constructor. Coordinates must be in bounds. | ||
QrCode.prototype.setFunctionModule = function (x, y, isDark) { | ||
this.modules[y][x] = isDark; | ||
this.isFunction[y][x] = true; | ||
}; | ||
/*-- Private helper methods for constructor: Codewords and masking --*/ | ||
// Returns a new byte string representing the given data with the appropriate error correction | ||
// codewords appended to it, based on this object's version and error correction level. | ||
QrCode.prototype.addEccAndInterleave = function (data) { | ||
var ver = this.version; | ||
var ecl = this.errorCorrectionLevel; | ||
if (data.length != QrCode.getNumDataCodewords(ver, ecl)) | ||
throw new RangeError("Invalid argument"); | ||
// Calculate parameter numbers | ||
var numBlocks = QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver]; | ||
var blockEccLen = QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver]; | ||
var rawCodewords = Math.floor(QrCode.getNumRawDataModules(ver) / 8); | ||
var numShortBlocks = numBlocks - rawCodewords % numBlocks; | ||
var shortBlockLen = Math.floor(rawCodewords / numBlocks); | ||
// Split data into blocks and append ECC to each block | ||
var blocks = []; | ||
var rsDiv = QrCode.reedSolomonComputeDivisor(blockEccLen); | ||
for (var i = 0, k = 0; i < numBlocks; i++) { | ||
var dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1)); | ||
k += dat.length; | ||
var ecc = QrCode.reedSolomonComputeRemainder(dat, rsDiv); | ||
if (i < numShortBlocks) | ||
dat.push(0); | ||
blocks.push(dat.concat(ecc)); | ||
} | ||
// Interleave (not concatenate) the bytes from every block into a single sequence | ||
var result = []; | ||
var _loop_1 = function (i) { | ||
blocks.forEach(function (block, j) { | ||
// Skip the padding byte in short blocks | ||
if (i != shortBlockLen - blockEccLen || j >= numShortBlocks) | ||
result.push(block[i]); | ||
}); | ||
}; | ||
for (var i = 0; i < blocks[0].length; i++) { | ||
_loop_1(i); | ||
} | ||
assert(result.length == rawCodewords); | ||
return result; | ||
}; | ||
// Draws the given sequence of 8-bit codewords (data and error correction) onto the entire | ||
// data area of this QR Code. Function modules need to be marked off before this is called. | ||
QrCode.prototype.drawCodewords = function (data) { | ||
if (data.length != Math.floor(QrCode.getNumRawDataModules(this.version) / 8)) | ||
throw new RangeError("Invalid argument"); | ||
var i = 0; // Bit index into the data | ||
// Do the funny zigzag scan | ||
for (var right = this.size - 1; right >= 1; right -= 2) { // Index of right column in each column pair | ||
if (right == 6) | ||
right = 5; | ||
for (var vert = 0; vert < this.size; vert++) { // Vertical counter | ||
for (var j = 0; j < 2; j++) { | ||
var x = right - j; // Actual x coordinate | ||
var upward = ((right + 1) & 2) == 0; | ||
var y = upward ? this.size - 1 - vert : vert; // Actual y coordinate | ||
if (!this.isFunction[y][x] && i < data.length * 8) { | ||
this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7)); | ||
i++; | ||
} | ||
// If this QR Code has any remainder bits (0 to 7), they were assigned as | ||
// 0/false/light by the constructor and are left unchanged by this method | ||
} | ||
} | ||
}; | ||
// Calculates and returns the penalty score based on state of this QR Code's current modules. | ||
// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. | ||
QrCode.prototype.getPenaltyScore = function () { | ||
var result = 0; | ||
// Adjacent modules in row having same color, and finder-like patterns | ||
for (var y = 0; y < this.size; y++) { | ||
var runColor = false; | ||
var runX = 0; | ||
var runHistory = [0, 0, 0, 0, 0, 0, 0]; | ||
for (var x = 0; x < this.size; x++) { | ||
if (this.modules[y][x] == runColor) { | ||
runX++; | ||
if (runX == 5) | ||
result += QrCode.PENALTY_N1; | ||
else if (runX > 5) | ||
result++; | ||
} | ||
} | ||
assert(i == data.length * 8); | ||
}; | ||
// XORs the codeword modules in this QR Code with the given mask pattern. | ||
// The function modules must be marked and the codeword bits must be drawn | ||
// before masking. Due to the arithmetic of XOR, calling applyMask() with | ||
// the same mask value a second time will undo the mask. A final well-formed | ||
// QR Code needs exactly one (not zero, two, etc.) mask applied. | ||
QrCode.prototype.applyMask = function (mask) { | ||
if (mask < 0 || mask > 7) | ||
throw new RangeError("Mask value out of range"); | ||
for (var y = 0; y < this.size; y++) { | ||
for (var x = 0; x < this.size; x++) { | ||
var invert = void 0; | ||
switch (mask) { | ||
case 0: | ||
invert = (x + y) % 2 == 0; | ||
break; | ||
case 1: | ||
invert = y % 2 == 0; | ||
break; | ||
case 2: | ||
invert = x % 3 == 0; | ||
break; | ||
case 3: | ||
invert = (x + y) % 3 == 0; | ||
break; | ||
case 4: | ||
invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0; | ||
break; | ||
case 5: | ||
invert = x * y % 2 + x * y % 3 == 0; | ||
break; | ||
case 6: | ||
invert = (x * y % 2 + x * y % 3) % 2 == 0; | ||
break; | ||
case 7: | ||
invert = ((x + y) % 2 + x * y % 3) % 2 == 0; | ||
break; | ||
default: throw new Error("Unreachable"); | ||
} | ||
if (!this.isFunction[y][x] && invert) | ||
this.modules[y][x] = !this.modules[y][x]; | ||
else { | ||
this.finderPenaltyAddHistory(runX, runHistory); | ||
if (!runColor) | ||
result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3; | ||
runColor = this.modules[y][x]; | ||
runX = 1; | ||
} | ||
} | ||
}; | ||
// Calculates and returns the penalty score based on state of this QR Code's current modules. | ||
// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. | ||
QrCode.prototype.getPenaltyScore = function () { | ||
var result = 0; | ||
// Adjacent modules in row having same color, and finder-like patterns | ||
result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * QrCode.PENALTY_N3; | ||
} | ||
// Adjacent modules in column having same color, and finder-like patterns | ||
for (var x = 0; x < this.size; x++) { | ||
var runColor = false; | ||
var runY = 0; | ||
var runHistory = [0, 0, 0, 0, 0, 0, 0]; | ||
for (var y = 0; y < this.size; y++) { | ||
var runColor = false; | ||
var runX = 0; | ||
var runHistory = [0, 0, 0, 0, 0, 0, 0]; | ||
for (var x = 0; x < this.size; x++) { | ||
if (this.modules[y][x] == runColor) { | ||
runX++; | ||
if (runX == 5) | ||
result += QrCode.PENALTY_N1; | ||
else if (runX > 5) | ||
result++; | ||
} | ||
else { | ||
this.finderPenaltyAddHistory(runX, runHistory); | ||
if (!runColor) | ||
result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3; | ||
runColor = this.modules[y][x]; | ||
runX = 1; | ||
} | ||
if (this.modules[y][x] == runColor) { | ||
runY++; | ||
if (runY == 5) | ||
result += QrCode.PENALTY_N1; | ||
else if (runY > 5) | ||
result++; | ||
} | ||
result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * QrCode.PENALTY_N3; | ||
} | ||
// Adjacent modules in column having same color, and finder-like patterns | ||
for (var x = 0; x < this.size; x++) { | ||
var runColor = false; | ||
var runY = 0; | ||
var runHistory = [0, 0, 0, 0, 0, 0, 0]; | ||
for (var y = 0; y < this.size; y++) { | ||
if (this.modules[y][x] == runColor) { | ||
runY++; | ||
if (runY == 5) | ||
result += QrCode.PENALTY_N1; | ||
else if (runY > 5) | ||
result++; | ||
} | ||
else { | ||
this.finderPenaltyAddHistory(runY, runHistory); | ||
if (!runColor) | ||
result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3; | ||
runColor = this.modules[y][x]; | ||
runY = 1; | ||
} | ||
else { | ||
this.finderPenaltyAddHistory(runY, runHistory); | ||
if (!runColor) | ||
result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3; | ||
runColor = this.modules[y][x]; | ||
runY = 1; | ||
} | ||
result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * QrCode.PENALTY_N3; | ||
} | ||
// 2*2 blocks of modules having same color | ||
for (var y = 0; y < this.size - 1; y++) { | ||
for (var x = 0; x < this.size - 1; x++) { | ||
var color = this.modules[y][x]; | ||
if (color == this.modules[y][x + 1] && | ||
color == this.modules[y + 1][x] && | ||
color == this.modules[y + 1][x + 1]) | ||
result += QrCode.PENALTY_N2; | ||
} | ||
result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * QrCode.PENALTY_N3; | ||
} | ||
// 2*2 blocks of modules having same color | ||
for (var y = 0; y < this.size - 1; y++) { | ||
for (var x = 0; x < this.size - 1; x++) { | ||
var color = this.modules[y][x]; | ||
if (color == this.modules[y][x + 1] && | ||
color == this.modules[y + 1][x] && | ||
color == this.modules[y + 1][x + 1]) | ||
result += QrCode.PENALTY_N2; | ||
} | ||
// Balance of dark and light modules | ||
var dark = 0; | ||
for (var _i = 0, _a = this.modules; _i < _a.length; _i++) { | ||
var row = _a[_i]; | ||
dark = row.reduce(function (sum, color) { return sum + (color ? 1 : 0); }, dark); | ||
} | ||
var total = this.size * this.size; // Note that size is odd, so dark/total != 1/2 | ||
// Compute the smallest integer k >= 0 such that (45-5k)% <= dark/total <= (55+5k)% | ||
var k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1; | ||
assert(0 <= k && k <= 9); | ||
result += k * QrCode.PENALTY_N4; | ||
assert(0 <= result && result <= 2568888); // Non-tight upper bound based on default values of PENALTY_N1, ..., N4 | ||
} | ||
// Balance of dark and light modules | ||
var dark = 0; | ||
for (var _i = 0, _a = this.modules; _i < _a.length; _i++) { | ||
var row = _a[_i]; | ||
dark = row.reduce(function (sum, color) { return sum + (color ? 1 : 0); }, dark); | ||
} | ||
var total = this.size * this.size; // Note that size is odd, so dark/total != 1/2 | ||
// Compute the smallest integer k >= 0 such that (45-5k)% <= dark/total <= (55+5k)% | ||
var k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1; | ||
assert(0 <= k && k <= 9); | ||
result += k * QrCode.PENALTY_N4; | ||
assert(0 <= result && result <= 2568888); // Non-tight upper bound based on default values of PENALTY_N1, ..., N4 | ||
return result; | ||
}; | ||
/*-- Private helper functions --*/ | ||
// Returns an ascending list of positions of alignment patterns for this version number. | ||
// Each position is in the range [0,177), and are used on both the x and y axes. | ||
// This could be implemented as lookup table of 40 variable-length lists of integers. | ||
QrCode.prototype.getAlignmentPatternPositions = function () { | ||
if (this.version == 1) | ||
return []; | ||
else { | ||
var numAlign = Math.floor(this.version / 7) + 2; | ||
var step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2; | ||
var result = [6]; | ||
for (var pos = this.size - 7; result.length < numAlign; pos -= step) | ||
result.splice(1, 0, pos); | ||
return result; | ||
}; | ||
/*-- Private helper functions --*/ | ||
// Returns an ascending list of positions of alignment patterns for this version number. | ||
// Each position is in the range [0,177), and are used on both the x and y axes. | ||
// This could be implemented as lookup table of 40 variable-length lists of integers. | ||
QrCode.prototype.getAlignmentPatternPositions = function () { | ||
if (this.version == 1) | ||
return []; | ||
else { | ||
var numAlign = Math.floor(this.version / 7) + 2; | ||
var step = (this.version == 32) ? 26 : | ||
Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2; | ||
var result = [6]; | ||
for (var pos = this.size - 7; result.length < numAlign; pos -= step) | ||
result.splice(1, 0, pos); | ||
return result; | ||
} | ||
}; | ||
// Returns the number of data bits that can be stored in a QR Code of the given version number, after | ||
// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. | ||
// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. | ||
QrCode.getNumRawDataModules = function (ver) { | ||
if (ver < QrCode.MIN_VERSION || ver > QrCode.MAX_VERSION) | ||
throw new RangeError("Version number out of range"); | ||
var result = (16 * ver + 128) * ver + 64; | ||
if (ver >= 2) { | ||
var numAlign = Math.floor(ver / 7) + 2; | ||
result -= (25 * numAlign - 10) * numAlign - 55; | ||
if (ver >= 7) | ||
result -= 36; | ||
} | ||
assert(208 <= result && result <= 29648); | ||
return result; | ||
}; | ||
// Returns the number of 8-bit data (i.e. not error correction) codewords contained in any | ||
// QR Code of the given version number and error correction level, with remainder bits discarded. | ||
// This stateless pure function could be implemented as a (40*4)-cell lookup table. | ||
QrCode.getNumDataCodewords = function (ver, ecl) { | ||
return Math.floor(QrCode.getNumRawDataModules(ver) / 8) - | ||
QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * | ||
QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver]; | ||
}; | ||
// Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be | ||
// implemented as a lookup table over all possible parameter values, instead of as an algorithm. | ||
QrCode.reedSolomonComputeDivisor = function (degree) { | ||
if (degree < 1 || degree > 255) | ||
throw new RangeError("Degree out of range"); | ||
// Polynomial coefficients are stored from highest to lowest power, excluding the leading term which is always 1. | ||
// For example the polynomial x^3 + 255x^2 + 8x + 93 is stored as the uint8 array [255, 8, 93]. | ||
var result = []; | ||
for (var i = 0; i < degree - 1; i++) | ||
result.push(0); | ||
result.push(1); // Start off with the monomial x^0 | ||
// Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), | ||
// and drop the highest monomial term which is always 1x^degree. | ||
// Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). | ||
var root = 1; | ||
for (var i = 0; i < degree; i++) { | ||
// Multiply the current product by (x - r^i) | ||
for (var j = 0; j < result.length; j++) { | ||
result[j] = QrCode.reedSolomonMultiply(result[j], root); | ||
if (j + 1 < result.length) | ||
result[j] ^= result[j + 1]; | ||
} | ||
root = QrCode.reedSolomonMultiply(root, 0x02); | ||
} | ||
return result; | ||
}; | ||
// Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials. | ||
QrCode.reedSolomonComputeRemainder = function (data, divisor) { | ||
var result = divisor.map(function (_) { return 0; }); | ||
var _loop_2 = function (b) { | ||
var factor = b ^ result.shift(); | ||
result.push(0); | ||
divisor.forEach(function (coef, i) { | ||
return result[i] ^= QrCode.reedSolomonMultiply(coef, factor); | ||
}); | ||
}; | ||
// Returns the number of data bits that can be stored in a QR Code of the given version number, after | ||
// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. | ||
// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. | ||
QrCode.getNumRawDataModules = function (ver) { | ||
if (ver < QrCode.MIN_VERSION || ver > QrCode.MAX_VERSION) | ||
throw new RangeError("Version number out of range"); | ||
var result = (16 * ver + 128) * ver + 64; | ||
if (ver >= 2) { | ||
var numAlign = Math.floor(ver / 7) + 2; | ||
result -= (25 * numAlign - 10) * numAlign - 55; | ||
if (ver >= 7) | ||
result -= 36; | ||
} | ||
assert(208 <= result && result <= 29648); | ||
return result; | ||
}; | ||
// Returns the number of 8-bit data (i.e. not error correction) codewords contained in any | ||
// QR Code of the given version number and error correction level, with remainder bits discarded. | ||
// This stateless pure function could be implemented as a (40*4)-cell lookup table. | ||
QrCode.getNumDataCodewords = function (ver, ecl) { | ||
return Math.floor(QrCode.getNumRawDataModules(ver) / 8) - | ||
QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * | ||
QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver]; | ||
}; | ||
// Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be | ||
// implemented as a lookup table over all possible parameter values, instead of as an algorithm. | ||
QrCode.reedSolomonComputeDivisor = function (degree) { | ||
if (degree < 1 || degree > 255) | ||
throw new RangeError("Degree out of range"); | ||
// Polynomial coefficients are stored from highest to lowest power, excluding the leading term which is always 1. | ||
// For example the polynomial x^3 + 255x^2 + 8x + 93 is stored as the uint8 array [255, 8, 93]. | ||
var result = []; | ||
for (var i = 0; i < degree - 1; i++) | ||
result.push(0); | ||
result.push(1); // Start off with the monomial x^0 | ||
// Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), | ||
// and drop the highest monomial term which is always 1x^degree. | ||
// Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). | ||
var root = 1; | ||
for (var i = 0; i < degree; i++) { | ||
// Multiply the current product by (x - r^i) | ||
for (var j = 0; j < result.length; j++) { | ||
result[j] = QrCode.reedSolomonMultiply(result[j], root); | ||
if (j + 1 < result.length) | ||
result[j] ^= result[j + 1]; | ||
} | ||
root = QrCode.reedSolomonMultiply(root, 0x02); | ||
} | ||
return result; | ||
}; | ||
// Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials. | ||
QrCode.reedSolomonComputeRemainder = function (data, divisor) { | ||
var result = divisor.map(function (_) { return 0; }); | ||
var _loop_2 = function (b) { | ||
var factor = b ^ result.shift(); | ||
result.push(0); | ||
divisor.forEach(function (coef, i) { | ||
return result[i] ^= QrCode.reedSolomonMultiply(coef, factor); | ||
}); | ||
}; | ||
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) { | ||
var b = data_1[_i]; | ||
_loop_2(b); | ||
} | ||
return result; | ||
}; | ||
// Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result | ||
// are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8. | ||
QrCode.reedSolomonMultiply = function (x, y) { | ||
if (x >>> 8 != 0 || y >>> 8 != 0) | ||
throw new RangeError("Byte out of range"); | ||
// Russian peasant multiplication | ||
var z = 0; | ||
for (var i = 7; i >= 0; i--) { | ||
z = (z << 1) ^ ((z >>> 7) * 0x11D); | ||
z ^= ((y >>> i) & 1) * x; | ||
} | ||
assert(z >>> 8 == 0); | ||
return z; | ||
}; | ||
// Can only be called immediately after a light run is added, and | ||
// returns either 0, 1, or 2. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyCountPatterns = function (runHistory) { | ||
var n = runHistory[1]; | ||
assert(n <= this.size * 3); | ||
var core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n; | ||
return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) | ||
+ (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0); | ||
}; | ||
// Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyTerminateAndCount = function (currentRunColor, currentRunLength, runHistory) { | ||
if (currentRunColor) { // Terminate dark run | ||
this.finderPenaltyAddHistory(currentRunLength, runHistory); | ||
currentRunLength = 0; | ||
} | ||
currentRunLength += this.size; // Add light border to final run | ||
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) { | ||
var b = data_1[_i]; | ||
_loop_2(b); | ||
} | ||
return result; | ||
}; | ||
// Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result | ||
// are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8. | ||
QrCode.reedSolomonMultiply = function (x, y) { | ||
if (x >>> 8 != 0 || y >>> 8 != 0) | ||
throw new RangeError("Byte out of range"); | ||
// Russian peasant multiplication | ||
var z = 0; | ||
for (var i = 7; i >= 0; i--) { | ||
z = (z << 1) ^ ((z >>> 7) * 0x11D); | ||
z ^= ((y >>> i) & 1) * x; | ||
} | ||
assert(z >>> 8 == 0); | ||
return z; | ||
}; | ||
// Can only be called immediately after a light run is added, and | ||
// returns either 0, 1, or 2. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyCountPatterns = function (runHistory) { | ||
var n = runHistory[1]; | ||
assert(n <= this.size * 3); | ||
var core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n; | ||
return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) | ||
+ (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0); | ||
}; | ||
// Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyTerminateAndCount = function (currentRunColor, currentRunLength, runHistory) { | ||
if (currentRunColor) { // Terminate dark run | ||
this.finderPenaltyAddHistory(currentRunLength, runHistory); | ||
return this.finderPenaltyCountPatterns(runHistory); | ||
}; | ||
// Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyAddHistory = function (currentRunLength, runHistory) { | ||
if (runHistory[0] == 0) | ||
currentRunLength += this.size; // Add light border to initial run | ||
runHistory.pop(); | ||
runHistory.unshift(currentRunLength); | ||
}; | ||
/*-- Constants and tables --*/ | ||
// The minimum version number supported in the QR Code Model 2 standard. | ||
QrCode.MIN_VERSION = 1; | ||
// The maximum version number supported in the QR Code Model 2 standard. | ||
QrCode.MAX_VERSION = 40; | ||
// For use in getPenaltyScore(), when evaluating which mask is best. | ||
QrCode.PENALTY_N1 = 3; | ||
QrCode.PENALTY_N2 = 3; | ||
QrCode.PENALTY_N3 = 40; | ||
QrCode.PENALTY_N4 = 10; | ||
QrCode.ECC_CODEWORDS_PER_BLOCK = [ | ||
// Version: (note that index 0 is for padding, and is set to an illegal value) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // High | ||
]; | ||
QrCode.NUM_ERROR_CORRECTION_BLOCKS = [ | ||
// Version: (note that index 0 is for padding, and is set to an illegal value) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], | ||
[-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81], // High | ||
]; | ||
return QrCode; | ||
}()); | ||
qrcodegen.QrCode = QrCode; | ||
// Appends the given number of low-order bits of the given value | ||
// to the given buffer. Requires 0 <= len <= 31 and 0 <= val < 2^len. | ||
function appendBits(val, len, bb) { | ||
if (len < 0 || len > 31 || val >>> len != 0) | ||
throw new RangeError("Value out of range"); | ||
for (var i = len - 1; i >= 0; i--) // Append bit by bit | ||
bb.push((val >>> i) & 1); | ||
currentRunLength = 0; | ||
} | ||
currentRunLength += this.size; // Add light border to final run | ||
this.finderPenaltyAddHistory(currentRunLength, runHistory); | ||
return this.finderPenaltyCountPatterns(runHistory); | ||
}; | ||
// Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore(). | ||
QrCode.prototype.finderPenaltyAddHistory = function (currentRunLength, runHistory) { | ||
if (runHistory[0] == 0) | ||
currentRunLength += this.size; // Add light border to initial run | ||
runHistory.pop(); | ||
runHistory.unshift(currentRunLength); | ||
}; | ||
/*-- Constants and tables --*/ | ||
// The minimum version number supported in the QR Code Model 2 standard. | ||
QrCode.MIN_VERSION = 1; | ||
// The maximum version number supported in the QR Code Model 2 standard. | ||
QrCode.MAX_VERSION = 40; | ||
// For use in getPenaltyScore(), when evaluating which mask is best. | ||
QrCode.PENALTY_N1 = 3; | ||
QrCode.PENALTY_N2 = 3; | ||
QrCode.PENALTY_N3 = 40; | ||
QrCode.PENALTY_N4 = 10; | ||
QrCode.ECC_CODEWORDS_PER_BLOCK = [ | ||
// Version: (note that index 0 is for padding, and is set to an illegal value) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Low | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], // Medium | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Quartile | ||
[-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // High | ||
]; | ||
QrCode.NUM_ERROR_CORRECTION_BLOCKS = [ | ||
// Version: (note that index 0 is for padding, and is set to an illegal value) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], // Low | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], // Medium | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], // Quartile | ||
[-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81], // High | ||
]; | ||
return QrCode; | ||
}()); | ||
qrcodegen.QrCode = QrCode; | ||
// Appends the given number of low-order bits of the given value | ||
// to the given buffer. Requires 0 <= len <= 31 and 0 <= val < 2^len. | ||
function appendBits(val, len, bb) { | ||
if (len < 0 || len > 31 || val >>> len != 0) | ||
throw new RangeError("Value out of range"); | ||
for (var i = len - 1; i >= 0; i--) // Append bit by bit | ||
bb.push((val >>> i) & 1); | ||
} | ||
// Returns true iff the i'th bit of x is set to 1. | ||
function getBit(x, i) { | ||
return ((x >>> i) & 1) != 0; | ||
} | ||
// Throws an exception if the given condition is false. | ||
function assert(cond) { | ||
if (!cond) | ||
throw new Error("Assertion error"); | ||
} | ||
/*---- Data segment class ----*/ | ||
/* | ||
* A segment of character/binary/control data in a QR Code symbol. | ||
* Instances of this class are immutable. | ||
* The mid-level way to create a segment is to take the payload data | ||
* and call a static factory function such as QrSegment.makeNumeric(). | ||
* The low-level way to create a segment is to custom-make the bit buffer | ||
* and call the QrSegment() constructor with appropriate values. | ||
* This segment class imposes no length restrictions, but QR Codes have restrictions. | ||
* Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. | ||
* Any segment longer than this is meaningless for the purpose of generating QR Codes. | ||
*/ | ||
var QrSegment = /** @class */ (function () { | ||
/*-- Constructor (low level) and fields --*/ | ||
// Creates a new QR Code segment with the given attributes and data. | ||
// The character count (numChars) must agree with the mode and the bit buffer length, | ||
// but the constraint isn't checked. The given bit buffer is cloned and stored. | ||
function QrSegment( | ||
// The mode indicator of this segment. | ||
mode, | ||
// The length of this segment's unencoded data. Measured in characters for | ||
// numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. | ||
// Always zero or positive. Not the same as the data's bit length. | ||
numChars, | ||
// The data bits of this segment. Accessed through getData(). | ||
bitData) { | ||
this.mode = mode; | ||
this.numChars = numChars; | ||
this.bitData = bitData; | ||
if (numChars < 0) | ||
throw new RangeError("Invalid argument"); | ||
this.bitData = bitData.slice(); // Make defensive copy | ||
} | ||
// Returns true iff the i'th bit of x is set to 1. | ||
function getBit(x, i) { | ||
return ((x >>> i) & 1) != 0; | ||
} | ||
// Throws an exception if the given condition is false. | ||
function assert(cond) { | ||
if (!cond) | ||
throw new Error("Assertion error"); | ||
} | ||
/*---- Data segment class ----*/ | ||
/*-- Static factory functions (mid level) --*/ | ||
// Returns a segment representing the given binary data encoded in | ||
// byte mode. All input byte arrays are acceptable. Any text string | ||
// can be converted to UTF-8 bytes and encoded as a byte mode segment. | ||
QrSegment.makeBytes = function (data) { | ||
var bb = []; | ||
for (var _i = 0, data_2 = data; _i < data_2.length; _i++) { | ||
var b = data_2[_i]; | ||
appendBits(b, 8, bb); | ||
} | ||
return new QrSegment(QrSegment.Mode.BYTE, data.length, bb); | ||
}; | ||
// Returns a segment representing the given string of decimal digits encoded in numeric mode. | ||
QrSegment.makeNumeric = function (digits) { | ||
if (!QrSegment.isNumeric(digits)) | ||
throw new RangeError("String contains non-numeric characters"); | ||
var bb = []; | ||
for (var i = 0; i < digits.length;) { // Consume up to 3 digits per iteration | ||
var n = Math.min(digits.length - i, 3); | ||
appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb); | ||
i += n; | ||
} | ||
return new QrSegment(QrSegment.Mode.NUMERIC, digits.length, bb); | ||
}; | ||
// Returns a segment representing the given text string encoded in alphanumeric mode. | ||
// The characters allowed are: 0 to 9, A to Z (uppercase only), space, | ||
// dollar, percent, asterisk, plus, hyphen, period, slash, colon. | ||
QrSegment.makeAlphanumeric = function (text) { | ||
if (!QrSegment.isAlphanumeric(text)) | ||
throw new RangeError("String contains unencodable characters in alphanumeric mode"); | ||
var bb = []; | ||
var i; | ||
for (i = 0; i + 2 <= text.length; i += 2) { // Process groups of 2 | ||
var temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; | ||
temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); | ||
appendBits(temp, 11, bb); | ||
} | ||
if (i < text.length) // 1 character remaining | ||
appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb); | ||
return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length, bb); | ||
}; | ||
// Returns a new mutable list of zero or more segments to represent the given Unicode text string. | ||
// The result may use various segment modes and switch modes to optimize the length of the bit stream. | ||
QrSegment.makeSegments = function (text) { | ||
// Select the most efficient segment encoding automatically | ||
if (text == "") | ||
return []; | ||
else if (QrSegment.isNumeric(text)) | ||
return [QrSegment.makeNumeric(text)]; | ||
else if (QrSegment.isAlphanumeric(text)) | ||
return [QrSegment.makeAlphanumeric(text)]; | ||
else | ||
return [QrSegment.makeBytes(QrSegment.toUtf8ByteArray(text))]; | ||
}; | ||
// Returns a segment representing an Extended Channel Interpretation | ||
// (ECI) designator with the given assignment value. | ||
QrSegment.makeEci = function (assignVal) { | ||
var bb = []; | ||
if (assignVal < 0) | ||
throw new RangeError("ECI assignment value out of range"); | ||
else if (assignVal < (1 << 7)) | ||
appendBits(assignVal, 8, bb); | ||
else if (assignVal < (1 << 14)) { | ||
appendBits(2, 2, bb); | ||
appendBits(assignVal, 14, bb); | ||
} | ||
else if (assignVal < 1000000) { | ||
appendBits(6, 3, bb); | ||
appendBits(assignVal, 21, bb); | ||
} | ||
else | ||
throw new RangeError("ECI assignment value out of range"); | ||
return new QrSegment(QrSegment.Mode.ECI, 0, bb); | ||
}; | ||
// Tests whether the given string can be encoded as a segment in numeric mode. | ||
// A string is encodable iff each character is in the range 0 to 9. | ||
QrSegment.isNumeric = function (text) { | ||
return QrSegment.NUMERIC_REGEX.test(text); | ||
}; | ||
// Tests whether the given string can be encoded as a segment in alphanumeric mode. | ||
// A string is encodable iff each character is in the following set: 0 to 9, A to Z | ||
// (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. | ||
QrSegment.isAlphanumeric = function (text) { | ||
return QrSegment.ALPHANUMERIC_REGEX.test(text); | ||
}; | ||
/*-- Methods --*/ | ||
// Returns a new copy of the data bits of this segment. | ||
QrSegment.prototype.getData = function () { | ||
return this.bitData.slice(); // Make defensive copy | ||
}; | ||
// (Package-private) Calculates and returns the number of bits needed to encode the given segments at | ||
// the given version. The result is infinity if a segment has too many characters to fit its length field. | ||
QrSegment.getTotalBits = function (segs, version) { | ||
var result = 0; | ||
for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { | ||
var seg = segs_2[_i]; | ||
var ccbits = seg.mode.numCharCountBits(version); | ||
if (seg.numChars >= (1 << ccbits)) | ||
return Infinity; // The segment's length doesn't fit the field's bit width | ||
result += 4 + ccbits + seg.bitData.length; | ||
} | ||
return result; | ||
}; | ||
// Returns a new array of bytes representing the given string encoded in UTF-8. | ||
QrSegment.toUtf8ByteArray = function (str) { | ||
str = encodeURI(str); | ||
var result = []; | ||
for (var i = 0; i < str.length; i++) { | ||
if (str.charAt(i) != "%") | ||
result.push(str.charCodeAt(i)); | ||
else { | ||
result.push(parseInt(str.substring(i + 1, i + 3), 16)); | ||
i += 2; | ||
} | ||
} | ||
return result; | ||
}; | ||
/*-- Constants --*/ | ||
// Describes precisely all strings that are encodable in numeric mode. | ||
QrSegment.NUMERIC_REGEX = /^[0-9]*$/; | ||
// Describes precisely all strings that are encodable in alphanumeric mode. | ||
QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\/:-]*$/; | ||
// The set of all legal characters in alphanumeric mode, | ||
// where each character value maps to the index in the string. | ||
QrSegment.ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; | ||
return QrSegment; | ||
}()); | ||
qrcodegen.QrSegment = QrSegment; | ||
})(qrcodegen || (qrcodegen = {})); | ||
/*---- Public helper enumeration ----*/ | ||
(function (qrcodegen) { | ||
(function (QrCode) { | ||
/* | ||
* A segment of character/binary/control data in a QR Code symbol. | ||
* Instances of this class are immutable. | ||
* The mid-level way to create a segment is to take the payload data | ||
* and call a static factory function such as QrSegment.makeNumeric(). | ||
* The low-level way to create a segment is to custom-make the bit buffer | ||
* and call the QrSegment() constructor with appropriate values. | ||
* This segment class imposes no length restrictions, but QR Codes have restrictions. | ||
* Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. | ||
* Any segment longer than this is meaningless for the purpose of generating QR Codes. | ||
* The error correction level in a QR Code symbol. Immutable. | ||
*/ | ||
var QrSegment = /** @class */ (function () { | ||
/*-- Constructor (low level) and fields --*/ | ||
// Creates a new QR Code segment with the given attributes and data. | ||
// The character count (numChars) must agree with the mode and the bit buffer length, | ||
// but the constraint isn't checked. The given bit buffer is cloned and stored. | ||
function QrSegment( | ||
// The mode indicator of this segment. | ||
mode, | ||
// The length of this segment's unencoded data. Measured in characters for | ||
// numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. | ||
// Always zero or positive. Not the same as the data's bit length. | ||
numChars, | ||
// The data bits of this segment. Accessed through getData(). | ||
bitData) { | ||
this.mode = mode; | ||
this.numChars = numChars; | ||
this.bitData = bitData; | ||
if (numChars < 0) | ||
throw new RangeError("Invalid argument"); | ||
this.bitData = bitData.slice(); // Make defensive copy | ||
var Ecc = /** @class */ (function () { | ||
/*-- Constructor and fields --*/ | ||
function Ecc( | ||
// In the range 0 to 3 (unsigned 2-bit integer). | ||
ordinal, | ||
// (Package-private) In the range 0 to 3 (unsigned 2-bit integer). | ||
formatBits) { | ||
this.ordinal = ordinal; | ||
this.formatBits = formatBits; | ||
} | ||
/*-- Static factory functions (mid level) --*/ | ||
// Returns a segment representing the given binary data encoded in | ||
// byte mode. All input byte arrays are acceptable. Any text string | ||
// can be converted to UTF-8 bytes and encoded as a byte mode segment. | ||
QrSegment.makeBytes = function (data) { | ||
var bb = []; | ||
for (var _i = 0, data_2 = data; _i < data_2.length; _i++) { | ||
var b = data_2[_i]; | ||
appendBits(b, 8, bb); | ||
} | ||
return new QrSegment(QrSegment.Mode.BYTE, data.length, bb); | ||
/*-- Constants --*/ | ||
Ecc.LOW = new Ecc(0, 1); // The QR Code can tolerate about 7% erroneous codewords | ||
Ecc.MEDIUM = new Ecc(1, 0); // The QR Code can tolerate about 15% erroneous codewords | ||
Ecc.QUARTILE = new Ecc(2, 3); // The QR Code can tolerate about 25% erroneous codewords | ||
Ecc.HIGH = new Ecc(3, 2); // The QR Code can tolerate about 30% erroneous codewords | ||
return Ecc; | ||
}()); | ||
QrCode.Ecc = Ecc; | ||
})(qrcodegen.QrCode || (qrcodegen.QrCode = {})); | ||
})(qrcodegen || (qrcodegen = {})); | ||
/*---- Public helper enumeration ----*/ | ||
(function (qrcodegen) { | ||
(function (QrSegment) { | ||
/* | ||
* Describes how a segment's data bits are interpreted. Immutable. | ||
*/ | ||
var Mode = /** @class */ (function () { | ||
/*-- Constructor and fields --*/ | ||
function Mode( | ||
// The mode indicator bits, which is a uint4 value (range 0 to 15). | ||
modeBits, | ||
// Number of character count bits for three different version ranges. | ||
numBitsCharCount) { | ||
this.modeBits = modeBits; | ||
this.numBitsCharCount = numBitsCharCount; | ||
} | ||
/*-- Method --*/ | ||
// (Package-private) Returns the bit width of the character count field for a segment in | ||
// this mode in a QR Code at the given version number. The result is in the range [0, 16]. | ||
Mode.prototype.numCharCountBits = function (ver) { | ||
return this.numBitsCharCount[Math.floor((ver + 7) / 17)]; | ||
}; | ||
// Returns a segment representing the given string of decimal digits encoded in numeric mode. | ||
QrSegment.makeNumeric = function (digits) { | ||
if (!QrSegment.isNumeric(digits)) | ||
throw new RangeError("String contains non-numeric characters"); | ||
var bb = []; | ||
for (var i = 0; i < digits.length;) { // Consume up to 3 digits per iteration | ||
var n = Math.min(digits.length - i, 3); | ||
appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb); | ||
i += n; | ||
} | ||
return new QrSegment(QrSegment.Mode.NUMERIC, digits.length, bb); | ||
}; | ||
// Returns a segment representing the given text string encoded in alphanumeric mode. | ||
// The characters allowed are: 0 to 9, A to Z (uppercase only), space, | ||
// dollar, percent, asterisk, plus, hyphen, period, slash, colon. | ||
QrSegment.makeAlphanumeric = function (text) { | ||
if (!QrSegment.isAlphanumeric(text)) | ||
throw new RangeError("String contains unencodable characters in alphanumeric mode"); | ||
var bb = []; | ||
var i; | ||
for (i = 0; i + 2 <= text.length; i += 2) { // Process groups of 2 | ||
var temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45; | ||
temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1)); | ||
appendBits(temp, 11, bb); | ||
} | ||
if (i < text.length) // 1 character remaining | ||
appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb); | ||
return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length, bb); | ||
}; | ||
// Returns a new mutable list of zero or more segments to represent the given Unicode text string. | ||
// The result may use various segment modes and switch modes to optimize the length of the bit stream. | ||
QrSegment.makeSegments = function (text) { | ||
// Select the most efficient segment encoding automatically | ||
if (text == "") | ||
return []; | ||
else if (QrSegment.isNumeric(text)) | ||
return [QrSegment.makeNumeric(text)]; | ||
else if (QrSegment.isAlphanumeric(text)) | ||
return [QrSegment.makeAlphanumeric(text)]; | ||
else | ||
return [QrSegment.makeBytes(QrSegment.toUtf8ByteArray(text))]; | ||
}; | ||
// Returns a segment representing an Extended Channel Interpretation | ||
// (ECI) designator with the given assignment value. | ||
QrSegment.makeEci = function (assignVal) { | ||
var bb = []; | ||
if (assignVal < 0) | ||
throw new RangeError("ECI assignment value out of range"); | ||
else if (assignVal < (1 << 7)) | ||
appendBits(assignVal, 8, bb); | ||
else if (assignVal < (1 << 14)) { | ||
appendBits(2, 2, bb); | ||
appendBits(assignVal, 14, bb); | ||
} | ||
else if (assignVal < 1000000) { | ||
appendBits(6, 3, bb); | ||
appendBits(assignVal, 21, bb); | ||
} | ||
else | ||
throw new RangeError("ECI assignment value out of range"); | ||
return new QrSegment(QrSegment.Mode.ECI, 0, bb); | ||
}; | ||
// Tests whether the given string can be encoded as a segment in numeric mode. | ||
// A string is encodable iff each character is in the range 0 to 9. | ||
QrSegment.isNumeric = function (text) { | ||
return QrSegment.NUMERIC_REGEX.test(text); | ||
}; | ||
// Tests whether the given string can be encoded as a segment in alphanumeric mode. | ||
// A string is encodable iff each character is in the following set: 0 to 9, A to Z | ||
// (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. | ||
QrSegment.isAlphanumeric = function (text) { | ||
return QrSegment.ALPHANUMERIC_REGEX.test(text); | ||
}; | ||
/*-- Methods --*/ | ||
// Returns a new copy of the data bits of this segment. | ||
QrSegment.prototype.getData = function () { | ||
return this.bitData.slice(); // Make defensive copy | ||
}; | ||
// (Package-private) Calculates and returns the number of bits needed to encode the given segments at | ||
// the given version. The result is infinity if a segment has too many characters to fit its length field. | ||
QrSegment.getTotalBits = function (segs, version) { | ||
var result = 0; | ||
for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { | ||
var seg = segs_2[_i]; | ||
var ccbits = seg.mode.numCharCountBits(version); | ||
if (seg.numChars >= (1 << ccbits)) | ||
return Infinity; // The segment's length doesn't fit the field's bit width | ||
result += 4 + ccbits + seg.bitData.length; | ||
} | ||
return result; | ||
}; | ||
// Returns a new array of bytes representing the given string encoded in UTF-8. | ||
QrSegment.toUtf8ByteArray = function (str) { | ||
str = encodeURI(str); | ||
var result = []; | ||
for (var i = 0; i < str.length; i++) { | ||
if (str.charAt(i) != "%") | ||
result.push(str.charCodeAt(i)); | ||
else { | ||
result.push(parseInt(str.substring(i + 1, i + 3), 16)); | ||
i += 2; | ||
} | ||
} | ||
return result; | ||
}; | ||
/*-- Constants --*/ | ||
// Describes precisely all strings that are encodable in numeric mode. | ||
QrSegment.NUMERIC_REGEX = /^[0-9]*$/; | ||
// Describes precisely all strings that are encodable in alphanumeric mode. | ||
QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\/:-]*$/; | ||
// The set of all legal characters in alphanumeric mode, | ||
// where each character value maps to the index in the string. | ||
QrSegment.ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; | ||
return QrSegment; | ||
Mode.NUMERIC = new Mode(0x1, [10, 12, 14]); | ||
Mode.ALPHANUMERIC = new Mode(0x2, [9, 11, 13]); | ||
Mode.BYTE = new Mode(0x4, [8, 16, 16]); | ||
Mode.KANJI = new Mode(0x8, [8, 10, 12]); | ||
Mode.ECI = new Mode(0x7, [0, 0, 0]); | ||
return Mode; | ||
}()); | ||
qrcodegen.QrSegment = QrSegment; | ||
})(qrcodegen || (qrcodegen = {})); | ||
/*---- Public helper enumeration ----*/ | ||
(function (qrcodegen) { | ||
(function (QrCode) { | ||
/* | ||
* The error correction level in a QR Code symbol. Immutable. | ||
*/ | ||
var Ecc = /** @class */ (function () { | ||
/*-- Constructor and fields --*/ | ||
function Ecc( | ||
// In the range 0 to 3 (unsigned 2-bit integer). | ||
ordinal, | ||
// (Package-private) In the range 0 to 3 (unsigned 2-bit integer). | ||
formatBits) { | ||
this.ordinal = ordinal; | ||
this.formatBits = formatBits; | ||
} | ||
/*-- Constants --*/ | ||
Ecc.LOW = new Ecc(0, 1); // The QR Code can tolerate about 7% erroneous codewords | ||
Ecc.MEDIUM = new Ecc(1, 0); // The QR Code can tolerate about 15% erroneous codewords | ||
Ecc.QUARTILE = new Ecc(2, 3); // The QR Code can tolerate about 25% erroneous codewords | ||
Ecc.HIGH = new Ecc(3, 2); // The QR Code can tolerate about 30% erroneous codewords | ||
return Ecc; | ||
}()); | ||
QrCode.Ecc = Ecc; | ||
})(qrcodegen.QrCode || (qrcodegen.QrCode = {})); | ||
})(qrcodegen || (qrcodegen = {})); | ||
/*---- Public helper enumeration ----*/ | ||
(function (qrcodegen) { | ||
(function (QrSegment) { | ||
/* | ||
* Describes how a segment's data bits are interpreted. Immutable. | ||
*/ | ||
var Mode = /** @class */ (function () { | ||
/*-- Constructor and fields --*/ | ||
function Mode( | ||
// The mode indicator bits, which is a uint4 value (range 0 to 15). | ||
modeBits, | ||
// Number of character count bits for three different version ranges. | ||
numBitsCharCount) { | ||
this.modeBits = modeBits; | ||
this.numBitsCharCount = numBitsCharCount; | ||
} | ||
/*-- Method --*/ | ||
// (Package-private) Returns the bit width of the character count field for a segment in | ||
// this mode in a QR Code at the given version number. The result is in the range [0, 16]. | ||
Mode.prototype.numCharCountBits = function (ver) { | ||
return this.numBitsCharCount[Math.floor((ver + 7) / 17)]; | ||
}; | ||
/*-- Constants --*/ | ||
Mode.NUMERIC = new Mode(0x1, [10, 12, 14]); | ||
Mode.ALPHANUMERIC = new Mode(0x2, [9, 11, 13]); | ||
Mode.BYTE = new Mode(0x4, [8, 16, 16]); | ||
Mode.KANJI = new Mode(0x8, [8, 10, 12]); | ||
Mode.ECI = new Mode(0x7, [0, 0, 0]); | ||
return Mode; | ||
}()); | ||
QrSegment.Mode = Mode; | ||
})(qrcodegen.QrSegment || (qrcodegen.QrSegment = {})); | ||
})(qrcodegen || (qrcodegen = {})); | ||
var QR = qrcodegen; | ||
QrSegment.Mode = Mode; | ||
})(qrcodegen.QrSegment || (qrcodegen.QrSegment = {})); | ||
})(qrcodegen || (qrcodegen = {})); | ||
var QR = qrcodegen; | ||
var defaultErrorCorrectLevel = 'H'; | ||
var ErrorCorrectLevelMap = { | ||
L: QR.QrCode.Ecc.LOW, | ||
M: QR.QrCode.Ecc.MEDIUM, | ||
Q: QR.QrCode.Ecc.QUARTILE, | ||
H: QR.QrCode.Ecc.HIGH, | ||
}; | ||
// Thanks the `qrcode.react` | ||
var SUPPORTS_PATH2D = (function () { | ||
try { | ||
new Path2D().addPath(new Path2D()); | ||
} | ||
catch (e) { | ||
return false; | ||
} | ||
return true; | ||
})(); | ||
function validErrorCorrectLevel(level) { | ||
return level in ErrorCorrectLevelMap; | ||
var defaultErrorCorrectLevel = 'L'; | ||
var ErrorCorrectLevelMap = { | ||
L: QR.QrCode.Ecc.LOW, | ||
M: QR.QrCode.Ecc.MEDIUM, | ||
Q: QR.QrCode.Ecc.QUARTILE, | ||
H: QR.QrCode.Ecc.HIGH, | ||
}; | ||
// Thanks the `qrcode.react` | ||
var SUPPORTS_PATH2D = (function () { | ||
try { | ||
new Path2D().addPath(new Path2D()); | ||
} | ||
function generatePath(modules, margin) { | ||
if (margin === void 0) { margin = 0; } | ||
var ops = []; | ||
modules.forEach(function (row, y) { | ||
var start = null; | ||
row.forEach(function (cell, x) { | ||
if (!cell && start !== null) { | ||
// M0 0h7v1H0z injects the space with the move and drops the comma, | ||
// saving a char per operation | ||
ops.push("M".concat(start + margin, " ").concat(y + margin, "h").concat(x - start, "v1H").concat(start + margin, "z")); | ||
start = null; | ||
catch (e) { | ||
return false; | ||
} | ||
return true; | ||
})(); | ||
function validErrorCorrectLevel(level) { | ||
return level in ErrorCorrectLevelMap; | ||
} | ||
function generatePath(modules, margin) { | ||
if (margin === void 0) { margin = 0; } | ||
var ops = []; | ||
modules.forEach(function (row, y) { | ||
var start = null; | ||
row.forEach(function (cell, x) { | ||
if (!cell && start !== null) { | ||
// M0 0h7v1H0z injects the space with the move and drops the comma, | ||
// saving a char per operation | ||
ops.push("M".concat(start + margin, " ").concat(y + margin, "h").concat(x - start, "v1H").concat(start + margin, "z")); | ||
start = null; | ||
return; | ||
} | ||
// end of row, clean up or skip | ||
if (x === row.length - 1) { | ||
if (!cell) { | ||
// We would have closed the op above already so this can only mean | ||
// 2+ light modules in a row. | ||
return; | ||
} | ||
// end of row, clean up or skip | ||
if (x === row.length - 1) { | ||
if (!cell) { | ||
// We would have closed the op above already so this can only mean | ||
// 2+ light modules in a row. | ||
return; | ||
} | ||
if (start === null) { | ||
// Just a single dark module. | ||
ops.push("M".concat(x + margin, ",").concat(y + margin, " h1v1H").concat(x + margin, "z")); | ||
} | ||
else { | ||
// Otherwise finish the current line. | ||
ops.push("M".concat(start + margin, ",").concat(y + margin, " h").concat(x + 1 - start, "v1H").concat(start + margin, "z")); | ||
} | ||
return; | ||
if (start === null) { | ||
// Just a single dark module. | ||
ops.push("M".concat(x + margin, ",").concat(y + margin, " h1v1H").concat(x + margin, "z")); | ||
} | ||
if (cell && start === null) { | ||
start = x; | ||
else { | ||
// Otherwise finish the current line. | ||
ops.push("M".concat(start + margin, ",").concat(y + margin, " h").concat(x + 1 - start, "v1H").concat(start + margin, "z")); | ||
} | ||
}); | ||
return; | ||
} | ||
if (cell && start === null) { | ||
start = x; | ||
} | ||
}); | ||
return ops.join(''); | ||
}); | ||
return ops.join(''); | ||
} | ||
function getImageSettings(cells, size, margin, imageSettings) { | ||
var width = imageSettings.width, height = imageSettings.height, imageX = imageSettings.x, imageY = imageSettings.y; | ||
var numCells = cells.length + margin * 2; | ||
var defaultSize = Math.floor(size * 0.1); | ||
var scale = numCells / size; | ||
var w = (width || defaultSize) * scale; | ||
var h = (height || defaultSize) * scale; | ||
var x = imageX == null ? cells.length / 2 - w / 2 : imageX * scale; | ||
var y = imageY == null ? cells.length / 2 - h / 2 : imageY * scale; | ||
var excavation = null; | ||
if (imageSettings.excavate) { | ||
var floorX = Math.floor(x); | ||
var floorY = Math.floor(y); | ||
var ceilW = Math.ceil(w + x - floorX); | ||
var ceilH = Math.ceil(h + y - floorY); | ||
excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH }; | ||
} | ||
var QRCodeProps = { | ||
value: { | ||
type: String, | ||
required: true, | ||
default: '', | ||
}, | ||
size: { | ||
type: Number, | ||
default: 100, | ||
}, | ||
level: { | ||
type: String, | ||
default: defaultErrorCorrectLevel, | ||
validator: function (l) { return validErrorCorrectLevel(l); }, | ||
}, | ||
background: { | ||
type: String, | ||
default: '#fff', | ||
}, | ||
foreground: { | ||
type: String, | ||
default: '#000', | ||
}, | ||
margin: { | ||
type: Number, | ||
required: false, | ||
default: 0, | ||
}, | ||
}; | ||
var QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: { | ||
type: String, | ||
required: false, | ||
default: 'canvas', | ||
validator: function (as) { return ['canvas', 'svg'].indexOf(as) > -1; }, | ||
} }); | ||
var QRCodeSvg = vue.defineComponent({ | ||
name: 'QRCodeSvg', | ||
props: QRCodeProps, | ||
setup: function (props) { | ||
var numCells = vue.ref(0); | ||
var fgPath = vue.ref(''); | ||
var generate = function () { | ||
var value = props.value, level = props.level, margin = props.margin; | ||
var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules(); | ||
numCells.value = cells.length + margin * 2; | ||
// Drawing strategy: instead of a rect per module, we're going to create a | ||
// single path for the dark modules and layer that on top of a light rect, | ||
// for a total of 2 DOM nodes. We pay a bit more in string concat but that's | ||
// way faster than DOM ops. | ||
// For level 1, 441 nodes -> 2 | ||
// For level 40, 31329 -> 2 | ||
fgPath.value = generatePath(cells, margin); | ||
}; | ||
generate(); | ||
vue.onUpdated(generate); | ||
return function () { return vue.h('svg', { | ||
width: props.size, | ||
height: props.size, | ||
'shape-rendering': "crispEdges", | ||
xmlns: 'http://www.w3.org/2000/svg', | ||
viewBox: "0 0 ".concat(numCells.value, " ").concat(numCells.value), | ||
}, [ | ||
vue.h('path', { | ||
fill: props.background, | ||
d: "M0,0 h".concat(numCells.value, "v").concat(numCells.value, "H0z"), | ||
}), | ||
vue.h('path', { fill: props.foreground, d: fgPath.value }), | ||
]); }; | ||
}, | ||
return { x: x, y: y, h: h, w: w, excavation: excavation }; | ||
} | ||
function excavateModules(modules, excavation) { | ||
return modules.slice().map(function (row, y) { | ||
if (y < excavation.y || y >= excavation.y + excavation.h) { | ||
return row; | ||
} | ||
return row.map(function (cell, x) { | ||
if (x < excavation.x || x >= excavation.x + excavation.w) { | ||
return cell; | ||
} | ||
return false; | ||
}); | ||
}); | ||
var QRCodeCanvas = vue.defineComponent({ | ||
name: 'QRCodeCanvas', | ||
props: QRCodeProps, | ||
setup: function (props) { | ||
var canvasEl = vue.ref(null); | ||
var generate = function () { | ||
var value = props.value, level = props.level, size = props.size, margin = props.margin, background = props.background, foreground = props.foreground; | ||
var canvas = canvasEl.value; | ||
if (!canvas) { | ||
return; | ||
} | ||
var QRCodeProps = { | ||
value: { | ||
type: String, | ||
required: true, | ||
default: '', | ||
}, | ||
size: { | ||
type: Number, | ||
default: 100, | ||
}, | ||
level: { | ||
type: String, | ||
default: defaultErrorCorrectLevel, | ||
validator: function (l) { return validErrorCorrectLevel(l); }, | ||
}, | ||
background: { | ||
type: String, | ||
default: '#fff', | ||
}, | ||
foreground: { | ||
type: String, | ||
default: '#000', | ||
}, | ||
margin: { | ||
type: Number, | ||
required: false, | ||
default: 0, | ||
}, | ||
imageSettings: { | ||
type: Object, | ||
required: false, | ||
default: function () { return ({}); }, | ||
}, | ||
}; | ||
var QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: { | ||
type: String, | ||
required: false, | ||
default: 'canvas', | ||
validator: function (as) { return ['canvas', 'svg'].indexOf(as) > -1; }, | ||
} }); | ||
var QrcodeSvg = vue.defineComponent({ | ||
name: 'QRCodeSvg', | ||
props: QRCodeProps, | ||
setup: function (props) { | ||
var numCells = vue.ref(0); | ||
var fgPath = vue.ref(''); | ||
var imageProps; | ||
var generate = function () { | ||
var value = props.value, level = props.level, margin = props.margin; | ||
var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules(); | ||
numCells.value = cells.length + margin * 2; | ||
if (props.imageSettings.src) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
var ctx = canvas.getContext('2d'); | ||
if (!ctx) { | ||
return; | ||
} | ||
// Drawing strategy: instead of a rect per module, we're going to create a | ||
// single path for the dark modules and layer that on top of a light rect, | ||
// for a total of 2 DOM nodes. We pay a bit more in string concat but that's | ||
// way faster than DOM ops. | ||
// For level 1, 441 nodes -> 2 | ||
// For level 40, 31329 -> 2 | ||
fgPath.value = generatePath(cells, margin); | ||
}; | ||
generate(); | ||
vue.onUpdated(generate); | ||
return function () { return vue.h('svg', { | ||
width: props.size, | ||
height: props.size, | ||
'shape-rendering': "crispEdges", | ||
xmlns: 'http://www.w3.org/2000/svg', | ||
viewBox: "0 0 ".concat(numCells.value, " ").concat(numCells.value), | ||
}, [ | ||
vue.h('path', { | ||
fill: props.background, | ||
d: "M0,0 h".concat(numCells.value, "v").concat(numCells.value, "H0z"), | ||
}), | ||
vue.h('path', { fill: props.foreground, d: fgPath.value }), | ||
props.imageSettings.src && vue.h('image', __assign({ href: props.imageSettings.src }, imageProps)), | ||
]); }; | ||
}, | ||
}); | ||
var QrcodeCanvas = vue.defineComponent({ | ||
name: 'QRCodeCanvas', | ||
props: QRCodeProps, | ||
setup: function (props, ctx) { | ||
var canvasEl = vue.ref(null); | ||
var imageRef = vue.ref(null); | ||
var generate = function () { | ||
var value = props.value, level = props.level, size = props.size, margin = props.margin, background = props.background, foreground = props.foreground; | ||
var canvas = canvasEl.value; | ||
if (!canvas) { | ||
return; | ||
} | ||
var ctx = canvas.getContext('2d'); | ||
if (!ctx) { | ||
return; | ||
} | ||
var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules(); | ||
var numCells = cells.length + margin * 2; | ||
var image = imageRef.value; | ||
var imageProps = { x: 0, y: 0, width: 0, height: 0 }; | ||
var showImage = props.imageSettings.src && image != null && image.naturalWidth !== 0 && image.naturalHeight !== 0; | ||
if (showImage) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules(); | ||
var numCells = cells.length + margin * 2; | ||
var devicePixelRatio = window.devicePixelRatio || 1; | ||
var scale = (size / numCells) * devicePixelRatio; | ||
canvas.height = canvas.width = size * devicePixelRatio; | ||
ctx.scale(scale, scale); | ||
ctx.fillStyle = background; | ||
ctx.fillRect(0, 0, numCells, numCells); | ||
ctx.fillStyle = foreground; | ||
if (SUPPORTS_PATH2D) { | ||
ctx.fill(new Path2D(generatePath(cells, margin))); | ||
} | ||
else { | ||
cells.forEach(function (row, rdx) { | ||
row.forEach(function (cell, cdx) { | ||
if (cell) { | ||
ctx.fillRect(cdx + margin, rdx + margin, 1, 1); | ||
} | ||
}); | ||
} | ||
var devicePixelRatio = window.devicePixelRatio || 1; | ||
var scale = (size / numCells) * devicePixelRatio; | ||
canvas.height = canvas.width = size * devicePixelRatio; | ||
ctx.scale(scale, scale); | ||
ctx.fillStyle = background; | ||
ctx.fillRect(0, 0, numCells, numCells); | ||
ctx.fillStyle = foreground; | ||
if (SUPPORTS_PATH2D) { | ||
ctx.fill(new Path2D(generatePath(cells, margin))); | ||
} | ||
else { | ||
cells.forEach(function (row, rdx) { | ||
row.forEach(function (cell, cdx) { | ||
if (cell) { | ||
ctx.fillRect(cdx + margin, rdx + margin, 1, 1); | ||
} | ||
}); | ||
} | ||
}; | ||
vue.onMounted(generate); | ||
vue.onUpdated(generate); | ||
return function () { return vue.h('canvas', { | ||
ref: canvasEl, | ||
style: { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }, | ||
}); }; | ||
}, | ||
}); | ||
var QrcodeVue = vue.defineComponent({ | ||
name: 'Qrcode', | ||
render: function () { | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground; | ||
var size = _size >>> 0; | ||
var margin = _margin >>> 0; | ||
var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel; | ||
return vue.h(renderAs === 'svg' ? QRCodeSvg : QRCodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground }); | ||
}, | ||
props: QRCodeVueProps, | ||
}); | ||
}); | ||
} | ||
if (showImage) { | ||
ctx.drawImage(image, imageProps.x, imageProps.y, imageProps.width, imageProps.height); | ||
} | ||
}; | ||
vue.onMounted(generate); | ||
vue.onUpdated(generate); | ||
var style = ctx.attrs.style; | ||
return function () { return vue.h(vue.Fragment, [ | ||
vue.h('canvas', __assign(__assign({}, ctx.attrs), { ref: canvasEl, style: __assign(__assign({}, style), { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }) })), | ||
props.imageSettings.src && vue.h('img', { | ||
ref: imageRef, | ||
src: props.imageSettings.src, | ||
style: { display: 'none' }, | ||
onLoad: generate, | ||
}) | ||
]); }; | ||
}, | ||
}); | ||
var QrcodeVue = vue.defineComponent({ | ||
name: 'Qrcode', | ||
render: function () { | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground, imageSettings = _a.imageSettings; | ||
var size = _size >>> 0; | ||
var margin = _margin >>> 0; | ||
var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel; | ||
return vue.h(renderAs === 'svg' ? QrcodeSvg : QrcodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground, imageSettings: imageSettings }); | ||
}, | ||
props: QRCodeVueProps, | ||
}); | ||
return QrcodeVue; | ||
exports.QrcodeCanvas = QrcodeCanvas; | ||
exports.QrcodeSvg = QrcodeSvg; | ||
exports.default = QrcodeVue; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
})); |
/*! | ||
* qrcode.vue v3.4.1 | ||
* A Vue.js component to generate QRCode. | ||
* © 2017-2023 @scopewu(https://github.com/scopewu) | ||
* qrcode.vue v3.5.0 | ||
* A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 | ||
* © 2017-PRESENT @scopewu(https://github.com/scopewu) | ||
* MIT License. | ||
*/ | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("vue")):"function"==typeof define&&define.amd?define(["vue"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).QrcodeVue=e(t.Vue)}(this,(function(t){"use strict";var e,r=function(){return r=Object.assign||function(t){for(var e,r=1,n=arguments.length;n>r;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},r.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError,function(t){var e=function(){function e(t,r,n,i){if(this.version=t,this.errorCorrectionLevel=r,this.modules=[],this.isFunction=[],e.MIN_VERSION>t||t>e.MAX_VERSION)throw new RangeError("Version value out of range");if(-1>i||i>7)throw new RangeError("Mask value out of range");this.size=4*t+17;for(var a=[],s=0;this.size>s;s++)a.push(!1);for(s=0;this.size>s;s++)this.modules.push(a.slice()),this.isFunction.push(a.slice());this.drawFunctionPatterns();var u=this.addEccAndInterleave(n);if(this.drawCodewords(u),-1==i){var h=1e9;for(s=0;8>s;s++){this.applyMask(s),this.drawFormatBits(s);var f=this.getPenaltyScore();h>f&&(i=s,h=f),this.applyMask(s)}}o(i>=0&&7>=i),this.mask=i,this.applyMask(i),this.drawFormatBits(i),this.isFunction=[]}return e.encodeText=function(r,n){var o=t.QrSegment.makeSegments(r);return e.encodeSegments(o,n)},e.encodeBinary=function(r,n){var o=t.QrSegment.makeBytes(r);return e.encodeSegments([o],n)},e.encodeSegments=function(t,n,a,s,u,h){if(void 0===a&&(a=1),void 0===s&&(s=40),void 0===u&&(u=-1),void 0===h&&(h=!0),e.MIN_VERSION>a||a>s||s>e.MAX_VERSION||-1>u||u>7)throw new RangeError("Invalid value");var f,l;for(f=a;;f++){var c=8*e.getNumDataCodewords(f,n),d=i.getTotalBits(t,f);if(c>=d){l=d;break}if(f>=s)throw new RangeError("Data too long")}for(var v=0,g=[e.Ecc.MEDIUM,e.Ecc.QUARTILE,e.Ecc.HIGH];g.length>v;v++){var m=g[v];h&&l<=8*e.getNumDataCodewords(f,m)&&(n=m)}for(var p=[],E=0,M=t;M.length>E;E++){var C=M[E];r(C.mode.modeBits,4,p),r(C.numChars,C.mode.numCharCountBits(f),p);for(var w=0,R=C.getData();R.length>w;w++){p.push(R[w])}}o(p.length==l);var y=8*e.getNumDataCodewords(f,n);o(y>=p.length),r(0,Math.min(4,y-p.length),p),r(0,(8-p.length%8)%8,p),o(p.length%8==0);for(var N=236;y>p.length;N^=253)r(N,8,p);for(var A=[];p.length>8*A.length;)A.push(0);return p.forEach((function(t,e){return A[e>>>3]|=t<<7-(7&e)})),new e(f,n,A,u)},e.prototype.getModule=function(t,e){return t>=0&&this.size>t&&e>=0&&this.size>e&&this.modules[e][t]},e.prototype.getModules=function(){return this.modules},e.prototype.drawFunctionPatterns=function(){for(var t=0;this.size>t;t++)this.setFunctionModule(6,t,t%2==0),this.setFunctionModule(t,6,t%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);var e=this.getAlignmentPatternPositions(),r=e.length;for(t=0;r>t;t++)for(var n=0;r>n;n++)0==t&&0==n||0==t&&n==r-1||t==r-1&&0==n||this.drawAlignmentPattern(e[t],e[n]);this.drawFormatBits(0),this.drawVersion()},e.prototype.drawFormatBits=function(t){for(var e=this.errorCorrectionLevel.formatBits<<3|t,r=e,i=0;10>i;i++)r=r<<1^1335*(r>>>9);var a=21522^(e<<10|r);o(a>>>15==0);for(i=0;5>=i;i++)this.setFunctionModule(8,i,n(a,i));this.setFunctionModule(8,7,n(a,6)),this.setFunctionModule(8,8,n(a,7)),this.setFunctionModule(7,8,n(a,8));for(i=9;15>i;i++)this.setFunctionModule(14-i,8,n(a,i));for(i=0;8>i;i++)this.setFunctionModule(this.size-1-i,8,n(a,i));for(i=8;15>i;i++)this.setFunctionModule(8,this.size-15+i,n(a,i));this.setFunctionModule(8,this.size-8,!0)},e.prototype.drawVersion=function(){if(this.version>=7){for(var t=this.version,e=0;12>e;e++)t=t<<1^7973*(t>>>11);var r=this.version<<12|t;o(r>>>18==0);for(e=0;18>e;e++){var i=n(r,e),a=this.size-11+e%3,s=Math.floor(e/3);this.setFunctionModule(a,s,i),this.setFunctionModule(s,a,i)}}},e.prototype.drawFinderPattern=function(t,e){for(var r=-4;4>=r;r++)for(var n=-4;4>=n;n++){var o=Math.max(Math.abs(n),Math.abs(r)),i=t+n,a=e+r;i>=0&&this.size>i&&a>=0&&this.size>a&&this.setFunctionModule(i,a,2!=o&&4!=o)}},e.prototype.drawAlignmentPattern=function(t,e){for(var r=-2;2>=r;r++)for(var n=-2;2>=n;n++)this.setFunctionModule(t+n,e+r,1!=Math.max(Math.abs(n),Math.abs(r)))},e.prototype.setFunctionModule=function(t,e,r){this.modules[e][t]=r,this.isFunction[e][t]=!0},e.prototype.addEccAndInterleave=function(t){var r=this.version,n=this.errorCorrectionLevel;if(t.length!=e.getNumDataCodewords(r,n))throw new RangeError("Invalid argument");for(var i=e.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][r],a=e.ECC_CODEWORDS_PER_BLOCK[n.ordinal][r],s=Math.floor(e.getNumRawDataModules(r)/8),u=i-s%i,h=Math.floor(s/i),f=[],l=e.reedSolomonComputeDivisor(a),c=0,d=0;i>c;c++){var v=t.slice(d,d+h-a+(u>c?0:1));d+=v.length;var g=e.reedSolomonComputeRemainder(v,l);u>c&&v.push(0),f.push(v.concat(g))}var m=[],p=function(t){f.forEach((function(e,r){t==h-a&&u>r||m.push(e[t])}))};for(c=0;f[0].length>c;c++)p(c);return o(m.length==s),m},e.prototype.drawCodewords=function(t){if(t.length!=Math.floor(e.getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");for(var r=0,i=this.size-1;i>=1;i-=2){6==i&&(i=5);for(var a=0;this.size>a;a++)for(var s=0;2>s;s++){var u=i-s,h=0==(i+1&2)?this.size-1-a:a;!this.isFunction[h][u]&&8*t.length>r&&(this.modules[h][u]=n(t[r>>>3],7-(7&r)),r++)}}o(r==8*t.length)},e.prototype.applyMask=function(t){if(0>t||t>7)throw new RangeError("Mask value out of range");for(var e=0;this.size>e;e++)for(var r=0;this.size>r;r++){var n=void 0;switch(t){case 0:n=(r+e)%2==0;break;case 1:n=e%2==0;break;case 2:n=r%3==0;break;case 3:n=(r+e)%3==0;break;case 4:n=(Math.floor(r/3)+Math.floor(e/2))%2==0;break;case 5:n=r*e%2+r*e%3==0;break;case 6:n=(r*e%2+r*e%3)%2==0;break;case 7:n=((r+e)%2+r*e%3)%2==0;break;default:throw Error("Unreachable")}!this.isFunction[e][r]&&n&&(this.modules[e][r]=!this.modules[e][r])}},e.prototype.getPenaltyScore=function(){for(var t=0,r=0;this.size>r;r++){for(var n=!1,i=0,a=[0,0,0,0,0,0,0],s=0;this.size>s;s++)this.modules[r][s]==n?5==++i?t+=e.PENALTY_N1:i>5&&t++:(this.finderPenaltyAddHistory(i,a),n||(t+=this.finderPenaltyCountPatterns(a)*e.PENALTY_N3),n=this.modules[r][s],i=1);t+=this.finderPenaltyTerminateAndCount(n,i,a)*e.PENALTY_N3}for(s=0;this.size>s;s++){n=!1;var u=0;for(a=[0,0,0,0,0,0,0],r=0;this.size>r;r++)this.modules[r][s]==n?5==++u?t+=e.PENALTY_N1:u>5&&t++:(this.finderPenaltyAddHistory(u,a),n||(t+=this.finderPenaltyCountPatterns(a)*e.PENALTY_N3),n=this.modules[r][s],u=1);t+=this.finderPenaltyTerminateAndCount(n,u,a)*e.PENALTY_N3}for(r=0;this.size-1>r;r++)for(s=0;this.size-1>s;s++){var h=this.modules[r][s];h==this.modules[r][s+1]&&h==this.modules[r+1][s]&&h==this.modules[r+1][s+1]&&(t+=e.PENALTY_N2)}for(var f=0,l=0,c=this.modules;c.length>l;l++){f=c[l].reduce((function(t,e){return t+(e?1:0)}),f)}var d=this.size*this.size,v=Math.ceil(Math.abs(20*f-10*d)/d)-1;return o(v>=0&&9>=v),o((t+=v*e.PENALTY_N4)>=0&&2568888>=t),t},e.prototype.getAlignmentPatternPositions=function(){if(1==this.version)return[];for(var t=Math.floor(this.version/7)+2,e=32==this.version?26:2*Math.ceil((4*this.version+4)/(2*t-2)),r=[6],n=this.size-7;t>r.length;n-=e)r.splice(1,0,n);return r},e.getNumRawDataModules=function(t){if(e.MIN_VERSION>t||t>e.MAX_VERSION)throw new RangeError("Version number out of range");var r=(16*t+128)*t+64;if(t>=2){var n=Math.floor(t/7)+2;r-=(25*n-10)*n-55,7>t||(r-=36)}return o(r>=208&&29648>=r),r},e.getNumDataCodewords=function(t,r){return Math.floor(e.getNumRawDataModules(t)/8)-e.ECC_CODEWORDS_PER_BLOCK[r.ordinal][t]*e.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][t]},e.reedSolomonComputeDivisor=function(t){if(1>t||t>255)throw new RangeError("Degree out of range");for(var r=[],n=0;t-1>n;n++)r.push(0);r.push(1);var o=1;for(n=0;t>n;n++){for(var i=0;r.length>i;i++)r[i]=e.reedSolomonMultiply(r[i],o),r.length>i+1&&(r[i]^=r[i+1]);o=e.reedSolomonMultiply(o,2)}return r},e.reedSolomonComputeRemainder=function(t,r){for(var n=r.map((function(t){return 0})),o=function(t){var o=t^n.shift();n.push(0),r.forEach((function(t,r){return n[r]^=e.reedSolomonMultiply(t,o)}))},i=0,a=t;a.length>i;i++){o(a[i])}return n},e.reedSolomonMultiply=function(t,e){if(t>>>8!=0||e>>>8!=0)throw new RangeError("Byte out of range");for(var r=0,n=7;n>=0;n--)r=r<<1^285*(r>>>7),r^=(e>>>n&1)*t;return o(r>>>8==0),r},e.prototype.finderPenaltyCountPatterns=function(t){var e=t[1];o(3*this.size>=e);var r=e>0&&t[2]==e&&t[3]==3*e&&t[4]==e&&t[5]==e;return(!r||4*e>t[0]||e>t[6]?0:1)+(!r||4*e>t[6]||e>t[0]?0:1)},e.prototype.finderPenaltyTerminateAndCount=function(t,e,r){return t&&(this.finderPenaltyAddHistory(e,r),e=0),this.finderPenaltyAddHistory(e+=this.size,r),this.finderPenaltyCountPatterns(r)},e.prototype.finderPenaltyAddHistory=function(t,e){0==e[0]&&(t+=this.size),e.pop(),e.unshift(t)},e.MIN_VERSION=1,e.MAX_VERSION=40,e.PENALTY_N1=3,e.PENALTY_N2=3,e.PENALTY_N3=40,e.PENALTY_N4=10,e.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],e.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e}();function r(t,e,r){if(0>e||e>31||t>>>e!=0)throw new RangeError("Value out of range");for(var n=e-1;n>=0;n--)r.push(t>>>n&1)}function n(t,e){return 0!=(t>>>e&1)}function o(t){if(!t)throw Error("Assertion error")}t.QrCode=e;var i=function(){function t(t,e,r){if(this.mode=t,this.numChars=e,this.bitData=r,0>e)throw new RangeError("Invalid argument");this.bitData=r.slice()}return t.makeBytes=function(e){for(var n=[],o=0,i=e;i.length>o;o++){r(i[o],8,n)}return new t(t.Mode.BYTE,e.length,n)},t.makeNumeric=function(e){if(!t.isNumeric(e))throw new RangeError("String contains non-numeric characters");for(var n=[],o=0;e.length>o;){var i=Math.min(e.length-o,3);r(parseInt(e.substring(o,o+i),10),3*i+1,n),o+=i}return new t(t.Mode.NUMERIC,e.length,n)},t.makeAlphanumeric=function(e){if(!t.isAlphanumeric(e))throw new RangeError("String contains unencodable characters in alphanumeric mode");var n,o=[];for(n=0;e.length>=n+2;n+=2){var i=45*t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n));r(i+=t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n+1)),11,o)}return e.length>n&&r(t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n)),6,o),new t(t.Mode.ALPHANUMERIC,e.length,o)},t.makeSegments=function(e){return""==e?[]:t.isNumeric(e)?[t.makeNumeric(e)]:t.isAlphanumeric(e)?[t.makeAlphanumeric(e)]:[t.makeBytes(t.toUtf8ByteArray(e))]},t.makeEci=function(e){var n=[];if(0>e)throw new RangeError("ECI assignment value out of range");if(128>e)r(e,8,n);else if(16384>e)r(2,2,n),r(e,14,n);else{if(e>=1e6)throw new RangeError("ECI assignment value out of range");r(6,3,n),r(e,21,n)}return new t(t.Mode.ECI,0,n)},t.isNumeric=function(e){return t.NUMERIC_REGEX.test(e)},t.isAlphanumeric=function(e){return t.ALPHANUMERIC_REGEX.test(e)},t.prototype.getData=function(){return this.bitData.slice()},t.getTotalBits=function(t,e){for(var r=0,n=0,o=t;o.length>n;n++){var i=o[n],a=i.mode.numCharCountBits(e);if(i.numChars>=1<<a)return 1/0;r+=4+a+i.bitData.length}return r},t.toUtf8ByteArray=function(t){t=encodeURI(t);for(var e=[],r=0;t.length>r;r++)"%"!=t.charAt(r)?e.push(t.charCodeAt(r)):(e.push(parseInt(t.substring(r+1,r+3),16)),r+=2);return e},t.NUMERIC_REGEX=/^[0-9]*$/,t.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,t.ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",t}();t.QrSegment=i}(e||(e={})),function(t){var e,r;e=t.QrCode||(t.QrCode={}),r=function(){function t(t,e){this.ordinal=t,this.formatBits=e}return t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),t}(),e.Ecc=r}(e||(e={})),function(t){var e,r;e=t.QrSegment||(t.QrSegment={}),r=function(){function t(t,e){this.modeBits=t,this.numBitsCharCount=e}return t.prototype.numCharCountBits=function(t){return this.numBitsCharCount[Math.floor((t+7)/17)]},t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),t}(),e.Mode=r}(e||(e={}));var n=e,o={L:n.QrCode.Ecc.LOW,M:n.QrCode.Ecc.MEDIUM,Q:n.QrCode.Ecc.QUARTILE,H:n.QrCode.Ecc.HIGH},i=function(){try{(new Path2D).addPath(new Path2D)}catch(t){return!1}return!0}();function a(t){return t in o}function s(t,e){void 0===e&&(e=0);var r=[];return t.forEach((function(t,n){var o=null;t.forEach((function(i,a){if(!i&&null!==o)return r.push("M".concat(o+e," ").concat(n+e,"h").concat(a-o,"v1H").concat(o+e,"z")),void(o=null);if(a!==t.length-1)i&&null===o&&(o=a);else{if(!i)return;r.push(null===o?"M".concat(a+e,",").concat(n+e," h1v1H").concat(a+e,"z"):"M".concat(o+e,",").concat(n+e," h").concat(a+1-o,"v1H").concat(o+e,"z"))}}))})),r.join("")}var u={value:{type:String,required:!0,default:""},size:{type:Number,default:100},level:{type:String,default:"H",validator:function(t){return a(t)}},background:{type:String,default:"#fff"},foreground:{type:String,default:"#000"},margin:{type:Number,required:!1,default:0}},h=r(r({},u),{renderAs:{type:String,required:!1,default:"canvas",validator:function(t){return["canvas","svg"].indexOf(t)>-1}}}),f=t.defineComponent({name:"QRCodeSvg",props:u,setup:function(e){var r=t.ref(0),i=t.ref(""),a=function(){var t=e.margin,a=n.QrCode.encodeText(e.value,o[e.level]).getModules();r.value=a.length+2*t,i.value=s(a,t)};return a(),t.onUpdated(a),function(){return t.h("svg",{width:e.size,height:e.size,"shape-rendering":"crispEdges",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(r.value," ").concat(r.value)},[t.h("path",{fill:e.background,d:"M0,0 h".concat(r.value,"v").concat(r.value,"H0z")}),t.h("path",{fill:e.foreground,d:i.value})])}}}),l=t.defineComponent({name:"QRCodeCanvas",props:u,setup:function(e){var r=t.ref(null),a=function(){var t=e.value,a=e.level,u=e.size,h=e.margin,f=e.background,l=e.foreground,c=r.value;if(c){var d=c.getContext("2d");if(d){var v=n.QrCode.encodeText(t,o[a]).getModules(),g=v.length+2*h,m=window.devicePixelRatio||1,p=u/g*m;c.height=c.width=u*m,d.scale(p,p),d.fillStyle=f,d.fillRect(0,0,g,g),d.fillStyle=l,i?d.fill(new Path2D(s(v,h))):v.forEach((function(t,e){t.forEach((function(t,r){t&&d.fillRect(r+h,e+h,1,1)}))}))}}};return t.onMounted(a),t.onUpdated(a),function(){return t.h("canvas",{ref:r,style:{width:"".concat(e.size,"px"),height:"".concat(e.size,"px")}})}}});return t.defineComponent({name:"Qrcode",render:function(){var e=this.$props,r=e.renderAs,n=e.value,o=e.level,i=e.background,s=e.foreground,u=e.size>>>0,h=e.margin>>>0,c=a(o)?o:"H";return t.h("svg"===r?f:l,{value:n,size:u,margin:h,level:c,background:i,foreground:s})},props:h})})); | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).QrcodeVue={},t.Vue)}(this,(function(t,e){"use strict";var r,n=function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;n>r;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},n.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError,function(t){var e=function(){function e(t,r,n,i){if(this.version=t,this.errorCorrectionLevel=r,this.modules=[],this.isFunction=[],e.MIN_VERSION>t||t>e.MAX_VERSION)throw new RangeError("Version value out of range");if(-1>i||i>7)throw new RangeError("Mask value out of range");this.size=4*t+17;for(var a=[],s=0;this.size>s;s++)a.push(!1);for(s=0;this.size>s;s++)this.modules.push(a.slice()),this.isFunction.push(a.slice());this.drawFunctionPatterns();var u=this.addEccAndInterleave(n);if(this.drawCodewords(u),-1==i){var h=1e9;for(s=0;8>s;s++){this.applyMask(s),this.drawFormatBits(s);var l=this.getPenaltyScore();h>l&&(i=s,h=l),this.applyMask(s)}}o(i>=0&&7>=i),this.mask=i,this.applyMask(i),this.drawFormatBits(i),this.isFunction=[]}return e.encodeText=function(r,n){var o=t.QrSegment.makeSegments(r);return e.encodeSegments(o,n)},e.encodeBinary=function(r,n){var o=t.QrSegment.makeBytes(r);return e.encodeSegments([o],n)},e.encodeSegments=function(t,n,a,s,u,h){if(void 0===a&&(a=1),void 0===s&&(s=40),void 0===u&&(u=-1),void 0===h&&(h=!0),e.MIN_VERSION>a||a>s||s>e.MAX_VERSION||-1>u||u>7)throw new RangeError("Invalid value");var l,c;for(l=a;;l++){var f=8*e.getNumDataCodewords(l,n),d=i.getTotalBits(t,l);if(f>=d){c=d;break}if(l>=s)throw new RangeError("Data too long")}for(var g=0,v=[e.Ecc.MEDIUM,e.Ecc.QUARTILE,e.Ecc.HIGH];v.length>g;g++){var m=v[g];h&&c<=8*e.getNumDataCodewords(l,m)&&(n=m)}for(var p=[],E=0,w=t;w.length>E;E++){var M=w[E];r(M.mode.modeBits,4,p),r(M.numChars,M.mode.numCharCountBits(l),p);for(var C=0,y=M.getData();y.length>C;C++){p.push(y[C])}}o(p.length==c);var R=8*e.getNumDataCodewords(l,n);o(R>=p.length),r(0,Math.min(4,R-p.length),p),r(0,(8-p.length%8)%8,p),o(p.length%8==0);for(var N=236;R>p.length;N^=253)r(N,8,p);for(var A=[];p.length>8*A.length;)A.push(0);return p.forEach((function(t,e){return A[e>>>3]|=t<<7-(7&e)})),new e(l,n,A,u)},e.prototype.getModule=function(t,e){return t>=0&&this.size>t&&e>=0&&this.size>e&&this.modules[e][t]},e.prototype.getModules=function(){return this.modules},e.prototype.drawFunctionPatterns=function(){for(var t=0;this.size>t;t++)this.setFunctionModule(6,t,t%2==0),this.setFunctionModule(t,6,t%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);var e=this.getAlignmentPatternPositions(),r=e.length;for(t=0;r>t;t++)for(var n=0;r>n;n++)0==t&&0==n||0==t&&n==r-1||t==r-1&&0==n||this.drawAlignmentPattern(e[t],e[n]);this.drawFormatBits(0),this.drawVersion()},e.prototype.drawFormatBits=function(t){for(var e=this.errorCorrectionLevel.formatBits<<3|t,r=e,i=0;10>i;i++)r=r<<1^1335*(r>>>9);var a=21522^(e<<10|r);o(a>>>15==0);for(i=0;5>=i;i++)this.setFunctionModule(8,i,n(a,i));this.setFunctionModule(8,7,n(a,6)),this.setFunctionModule(8,8,n(a,7)),this.setFunctionModule(7,8,n(a,8));for(i=9;15>i;i++)this.setFunctionModule(14-i,8,n(a,i));for(i=0;8>i;i++)this.setFunctionModule(this.size-1-i,8,n(a,i));for(i=8;15>i;i++)this.setFunctionModule(8,this.size-15+i,n(a,i));this.setFunctionModule(8,this.size-8,!0)},e.prototype.drawVersion=function(){if(this.version>=7){for(var t=this.version,e=0;12>e;e++)t=t<<1^7973*(t>>>11);var r=this.version<<12|t;o(r>>>18==0);for(e=0;18>e;e++){var i=n(r,e),a=this.size-11+e%3,s=Math.floor(e/3);this.setFunctionModule(a,s,i),this.setFunctionModule(s,a,i)}}},e.prototype.drawFinderPattern=function(t,e){for(var r=-4;4>=r;r++)for(var n=-4;4>=n;n++){var o=Math.max(Math.abs(n),Math.abs(r)),i=t+n,a=e+r;i>=0&&this.size>i&&a>=0&&this.size>a&&this.setFunctionModule(i,a,2!=o&&4!=o)}},e.prototype.drawAlignmentPattern=function(t,e){for(var r=-2;2>=r;r++)for(var n=-2;2>=n;n++)this.setFunctionModule(t+n,e+r,1!=Math.max(Math.abs(n),Math.abs(r)))},e.prototype.setFunctionModule=function(t,e,r){this.modules[e][t]=r,this.isFunction[e][t]=!0},e.prototype.addEccAndInterleave=function(t){var r=this.version,n=this.errorCorrectionLevel;if(t.length!=e.getNumDataCodewords(r,n))throw new RangeError("Invalid argument");for(var i=e.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][r],a=e.ECC_CODEWORDS_PER_BLOCK[n.ordinal][r],s=Math.floor(e.getNumRawDataModules(r)/8),u=i-s%i,h=Math.floor(s/i),l=[],c=e.reedSolomonComputeDivisor(a),f=0,d=0;i>f;f++){var g=t.slice(d,d+h-a+(u>f?0:1));d+=g.length;var v=e.reedSolomonComputeRemainder(g,c);u>f&&g.push(0),l.push(g.concat(v))}var m=[],p=function(t){l.forEach((function(e,r){t==h-a&&u>r||m.push(e[t])}))};for(f=0;l[0].length>f;f++)p(f);return o(m.length==s),m},e.prototype.drawCodewords=function(t){if(t.length!=Math.floor(e.getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");for(var r=0,i=this.size-1;i>=1;i-=2){6==i&&(i=5);for(var a=0;this.size>a;a++)for(var s=0;2>s;s++){var u=i-s,h=!(i+1&2)?this.size-1-a:a;!this.isFunction[h][u]&&8*t.length>r&&(this.modules[h][u]=n(t[r>>>3],7-(7&r)),r++)}}o(r==8*t.length)},e.prototype.applyMask=function(t){if(0>t||t>7)throw new RangeError("Mask value out of range");for(var e=0;this.size>e;e++)for(var r=0;this.size>r;r++){var n=void 0;switch(t){case 0:n=(r+e)%2==0;break;case 1:n=e%2==0;break;case 2:n=r%3==0;break;case 3:n=(r+e)%3==0;break;case 4:n=(Math.floor(r/3)+Math.floor(e/2))%2==0;break;case 5:n=r*e%2+r*e%3==0;break;case 6:n=(r*e%2+r*e%3)%2==0;break;case 7:n=((r+e)%2+r*e%3)%2==0;break;default:throw Error("Unreachable")}!this.isFunction[e][r]&&n&&(this.modules[e][r]=!this.modules[e][r])}},e.prototype.getPenaltyScore=function(){for(var t=0,r=0;this.size>r;r++){for(var n=!1,i=0,a=[0,0,0,0,0,0,0],s=0;this.size>s;s++)this.modules[r][s]==n?5==++i?t+=e.PENALTY_N1:i>5&&t++:(this.finderPenaltyAddHistory(i,a),n||(t+=this.finderPenaltyCountPatterns(a)*e.PENALTY_N3),n=this.modules[r][s],i=1);t+=this.finderPenaltyTerminateAndCount(n,i,a)*e.PENALTY_N3}for(s=0;this.size>s;s++){n=!1;var u=0;for(a=[0,0,0,0,0,0,0],r=0;this.size>r;r++)this.modules[r][s]==n?5==++u?t+=e.PENALTY_N1:u>5&&t++:(this.finderPenaltyAddHistory(u,a),n||(t+=this.finderPenaltyCountPatterns(a)*e.PENALTY_N3),n=this.modules[r][s],u=1);t+=this.finderPenaltyTerminateAndCount(n,u,a)*e.PENALTY_N3}for(r=0;this.size-1>r;r++)for(s=0;this.size-1>s;s++){var h=this.modules[r][s];h==this.modules[r][s+1]&&h==this.modules[r+1][s]&&h==this.modules[r+1][s+1]&&(t+=e.PENALTY_N2)}for(var l=0,c=0,f=this.modules;f.length>c;c++){l=f[c].reduce((function(t,e){return t+(e?1:0)}),l)}var d=this.size*this.size,g=Math.ceil(Math.abs(20*l-10*d)/d)-1;return o(g>=0&&9>=g),o((t+=g*e.PENALTY_N4)>=0&&2568888>=t),t},e.prototype.getAlignmentPatternPositions=function(){if(1==this.version)return[];for(var t=Math.floor(this.version/7)+2,e=2*Math.floor((8*this.version+3*t+5)/(4*t-4)),r=[6],n=this.size-7;t>r.length;n-=e)r.splice(1,0,n);return r},e.getNumRawDataModules=function(t){if(e.MIN_VERSION>t||t>e.MAX_VERSION)throw new RangeError("Version number out of range");var r=(16*t+128)*t+64;if(t>=2){var n=Math.floor(t/7)+2;r-=(25*n-10)*n-55,7>t||(r-=36)}return o(r>=208&&29648>=r),r},e.getNumDataCodewords=function(t,r){return Math.floor(e.getNumRawDataModules(t)/8)-e.ECC_CODEWORDS_PER_BLOCK[r.ordinal][t]*e.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][t]},e.reedSolomonComputeDivisor=function(t){if(1>t||t>255)throw new RangeError("Degree out of range");for(var r=[],n=0;t-1>n;n++)r.push(0);r.push(1);var o=1;for(n=0;t>n;n++){for(var i=0;r.length>i;i++)r[i]=e.reedSolomonMultiply(r[i],o),r.length>i+1&&(r[i]^=r[i+1]);o=e.reedSolomonMultiply(o,2)}return r},e.reedSolomonComputeRemainder=function(t,r){for(var n=r.map((function(t){return 0})),o=function(t){var o=t^n.shift();n.push(0),r.forEach((function(t,r){return n[r]^=e.reedSolomonMultiply(t,o)}))},i=0,a=t;a.length>i;i++){o(a[i])}return n},e.reedSolomonMultiply=function(t,e){if(t>>>8!=0||e>>>8!=0)throw new RangeError("Byte out of range");for(var r=0,n=7;n>=0;n--)r=r<<1^285*(r>>>7),r^=(e>>>n&1)*t;return o(r>>>8==0),r},e.prototype.finderPenaltyCountPatterns=function(t){var e=t[1];o(3*this.size>=e);var r=e>0&&t[2]==e&&t[3]==3*e&&t[4]==e&&t[5]==e;return(!r||4*e>t[0]||e>t[6]?0:1)+(!r||4*e>t[6]||e>t[0]?0:1)},e.prototype.finderPenaltyTerminateAndCount=function(t,e,r){return t&&(this.finderPenaltyAddHistory(e,r),e=0),this.finderPenaltyAddHistory(e+=this.size,r),this.finderPenaltyCountPatterns(r)},e.prototype.finderPenaltyAddHistory=function(t,e){0==e[0]&&(t+=this.size),e.pop(),e.unshift(t)},e.MIN_VERSION=1,e.MAX_VERSION=40,e.PENALTY_N1=3,e.PENALTY_N2=3,e.PENALTY_N3=40,e.PENALTY_N4=10,e.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],e.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e}();function r(t,e,r){if(0>e||e>31||t>>>e!=0)throw new RangeError("Value out of range");for(var n=e-1;n>=0;n--)r.push(t>>>n&1)}function n(t,e){return!!(t>>>e&1)}function o(t){if(!t)throw Error("Assertion error")}t.QrCode=e;var i=function(){function t(t,e,r){if(this.mode=t,this.numChars=e,this.bitData=r,0>e)throw new RangeError("Invalid argument");this.bitData=r.slice()}return t.makeBytes=function(e){for(var n=[],o=0,i=e;i.length>o;o++){r(i[o],8,n)}return new t(t.Mode.BYTE,e.length,n)},t.makeNumeric=function(e){if(!t.isNumeric(e))throw new RangeError("String contains non-numeric characters");for(var n=[],o=0;e.length>o;){var i=Math.min(e.length-o,3);r(parseInt(e.substring(o,o+i),10),3*i+1,n),o+=i}return new t(t.Mode.NUMERIC,e.length,n)},t.makeAlphanumeric=function(e){if(!t.isAlphanumeric(e))throw new RangeError("String contains unencodable characters in alphanumeric mode");var n,o=[];for(n=0;e.length>=n+2;n+=2){var i=45*t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n));r(i+=t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n+1)),11,o)}return e.length>n&&r(t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n)),6,o),new t(t.Mode.ALPHANUMERIC,e.length,o)},t.makeSegments=function(e){return""==e?[]:t.isNumeric(e)?[t.makeNumeric(e)]:t.isAlphanumeric(e)?[t.makeAlphanumeric(e)]:[t.makeBytes(t.toUtf8ByteArray(e))]},t.makeEci=function(e){var n=[];if(0>e)throw new RangeError("ECI assignment value out of range");if(128>e)r(e,8,n);else if(16384>e)r(2,2,n),r(e,14,n);else{if(e>=1e6)throw new RangeError("ECI assignment value out of range");r(6,3,n),r(e,21,n)}return new t(t.Mode.ECI,0,n)},t.isNumeric=function(e){return t.NUMERIC_REGEX.test(e)},t.isAlphanumeric=function(e){return t.ALPHANUMERIC_REGEX.test(e)},t.prototype.getData=function(){return this.bitData.slice()},t.getTotalBits=function(t,e){for(var r=0,n=0,o=t;o.length>n;n++){var i=o[n],a=i.mode.numCharCountBits(e);if(i.numChars>=1<<a)return 1/0;r+=4+a+i.bitData.length}return r},t.toUtf8ByteArray=function(t){t=encodeURI(t);for(var e=[],r=0;t.length>r;r++)"%"!=t.charAt(r)?e.push(t.charCodeAt(r)):(e.push(parseInt(t.substring(r+1,r+3),16)),r+=2);return e},t.NUMERIC_REGEX=/^[0-9]*$/,t.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,t.ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",t}();t.QrSegment=i}(r||(r={})),function(t){var e,r;e=t.QrCode||(t.QrCode={}),r=function(){function t(t,e){this.ordinal=t,this.formatBits=e}return t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),t}(),e.Ecc=r}(r||(r={})),function(t){var e,r;e=t.QrSegment||(t.QrSegment={}),r=function(){function t(t,e){this.modeBits=t,this.numBitsCharCount=e}return t.prototype.numCharCountBits=function(t){return this.numBitsCharCount[Math.floor((t+7)/17)]},t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),t}(),e.Mode=r}(r||(r={}));var o=r,i={L:o.QrCode.Ecc.LOW,M:o.QrCode.Ecc.MEDIUM,Q:o.QrCode.Ecc.QUARTILE,H:o.QrCode.Ecc.HIGH},a=function(){try{(new Path2D).addPath(new Path2D)}catch(t){return!1}return!0}();function s(t){return t in i}function u(t,e){void 0===e&&(e=0);var r=[];return t.forEach((function(t,n){var o=null;t.forEach((function(i,a){if(!i&&null!==o)return r.push("M".concat(o+e," ").concat(n+e,"h").concat(a-o,"v1H").concat(o+e,"z")),void(o=null);if(a!==t.length-1)i&&null===o&&(o=a);else{if(!i)return;r.push(null===o?"M".concat(a+e,",").concat(n+e," h1v1H").concat(a+e,"z"):"M".concat(o+e,",").concat(n+e," h").concat(a+1-o,"v1H").concat(o+e,"z"))}}))})),r.join("")}function h(t,e,r,n){var o=n.width,i=n.height,a=n.x,s=n.y,u=t.length+2*r,h=Math.floor(.1*e),l=u/e,c=(o||h)*l,f=(i||h)*l,d=null==a?t.length/2-c/2:a*l,g=null==s?t.length/2-f/2:s*l,v=null;if(n.excavate){var m=Math.floor(d),p=Math.floor(g);v={x:m,y:p,w:Math.ceil(c+d-m),h:Math.ceil(f+g-p)}}return{x:d,y:g,h:f,w:c,excavation:v}}function l(t,e){return t.slice().map((function(t,r){return e.y>r||r>=e.y+e.h?t:t.map((function(t,r){return(e.x>r||r>=e.x+e.w)&&t}))}))}var c={value:{type:String,required:!0,default:""},size:{type:Number,default:100},level:{type:String,default:"L",validator:function(t){return s(t)}},background:{type:String,default:"#fff"},foreground:{type:String,default:"#000"},margin:{type:Number,required:!1,default:0},imageSettings:{type:Object,required:!1,default:function(){return{}}}},f=n(n({},c),{renderAs:{type:String,required:!1,default:"canvas",validator:function(t){return["canvas","svg"].indexOf(t)>-1}}}),d=e.defineComponent({name:"QRCodeSvg",props:c,setup:function(t){var r,a=e.ref(0),s=e.ref(""),c=function(){var e=t.margin,n=o.QrCode.encodeText(t.value,i[t.level]).getModules();if(a.value=n.length+2*e,t.imageSettings.src){var c=h(n,t.size,e,t.imageSettings);r={x:c.x+e,y:c.y+e,width:c.w,height:c.h},c.excavation&&(n=l(n,c.excavation))}s.value=u(n,e)};return c(),e.onUpdated(c),function(){return e.h("svg",{width:t.size,height:t.size,"shape-rendering":"crispEdges",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(a.value," ").concat(a.value)},[e.h("path",{fill:t.background,d:"M0,0 h".concat(a.value,"v").concat(a.value,"H0z")}),e.h("path",{fill:t.foreground,d:s.value}),t.imageSettings.src&&e.h("image",n({href:t.imageSettings.src},r))])}}}),g=e.defineComponent({name:"QRCodeCanvas",props:c,setup:function(t,r){var s=e.ref(null),c=e.ref(null),f=function(){var e=t.value,r=t.level,n=t.size,f=t.margin,d=t.background,g=t.foreground,v=s.value;if(v){var m=v.getContext("2d");if(m){var p=o.QrCode.encodeText(e,i[r]).getModules(),E=p.length+2*f,w=c.value,M={x:0,y:0,width:0,height:0},C=t.imageSettings.src&&null!=w&&0!==w.naturalWidth&&0!==w.naturalHeight;if(C){var y=h(p,t.size,f,t.imageSettings);M={x:y.x+f,y:y.y+f,width:y.w,height:y.h},y.excavation&&(p=l(p,y.excavation))}var R=window.devicePixelRatio||1,N=n/E*R;v.height=v.width=n*R,m.scale(N,N),m.fillStyle=d,m.fillRect(0,0,E,E),m.fillStyle=g,a?m.fill(new Path2D(u(p,f))):p.forEach((function(t,e){t.forEach((function(t,r){t&&m.fillRect(r+f,e+f,1,1)}))})),C&&m.drawImage(w,M.x,M.y,M.width,M.height)}}};e.onMounted(f),e.onUpdated(f);var d=r.attrs.style;return function(){return e.h(e.Fragment,[e.h("canvas",n(n({},r.attrs),{ref:s,style:n(n({},d),{width:"".concat(t.size,"px"),height:"".concat(t.size,"px")})})),t.imageSettings.src&&e.h("img",{ref:c,src:t.imageSettings.src,style:{display:"none"},onLoad:f})])}}}),v=e.defineComponent({name:"Qrcode",render:function(){var t=this.$props,r=t.renderAs,n=t.value,o=t.level,i=t.background,a=t.foreground,u=t.imageSettings,h=t.size>>>0,l=t.margin>>>0,c=s(o)?o:"L";return e.h("svg"===r?d:g,{value:n,size:h,margin:l,level:c,background:i,foreground:a,imageSettings:u})},props:f});t.QrcodeCanvas=g,t.QrcodeSvg=d,t.default=v,Object.defineProperty(t,"__esModule",{value:!0})})); |
/*! | ||
* qrcode.vue v3.4.1 | ||
* A Vue.js component to generate QRCode. | ||
* © 2017-2023 @scopewu(https://github.com/scopewu) | ||
* qrcode.vue v3.5.0 | ||
* A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 | ||
* © 2017-PRESENT @scopewu(https://github.com/scopewu) | ||
* MIT License. | ||
@@ -9,2 +9,4 @@ */ | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
var vue = require('vue'); | ||
@@ -529,4 +531,3 @@ | ||
var numAlign = Math.floor(this.version / 7) + 2; | ||
var step = (this.version == 32) ? 26 : | ||
Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2; | ||
var step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2; | ||
var result = [6]; | ||
@@ -657,5 +658,5 @@ for (var pos = this.size - 7; result.length < numAlign; pos -= step) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Low | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], // Medium | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Quartile | ||
[-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // High | ||
@@ -666,5 +667,5 @@ ]; | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], // Low | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], // Medium | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], // Quartile | ||
[-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81], // High | ||
@@ -915,3 +916,3 @@ ]; | ||
var defaultErrorCorrectLevel = 'H'; | ||
var defaultErrorCorrectLevel = 'L'; | ||
var ErrorCorrectLevelMap = { | ||
@@ -973,2 +974,34 @@ L: QR.QrCode.Ecc.LOW, | ||
} | ||
function getImageSettings(cells, size, margin, imageSettings) { | ||
var width = imageSettings.width, height = imageSettings.height, imageX = imageSettings.x, imageY = imageSettings.y; | ||
var numCells = cells.length + margin * 2; | ||
var defaultSize = Math.floor(size * 0.1); | ||
var scale = numCells / size; | ||
var w = (width || defaultSize) * scale; | ||
var h = (height || defaultSize) * scale; | ||
var x = imageX == null ? cells.length / 2 - w / 2 : imageX * scale; | ||
var y = imageY == null ? cells.length / 2 - h / 2 : imageY * scale; | ||
var excavation = null; | ||
if (imageSettings.excavate) { | ||
var floorX = Math.floor(x); | ||
var floorY = Math.floor(y); | ||
var ceilW = Math.ceil(w + x - floorX); | ||
var ceilH = Math.ceil(h + y - floorY); | ||
excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH }; | ||
} | ||
return { x: x, y: y, h: h, w: w, excavation: excavation }; | ||
} | ||
function excavateModules(modules, excavation) { | ||
return modules.slice().map(function (row, y) { | ||
if (y < excavation.y || y >= excavation.y + excavation.h) { | ||
return row; | ||
} | ||
return row.map(function (cell, x) { | ||
if (x < excavation.x || x >= excavation.x + excavation.w) { | ||
return cell; | ||
} | ||
return false; | ||
}); | ||
}); | ||
} | ||
var QRCodeProps = { | ||
@@ -1002,2 +1035,7 @@ value: { | ||
}, | ||
imageSettings: { | ||
type: Object, | ||
required: false, | ||
default: function () { return ({}); }, | ||
}, | ||
}; | ||
@@ -1010,3 +1048,3 @@ var QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: { | ||
} }); | ||
var QRCodeSvg = vue.defineComponent({ | ||
var QrcodeSvg = vue.defineComponent({ | ||
name: 'QRCodeSvg', | ||
@@ -1017,2 +1055,3 @@ props: QRCodeProps, | ||
var fgPath = vue.ref(''); | ||
var imageProps; | ||
var generate = function () { | ||
@@ -1022,2 +1061,14 @@ var value = props.value, level = props.level, margin = props.margin; | ||
numCells.value = cells.length + margin * 2; | ||
if (props.imageSettings.src) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
} | ||
// Drawing strategy: instead of a rect per module, we're going to create a | ||
@@ -1045,10 +1096,12 @@ // single path for the dark modules and layer that on top of a light rect, | ||
vue.h('path', { fill: props.foreground, d: fgPath.value }), | ||
props.imageSettings.src && vue.h('image', __assign({ href: props.imageSettings.src }, imageProps)), | ||
]); }; | ||
}, | ||
}); | ||
var QRCodeCanvas = vue.defineComponent({ | ||
var QrcodeCanvas = vue.defineComponent({ | ||
name: 'QRCodeCanvas', | ||
props: QRCodeProps, | ||
setup: function (props) { | ||
setup: function (props, ctx) { | ||
var canvasEl = vue.ref(null); | ||
var imageRef = vue.ref(null); | ||
var generate = function () { | ||
@@ -1066,2 +1119,17 @@ var value = props.value, level = props.level, size = props.size, margin = props.margin, background = props.background, foreground = props.foreground; | ||
var numCells = cells.length + margin * 2; | ||
var image = imageRef.value; | ||
var imageProps = { x: 0, y: 0, width: 0, height: 0 }; | ||
var showImage = props.imageSettings.src && image != null && image.naturalWidth !== 0 && image.naturalHeight !== 0; | ||
if (showImage) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
} | ||
var devicePixelRatio = window.devicePixelRatio || 1; | ||
@@ -1086,9 +1154,18 @@ var scale = (size / numCells) * devicePixelRatio; | ||
} | ||
if (showImage) { | ||
ctx.drawImage(image, imageProps.x, imageProps.y, imageProps.width, imageProps.height); | ||
} | ||
}; | ||
vue.onMounted(generate); | ||
vue.onUpdated(generate); | ||
return function () { return vue.h('canvas', { | ||
ref: canvasEl, | ||
style: { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }, | ||
}); }; | ||
var style = ctx.attrs.style; | ||
return function () { return vue.h(vue.Fragment, [ | ||
vue.h('canvas', __assign(__assign({}, ctx.attrs), { ref: canvasEl, style: __assign(__assign({}, style), { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }) })), | ||
props.imageSettings.src && vue.h('img', { | ||
ref: imageRef, | ||
src: props.imageSettings.src, | ||
style: { display: 'none' }, | ||
onLoad: generate, | ||
}) | ||
]); }; | ||
}, | ||
@@ -1099,7 +1176,7 @@ }); | ||
render: function () { | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground; | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground, imageSettings = _a.imageSettings; | ||
var size = _size >>> 0; | ||
var margin = _margin >>> 0; | ||
var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel; | ||
return vue.h(renderAs === 'svg' ? QRCodeSvg : QRCodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground }); | ||
return vue.h(renderAs === 'svg' ? QrcodeSvg : QrcodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground, imageSettings: imageSettings }); | ||
}, | ||
@@ -1109,2 +1186,4 @@ props: QRCodeVueProps, | ||
module.exports = QrcodeVue; | ||
exports.QrcodeCanvas = QrcodeCanvas; | ||
exports.QrcodeSvg = QrcodeSvg; | ||
exports.default = QrcodeVue; |
/*! | ||
* qrcode.vue v3.4.1 | ||
* A Vue.js component to generate QRCode. | ||
* © 2017-2023 @scopewu(https://github.com/scopewu) | ||
* qrcode.vue v3.5.0 | ||
* A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 | ||
* © 2017-PRESENT @scopewu(https://github.com/scopewu) | ||
* MIT License. | ||
*/ | ||
import { defineComponent, ref, onUpdated, h, onMounted } from 'vue'; | ||
import { defineComponent, ref, onUpdated, h, onMounted, Fragment } from 'vue'; | ||
@@ -526,4 +526,3 @@ /****************************************************************************** | ||
var numAlign = Math.floor(this.version / 7) + 2; | ||
var step = (this.version == 32) ? 26 : | ||
Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2; | ||
var step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2; | ||
var result = [6]; | ||
@@ -654,5 +653,5 @@ for (var pos = this.size - 7; result.length < numAlign; pos -= step) | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], | ||
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Low | ||
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], // Medium | ||
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Quartile | ||
[-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // High | ||
@@ -663,5 +662,5 @@ ]; | ||
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], | ||
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], // Low | ||
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], // Medium | ||
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], // Quartile | ||
[-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81], // High | ||
@@ -912,3 +911,3 @@ ]; | ||
var defaultErrorCorrectLevel = 'H'; | ||
var defaultErrorCorrectLevel = 'L'; | ||
var ErrorCorrectLevelMap = { | ||
@@ -970,2 +969,34 @@ L: QR.QrCode.Ecc.LOW, | ||
} | ||
function getImageSettings(cells, size, margin, imageSettings) { | ||
var width = imageSettings.width, height = imageSettings.height, imageX = imageSettings.x, imageY = imageSettings.y; | ||
var numCells = cells.length + margin * 2; | ||
var defaultSize = Math.floor(size * 0.1); | ||
var scale = numCells / size; | ||
var w = (width || defaultSize) * scale; | ||
var h = (height || defaultSize) * scale; | ||
var x = imageX == null ? cells.length / 2 - w / 2 : imageX * scale; | ||
var y = imageY == null ? cells.length / 2 - h / 2 : imageY * scale; | ||
var excavation = null; | ||
if (imageSettings.excavate) { | ||
var floorX = Math.floor(x); | ||
var floorY = Math.floor(y); | ||
var ceilW = Math.ceil(w + x - floorX); | ||
var ceilH = Math.ceil(h + y - floorY); | ||
excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH }; | ||
} | ||
return { x: x, y: y, h: h, w: w, excavation: excavation }; | ||
} | ||
function excavateModules(modules, excavation) { | ||
return modules.slice().map(function (row, y) { | ||
if (y < excavation.y || y >= excavation.y + excavation.h) { | ||
return row; | ||
} | ||
return row.map(function (cell, x) { | ||
if (x < excavation.x || x >= excavation.x + excavation.w) { | ||
return cell; | ||
} | ||
return false; | ||
}); | ||
}); | ||
} | ||
var QRCodeProps = { | ||
@@ -999,2 +1030,7 @@ value: { | ||
}, | ||
imageSettings: { | ||
type: Object, | ||
required: false, | ||
default: function () { return ({}); }, | ||
}, | ||
}; | ||
@@ -1007,3 +1043,3 @@ var QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: { | ||
} }); | ||
var QRCodeSvg = defineComponent({ | ||
var QrcodeSvg = defineComponent({ | ||
name: 'QRCodeSvg', | ||
@@ -1014,2 +1050,3 @@ props: QRCodeProps, | ||
var fgPath = ref(''); | ||
var imageProps; | ||
var generate = function () { | ||
@@ -1019,2 +1056,14 @@ var value = props.value, level = props.level, margin = props.margin; | ||
numCells.value = cells.length + margin * 2; | ||
if (props.imageSettings.src) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
} | ||
// Drawing strategy: instead of a rect per module, we're going to create a | ||
@@ -1042,10 +1091,12 @@ // single path for the dark modules and layer that on top of a light rect, | ||
h('path', { fill: props.foreground, d: fgPath.value }), | ||
props.imageSettings.src && h('image', __assign({ href: props.imageSettings.src }, imageProps)), | ||
]); }; | ||
}, | ||
}); | ||
var QRCodeCanvas = defineComponent({ | ||
var QrcodeCanvas = defineComponent({ | ||
name: 'QRCodeCanvas', | ||
props: QRCodeProps, | ||
setup: function (props) { | ||
setup: function (props, ctx) { | ||
var canvasEl = ref(null); | ||
var imageRef = ref(null); | ||
var generate = function () { | ||
@@ -1063,2 +1114,17 @@ var value = props.value, level = props.level, size = props.size, margin = props.margin, background = props.background, foreground = props.foreground; | ||
var numCells = cells.length + margin * 2; | ||
var image = imageRef.value; | ||
var imageProps = { x: 0, y: 0, width: 0, height: 0 }; | ||
var showImage = props.imageSettings.src && image != null && image.naturalWidth !== 0 && image.naturalHeight !== 0; | ||
if (showImage) { | ||
var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings); | ||
imageProps = { | ||
x: imageSettings.x + margin, | ||
y: imageSettings.y + margin, | ||
width: imageSettings.w, | ||
height: imageSettings.h, | ||
}; | ||
if (imageSettings.excavation) { | ||
cells = excavateModules(cells, imageSettings.excavation); | ||
} | ||
} | ||
var devicePixelRatio = window.devicePixelRatio || 1; | ||
@@ -1083,9 +1149,18 @@ var scale = (size / numCells) * devicePixelRatio; | ||
} | ||
if (showImage) { | ||
ctx.drawImage(image, imageProps.x, imageProps.y, imageProps.width, imageProps.height); | ||
} | ||
}; | ||
onMounted(generate); | ||
onUpdated(generate); | ||
return function () { return h('canvas', { | ||
ref: canvasEl, | ||
style: { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }, | ||
}); }; | ||
var style = ctx.attrs.style; | ||
return function () { return h(Fragment, [ | ||
h('canvas', __assign(__assign({}, ctx.attrs), { ref: canvasEl, style: __assign(__assign({}, style), { width: "".concat(props.size, "px"), height: "".concat(props.size, "px") }) })), | ||
props.imageSettings.src && h('img', { | ||
ref: imageRef, | ||
src: props.imageSettings.src, | ||
style: { display: 'none' }, | ||
onLoad: generate, | ||
}) | ||
]); }; | ||
}, | ||
@@ -1096,7 +1171,7 @@ }); | ||
render: function () { | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground; | ||
var _a = this.$props, renderAs = _a.renderAs, value = _a.value, _size = _a.size, _margin = _a.margin, _level = _a.level, background = _a.background, foreground = _a.foreground, imageSettings = _a.imageSettings; | ||
var size = _size >>> 0; | ||
var margin = _margin >>> 0; | ||
var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel; | ||
return h(renderAs === 'svg' ? QRCodeSvg : QRCodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground }); | ||
return h(renderAs === 'svg' ? QrcodeSvg : QrcodeCanvas, { value: value, size: size, margin: margin, level: level, background: background, foreground: foreground, imageSettings: imageSettings }); | ||
}, | ||
@@ -1106,2 +1181,2 @@ props: QRCodeVueProps, | ||
export { QrcodeVue as default }; | ||
export { QrcodeCanvas, QrcodeSvg, QrcodeVue as default }; |
{ | ||
"name": "qrcode.vue", | ||
"version": "3.4.1", | ||
"description": "A Vue.js component to generate QRCode.", | ||
"version": "3.5.0", | ||
"description": "A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3", | ||
"type": "module", | ||
@@ -21,3 +21,3 @@ "main": "./dist/qrcode.vue.cjs.js", | ||
"scripts": { | ||
"start": "webpack serve --config webpack.config.js --mode=development", | ||
"dev": "rsbuild dev", | ||
"build": "rollup -c" | ||
@@ -54,16 +54,9 @@ }, | ||
"devDependencies": { | ||
"@rollup/plugin-terser": "^0.4.3", | ||
"@vue/compiler-sfc": "^3.3.4", | ||
"@vue/server-renderer": "^3.3.4", | ||
"html-webpack-plugin": "^5.5.3", | ||
"rollup": "^3.25.3", | ||
"rollup-plugin-typescript2": "^0.35.0", | ||
"ts-loader": "^9.4.3", | ||
"typescript": "^5.1.3", | ||
"vue": "^3.3.4", | ||
"vue-loader": "^17.2.2", | ||
"webpack": "^5.88.0", | ||
"webpack-cli": "^5.1.4", | ||
"webpack-dev-server": "^4.15.1" | ||
"@rollup/plugin-terser": "^0.4.4", | ||
"@rsbuild/core": "^1.0.7", | ||
"rollup": "^4.22.4", | ||
"rollup-plugin-typescript2": "^0.36.0", | ||
"typescript": "^5.6.2", | ||
"vue": "^3.5.8" | ||
} | ||
} |
@@ -7,5 +7,4 @@ # qrcode.vue | ||
一款 Vue.js 二维码组件. | ||
一款 Vue.js 二维码组件,同时支持 Vue 2 和 Vue 3. | ||
[![Build Status](https://travis-ci.org/scopewu/qrcode.vue.svg?branch=master)](https://travis-ci.org/scopewu/qrcode.vue) | ||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/scopewu/qrcode.vue/blob/master/LICENSE) | ||
@@ -75,13 +74,32 @@ | ||
<template> | ||
<qrcode-vue :value="value" :level="level" :render-as="renderAs" /> | ||
<qrcode-vue | ||
:value="value" | ||
:level="level" | ||
:render-as="renderAs" | ||
:background="background" | ||
:foreground='foreground' | ||
:image-settings='imageSettings' | ||
/> | ||
</template> | ||
<script setup lang="ts"> | ||
import { ref } from 'vue' | ||
import QrcodeVue, { Level, RenderAs } from 'qrcode.vue' | ||
const value = ref<String>('qrcode') | ||
import QrcodeVue from 'qrcode.vue' | ||
import type { Level, RenderAs, ImageSettings } from 'qrcode.vue' | ||
const value = ref('qrcode') | ||
const level = ref<Level>('M') | ||
const renderAs = ref<RenderAs>('svg') | ||
const background = ref('#ffffff') | ||
const foreground = ref('#000000') | ||
const margin = ref(0) | ||
const imageSettings = ref<ImageSettings>({ | ||
src: 'https://github.com/scopewu.png', | ||
width: 30, | ||
height: 30, | ||
// x: 10, | ||
// y: 10, | ||
excavate: true, | ||
}) | ||
</script> | ||
``` | ||
@@ -106,3 +124,3 @@ ## Component props | ||
- 类型:`string('canvas' | 'svg')` | ||
- 类型:`RenderAs('canvas' | 'svg')` | ||
- 默认值:`canvas` | ||
@@ -121,4 +139,4 @@ | ||
- 类型:`string('L' | 'M' | 'Q' | 'H')` | ||
- 默认值:`H` | ||
- 类型:`Level('L' | 'M' | 'Q' | 'H')` | ||
- 默认值:`L` | ||
@@ -141,2 +159,23 @@ 二维码的容错能力等级,取值为 'L', 'M', 'Q', 'H' 之一。了解更多,[维基百科:QR_code](https://en.wikipedia.org/wiki/QR_code#Error_correction)。 | ||
### `image-settings` | ||
- 类型: `ImageSettings` | ||
- 默认值: `{}` | ||
```ts | ||
export type ImageSettings = { | ||
src: string, // 图片的地址。 | ||
x?: number, // 水平横向偏移。没有设定值时,图片剧中 | ||
y?: number, // 垂直竖向偏移。没有设定值时,图片剧中 | ||
height: number, // 图片的高度 | ||
width: number, // 图片的宽度 | ||
// 是否“挖掘”图像周围的模块。 | ||
// 这意味着嵌入图像重叠的任何模块都将使用背景颜色。 | ||
// 使用此选项可确保图像周围的边缘清晰。嵌入透明图像时也很有用。 | ||
excavate?: boolean, | ||
} | ||
``` | ||
二维码图片 logo 配置。 | ||
### `class` | ||
@@ -151,2 +190,2 @@ | ||
copyright © 2021 scopewu, license by [MIT](https://github.com/scopewu/qrcode.vue/blob/master/LICENSE) | ||
copyright © 2021 scopewu, license by [MIT](https://github.com/scopewu/qrcode.vue/blob/main/LICENSE) |
@@ -7,8 +7,7 @@ # qrcode.vue | ||
A Vue.js component to generate [QRCode](https://en.wikipedia.org/wiki/QR_code). | ||
A Vue.js component to generate [QRCode](https://en.wikipedia.org/wiki/QR_code). Both support Vue 2 and Vue 3. | ||
[![Build Status](https://travis-ci.org/scopewu/qrcode.vue.svg?branch=master)](https://travis-ci.org/scopewu/qrcode.vue) | ||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/scopewu/qrcode.vue/blob/master/LICENSE) | ||
[中文](./README-zh_cn.md) | ||
[中文](./README-zh_cn.md) | [日本語](./README-ja.md) | ||
@@ -54,6 +53,8 @@ ## install | ||
<template> | ||
<qrcode-vue :value="value" :size="size" level="H" /> | ||
<qrcode-vue :value="value" :size="size" level="H" render-as="svg" /> | ||
<qrcode-canvas :value="QRCODE.VUE 😄" :size="size" level="H" /> | ||
<qrcode-svg value="QRCODE.VUE 😄" level="H" /> | ||
</template> | ||
<script> | ||
import QrcodeVue from 'qrcode.vue' | ||
import QrcodeVue, { QrcodeCanvas, QrcodeSvg } from 'qrcode.vue' | ||
@@ -69,2 +70,4 @@ export default { | ||
QrcodeVue, | ||
QrcodeCanvas, | ||
QrcodeSvg, | ||
}, | ||
@@ -79,7 +82,15 @@ } | ||
<template> | ||
<qrcode-vue :value="value" :level="level" :render-as="renderAs" /> | ||
<qrcode-vue | ||
:value="value" | ||
:level="level" | ||
:render-as="renderAs" | ||
:background="background" | ||
:foreground='foreground' | ||
:image-settings='imageSettings' | ||
/> | ||
</template> | ||
<script setup lang="ts"> | ||
import { ref } from 'vue' | ||
import QrcodeVue, { Level, RenderAs } from 'qrcode.vue' | ||
import QrcodeVue from 'qrcode.vue' | ||
import type { Level, RenderAs, ImageSettings } from 'qrcode.vue' | ||
@@ -89,2 +100,13 @@ const value = ref('qrcode') | ||
const renderAs = ref<RenderAs>('svg') | ||
const background = ref('#ffffff') | ||
const foreground = ref('#000000') | ||
const margin = ref(0) | ||
const imageSettings = ref<ImageSettings>({ | ||
src: 'https://github.com/scopewu.png', | ||
width: 30, | ||
height: 30, | ||
// x: 10, | ||
// y: 10, | ||
excavate: true, | ||
}) | ||
</script> | ||
@@ -111,3 +133,3 @@ ``` | ||
- Type: `string('canvas' | 'svg')` | ||
- Type: `RenderAs('canvas' | 'svg')` | ||
- Default: `canvas` | ||
@@ -126,4 +148,4 @@ | ||
- Type: `string('L' | 'M' | 'Q' | 'H')` | ||
- Default: `H` | ||
- Type: `Level('L' | 'M' | 'Q' | 'H')` | ||
- Default: `L` | ||
@@ -146,2 +168,20 @@ qrcode Error correction level (one of 'L', 'M', 'Q', 'H'). Know more, [wikipedia: QR_code](https://en.wikipedia.org/wiki/QR_code#Error_correction). | ||
### `image-settings` | ||
- Type: `ImageSettings` | ||
- Default: `{}` | ||
```ts | ||
export type ImageSettings = { | ||
src: string, // The URL of image. | ||
x?: number, // The horizontal offset. When not specified, will center the image. | ||
y?: number, // The vertical offset. When not specified, will center the image. | ||
height: number, // The height of image | ||
width: number, // The height of image | ||
excavate?: boolean, // Whether or not to "excavate" the modules around the image. | ||
} | ||
``` | ||
The settings to support qrcode image logo. | ||
### `class` | ||
@@ -156,2 +196,2 @@ | ||
copyright © 2021 @scopewu, license by [MIT](https://github.com/scopewu/qrcode.vue/blob/master/LICENSE) | ||
copyright © 2021 @scopewu, license by [MIT](https://github.com/scopewu/qrcode.vue/blob/main/LICENSE) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
221603
6
12
3908
189