|
6 | 6 | */
|
7 | 7 | (function (Prism) {
|
8 | 8 | Prism.languages.ruby = Prism.languages.extend('clike', {
|
9 |
| - 'comment': [ |
10 |
| - /#.*/, |
11 |
| - { |
12 |
| - pattern: /^=begin\s[\s\S]*?^=end/m, |
13 |
| - greedy: true |
14 |
| - } |
15 |
| - ], |
| 9 | + 'comment': { |
| 10 | + pattern: /#.*|^=begin\s[\s\S]*?^=end/m, |
| 11 | + greedy: true |
| 12 | + }, |
16 | 13 | 'class-name': {
|
17 |
| - pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, |
| 14 | + pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/, |
18 | 15 | lookbehind: true,
|
19 | 16 | inside: {
|
20 | 17 | 'punctuation': /[.\\]/
|
21 | 18 | }
|
22 | 19 | },
|
23 |
| - 'keyword': /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ |
| 20 | + 'keyword': /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/, |
| 21 | + 'operator': /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/, |
| 22 | + 'punctuation': /[(){}[\].,;]/, |
| 23 | + }); |
| 24 | + |
| 25 | + Prism.languages.insertBefore('ruby', 'operator', { |
| 26 | + 'double-colon': { |
| 27 | + pattern: /::/, |
| 28 | + alias: 'punctuation' |
| 29 | + }, |
24 | 30 | });
|
25 | 31 |
|
26 | 32 | var interpolation = {
|
27 |
| - pattern: /#\{[^}]+\}/, |
| 33 | + pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/, |
| 34 | + lookbehind: true, |
28 | 35 | inside: {
|
| 36 | + 'content': { |
| 37 | + pattern: /^(#\{)[\s\S]+(?=\}$)/, |
| 38 | + lookbehind: true, |
| 39 | + inside: Prism.languages.ruby |
| 40 | + }, |
29 | 41 | 'delimiter': {
|
30 | 42 | pattern: /^#\{|\}$/,
|
31 |
| - alias: 'tag' |
32 |
| - }, |
33 |
| - rest: Prism.languages.ruby |
| 43 | + alias: 'punctuation' |
| 44 | + } |
34 | 45 | }
|
35 | 46 | };
|
36 | 47 |
|
37 | 48 | delete Prism.languages.ruby.function;
|
38 | 49 |
|
| 50 | + var percentExpression = '(?:' + [ |
| 51 | + /([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, |
| 52 | + /\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source, |
| 53 | + /\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source, |
| 54 | + /\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source, |
| 55 | + /<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source |
| 56 | + ].join('|') + ')'; |
| 57 | + |
| 58 | + var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source; |
| 59 | + |
39 | 60 | Prism.languages.insertBefore('ruby', 'keyword', {
|
40 |
| - 'regex': [ |
| 61 | + 'regex-literal': [ |
41 | 62 | {
|
42 |
| - pattern: RegExp(/%r/.source + '(?:' + [ |
43 |
| - /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, |
44 |
| - /\((?:[^()\\]|\\[\s\S])*\)/.source, |
45 |
| - // Here we need to specifically allow interpolation |
46 |
| - /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, |
47 |
| - /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, |
48 |
| - /<(?:[^<>\\]|\\[\s\S])*>/.source |
49 |
| - ].join('|') + ')' + /[egimnosux]{0,6}/.source), |
| 63 | + pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source), |
50 | 64 | greedy: true,
|
51 | 65 | inside: {
|
52 |
| - 'interpolation': interpolation |
| 66 | + 'interpolation': interpolation, |
| 67 | + 'regex': /[\s\S]+/ |
53 | 68 | }
|
54 | 69 | },
|
55 | 70 | {
|
56 | 71 | pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,
|
57 | 72 | lookbehind: true,
|
58 | 73 | greedy: true,
|
59 | 74 | inside: {
|
60 |
| - 'interpolation': interpolation |
| 75 | + 'interpolation': interpolation, |
| 76 | + 'regex': /[\s\S]+/ |
61 | 77 | }
|
62 | 78 | }
|
63 | 79 | ],
|
64 | 80 | 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
|
65 |
| - 'symbol': { |
66 |
| - pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, |
67 |
| - lookbehind: true |
68 |
| - }, |
| 81 | + 'symbol': [ |
| 82 | + { |
| 83 | + pattern: RegExp(/(^|[^:]):/.source + symbolName), |
| 84 | + lookbehind: true, |
| 85 | + greedy: true |
| 86 | + }, |
| 87 | + { |
| 88 | + pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source), |
| 89 | + lookbehind: true, |
| 90 | + greedy: true |
| 91 | + }, |
| 92 | + ], |
69 | 93 | 'method-definition': {
|
70 |
| - pattern: /(\bdef\s+)[\w.]+/, |
| 94 | + pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/, |
71 | 95 | lookbehind: true,
|
72 | 96 | inside: {
|
73 |
| - 'function': /\w+$/, |
74 |
| - rest: Prism.languages.ruby |
| 97 | + 'function': /\b\w+$/, |
| 98 | + 'keyword': /^self\b/, |
| 99 | + 'class-name': /^\w+/, |
| 100 | + 'punctuation': /\./ |
75 | 101 | }
|
76 | 102 | }
|
77 | 103 | });
|
78 | 104 |
|
79 |
| - Prism.languages.insertBefore('ruby', 'number', { |
80 |
| - 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/, |
81 |
| - 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ |
82 |
| - }); |
83 |
| - |
84 |
| - Prism.languages.ruby.string = [ |
85 |
| - { |
86 |
| - pattern: RegExp(/%[qQiIwWxs]?/.source + '(?:' + [ |
87 |
| - /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, |
88 |
| - /\((?:[^()\\]|\\[\s\S])*\)/.source, |
89 |
| - // Here we need to specifically allow interpolation |
90 |
| - /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, |
91 |
| - /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, |
92 |
| - /<(?:[^<>\\]|\\[\s\S])*>/.source |
93 |
| - ].join('|') + ')'), |
94 |
| - greedy: true, |
95 |
| - inside: { |
96 |
| - 'interpolation': interpolation |
97 |
| - } |
98 |
| - }, |
99 |
| - { |
100 |
| - pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/, |
101 |
| - greedy: true, |
102 |
| - inside: { |
103 |
| - 'interpolation': interpolation |
| 105 | + Prism.languages.insertBefore('ruby', 'string', { |
| 106 | + 'string-literal': [ |
| 107 | + { |
| 108 | + pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression), |
| 109 | + greedy: true, |
| 110 | + inside: { |
| 111 | + 'interpolation': interpolation, |
| 112 | + 'string': /[\s\S]+/ |
| 113 | + } |
| 114 | + }, |
| 115 | + { |
| 116 | + pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/, |
| 117 | + greedy: true, |
| 118 | + inside: { |
| 119 | + 'interpolation': interpolation, |
| 120 | + 'string': /[\s\S]+/ |
| 121 | + } |
| 122 | + }, |
| 123 | + { |
| 124 | + pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
| 125 | + alias: 'heredoc-string', |
| 126 | + greedy: true, |
| 127 | + inside: { |
| 128 | + 'delimiter': { |
| 129 | + pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i, |
| 130 | + inside: { |
| 131 | + 'symbol': /\b\w+/, |
| 132 | + 'punctuation': /^<<[-~]?/ |
| 133 | + } |
| 134 | + }, |
| 135 | + 'interpolation': interpolation, |
| 136 | + 'string': /[\s\S]+/ |
| 137 | + } |
| 138 | + }, |
| 139 | + { |
| 140 | + pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
| 141 | + alias: 'heredoc-string', |
| 142 | + greedy: true, |
| 143 | + inside: { |
| 144 | + 'delimiter': { |
| 145 | + pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i, |
| 146 | + inside: { |
| 147 | + 'symbol': /\b\w+/, |
| 148 | + 'punctuation': /^<<[-~]?'|'$/, |
| 149 | + } |
| 150 | + }, |
| 151 | + 'string': /[\s\S]+/ |
| 152 | + } |
104 | 153 | }
|
105 |
| - }, |
106 |
| - { |
107 |
| - pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
108 |
| - alias: 'heredoc-string', |
109 |
| - greedy: true, |
110 |
| - inside: { |
111 |
| - 'delimiter': { |
112 |
| - pattern: /^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i, |
113 |
| - alias: 'symbol', |
114 |
| - inside: { |
115 |
| - 'punctuation': /^<<[-~]?/ |
| 154 | + ], |
| 155 | + 'command-literal': [ |
| 156 | + { |
| 157 | + pattern: RegExp(/%x/.source + percentExpression), |
| 158 | + greedy: true, |
| 159 | + inside: { |
| 160 | + 'interpolation': interpolation, |
| 161 | + 'command': { |
| 162 | + pattern: /[\s\S]+/, |
| 163 | + alias: 'string' |
116 | 164 | }
|
117 |
| - }, |
118 |
| - 'interpolation': interpolation |
119 |
| - } |
120 |
| - }, |
121 |
| - { |
122 |
| - pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
123 |
| - alias: 'heredoc-string', |
124 |
| - greedy: true, |
125 |
| - inside: { |
126 |
| - 'delimiter': { |
127 |
| - pattern: /^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i, |
128 |
| - alias: 'symbol', |
129 |
| - inside: { |
130 |
| - 'punctuation': /^<<[-~]?'|'$/, |
| 165 | + } |
| 166 | + }, |
| 167 | + { |
| 168 | + pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/, |
| 169 | + greedy: true, |
| 170 | + inside: { |
| 171 | + 'interpolation': interpolation, |
| 172 | + 'command': { |
| 173 | + pattern: /[\s\S]+/, |
| 174 | + alias: 'string' |
131 | 175 | }
|
132 | 176 | }
|
133 | 177 | }
|
134 |
| - } |
135 |
| - ]; |
| 178 | + ] |
| 179 | + }); |
| 180 | + |
| 181 | + delete Prism.languages.ruby.string; |
| 182 | + |
| 183 | + Prism.languages.insertBefore('ruby', 'number', { |
| 184 | + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/, |
| 185 | + 'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/ |
| 186 | + }); |
136 | 187 |
|
137 | 188 | Prism.languages.rb = Prism.languages.ruby;
|
138 | 189 | }(Prism));
|
0 commit comments