Index: lib/src/prism/components/prism-ruby.js |
diff --git a/lib/src/prism/components/prism-ruby.js b/lib/src/prism/components/prism-ruby.js |
index 030eefe9f769088979b5bf6e8c90dc8ded591593..10e8b5002dafec2e12b807bf030630a3374f21c4 100644 |
--- a/lib/src/prism/components/prism-ruby.js |
+++ b/lib/src/prism/components/prism-ruby.js |
@@ -4,34 +4,107 @@ |
* Adds the following new token classes: |
* constant, builtin, variable, symbol, regex |
*/ |
-Prism.languages.ruby = Prism.languages.extend('clike', { |
- 'comment': /#(?!\{[^\r\n]*?\})[^\r\n]*(\r?\n|$)/, |
- 'keyword': /\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/, |
- 'builtin': /\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, |
- 'constant': /\b[A-Z][a-zA-Z_0-9]*[?!]?\b/ |
-}); |
+(function(Prism) { |
+ Prism.languages.ruby = Prism.languages.extend('clike', { |
+ 'comment': /#(?!\{[^\r\n]*?\}).*/, |
+ 'keyword': /\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/ |
+ }); |
-Prism.languages.insertBefore('ruby', 'keyword', { |
- 'regex': { |
- pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/, |
- lookbehind: true |
- }, |
- 'variable': /[@$]+\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/, |
- 'symbol': /:\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/ |
-}); |
+ var interpolation = { |
+ pattern: /#\{[^}]+\}/, |
+ inside: { |
+ 'delimiter': { |
+ pattern: /^#\{|\}$/, |
+ alias: 'tag' |
+ }, |
+ rest: Prism.util.clone(Prism.languages.ruby) |
+ } |
+ }; |
+ |
+ Prism.languages.insertBefore('ruby', 'keyword', { |
+ 'regex': [ |
+ { |
+ pattern: /%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ // Here we need to specifically allow interpolation |
+ pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/, |
+ lookbehind: true |
+ } |
+ ], |
+ 'variable': /[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/, |
+ 'symbol': /:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/ |
+ }); |
+ |
+ Prism.languages.insertBefore('ruby', 'number', { |
+ 'builtin': /\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, |
+ 'constant': /\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/ |
+ }); |
-Prism.languages.ruby.string = { |
- pattern: /("|')(#\{[^}]+\}|\\\n|\\?.)*?\1/, |
- inside: { |
- 'interpolation': { |
- pattern: /#\{[^}]+\}/, |
+ Prism.languages.ruby.string = [ |
+ { |
+ pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ // Here we need to specifically allow interpolation |
+ pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, |
+ inside: { |
+ 'interpolation': interpolation |
+ } |
+ }, |
+ { |
+ pattern: /("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/, |
inside: { |
- 'delimiter': { |
- pattern: /^#\{|\}$/, |
- alias: 'tag' |
- }, |
- rest: Prism.util.clone(Prism.languages.ruby) |
+ 'interpolation': interpolation |
} |
} |
- } |
-}; |
+ ]; |
+}(Prism)); |