@akamfoad/qr
Version:
Fully typed QRCode encoding implementation in JavaScript with no dependencies!
302 lines (251 loc) • 6.38 kB
text/typescript
import { ErrorCorrectLevel } from './ErrorCorrectLevel';
export default class QRRSBlock {
totalCount: number;
dataCount: number;
constructor(totalCount: number, dataCount: number) {
this.totalCount = totalCount;
this.dataCount = dataCount;
}
static RS_BLOCK_TABLE = [
// L
// M
// Q
// H
// 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
[],
[],
[],
[],
];
static getRSBlocks(typeNumber: number, errorCorrectLevel: number) {
const rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
if (rsBlock == undefined) {
throw new Error(
'bad rs block @ typeNumber:' +
typeNumber +
'/errorCorrectLevel:' +
errorCorrectLevel,
);
}
const length = rsBlock.length / 3;
const list = [];
for (let i = 0; i < length; i++) {
const count = rsBlock[i * 3 + 0];
const totalCount = rsBlock[i * 3 + 1];
const dataCount = rsBlock[i * 3 + 2];
for (let j = 0; j < count; j++) {
list.push(new QRRSBlock(totalCount, dataCount));
}
}
return list;
}
static getRsBlockTable(typeNumber: number, errorCorrectLevel: number) {
switch (errorCorrectLevel) {
case ErrorCorrectLevel.L:
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
case ErrorCorrectLevel.M:
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
case ErrorCorrectLevel.Q:
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
case ErrorCorrectLevel.H:
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
default:
return undefined;
}
}
}