var exec = require('child_process').exec | |
, path = require('path') | |
; | |
/** | |
* open a file or uri using the default application for the file type. | |
* | |
* @return {ChildProcess} - the child process object. | |
* @param {string} target - the file/uri to open. | |
* @param {string} appName - (optional) the application to be used to open the | |
* file (for example, "chrome", "firefox") | |
* @param {function(Error)} callback - called with null on success, or | |
* an error object that contains a property 'code' with the exit | |
* code of the process. | |
*/ | |
module.exports = open; | |
function open(target, appName, callback) { | |
var opener; | |
if (typeof(appName) === 'function') { | |
callback = appName; | |
appName = null; | |
} | |
switch (process.platform) { | |
case 'darwin': | |
if (appName) { | |
opener = 'open -a "' + escape(appName) + '"'; | |
} else { | |
opener = 'open'; | |
} | |
break; | |
case 'win32': | |
// if the first parameter to start is quoted, it uses that as the title | |
// so we pass a blank title so we can quote the file we are opening | |
if (appName) { | |
opener = 'start "" "' + escape(appName) + '"'; | |
} else { | |
opener = 'start ""'; | |
} | |
break; | |
default: | |
if (appName) { | |
opener = escape(appName); | |
} else { | |
// use Portlands xdg-open everywhere else | |
opener = path.join(__dirname, '../vendor/xdg-open'); | |
} | |
break; | |
} | |
if (process.env.SUDO_USER) { | |
opener = 'sudo -u ' + process.env.SUDO_USER + ' ' + opener; | |
} | |
return exec(opener + ' "' + escape(target) + '"', callback); | |
} | |
function escape(s) { | |
return s.replace(/"/g, '\\\"'); | |
} |