@nuintun/qrcode
Version:
A pure JavaScript QRCode encode and decode library.
78 lines (73 loc) • 2.26 kB
JavaScript
/**
* @module QRCode
* @package @nuintun/qrcode
* @license MIT
* @version 5.0.2
* @author nuintun <nuintun@qq.com>
* @description A pure JavaScript QRCode encode and decode library.
* @see https://github.com/nuintun/qrcode#readme
*/
;
const Decoded = require('./Decoded.cjs');
const source = require('./utils/source.cjs');
const BitMatrixParser = require('./BitMatrixParser.cjs');
const decoder = require('./utils/decoder.cjs');
const index = require('../common/encoding/index.cjs');
/**
* @module Decoder
*/
function parse(parser, version, { mask, level }) {
let offset = 0;
let corrected = 0;
parser.unmask(mask);
const ecBlocks = version.getECBlocks(level);
const codewords = parser.readCodewords(version, level);
const blocks = decoder.getDataBlocks(codewords, version, level);
const buffer = new Uint8Array(ecBlocks.numTotalDataCodewords);
for (const { codewords, numDataCodewords } of blocks) {
const [bytes, errors] = decoder.correctErrors(codewords, numDataCodewords);
buffer.set(bytes.subarray(0, numDataCodewords), offset);
corrected += errors;
offset += numDataCodewords;
}
return [buffer, corrected];
}
class Decoder {
#decode;
/**
* @constructor
* @param options The options of decoder.
*/
constructor({ decode = index.decode } = {}) {
this.#decode = decode;
}
/**
* @method decode
* @description Decode the qrcode matrix.
* @param matrix The qrcode matrix.
*/
decode(matrix) {
let corrected = 0;
let mirror = false;
let version;
let codewords;
let formatInfo;
const parser = new BitMatrixParser.BitMatrixParser(matrix);
try {
version = parser.readVersion();
formatInfo = parser.readFormatInfo();
[codewords, corrected] = parse(parser, version, formatInfo);
} catch {
if (formatInfo != null) {
parser.remask(formatInfo.mask);
}
parser.mirror();
mirror = true;
version = parser.readVersion();
formatInfo = parser.readFormatInfo();
[codewords, corrected] = parse(parser, version, formatInfo);
}
return new Decoded.Decoded(source.decode(codewords, version, this.#decode), version, formatInfo, corrected, mirror);
}
}
exports.Decoder = Decoder;