| #!/usr/bin/env node |
| (function() { |
| |
| var fs = require('fs'); |
| var stringEscape = require('../jsesc.js'); |
| var strings = process.argv.splice(2); |
| var stdin = process.stdin; |
| var data; |
| var timeout; |
| var isObject = false; |
| var options = {}; |
| var log = console.log; |
| |
| var main = function() { |
| var option = strings[0]; |
| |
| if (/^(?:-h|--help|undefined)$/.test(option)) { |
| log( |
| 'jsesc v%s - https://mths.be/jsesc', |
| stringEscape.version |
| ); |
| log([ |
| '\nUsage:\n', |
| '\tjsesc [string]', |
| '\tjsesc [-s | --single-quotes] [string]', |
| '\tjsesc [-d | --double-quotes] [string]', |
| '\tjsesc [-w | --wrap] [string]', |
| '\tjsesc [-e | --escape-everything] [string]', |
| '\tjsesc [-t | --escape-etago] [string]', |
| '\tjsesc [-6 | --es6] [string]', |
| '\tjsesc [-l | --lowercase-hex] [string]', |
| '\tjsesc [-j | --json] [string]', |
| '\tjsesc [-o | --object] [stringified_object]', // `JSON.parse()` the argument |
| '\tjsesc [-p | --pretty] [string]', // `compact: false` |
| '\tjsesc [-v | --version]', |
| '\tjsesc [-h | --help]', |
| '\nExamples:\n', |
| '\tjsesc \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', |
| '\tjsesc --json \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', |
| '\tjsesc --json --escape-everything \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', |
| '\tjsesc --double-quotes --wrap \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\'', |
| '\techo \'f\xF6o \u2665 b\xE5r \uD834\uDF06 baz\' | jsesc' |
| ].join('\n')); |
| return process.exit(1); |
| } |
| |
| if (/^(?:-v|--version)$/.test(option)) { |
| log('v%s', stringEscape.version); |
| return process.exit(1); |
| } |
| |
| strings.forEach(function(string) { |
| // Process options |
| if (/^(?:-s|--single-quotes)$/.test(string)) { |
| options.quotes = 'single'; |
| return; |
| } |
| if (/^(?:-d|--double-quotes)$/.test(string)) { |
| options.quotes = 'double'; |
| return; |
| } |
| if (/^(?:-w|--wrap)$/.test(string)) { |
| options.wrap = true; |
| return; |
| } |
| if (/^(?:-e|--escape-everything)$/.test(string)) { |
| options.escapeEverything = true; |
| return; |
| } |
| if (/^(?:-t|--escape-etago)$/.test(string)) { |
| options.escapeEtago = true; |
| return; |
| } |
| if (/^(?:-6|--es6)$/.test(string)) { |
| options.es6 = true; |
| return; |
| } |
| if (/^(?:-l|--lowercase-hex)$/.test(string)) { |
| options.lowercaseHex = true; |
| return; |
| } |
| if (/^(?:-j|--json)$/.test(string)) { |
| options.json = true; |
| return; |
| } |
| if (/^(?:-o|--object)$/.test(string)) { |
| isObject = true; |
| return; |
| } |
| if (/^(?:-p|--pretty)$/.test(string)) { |
| isObject = true; |
| options.compact = false; |
| return; |
| } |
| |
| // Process string(s) |
| var result; |
| try { |
| if (isObject) { |
| string = JSON.parse(string); |
| } |
| result = stringEscape(string, options); |
| log(result); |
| } catch(error) { |
| log(error.message + '\n'); |
| log('Error: failed to escape.'); |
| log('If you think this is a bug in jsesc, please report it:'); |
| log('https://github.com/mathiasbynens/jsesc/issues/new'); |
| log( |
| '\nStack trace using jsesc@%s:\n', |
| stringEscape.version |
| ); |
| log(error.stack); |
| 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) { // called from a non-TTY context |
| timeout = setTimeout(function() { |
| // if no piped data arrived after a while, handle shell arguments |
| main(); |
| }, 250); |
| } |
| |
| data = ''; |
| stdin.on('data', function(chunk) { |
| clearTimeout(timeout); |
| data += chunk; |
| }); |
| stdin.on('end', function() { |
| strings.push(data.trim()); |
| main(); |
| }); |
| stdin.resume(); |
| } |
| |
| }()); |