Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 4x 4x 4x 10x 10x 4x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 1x 1x 1x | import { MODE_NUMBER } from './mode-bits.constants.js' /** * Create QR code numeric mode object * @param {string} data - data of mode object * @returns {import('./mode-bits.constants.js').ModeObject} created mode object */ export const QrNumber = (data) => Object.freeze({ data, mode: MODE_NUMBER, length: data.length, write: writeDataToBitBuffer.bind(null, data), }) /** * Writes numeric data to bit buffer that will be used to generate the QR code * @param {string} data - QrNumber mode object data * @param {import("./../utils/qr-bit-buffer.js").QrBitBuffer} buffer - target bit buffer */ function writeDataToBitBuffer (data, buffer) { let i = 0 const { length } = data while (i + 2 < length) { buffer.put(strToNum(data.slice(i, i + 3)), 10) i += 3 } if (i < length) { if (length - i === 1) { buffer.put(strToNum(data.slice(i, i + 1)), 4) } else if (length - i === 2) { buffer.put(strToNum(data.slice(i, i + 2)), 7) } } } /** * @param {string} s - target string * @returns {number} `s` as number */ function strToNum (s) { let num = 0 for (let i = 0, e = s.length; i < e; i++) { num = num * 10 + charToNum(s.charAt(i)) } return num }; /** * * @param {string} c - target character * @returns {number} `c` as number */ function charToNum (c) { if (c >= '0' && c <= '9') { return /** @type {number} */(c.codePointAt(0)) - zeroCodePoint } throw new Error(`illegal char: ${c}`) }; const zeroCodePoint = /** @type {number} */('0'.codePointAt(0)) |