pet/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93.js

74 lines
1.6 KiB
JavaScript

// Encoding documentation:
// https://en.wikipedia.org/wiki/Code_93#Detailed_outline
import { SYMBOLS, BINARIES, MULTI_SYMBOLS } from './constants';
import Barcode from "../Barcode.js";
class CODE93 extends Barcode {
constructor(data, options){
super(data, options);
}
valid(){
return /^[0-9A-Z\-. $/+%]+$/.test(this.data);
}
encode(){
const symbols = this.data
.split('')
.flatMap(c => MULTI_SYMBOLS[c] || c);
const encoded = symbols
.map(s => CODE93.getEncoding(s))
.join('');
// Compute checksum symbols
const csumC = CODE93.checksum(symbols, 20);
const csumK = CODE93.checksum(symbols.concat(csumC), 15);
return {
text: this.text,
data:
// Add the start bits
CODE93.getEncoding('\xff') +
// Add the encoded bits
encoded +
// Add the checksum
CODE93.getEncoding(csumC) + CODE93.getEncoding(csumK) +
// Add the stop bits
CODE93.getEncoding('\xff') +
// Add the termination bit
'1'
};
}
// Get the binary encoding of a symbol
static getEncoding(symbol) {
return BINARIES[CODE93.symbolValue(symbol)];
}
// Get the symbol for a symbol value
static getSymbol(symbolValue) {
return SYMBOLS[symbolValue];
}
// Get the symbol value of a symbol
static symbolValue(symbol) {
return SYMBOLS.indexOf(symbol);
}
// Calculate a checksum symbol
static checksum(symbols, maxWeight) {
const csum = symbols
.slice()
.reverse()
.reduce((sum, symbol, idx) => {
const weight = (idx % maxWeight) + 1;
return sum + (CODE93.symbolValue(symbol) * weight);
}, 0);
return CODE93.getSymbol(csum % 47);
}
}
export default CODE93;