summaryrefslogtreecommitdiff
path: root/lib/Unescaper.js
blob: d0c826e0d0650505ab8e4786e2ab06916116d613 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Generated by CoffeeScript 2.4.1
var Pattern, Unescaper, Utils;

Utils = require('./Utils');

Pattern = require('./Pattern');

Unescaper = (function() {
  // Unescaper encapsulates unescaping rules for single and double-quoted YAML strings.

  class Unescaper {
    static unescapeSingleQuotedString(value) {
      return value.replace(/\'\'/g, '\'');
    }

    // Unescapes a double quoted string.

    // @param [String]       value A double quoted string.

    // @return [String]      The unescaped string.

    static unescapeDoubleQuotedString(value) {
      if (this._unescapeCallback == null) {
        this._unescapeCallback = (str) => {
          return this.unescapeCharacter(str);
        };
      }
      // Evaluate the string
      return this.PATTERN_ESCAPED_CHARACTER.replace(value, this._unescapeCallback);
    }

    // Unescapes a character that was found in a double-quoted string

    // @param [String]       value An escaped character

    // @return [String]      The unescaped character

    static unescapeCharacter(value) {
      var ch;
      ch = String.fromCharCode;
      switch (value.charAt(1)) {
        case '0':
          return ch(0);
        case 'a':
          return ch(7);
        case 'b':
          return ch(8);
        case 't':
          return "\t";
        case "\t":
          return "\t";
        case 'n':
          return "\n";
        case 'v':
          return ch(11);
        case 'f':
          return ch(12);
        case 'r':
          return ch(13);
        case 'e':
          return ch(27);
        case ' ':
          return ' ';
        case '"':
          return '"';
        case '/':
          return '/';
        case '\\':
          return '\\';
        case 'N':
          // U+0085 NEXT LINE
          return ch(0x0085);
        case '_':
          // U+00A0 NO-BREAK SPACE
          return ch(0x00A0);
        case 'L':
          // U+2028 LINE SEPARATOR
          return ch(0x2028);
        case 'P':
          // U+2029 PARAGRAPH SEPARATOR
          return ch(0x2029);
        case 'x':
          return Utils.utf8chr(Utils.hexDec(value.substr(2, 2)));
        case 'u':
          return Utils.utf8chr(Utils.hexDec(value.substr(2, 4)));
        case 'U':
          return Utils.utf8chr(Utils.hexDec(value.substr(2, 8)));
        default:
          return '';
      }
    }

  };

  // Regex fragment that matches an escaped character in
  // a double quoted string.
  Unescaper.PATTERN_ESCAPED_CHARACTER = new Pattern('\\\\([0abt\tnvfre "\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})');

  return Unescaper;

}).call(this);

module.exports = Unescaper;