You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.5 KiB
148 lines
3.5 KiB
#!/usr/bin/env node |
|
(function() { |
|
|
|
var fs = require('fs'); |
|
var he = require('../he.js'); |
|
var strings = process.argv.splice(2); |
|
var stdin = process.stdin; |
|
var data; |
|
var timeout; |
|
var action; |
|
var options = {}; |
|
var log = console.log; |
|
|
|
var main = function() { |
|
var option = strings[0]; |
|
var count = 0; |
|
|
|
if (/^(?:-h|--help|undefined)$/.test(option)) { |
|
log( |
|
'he v%s - https://mths.be/he', |
|
he.version |
|
); |
|
log([ |
|
'\nUsage:\n', |
|
'\the [--escape] string', |
|
'\the [--encode] [--use-named-refs] [--everything] [--allow-unsafe] [--decimal] string', |
|
'\the [--decode] [--attribute] [--strict] string', |
|
'\the [-v | --version]', |
|
'\the [-h | --help]', |
|
'\nExamples:\n', |
|
'\the --escape \\<img\\ src\\=\\\'x\\\'\\ onerror\\=\\"prompt\\(1\\)\\"\\>', |
|
'\techo \'© 𝌆\' | he --decode' |
|
].join('\n')); |
|
return process.exit(option ? 0 : 1); |
|
} |
|
|
|
if (/^(?:-v|--version)$/.test(option)) { |
|
log('v%s', he.version); |
|
return process.exit(0); |
|
} |
|
|
|
strings.forEach(function(string) { |
|
// Process options |
|
if (string == '--escape') { |
|
action = 'escape'; |
|
return; |
|
} |
|
if (string == '--encode') { |
|
action = 'encode'; |
|
return; |
|
} |
|
if (string == '--use-named-refs') { |
|
action = 'encode'; |
|
options.useNamedReferences = true; |
|
return; |
|
} |
|
if (string == '--everything') { |
|
action = 'encode'; |
|
options.encodeEverything = true; |
|
return; |
|
} |
|
if (string == '--allow-unsafe') { |
|
action = 'encode'; |
|
options.allowUnsafeSymbols = true; |
|
return; |
|
} |
|
if (string == '--decimal') { |
|
action = 'encode'; |
|
options.decimal = true; |
|
return; |
|
} |
|
if (string == '--decode') { |
|
action = 'decode'; |
|
return; |
|
} |
|
if (string == '--attribute') { |
|
action = 'decode'; |
|
options.isAttributeValue = true; |
|
return; |
|
} |
|
if (string == '--strict') { |
|
action = 'decode'; |
|
options.strict = true; |
|
return; |
|
} |
|
// Process string(s) |
|
var result; |
|
if (!action) { |
|
log('Error: he requires at least one option and a string argument.'); |
|
log('Try `he --help` for more information.'); |
|
return process.exit(1); |
|
} |
|
try { |
|
result = he[action](string, options); |
|
log(result); |
|
count++; |
|
} catch(error) { |
|
log(error.message + '\n'); |
|
log('Error: failed to %s.', action); |
|
log('If you think this is a bug in he, please report it:'); |
|
log('https://github.com/mathiasbynens/he/issues/new'); |
|
log( |
|
'\nStack trace using he@%s:\n', |
|
he.version |
|
); |
|
log(error.stack); |
|
return process.exit(1); |
|
} |
|
}); |
|
if (!count) { |
|
log('Error: he requires a string argument.'); |
|
log('Try `he --help` for more information.'); |
|
return process.exit(1); |
|
} |
|
// Return with exit status 0 outside of the `forEach` loop, in case |
|
// multiple strings were passed in. |
|
return process.exit(0); |
|
}; |
|
|
|
if (stdin.isTTY) { |
|
// handle shell arguments |
|
main(); |
|
} else { |
|
// Either the script is called from within a non-TTY context, or `stdin` |
|
// content is being piped in. |
|
if (!process.stdout.isTTY) { |
|
// The script was called from a non-TTY context. This is a rather uncommon |
|
// use case we don’t actively support. However, we don’t want the script |
|
// to wait forever in such cases, so… |
|
timeout = setTimeout(function() { |
|
// …if no piped data arrived after a whole minute, handle shell |
|
// arguments instead. |
|
main(); |
|
}, 60000); |
|
} |
|
data = ''; |
|
stdin.on('data', function(chunk) { |
|
clearTimeout(timeout); |
|
data += chunk; |
|
}); |
|
stdin.on('end', function() { |
|
strings.push(data.trim()); |
|
main(); |
|
}); |
|
stdin.resume(); |
|
} |
|
|
|
}());
|
|
|