All files / src/modes mode-utils.util.js

100% Statements 43/43
100% Branches 16/16
100% Functions 2/2
100% Lines 43/43

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 441x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 13x 2x 2x 13x 3x 3x 13x 13x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 179x 1x 1x 179x 1x 1x 177x 179x 179x 1x  
import { QrNumber } from './number.mode.js'
import { QrAlphaNum } from './alphanum.mode.js'
import { getValidQrKanjiOrNull } from './kanji.mode.js'
import { Qr8BitByte } from './byte.mode.js'
 
/**
 * Create QR code Kanji mode object
 * @param {string} data - data of mode object
 * @returns {import('./mode-bits.constants.js').ModeObject} get best matching mode
 */
export function getBestMode (data) {
  if (/^\d+$/.test(data)) {
    return QrNumber(data)
  }
  if (/^[0-9A-Z $%*+-./:]+$/.test(data)) {
    return QrAlphaNum(data)
  }
  return getValidQrKanjiOrNull(data) ?? Qr8BitByte(data)
}
 
const LENGTH_BITS_MATRIX = Object.freeze([
  10, 12, 14, // MODE_NUMBER
  9, 11, 13, // MODE_ALPHA_NUM
  8, 16, 16, // MODE_8BIT_BYTE
  8, 10, 12, // MODE_KANJI
])
 
/**
 * @param {number} mode - mode value
 * @param {number} version - qr version
 * @returns {number} the number of bits in character count indicator
 */
export function getCharCountBitLength (mode, version) {
  if (!(version >= 1 && version < 41)) {
    throw Error(`invalid version: ${version}`)
  }
  if (mode < 1 || mode > 8 || (mode & (mode - 1))) {
    throw Error(`invalid mode: ${mode}`)
  }
  const modeIndex = 31 - Math.clz32(mode)
  const bitsIndex = version > 26 ? 2 : version > 9 ? 1 : 0
  return LENGTH_BITS_MATRIX[modeIndex * 3 + bitsIndex]
};