Javascript Epson label printer emulator

Date: 2017-05-03
const repeat = (char, length) => Array(length + 1).join(char);
// padleft
function ljust(string, width, padding = " ") {
	padding = padding.slice(0, 1);
	if (string.length < width)
		return string + repeat(padding, width - string.length);
	else
		return string;
}
// padright
function rjust(string, width, padding = " ") {
	padding = padding.slice(0, 1);
	if (string.length < width)
		return repeat(padding, width - string.length) + string;
	else
		return string;
}
// padcenter
function center(string, width, padding = " ") {
	padding = padding.slice(0, 1);
	if (string.length < width) {
		const len = width - string.length;
		const remain = (len % 2 == 0) ? "" : padding;
		const pads = repeat(padding, parseInt(len / 2));
		return pads + string + pads + remain;
	} else
		return string;
}
const ALIGN = {
	LEFT: 0,
	CENTER: 1,
	RIGHT: 2
};
const mergeLine = (line, newLineData) => {
	let newStr = "";
	for (let i = 0; i < newLineData.length; i += 1) {
		if (newLineData[i] != ' ') {
			newStr += newLineData[i] || ' ';
		} else {
			newStr += line[i] || ' ';
		}
	}
	return newStr;
};
const emulatePrintBon = printerCommands => {
	// printer character width
	const bonCharWidth = 42;
	// remove newline characters
	const printerText = printerCommands.replace('\r', ' ').replace('\n', ' ');
	// split on new line command
	const commands = printerText.split('\x1B|N');
	// regex om op printer commando te splitten
	const regExCmd = /\x1B\|?([a-z0-9]*)([^\x1B]*)/gi;
	const output = [];
	let line = null;
	// loop langs de printer regels
	for (let i = 0; i < commands.length; i += 1) {
		const command = commands[i];
		// add current line to output
		if (line) {
			output.push(line);
		}
		// and start with a new empty line
		line = repeat(' ', bonCharWidth);
		// reset command options
		let align = ALIGN.LEFT;
		let bold = false;
		// loop langs alle commando's
		while (match = regExCmd.exec(command)) {
			const cmd = match[1];
			const text = (`${match[2]}`).trim();
			if (cmd) {
				switch (cmd) {
					case 'lA':
						align = ALIGN.LEFT;
						break;
					case 'rA':
						align = ALIGN.RIGHT;
						break;
					case 'cA':
						align = ALIGN.CENTER;
						break;
					case '1B': // begin bon?
						break;
					case 'fP': // fP (einde bon of knip bon?)
						break;
					case '2C': //?
						break;
					case 'bC':
						bold = true;
						break;
				}
			}
			if (text != '') {
				let newLinePart = '';
				if (align === ALIGN.CENTER) {
					newLinePart = center(text, bonCharWidth);
				} else if (align === ALIGN.RIGHT) {
					newLinePart = rjust(text, bonCharWidth);
				} else {
					newLinePart = ljust(text, bonCharWidth);
				}
				line = mergeLine(line, newLinePart)
			}
		}
	}
	if (line) {
		output.push(line); // push last line
	}
	console.log(output.join('\n'));
	//return output;
};
const generateTestBon = () => {
	const filiaaladres = 'Street';
	const filiaalpostcode = '1234AB';
	const filiaalplaats = 'Rotterdam';
	const filiaaltelnr = '123-4567890';
	const filiaalemail = 'test@test.com';
	const input = [ 
		'\x1B' + '|1B',
		'\x1B' + '|lA ' + 'li' + '\n',
		`\x1B|cA ${filiaaladres}\n`,
		'\x1B' + '|rA ' + 're' + '\n',
		`\x1B|N\x1B|cA ${filiaalpostcode} ${filiaalplaats}\n`,
		`\x1B|N\x1B|cA Tel:${filiaaltelnr} ${filiaalemail}\n\n`
	];
	// const tmp = CCPrinterInfo.split("#");
	//
	// for( var i = 0; i < tmp.length; i++) {
	//  if( i == 0 ){
	//      input.push('\x1B' +'__________________________________________\n');
	//  } else {
	//      if( (tmp[i] != '') && (tmp[i].search("----") == -1 ) ) 
	//          input.push('\x1B'+'|N'+tmp[i]+'\n');
	//  }
	// }
	//
	// if( tmp.length == 1 ) {
	//  input.push('\x1B' +'Bon niet beschikbaar!\n');
	// }
	input.push('\x1B' + '__________________________________________\n');
	input.push('\x1B' + '|fP');
	return input.join('');
};

emulatePrintBon(generateTestBon());

Output:

li                Street                re
             1234AB Rotterdam             
__________________________________________
7360cookie-checkJavascript Epson label printer emulator