#!/usr/bin/env node /* js-codepage (C) 2014-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2 ft=javascript: */ /* eslint-env node */ var codepage = require('codepage'); require('exit-on-epipe'); var fs = require('fs'), program/*:any*/ = (require('commander')/*:any*/); function run() { program .version(codepage.version) .usage('[options] ') .option('-f, --from-code ', 'codepage of input (default 65001 utf8)') .option('-t, --to-code ', 'codepage of output (default 65001 utf8)') .option('-o, --output ', 'output file (. if specified)') .option('-B, --bom', 'write BOM (for unicode codepages)') .option('-F, --force', 'force writing to stdout for non-utf8 codepages') .option('-l, --list', 'List supported codepages'); program.on('--help', function () { console.log(' Codepage descriptions can be found in the README'); console.log(' http://oss.sheetjs.com/js-codepage/README.md'); console.log(' Support email: dev.codepage@sheetjs.com'); }); program.parse(process.argv); if (program.list) { var l/*:Array*/ = []; Object.keys(codepage).forEach(function (x) { if (parseInt(x, 10) == +x) l.push(+x); }); Object.keys(codepage.utils.magic).forEach(function (x) { if (parseInt(x, 10) == +x && +x != 16969) l.push(+x); }); l.sort(function (a, b) { return a - b; }).forEach(function (x) { console.log(x); }); process.exit(); } var fr = +program.fromCode || 65001; var to = +program.toCode || 65001; var f = program.args[0]; var o = program.output; if (!process.stdin.isTTY) f = f || "-"; if (f !== "-" && !fs.existsSync(f)) { console.error('codepage: must specify a filename'); process.exit(13); } function concat(func) { // $FlowIgnore var writable = require('stream').Writable(); var buf = []; writable._write = function (chunk, e, cb) { buf.push(chunk); cb(); }; writable._writev = function (chunks, cb) { chunks.forEach(function (c) { buf.push(c.chunk); cb(); }); }; writable.on('finish', function () { func(Buffer.concat(buf)); }); return writable; } if (f === "-") process.stdin.pipe(concat(process_text)); else process_text(fs.readFileSync(f)); function process_text(text/*:Buffer*/) { var dec/*:Buffer*/ = (codepage.utils.decode(fr, text)/*:any*/); var bom/*:Array*/ = []; bom[1200] = new Buffer([0xFF, 0xFE]); bom[1201] = new Buffer([0xFE, 0xFF]); bom[12000] = new Buffer([0xFF, 0xFE, 0x00, 0x00]); bom[12001] = new Buffer([0x00, 0x00, 0xFE, 0xFF]); bom[16969] = new Buffer([0x69, 0x69]); bom[65000] = new Buffer([0x2B, 0x2F, 0x76, 0x2B]); bom[65001] = new Buffer([0xEF, 0xBB, 0xBF]); var mybom = (program.bom && bom[to] ? bom[to] : ""); var out/*:any*/ = to === 65001 ? dec.toString('utf8') : codepage.utils.encode(to, dec); /* if output file is specified */ if (o) writefile(o, out, mybom); /* utf8 -> print to stdout */ else if (to === 65001) logit(out, mybom); /* stdout piped to process -> print */ else if (!process.stdout.isTTY) logit(out, mybom); /* forced */ else if (program.force) logit(out, mybom); /* input file specified -> write to file */ else if (f !== "-") writefile(f + "." + to, out, mybom); else { console.error('codepage: use force (-F, --force) to print ' + to + ' codes'); process.exit(14); } } function logit(out/*:Buffer*/, bom) { process.stdout.write(bom); process.stdout.write(out); } function writefile(o, out/*:Buffer*/, bom) { fs.writeFileSync(o, bom); fs.appendFileSync(o, out); } } module.exports = run;