123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import Barcode from "../Barcode.js";
- import { SHIFT, SET_A, SET_B, MODULO, STOP, FNC1, SET_BY_CODE, SWAP, BARS } from './constants';
- // This is the master class,
- // it does require the start code to be included in the string
- class CODE128 extends Barcode {
- constructor(data, options) {
- super(data.substring(1), options);
- // Get array of ascii codes from data
- this.bytes = data.split('')
- .map(char => char.charCodeAt(0));
- }
- valid() {
- // ASCII value ranges 0-127, 200-211
- return /^[\x00-\x7F\xC8-\xD3]+$/.test(this.data);
- }
- // The public encoding function
- encode() {
- const bytes = this.bytes;
- // Remove the start code from the bytes and set its index
- const startIndex = bytes.shift() - 105;
- // Get start set by index
- const startSet = SET_BY_CODE[startIndex];
- if (startSet === undefined) {
- throw new RangeError('The encoding does not start with a start character.');
- }
- if (this.shouldEncodeAsEan128() === true) {
- bytes.unshift(FNC1);
- }
- // Start encode with the right type
- const encodingResult = CODE128.next(bytes, 1, startSet);
- return {
- text:
- this.text === this.data
- ? this.text.replace(/[^\x20-\x7E]/g, '')
- : this.text,
- data:
- // Add the start bits
- CODE128.getBar(startIndex) +
- // Add the encoded bits
- encodingResult.result +
- // Add the checksum
- CODE128.getBar((encodingResult.checksum + startIndex) % MODULO) +
- // Add the end bits
- CODE128.getBar(STOP)
- };
- }
- // GS1-128/EAN-128
- shouldEncodeAsEan128() {
- let isEAN128 = this.options.ean128 || false;
- if (typeof isEAN128 === 'string') {
- isEAN128 = isEAN128.toLowerCase() === 'true';
- }
- return isEAN128;
- }
- // Get a bar symbol by index
- static getBar(index) {
- return BARS[index] ? BARS[index].toString() : '';
- }
- // Correct an index by a set and shift it from the bytes array
- static correctIndex(bytes, set) {
- if (set === SET_A) {
- const charCode = bytes.shift();
- return charCode < 32 ? charCode + 64 : charCode - 32;
- } else if (set === SET_B) {
- return bytes.shift() - 32;
- } else {
- return (bytes.shift() - 48) * 10 + bytes.shift() - 48;
- }
- }
- static next(bytes, pos, set) {
- if (!bytes.length) {
- return { result: '', checksum: 0 };
- }
- let nextCode, index;
- // Special characters
- if (bytes[0] >= 200){
- index = bytes.shift() - 105;
- const nextSet = SWAP[index];
- // Swap to other set
- if (nextSet !== undefined) {
- nextCode = CODE128.next(bytes, pos + 1, nextSet);
- }
- // Continue on current set but encode a special character
- else {
- // Shift
- if ((set === SET_A || set === SET_B) && index === SHIFT) {
- // Convert the next character so that is encoded correctly
- bytes[0] = (set === SET_A)
- ? bytes[0] > 95 ? bytes[0] - 96 : bytes[0]
- : bytes[0] < 32 ? bytes[0] + 96 : bytes[0];
- }
- nextCode = CODE128.next(bytes, pos + 1, set);
- }
- }
- // Continue encoding
- else {
- index = CODE128.correctIndex(bytes, set);
- nextCode = CODE128.next(bytes, pos + 1, set);
- }
- // Get the correct binary encoding and calculate the weight
- const enc = CODE128.getBar(index);
- const weight = index * pos;
- return {
- result: enc + nextCode.result,
- checksum: weight + nextCode.checksum
- };
- }
- }
- export default CODE128;
|