#!/usr/bin/env narwhal var FILE = require("file"); var SYSTEM = require("system"); var OS = require("os"); var OBJJ = require("objective-j"); var parser = new (require("args").Parser)(); parser.usage("file..."); parser.help("Cappuccino plist converter."); parser.option("-c", "--convert", "format") .help("rewrite property list files in format") .choices({ "280north1" : OBJJ.kCFPropertyList280NorthFormat_v1_0, "xml1": OBJJ.kCFPropertyListXMLFormat_v1_0 }); parser.option("-l", "--lint", "lint") .help("check the property list files for syntax errors") .set(true); parser.option("-h", "--help") .action(parser.printHelp); parser.option("-o", "outPath") .help("specify alternate file path name for result;\n\ the -o option is used with -convert, and is only\n\ useful with one file argument (last file overwrites);\n\ the path '-' means stdout.") .set(); parser.option("-e", "outExtension") .help("specify alternate extension for converted files") .set(); parser.option("-s", "silent") .help("be silent on success") .set(true); exports.main = function(args) { // HACK: add extra "-" to "-convert", etc, for plutil compatibility var args = args.map(function(arg) { return arg.replace(/^(-[^-].+)$/, "-$1"); }); var options = parser.parse(args); var ok = false; if (typeof options.format !== "undefined" || options.lint) { ok = true; options.args.forEach(function(filePath) { var data = new OBJJ.objj_data(); data.string = FILE.read(filePath, { charset:"UTF-8" }); var plistObject = OBJJ.CPPropertyListCreateFromData(data); if (!plistObject) { // FIXME: more useful error messages SYSTEM.stderr.print(filePath + ": parse error"); ok = false; return; } if (options.lint) { if (!options.silent) SYSTEM.stderr.print(filePath + ": OK"); } else { data = OBJJ.CPPropertyListCreateData(plistObject, options.format); // outextension? if (options.outPath === "-") SYSTEM.stdout.write(data.string); else FILE.write(options.outPath || filePath, data.string, { charset:"UTF-8" }); } }); } else { parser.printHelp(options); } OS.exit(ok ? 0 : 1); } if (require.main == module.id) exports.main(system.args);