UNPKG

@nuintun/qrcode

Version:

A pure JavaScript QRCode encode and decode library.

78 lines (73 loc) 2.26 kB
/** * @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 */ 'use strict'; 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;