starter-kit/po/po2json
Martin Pitt c7f610f489 Fix po2json usage help
The output file is an option, not a positional argument.

`opts.args` is undefined if there are no positional arguments, so that
just calling `po/po2json` crashed with

    TypeError: Cannot read property 'length' of undefined
2021-01-04 14:01:59 +01:00

127 lines
3.3 KiB
JavaScript
Executable file

#!/usr/bin/env node
function fatal(message, code) {
console.log((filename || "html2po") + ": " + message);
process.exit(code || 1);
}
function usage() {
console.log("usage: po2json [--module=template.js] [--output=output.js] input");
process.exit(2);
}
var fs, po2json, Jed, stdio;
try {
fs = require('fs');
po2json = require('po2json');
Jed = require('jed');
stdio = require('stdio');
} catch(ex) {
fatal(ex.message, 127); /* missing looks for this */
}
var argi = 2;
var filename = null;
var opts = stdio.getopt({
module: { key: "m", args: 1, description: "Module template to include", default: "" },
output: { key: "o", args: 1, description: "Output file", default: "" },
});
if (!opts.args || opts.args.length != 1) {
usage();
}
parse();
function prepareHeader(header) {
var body, statement, plurals = header["plural-forms"], ret = null;
if (plurals) {
try {
/* Check that the plural forms isn't being sneaky since we build a function here */
Jed.PF.parse(plurals);
} catch(ex) {
fatal("bad plural forms: " + ex.message, 1);
}
/* A function for the front end */
statement = header["plural-forms"];
if (statement[statement.length - 1] != ';')
statement += ';';
ret = 'function(n) {\nvar nplurals, plural;\n' + statement + '\nreturn plural;\n}';
/* Added back in later */
delete header["plural-forms"];
}
/* We don't need to be transferring this */
delete header["project-id-version"];
delete header["report-msgid-bugs-to"];
delete header["pot-creation-date"];
delete header["po-revision-date"];
delete header["last-translator"];
delete header["language-team"];
delete header["mime-version"];
delete header["content-type"];
delete header["content-transfer-encoding"];
return ret;
}
/* Parse and process the po data */
function parse() {
filename = opts.args[0];
po2json.parseFile(opts.args[0], { "fuzzy": false }, function(err, jsonData) {
var plurals, pos;
if (err)
fatal(err.message);
var header = jsonData[""];
if (header)
plurals = prepareHeader(header);
var data = JSON.stringify(jsonData, null, 1);
/* We know the brace in is the location to insert our function */
if (plurals) {
pos = data.indexOf('{', 1);
data = data.substr(0, pos + 1) + "'plural-forms':" + String(plurals) + "," + data.substr(pos + 1);
}
if (data == JSON.stringify({}))
finish("");
else
wrap(data);
});
}
/* Wrap the data if desired */
function wrap(data) {
if (opts.module) {
filename = opts.module;
fs.readFile(opts.module, { encoding: "utf-8" }, function(err, template) {
if (err)
fatal(err.message);
data = template.replace('{"":{"language":"en"}}', data);
finish(data);
});
} else {
finish(data);
}
}
/* Write it out */
function finish(data) {
if (opts.output) {
fs.writeFile(opts.output, data, function(err) {
if (err)
fatal(err.message);
process.exit(0);
});
} else {
process.stdout.write(data);
process.exit(0);
}
}