Displaying the hex code of escaped characters

This is only done where appropriate (escapes like "word boundary" don't
have a hex value, and displaying it for hex or unicode escapes would be
a little redundant).
This commit is contained in:
Jeff Avallone 2015-01-25 17:44:07 -05:00
parent 80e96c7bd3
commit 1170a1be76
4 changed files with 62 additions and 46 deletions

View File

@ -5,21 +5,21 @@ import Snap from 'snapsvg';
describe('parser/javascript/charset_escape.js', function() { describe('parser/javascript/charset_escape.js', function() {
_.forIn({ _.forIn({
'\\b': { label: 'backspace', ordinal: 0x08 }, '\\b': { label: 'backspace (0x08)', ordinal: 0x08 },
'\\d': { label: 'digit', ordinal: -1 }, '\\d': { label: 'digit', ordinal: -1 },
'\\D': { label: 'non-digit', ordinal: -1 }, '\\D': { label: 'non-digit', ordinal: -1 },
'\\f': { label: 'form feed', ordinal: 0x0c }, '\\f': { label: 'form feed (0x0C)', ordinal: 0x0c },
'\\n': { label: 'line feed', ordinal: 0x0a }, '\\n': { label: 'line feed (0x0A)', ordinal: 0x0a },
'\\r': { label: 'carriage return', ordinal: 0x0d }, '\\r': { label: 'carriage return (0x0D)', ordinal: 0x0d },
'\\s': { label: 'white space', ordinal: -1 }, '\\s': { label: 'white space', ordinal: -1 },
'\\S': { label: 'non-white space', ordinal: -1 }, '\\S': { label: 'non-white space', ordinal: -1 },
'\\t': { label: 'tab', ordinal: 0x09 }, '\\t': { label: 'tab (0x09)', ordinal: 0x09 },
'\\v': { label: 'vertical tab', ordinal: 0x0b }, '\\v': { label: 'vertical tab (0x0B)', ordinal: 0x0b },
'\\w': { label: 'word', ordinal: -1 }, '\\w': { label: 'word', ordinal: -1 },
'\\W': { label: 'non-word', ordinal: -1 }, '\\W': { label: 'non-word', ordinal: -1 },
'\\0': { label: 'null', ordinal: 0 }, '\\0': { label: 'null (0x00)', ordinal: 0 },
'\\012': { label: 'octal: 12', ordinal: 10 }, '\\012': { label: 'octal: 12 (0x0A)', ordinal: 10 },
'\\cx': { label: 'ctrl-X', ordinal: 24 }, '\\cx': { label: 'ctrl-X (0x18)', ordinal: 24 },
'\\xab': { label: '0xAB', ordinal: 0xab }, '\\xab': { label: '0xAB', ordinal: 0xab },
'\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd }
}, (content, str) => { }, (content, str) => {

View File

@ -9,16 +9,16 @@ describe('parser/javascript/escape.js', function() {
'\\B': { label: 'non-word boundary', ordinal: -1 }, '\\B': { label: 'non-word boundary', ordinal: -1 },
'\\d': { label: 'digit', ordinal: -1 }, '\\d': { label: 'digit', ordinal: -1 },
'\\D': { label: 'non-digit', ordinal: -1 }, '\\D': { label: 'non-digit', ordinal: -1 },
'\\f': { label: 'form feed', ordinal: 0x0c }, '\\f': { label: 'form feed (0x0C)', ordinal: 0x0c },
'\\n': { label: 'line feed', ordinal: 0x0a }, '\\n': { label: 'line feed (0x0A)', ordinal: 0x0a },
'\\r': { label: 'carriage return', ordinal: 0x0d }, '\\r': { label: 'carriage return (0x0D)', ordinal: 0x0d },
'\\s': { label: 'white space', ordinal: -1 }, '\\s': { label: 'white space', ordinal: -1 },
'\\S': { label: 'non-white space', ordinal: -1 }, '\\S': { label: 'non-white space', ordinal: -1 },
'\\t': { label: 'tab', ordinal: 0x09 }, '\\t': { label: 'tab (0x09)', ordinal: 0x09 },
'\\v': { label: 'vertical tab', ordinal: 0x0b }, '\\v': { label: 'vertical tab (0x0B)', ordinal: 0x0b },
'\\w': { label: 'word', ordinal: -1 }, '\\w': { label: 'word', ordinal: -1 },
'\\W': { label: 'non-word', ordinal: -1 }, '\\W': { label: 'non-word', ordinal: -1 },
'\\0': { label: 'null', ordinal: 0 }, '\\0': { label: 'null (0x00)', ordinal: 0 },
'\\1': { label: 'Back reference (group = 1)', ordinal: -1 }, '\\1': { label: 'Back reference (group = 1)', ordinal: -1 },
'\\2': { label: 'Back reference (group = 2)', ordinal: -1 }, '\\2': { label: 'Back reference (group = 2)', ordinal: -1 },
'\\3': { label: 'Back reference (group = 3)', ordinal: -1 }, '\\3': { label: 'Back reference (group = 3)', ordinal: -1 },
@ -28,8 +28,8 @@ describe('parser/javascript/escape.js', function() {
'\\7': { label: 'Back reference (group = 7)', ordinal: -1 }, '\\7': { label: 'Back reference (group = 7)', ordinal: -1 },
'\\8': { label: 'Back reference (group = 8)', ordinal: -1 }, '\\8': { label: 'Back reference (group = 8)', ordinal: -1 },
'\\9': { label: 'Back reference (group = 9)', ordinal: -1 }, '\\9': { label: 'Back reference (group = 9)', ordinal: -1 },
'\\012': { label: 'octal: 12', ordinal: 10 }, '\\012': { label: 'octal: 12 (0x0A)', ordinal: 10 },
'\\cx': { label: 'ctrl-X', ordinal: 24 }, '\\cx': { label: 'ctrl-X (0x18)', ordinal: 24 },
'\\xab': { label: '0xAB', ordinal: 0xab }, '\\xab': { label: '0xAB', ordinal: 0xab },
'\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd }
}, (content, str) => { }, (content, str) => {

View File

@ -4,5 +4,5 @@ import Escape from './escape.js';
export default _.extend({}, Escape, { export default _.extend({}, Escape, {
type: 'charset-escape', type: 'charset-escape',
b: ['backspace', 0x08] b: ['backspace', 0x08, true]
}); });

View File

@ -1,5 +1,15 @@
import _ from 'lodash'; import _ from 'lodash';
function hex(value) {
var str = value.toString(16).toUpperCase();
if (str.length < 2) {
str = '0' + str;
}
return `(0x${str})`;
}
export default { export default {
type: 'escape', type: 'escape',
@ -14,48 +24,54 @@ export default {
}, },
setup() { setup() {
var addHex;
this.code = this.properties.esc.properties.code.textValue; this.code = this.properties.esc.properties.code.textValue;
this.arg = this.properties.esc.properties.arg.textValue; this.arg = this.properties.esc.properties.arg.textValue;
[this.label, this.ordinal] = _.result(this, this.code); [this.label, this.ordinal, addHex] = _.result(this, this.code);
if (addHex) {
this.label = `${this.label} ${hex(this.ordinal)}`;
}
}, },
// Escape code mappings // Escape code mappings
b: ['word boundary', -1], b: ['word boundary', -1, false],
B: ['non-word boundary', -1], B: ['non-word boundary', -1, false],
d: ['digit', -1], d: ['digit', -1, false],
D: ['non-digit', -1], D: ['non-digit', -1, false],
f: ['form feed', 0x0c], f: ['form feed', 0x0c, true],
n: ['line feed', 0x0a], n: ['line feed', 0x0a, true],
r: ['carriage return', 0x0d], r: ['carriage return', 0x0d, true],
s: ['white space', -1], s: ['white space', -1, false],
S: ['non-white space', -1], S: ['non-white space', -1, false],
t: ['tab', 0x09], t: ['tab', 0x09, true],
v: ['vertical tab', 0x0b], v: ['vertical tab', 0x0b, true],
w: ['word', -1], w: ['word', -1, false],
W: ['non-word', -1], W: ['non-word', -1, false],
1: ['Back reference (group = 1)', -1], 1: ['Back reference (group = 1)', -1, false],
2: ['Back reference (group = 2)', -1], 2: ['Back reference (group = 2)', -1, false],
3: ['Back reference (group = 3)', -1], 3: ['Back reference (group = 3)', -1, false],
4: ['Back reference (group = 4)', -1], 4: ['Back reference (group = 4)', -1, false],
5: ['Back reference (group = 5)', -1], 5: ['Back reference (group = 5)', -1, false],
6: ['Back reference (group = 6)', -1], 6: ['Back reference (group = 6)', -1, false],
7: ['Back reference (group = 7)', -1], 7: ['Back reference (group = 7)', -1, false],
8: ['Back reference (group = 8)', -1], 8: ['Back reference (group = 8)', -1, false],
9: ['Back reference (group = 9)', -1], 9: ['Back reference (group = 9)', -1, false],
0() { 0() {
if (this.arg) { if (this.arg) {
return [`octal: ${this.arg}`, parseInt(this.arg, 8)]; return [`octal: ${this.arg}`, parseInt(this.arg, 8), true];
} else { } else {
return ['null', 0]; return ['null', 0, true];
} }
}, },
c() { c() {
return [`ctrl-${this.arg.toUpperCase()}`, this.arg.toUpperCase().charCodeAt(0) - 64]; return [`ctrl-${this.arg.toUpperCase()}`, this.arg.toUpperCase().charCodeAt(0) - 64, true];
}, },
x() { x() {
return [`0x${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; return [`0x${this.arg.toUpperCase()}`, parseInt(this.arg, 16), false];
}, },
u() { u() {
return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16), false];
} }
}; };