awesome-qr
Advanced tools
Comparing version 2.0.0-rc.3 to 2.0.1-beta.0
@@ -30,2 +30,24 @@ /// <reference types="node" /> | ||
/** | ||
* **This is an advanced option.** | ||
* | ||
* Specify the mask pattern to be used in QR code encoding. | ||
* | ||
* Accepts a value provided by _QRMaskPattern_. | ||
* | ||
* To find out all eight mask patterns, please refer to [https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg](https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg) | ||
* | ||
* For more information, please refer to [https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking](https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking). | ||
*/ | ||
maskPattern?: number; | ||
/** | ||
* **This is an advanced option.** | ||
* | ||
* Specify the version to be used in QR code encoding. | ||
* | ||
* Accepts an integer in range [1, 40]. | ||
* | ||
* For more information, please refer to [https://www.qrcode.com/en/about/version.html](https://www.qrcode.com/en/about/version.html). | ||
*/ | ||
version?: number; | ||
/** | ||
* Color of the blocks on the QR code. | ||
@@ -32,0 +54,0 @@ * |
@@ -63,2 +63,8 @@ "use strict"; | ||
this.qrCode = new qrcode_1.QRCodeModel(-1, this.options.correctLevel); | ||
if (Number.isInteger(this.options.maskPattern)) { | ||
this.qrCode.maskPattern = this.options.maskPattern; | ||
} | ||
if (Number.isInteger(this.options.version)) { | ||
this.qrCode.typeNumber = this.options.version; | ||
} | ||
this.qrCode.addData(this.options.text); | ||
@@ -65,0 +71,0 @@ this.qrCode.make(); |
@@ -16,2 +16,3 @@ declare class QR8bitByte { | ||
dataList: QR8bitByte[]; | ||
maskPattern?: number; | ||
constructor(typeNumber?: number, errorCorrectLevel?: number); | ||
@@ -41,2 +42,12 @@ addData(data: string): void; | ||
}; | ||
export declare const QRMaskPattern: { | ||
PATTERN000: number; | ||
PATTERN001: number; | ||
PATTERN010: number; | ||
PATTERN011: number; | ||
PATTERN100: number; | ||
PATTERN101: number; | ||
PATTERN110: number; | ||
PATTERN111: number; | ||
}; | ||
export declare class QRUtil { | ||
@@ -43,0 +54,0 @@ static PATTERN_POSITION_TABLE: number[][]; |
@@ -19,3 +19,23 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.QRMath = exports.QRUtil = exports.QRErrorCorrectLevel = exports.QRCodeModel = void 0; | ||
exports.QRMath = exports.QRUtil = exports.QRMaskPattern = exports.QRErrorCorrectLevel = exports.QRCodeModel = void 0; | ||
function checkQRVersion(version, sText, nCorrectLevel) { | ||
var length = _getUTF8Length(sText); | ||
var i = version - 1; | ||
var nLimit = 0; | ||
switch (nCorrectLevel) { | ||
case exports.QRErrorCorrectLevel.L: | ||
nLimit = QRCodeLimitLength[i][0]; | ||
break; | ||
case exports.QRErrorCorrectLevel.M: | ||
nLimit = QRCodeLimitLength[i][1]; | ||
break; | ||
case exports.QRErrorCorrectLevel.Q: | ||
nLimit = QRCodeLimitLength[i][2]; | ||
break; | ||
case exports.QRErrorCorrectLevel.H: | ||
nLimit = QRCodeLimitLength[i][3]; | ||
break; | ||
} | ||
return length <= nLimit; | ||
} | ||
function _getTypeNumber(sText, nCorrectLevel) { | ||
@@ -120,2 +140,10 @@ var nType = 1; | ||
} | ||
else if (this.typeNumber > 40) { | ||
throw new Error("Invalid QR version: " + this.typeNumber); | ||
} | ||
else { | ||
if (!checkQRVersion(this.typeNumber, data, this.errorCorrectLevel)) { | ||
throw new Error("Data is too long for QR version: " + this.typeNumber); | ||
} | ||
} | ||
var newData = new QR8bitByte(data); | ||
@@ -179,2 +207,5 @@ this.dataList.push(newData); | ||
QRCodeModel.prototype.getBestMaskPattern = function () { | ||
if (Number.isInteger(this.maskPattern) && Object.values(exports.QRMaskPattern).includes(this.maskPattern)) { | ||
return this.maskPattern; | ||
} | ||
var minLostPoint = 0; | ||
@@ -392,3 +423,3 @@ var pattern = 0; | ||
var QRMode = { MODE_NUMBER: 1 << 0, MODE_ALPHA_NUM: 1 << 1, MODE_8BIT_BYTE: 1 << 2, MODE_KANJI: 1 << 3 }; | ||
var QRMaskPattern = { | ||
exports.QRMaskPattern = { | ||
PATTERN000: 0, | ||
@@ -433,17 +464,17 @@ PATTERN001: 1, | ||
switch (maskPattern) { | ||
case QRMaskPattern.PATTERN000: | ||
case exports.QRMaskPattern.PATTERN000: | ||
return (i + j) % 2 == 0; | ||
case QRMaskPattern.PATTERN001: | ||
case exports.QRMaskPattern.PATTERN001: | ||
return i % 2 == 0; | ||
case QRMaskPattern.PATTERN010: | ||
case exports.QRMaskPattern.PATTERN010: | ||
return j % 3 == 0; | ||
case QRMaskPattern.PATTERN011: | ||
case exports.QRMaskPattern.PATTERN011: | ||
return (i + j) % 3 == 0; | ||
case QRMaskPattern.PATTERN100: | ||
case exports.QRMaskPattern.PATTERN100: | ||
return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; | ||
case QRMaskPattern.PATTERN101: | ||
case exports.QRMaskPattern.PATTERN101: | ||
return ((i * j) % 2) + ((i * j) % 3) == 0; | ||
case QRMaskPattern.PATTERN110: | ||
case exports.QRMaskPattern.PATTERN110: | ||
return (((i * j) % 2) + ((i * j) % 3)) % 2 == 0; | ||
case QRMaskPattern.PATTERN111: | ||
case exports.QRMaskPattern.PATTERN111: | ||
return (((i * j) % 3) + ((i + j) % 2)) % 2 == 0; | ||
@@ -450,0 +481,0 @@ default: |
{ | ||
"name": "awesome-qr", | ||
"version": "2.0.0-rc.3", | ||
"version": "2.0.1-beta.0", | ||
"description": "An awesome but simple QR code generator written in JavaScript.", | ||
@@ -5,0 +5,0 @@ "main": "./lib/index.js", |
@@ -22,3 +22,2 @@ # Awesome-qr.js <!-- omit in toc --> | ||
- [Getting Started](#getting-started) | ||
- [React](#react) | ||
- [Node.js](#nodejs) | ||
@@ -31,2 +30,4 @@ - [Browsers](#browsers) | ||
- [correctLevel](#correctlevel) | ||
- [maskPattern](#maskpattern) | ||
- [version](#version) | ||
- [colorDark](#colordark) | ||
@@ -53,6 +54,2 @@ - [colorLight](#colorlight) | ||
### React | ||
Please use [react-awesome-qr](https://github.com/AwesomeQR/react-awesome-qr). | ||
### Node.js | ||
@@ -92,2 +89,4 @@ | ||
> ⚛️ If you're using React, please use [react-awesome-qr](https://github.com/AwesomeQR/react-awesome-qr). | ||
```html | ||
@@ -126,5 +125,5 @@ <!-- import to the global scope --> | ||
margin?: number; | ||
typeNumber?: number; | ||
correctLevel?: number; | ||
dotScale?: number; | ||
maskPattern?: number; | ||
version?: number; | ||
colorDark?: string; | ||
@@ -137,2 +136,3 @@ colorLight?: string; | ||
whiteMargin?: boolean; | ||
dotScale?: number; | ||
logoImage?: string | Buffer; | ||
@@ -170,3 +170,35 @@ logoScale?: number; | ||
Error correction level of the QR code. | ||
### maskPattern | ||
`number?, continue reading to learn more` | ||
**This is an advanced option.** | ||
Leave untouched to let the code decide which mask pattern to use. | ||
Specify the mask pattern to be used in QR code encoding. | ||
Accepts a value provided by _QRMaskPattern_. | ||
> To find out all eight mask patterns, please refer to [Wikipedia File:QR_Code_Mask_Patterns.svg](https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg) | ||
> For more information, please refer to [Reed–Solomon codes for coders: Masking](https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking). | ||
### version | ||
`number?, continue reading to learn more` | ||
**This is an advanced option.** | ||
Leave untouched to let the code decide which version to use. | ||
Specify the version to be used in QR code encoding. | ||
Accepts an integer in range [1, 40]. | ||
**⚠️ An error might occurs if the specified version does not have enough space for the input data.** | ||
> For more information, please refer to [Information capacity and versions of QR Code | QRcode.com | DENSO WAVE](https://www.qrcode.com/en/about/version.html). | ||
### colorDark | ||
@@ -173,0 +205,0 @@ |
@@ -38,2 +38,26 @@ import { Canvas, CanvasRenderingContext2D, createCanvas, Image, loadImage } from "canvas"; | ||
/** | ||
* **This is an advanced option.** | ||
* | ||
* Specify the mask pattern to be used in QR code encoding. | ||
* | ||
* Accepts a value provided by _QRMaskPattern_. | ||
* | ||
* To find out all eight mask patterns, please refer to [https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg](https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg) | ||
* | ||
* For more information, please refer to [https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking](https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking). | ||
*/ | ||
maskPattern?: number; | ||
/** | ||
* **This is an advanced option.** | ||
* | ||
* Specify the version to be used in QR code encoding. | ||
* | ||
* Accepts an integer in range [1, 40]. | ||
* | ||
* For more information, please refer to [https://www.qrcode.com/en/about/version.html](https://www.qrcode.com/en/about/version.html). | ||
*/ | ||
version?: number; | ||
/** | ||
* Color of the blocks on the QR code. | ||
@@ -184,2 +208,8 @@ * | ||
this.qrCode = new QRCodeModel(-1, this.options.correctLevel!); | ||
if (Number.isInteger(this.options.maskPattern)) { | ||
this.qrCode.maskPattern = this.options.maskPattern!; | ||
} | ||
if (Number.isInteger(this.options.version)) { | ||
this.qrCode.typeNumber = this.options.version!; | ||
} | ||
this.qrCode.addData(this.options.text); | ||
@@ -186,0 +216,0 @@ this.qrCode.make(); |
@@ -18,2 +18,25 @@ //--------------------------------------------------------------------- | ||
function checkQRVersion(version: number, sText: string, nCorrectLevel: number) { | ||
const length = _getUTF8Length(sText); | ||
const i = version - 1; | ||
let nLimit = 0; | ||
switch (nCorrectLevel) { | ||
case QRErrorCorrectLevel.L: | ||
nLimit = QRCodeLimitLength[i][0]; | ||
break; | ||
case QRErrorCorrectLevel.M: | ||
nLimit = QRCodeLimitLength[i][1]; | ||
break; | ||
case QRErrorCorrectLevel.Q: | ||
nLimit = QRCodeLimitLength[i][2]; | ||
break; | ||
case QRErrorCorrectLevel.H: | ||
nLimit = QRCodeLimitLength[i][3]; | ||
break; | ||
} | ||
return length <= nLimit; | ||
} | ||
function _getTypeNumber(sText: string, nCorrectLevel: number) { | ||
@@ -123,2 +146,4 @@ var nType = 1; | ||
maskPattern?: number; | ||
constructor(typeNumber = -1, errorCorrectLevel = QRErrorCorrectLevel.L) { | ||
@@ -134,2 +159,8 @@ this.typeNumber = typeNumber; | ||
this.typeNumber = _getTypeNumber(data, this.errorCorrectLevel); | ||
} else if (this.typeNumber > 40) { | ||
throw new Error(`Invalid QR version: ${this.typeNumber}`); | ||
} else { | ||
if (!checkQRVersion(this.typeNumber, data, this.errorCorrectLevel)) { | ||
throw new Error(`Data is too long for QR version: ${this.typeNumber}`); | ||
} | ||
} | ||
@@ -151,2 +182,3 @@ const newData = new QR8bitByte(data); | ||
} | ||
make() { | ||
@@ -199,2 +231,6 @@ this.makeImpl(false, this.getBestMaskPattern()); | ||
getBestMaskPattern() { | ||
if (Number.isInteger(this.maskPattern) && Object.values(QRMaskPattern).includes(this.maskPattern!)) { | ||
return this.maskPattern!; | ||
} | ||
let minLostPoint = 0; | ||
@@ -413,3 +449,3 @@ let pattern = 0; | ||
const QRMode = { MODE_NUMBER: 1 << 0, MODE_ALPHA_NUM: 1 << 1, MODE_8BIT_BYTE: 1 << 2, MODE_KANJI: 1 << 3 }; | ||
const QRMaskPattern = { | ||
export const QRMaskPattern = { | ||
PATTERN000: 0, | ||
@@ -416,0 +452,0 @@ PATTERN001: 1, |
Sorry, the diff of this file is too big to display
16594119
6952
364