|
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