Skip to content

Commit

Permalink
Merge c6842c9 into 17db0fe
Browse files Browse the repository at this point in the history
  • Loading branch information
almet committed Feb 19, 2016
2 parents 17db0fe + c6842c9 commit c7fd700
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 6 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,18 @@ jsesc([ undefined, -Infinity ], {

**Note:** Using this option on objects or arrays that contain non-string values relies on `JSON.stringify()`. For legacy environments like IE ≤ 7, use [a `JSON` polyfill](http://bestiejs.github.io/json3/).

#### `lowercaseHex`

The `lowercaseHex` option takes a boolean value (`true` or `false`), and defaults to `false`. When enabled, the hexadecimal values in the output are in lower case.

```js
jsesc('Ich ♥ Bücher', {
'lowercaseHex': true,
});
// → 'Ich \\u2665 B\\xfccher'

```

### `jsesc.version`

A string representing the semantic version number.
Expand Down
5 changes: 5 additions & 0 deletions bin/jsesc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
'\tjsesc [-j | --json] [string]',
'\tjsesc [-o | --object] [stringified_object]', // `JSON.parse()` the argument
'\tjsesc [-p | --pretty] [string]', // `compact: false`
'\tjsesc [-l | --lowercase-hex] [string]',
'\tjsesc [-v | --version]',
'\tjsesc [-h | --help]',
'\nExamples:\n',
Expand Down Expand Up @@ -82,6 +83,10 @@
options.compact = false;
return;
}
if (/^(?:-l|--lowercase-hex)$/.test(string)) {
options.lowercaseHex = true;
return;
}

// Process string(s)
var result;
Expand Down
16 changes: 12 additions & 4 deletions jsesc.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
var freeModule = typeof module == 'object' && module &&
module.exports == freeExports && module;

// Detect free variable `global`, from Node.js/io.js or Browserified code,
// Detect free variable `global`, from Node.js or Browserified code,
// and use it as `root`
var freeGlobal = typeof global == 'object' && global;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
Expand Down Expand Up @@ -95,6 +95,7 @@
'es6': false,
'json': false,
'compact': true,
'lowercaseHex': false,
'indent': '\t',
'__indent__': ''
};
Expand Down Expand Up @@ -189,7 +190,11 @@
if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate
// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
result += '\\u{' + codePoint.toString(16).toUpperCase() + '}';
var hexadecimal = codePoint.toString(16);
if (!options.lowercaseHex) {
hexadecimal = hexadecimal.toUpperCase();
}
result += '\\u{' + hexadecimal + '}';
index++;
continue;
}
Expand Down Expand Up @@ -225,7 +230,10 @@
continue;
}
var charCode = character.charCodeAt(0);
var hexadecimal = charCode.toString(16).toUpperCase();
var hexadecimal = charCode.toString(16);
if (!options.lowercaseHex) {
hexadecimal = hexadecimal.toUpperCase();
}
var longhand = hexadecimal.length > 2 || json;
var escaped = '\\' + (longhand ? 'u' : 'x') +
('0000' + hexadecimal).slice(longhand ? -4 : -2);
Expand Down Expand Up @@ -253,7 +261,7 @@
return jsesc;
});
} else if (freeExports && !freeExports.nodeType) {
if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
if (freeModule) { // in Node.js or RingoJS v0.8.0+
freeModule.exports = jsesc;
} else { // in Narwhal or RingoJS v0.7.0-
freeExports.jsesc = jsesc;
Expand Down
4 changes: 4 additions & 0 deletions man/jsesc.1
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
.br
.Op Fl p | -pretty Ar string
.br
.Op Fl u | -uppercase-hex Ar string
.br
.Op Fl v | -version
.br
.Op Fl h | -help
Expand Down Expand Up @@ -53,6 +55,8 @@ settings.
Treat the input as a JavaScript object rather than a string. Accepted values are flat arrays containing only string values, and flat objects containing only string values.
.It Sy "-p, --pretty"
Pretty-print the output for objects, using whitespace to make it more readable. Setting this flag enables the
.It Sy "-u, --lowercase-hex"
Convert the hexadecimal values to lowercase.
.Ar -o | --object
setting.
.It Sy "-v, --version"
Expand Down
12 changes: 10 additions & 2 deletions src/jsesc.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
'es6': false,
'json': false,
'compact': true,
'lowercaseHex': false,
'indent': '\t',
'__indent__': ''
};
Expand Down Expand Up @@ -189,7 +190,11 @@
if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate
// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
result += '\\u{' + codePoint.toString(16).toUpperCase() + '}';
var hexadecimal = codePoint.toString(16);
if (!options.lowercaseHex) {
hexadecimal = hexadecimal.toUpperCase();
}
result += '\\u{' + hexadecimal + '}';
index++;
continue;
}
Expand Down Expand Up @@ -225,7 +230,10 @@
continue;
}
var charCode = character.charCodeAt(0);
var hexadecimal = charCode.toString(16).toUpperCase();
var hexadecimal = charCode.toString(16);
if (!options.lowercaseHex) {
hexadecimal = hexadecimal.toUpperCase();
}
var longhand = hexadecimal.length > 2 || json;
var escaped = '\\' + (longhand ? 'u' : 'x') +
('0000' + hexadecimal).slice(longhand ? -4 : -2);
Expand Down
94 changes: 94 additions & 0 deletions tests/tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,100 @@
'{"hello":"world","\\uD83D\\uDCA9":"foo","pile":"\\uD83D\\uDCA9"}',
'`toJSON` methods are not called when `json: false`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': true
}),
'\\u2192\\xe9',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: true`'
);
equal(
jsesc('\u2192\xe9', {
'lowercaseHex': true,
'json': true
}),
'"\\u2192\\u00e9"',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: alse` and `json: true`'
);
equal(
jsesc('ççaçç', {
'lowercaseHex': true,
'escapeEverything': true
}),
'\\xe7\\xe7\\x61\\xe7\\xe7',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: true` and `escapeEverything: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': true,
'es6': true
}),
'\\u2192\\xe9',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: true` and `es6: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': true,
'compact': true
}),
'\\u2192\\xe9',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: true` and `compact: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': true,
'indent': true
}),
'\\u2192\\xe9',
'Alphabetical hexadecimal digits are lowercase when `lowercaseHex: true` and `indent: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': false
}),
'\\u2192\\xE9',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: false`'
);
equal(
jsesc('\u2192\xe9', {
'lowercaseHex': false,
'json': true
}),
'"\\u2192\\u00E9"',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: alse` and `json: true`'
);
equal(
jsesc('ççaçç', {
'lowercaseHex': false,
'escapeEverything': true
}),
'\\xE7\\xE7\\x61\\xE7\\xE7',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: false` and `escapeEverything: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': false,
'es6': true
}),
'\\u2192\\xE9',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: true` and `es6: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': false,
'compact': true
}),
'\\u2192\\xE9',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: false` and `compact: true`'
);
equal(
jsesc('\u2192\xE9', {
'lowercaseHex': false,
'indent': true
}),
'\\u2192\\xE9',
'Alphabetical hexadecimal digits are uppercase when `lowercaseHex: false` and `indent: true`'
);
});

if (runExtendedTests) {
Expand Down

0 comments on commit c7fd700

Please sign in to comment.