diff --git a/spec/parser/javascript/charset_escape_spec.js b/spec/parser/javascript/charset_escape_spec.js index a5e3a1d..434eec7 100644 --- a/spec/parser/javascript/charset_escape_spec.js +++ b/spec/parser/javascript/charset_escape_spec.js @@ -5,30 +5,27 @@ import Snap from 'snapsvg'; describe('parser/javascript/charset_escape.js', function() { _.forIn({ - '\\b': 'backspace', - '\\d': 'digit', - '\\D': 'non-digit', - '\\f': 'form feed', - '\\n': 'line feed', - '\\r': 'carriage return', - '\\s': 'white space', - '\\S': 'non-white space', - '\\t': 'tab', - '\\v': 'vertical tab', - '\\w': 'word', - '\\W': 'non-word', - '\\0': 'null', - '\\012': 'octal: 12', - '\\cx': 'ctrl-x', - '\\xab': '0xAB', - '\\uabcd': 'U+ABCD' - }, (label, str) => { + '\\b': { label: 'backspace', ordinal: 0x08 }, + '\\d': { label: 'digit', ordinal: -1 }, + '\\D': { label: 'non-digit', ordinal: -1 }, + '\\f': { label: 'form feed', ordinal: 0x0c }, + '\\n': { label: 'line feed', ordinal: 0x0a }, + '\\r': { label: 'carriage return', ordinal: 0x0d }, + '\\s': { label: 'white space', ordinal: -1 }, + '\\S': { label: 'non-white space', ordinal: -1 }, + '\\t': { label: 'tab', ordinal: 0x09 }, + '\\v': { label: 'vertical tab', ordinal: 0x0b }, + '\\w': { label: 'word', ordinal: -1 }, + '\\W': { label: 'non-word', ordinal: -1 }, + '\\0': { label: 'null', ordinal: 0 }, + '\\012': { label: 'octal: 12', ordinal: 10 }, + '\\cx': { label: 'ctrl-x', ordinal: -1 }, + '\\xab': { label: '0xAB', ordinal: 0xab }, + '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } + }, (content, str) => { it(`parses "${str}" as a CharsetEscape`, function() { var parser = new javascript.Parser(str); - expect(parser.__consume__charset_terminal()).toEqual(jasmine.objectContaining({ - type: 'charset-escape', - label - })); + expect(parser.__consume__charset_terminal()).toEqual(jasmine.objectContaining(content)); }); }); diff --git a/spec/parser/javascript/escape_spec.js b/spec/parser/javascript/escape_spec.js index a4c7d9d..d52dba0 100644 --- a/spec/parser/javascript/escape_spec.js +++ b/spec/parser/javascript/escape_spec.js @@ -5,40 +5,37 @@ import Snap from 'snapsvg'; describe('parser/javascript/escape.js', function() { _.forIn({ - '\\b': 'word boundary', - '\\B': 'non-word boundary', - '\\d': 'digit', - '\\D': 'non-digit', - '\\f': 'form feed', - '\\n': 'line feed', - '\\r': 'carriage return', - '\\s': 'white space', - '\\S': 'non-white space', - '\\t': 'tab', - '\\v': 'vertical tab', - '\\w': 'word', - '\\W': 'non-word', - '\\0': 'null', - '\\1': 'Back reference (group = 1)', - '\\2': 'Back reference (group = 2)', - '\\3': 'Back reference (group = 3)', - '\\4': 'Back reference (group = 4)', - '\\5': 'Back reference (group = 5)', - '\\6': 'Back reference (group = 6)', - '\\7': 'Back reference (group = 7)', - '\\8': 'Back reference (group = 8)', - '\\9': 'Back reference (group = 9)', - '\\012': 'octal: 12', - '\\cx': 'ctrl-x', - '\\xab': '0xAB', - '\\uabcd': 'U+ABCD' - }, (label, str) => { + '\\b': { label: 'word boundary', ordinal: -1 }, + '\\B': { label: 'non-word boundary', ordinal: -1 }, + '\\d': { label: 'digit', ordinal: -1 }, + '\\D': { label: 'non-digit', ordinal: -1 }, + '\\f': { label: 'form feed', ordinal: 0x0c }, + '\\n': { label: 'line feed', ordinal: 0x0a }, + '\\r': { label: 'carriage return', ordinal: 0x0d }, + '\\s': { label: 'white space', ordinal: -1 }, + '\\S': { label: 'non-white space', ordinal: -1 }, + '\\t': { label: 'tab', ordinal: 0x09 }, + '\\v': { label: 'vertical tab', ordinal: 0x0b }, + '\\w': { label: 'word', ordinal: -1 }, + '\\W': { label: 'non-word', ordinal: -1 }, + '\\0': { label: 'null', ordinal: 0 }, + '\\1': { label: 'Back reference (group = 1)', ordinal: -1 }, + '\\2': { label: 'Back reference (group = 2)', ordinal: -1 }, + '\\3': { label: 'Back reference (group = 3)', ordinal: -1 }, + '\\4': { label: 'Back reference (group = 4)', ordinal: -1 }, + '\\5': { label: 'Back reference (group = 5)', ordinal: -1 }, + '\\6': { label: 'Back reference (group = 6)', ordinal: -1 }, + '\\7': { label: 'Back reference (group = 7)', ordinal: -1 }, + '\\8': { label: 'Back reference (group = 8)', ordinal: -1 }, + '\\9': { label: 'Back reference (group = 9)', ordinal: -1 }, + '\\012': { label: 'octal: 12', ordinal: 10 }, + '\\cx': { label: 'ctrl-x', ordinal: -1 }, + '\\xab': { label: '0xAB', ordinal: 0xab }, + '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } + }, (content, str) => { it(`parses "${str}" as an Escape`, function() { var parser = new javascript.Parser(str); - expect(parser.__consume__terminal()).toEqual(jasmine.objectContaining({ - type: 'escape', - label - })); + expect(parser.__consume__terminal()).toEqual(jasmine.objectContaining(content)); }); }); diff --git a/src/js/parser/javascript/charset_escape.js b/src/js/parser/javascript/charset_escape.js index 576f8c3..8690268 100644 --- a/src/js/parser/javascript/charset_escape.js +++ b/src/js/parser/javascript/charset_escape.js @@ -4,5 +4,5 @@ import Escape from './escape.js'; export default _.extend({}, Escape, { type: 'charset-escape', - b: 'backspace' + b: ['backspace', 0x08] }); diff --git a/src/js/parser/javascript/escape.js b/src/js/parser/javascript/escape.js index 6f74c5f..47a0340 100644 --- a/src/js/parser/javascript/escape.js +++ b/src/js/parser/javascript/escape.js @@ -16,46 +16,46 @@ export default { setup() { this.code = this.properties.esc.properties.code.textValue; this.arg = this.properties.esc.properties.arg.textValue; - this.label = _.result(this, this.code); + [this.label, this.ordinal] = _.result(this, this.code); }, // Escape code mappings - b: 'word boundary', - B: 'non-word boundary', - d: 'digit', - D: 'non-digit', - f: 'form feed', - n: 'line feed', - r: 'carriage return', - s: 'white space', - S: 'non-white space', - t: 'tab', - v: 'vertical tab', - w: 'word', - W: 'non-word', - 1: 'Back reference (group = 1)', - 2: 'Back reference (group = 2)', - 3: 'Back reference (group = 3)', - 4: 'Back reference (group = 4)', - 5: 'Back reference (group = 5)', - 6: 'Back reference (group = 6)', - 7: 'Back reference (group = 7)', - 8: 'Back reference (group = 8)', - 9: 'Back reference (group = 9)', + b: ['word boundary', -1], + B: ['non-word boundary', -1], + d: ['digit', -1], + D: ['non-digit', -1], + f: ['form feed', 0x0c], + n: ['line feed', 0x0a], + r: ['carriage return', 0x0d], + s: ['white space', -1], + S: ['non-white space', -1], + t: ['tab', 0x09], + v: ['vertical tab', 0x0b], + w: ['word', -1], + W: ['non-word', -1], + 1: ['Back reference (group = 1)', -1], + 2: ['Back reference (group = 2)', -1], + 3: ['Back reference (group = 3)', -1], + 4: ['Back reference (group = 4)', -1], + 5: ['Back reference (group = 5)', -1], + 6: ['Back reference (group = 6)', -1], + 7: ['Back reference (group = 7)', -1], + 8: ['Back reference (group = 8)', -1], + 9: ['Back reference (group = 9)', -1], 0() { if (this.arg) { - return `octal: ${this.arg}`; + return [`octal: ${this.arg}`, parseInt(this.arg, 8)]; } else { - return 'null'; + return ['null', 0]; } }, c() { - return `ctrl-${this.arg}`; + return [`ctrl-${this.arg}`, -1]; }, x() { - return `0x${this.arg.toUpperCase()}`; + return [`0x${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; }, u() { - return `U+${this.arg.toUpperCase()}`; + return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; } };