aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-regex.js
blob: 19fbccab97703f16e980576d387b0c20879b2f71 (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
104
(function (Prism) {
  var specialEscape = {
    pattern: /\\[\\(){}[\]^$+*?|.]/,
    alias: 'escape',
  };
  var escape =
    /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
  var charSet = {
    pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
    alias: 'class-name',
  };
  var charSetWithoutDot = {
    pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
    alias: 'class-name',
  };

  var rangeChar = '(?:[^\\\\-]|' + escape.source + ')';
  var range = RegExp(rangeChar + '-' + rangeChar);

  // the name of a capturing group
  var groupName = {
    pattern: /(<|')[^<>']+(?=[>']$)/,
    lookbehind: true,
    alias: 'variable',
  };

  Prism.languages.regex = {
    'char-class': {
      pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
      lookbehind: true,
      inside: {
        'char-class-negation': {
          pattern: /(^\[)\^/,
          lookbehind: true,
          alias: 'operator',
        },
        'char-class-punctuation': {
          pattern: /^\[|\]$/,
          alias: 'punctuation',
        },
        range: {
          pattern: range,
          inside: {
            escape: escape,
            'range-punctuation': {
              pattern: /-/,
              alias: 'operator',
            },
          },
        },
        'special-escape': specialEscape,
        'char-set': charSetWithoutDot,
        escape: escape,
      },
    },
    'special-escape': specialEscape,
    'char-set': charSet,
    backreference: [
      {
        // a backreference which is not an octal escape
        pattern: /\\(?![123][0-7]{2})[1-9]/,
        alias: 'keyword',
      },
      {
        pattern: /\\k<[^<>']+>/,
        alias: 'keyword',
        inside: {
          'group-name': groupName,
        },
      },
    ],
    anchor: {
      pattern: /[$^]|\\[ABbGZz]/,
      alias: 'function',
    },
    escape: escape,
    group: [
      {
        // https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
        // https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs

        // (), (?<name>), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?<!), (?is-m), (?i-m:)
        pattern:
          /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
        alias: 'punctuation',
        inside: {
          'group-name': groupName,
        },
      },
      {
        pattern: /\)/,
        alias: 'punctuation',
      },
    ],
    quantifier: {
      pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
      alias: 'number',
    },
    alternation: {
      pattern: /\|/,
      alias: 'keyword',
    },
  };
})(Prism);