modules/command.js

var aeq = (function (aeq) {
/**
 * Module for interacting with the command line / system
 * @namespace aeq.command
 * @memberof aeq
 * @type {Object}
 */
aeq.command = aeq.extend({}, {
	toString: function() {
		return "[object aeq.command]";
	},

	// Function for extending the prototype using objects
	extend: aeq.extend,

	/**
	 * Call a command-line/system command.
	 * @method
	 * @memberof aeq.command
	 * @param  {string|object} windows           Command to call if OS is windows,
	 *                                           or an object with options.
	 * @param  {string}        [windows.win]     Command to call if OS is windows.
	 * @param  {string}        [windows.windows] Command to call if OS is windows.
	 * @param  {string}        [windows.mac]     Argument to give the command.
	 * @param  {string}        [windows.arg]     Command to call if OS is MacOS.
	 * @param  {string}        [mac]             Command to call if OS is MacOS.
	 * @param  {string}        [arg]             Argument to give the command.
	 * @return {string}        The value returned from the command.
	 *
	 * @example
	 * <caption>Open file in Finder/Explorer. ({@link aeq.command.revealFile})</caption>
	 * aeq.command.call('Explorer /select,', 'open -R', '"' + file.fsName + '"' )
	 * aeq.command.call({
	 *     windows: 'Explorer /select,',
	 *     mac: 'open -R',
	 *     arg: '"' + file.fsName + '"'
	 * })
	 */
	call: function(windows, mac, arg) {
		if (aeq.isObject(arguments[0])) {
			var args = arguments[0];
			windows = setDefault(args.win, args.windows);
			mac = setDefault(args.mac, args.osx);
			arg = args.arg;
		}
		var command = mac;
		if (aeq.isWindows) {
			command = windows;
		}
		arg = arg !== undefined ? " " + arg : "";
		return system.callSystem(command + arg);
	},

	/**
	 * Opens the given URL in the default web browser.
	 * @method
	 * @memberof aeq.command
	 * @param  {string} URL The URL to open.
	 *
	 * @example
	 * <caption>Opens AEQuery bitbucket project.</caption>
	 * aeq.command.openURL('https://bitbucket.org/motiondesign/aequery')
	 */
	openURL: function(URL) {
		try {
			if (URL.match(/^https?:\/\//) === null) {
				URL = "http://" + URL;
			}
			aeq.command.call({
				win: "cmd /c \"explorer",
				mac: "open",
				arg: URL
			});
		} catch(err){
			alert("Error in openURL function\n" + err.toString());
		}
	},

	/**
	 * Reveals the given file path or file object in Finder/Explorer.
	 * @method
	 * @memberof aeq.command
	 * @param  {string|File} filePath The path to the file that should be
	 *                                revealed, or a file object to reveal.
	 * @return {string}      The value returned when calling the reveal command
	 *                       in the command line. Mostly empty, holds error info
	 *                       if not empty.
	 * @example
	 * <caption>Reveals the rurnning script in Finder/Explorer</caption>
	 * aeq.command.revealFile( $.fileName )
	 */
	revealFile: function(filePath) {
		if ( aeq.isFile(filePath) ) {
			filePath = filePath.fsName;
		}
		return aeq.command.call("Explorer /select,", "open -R", "\"" + filePath + "\"");
	},

	/**
	 * Copies a string to the users clipboard.
	 * @method
	 * @memberof aeq.command
	 * @param  {string} text The string to copy.
	 *
	 * @example
	 * aeq.command.copyToClipboard( 'Hello World!' )
	 */
	copyToClipboard: function( text ) {
		aeq.command.call(
			'cmd.exe /c cmd.exe /c "echo ' + text + ' | clip"', // Windows
			'echo "' + text + '" | pbcopy' // MacOS
		);
	}
});

// Function aliases
aeq.callSystem = aeq.command.call;
aeq.openURL = aeq.command.openURL;
aeq.revealFile = aeq.command.revealFile;
aeq.copyToClipboard = aeq.command.copyToClipboard;

return aeq;
}(aeq || {}));