diff --git a/CHANGES.md b/CHANGES.md index 4b7c3021fd..bf95f0277d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -25,6 +25,7 @@ Core Grammars: - enh(json) add json5 support [Kerry Shetline][] - fix(css) `unicode-range` parsing, issue #4253 [Kerry Shetline][] - fix(csharp) Support digit separators [te-ing][] +- fix(ruby) support nested content in `%r{}` regex literals outside expression contexts [Jacques Erasmus][] Documentation: @@ -53,6 +54,7 @@ CONTRIBUTORS [Thomas Gorissen]: https://github.com/serrynaimo [te-ing]: https://github.com/te-ing [Anthony Martin]: https://github.com/anthony-c-martin +[Jacques Erasmus]: https://github.com/j-erasmus ## Version 11.11.1 diff --git a/src/languages/ruby.js b/src/languages/ruby.js index 91b2cb527d..ce2ffc18a5 100644 --- a/src/languages/ruby.js +++ b/src/languages/ruby.js @@ -227,6 +227,34 @@ export default function(hljs) { ] }; + const REGEXP = { + className: 'regexp', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST, + { + begin: /\[/, + end: /\]/, + contains: [ + hljs.BACKSLASH_ESCAPE, + { begin: /\\./ } + ] + }, + { + begin: /\{/, end: /\}/, + contains: ['self', hljs.BACKSLASH_ESCAPE, SUBST], + relevance: 0 + } + ], + illegal: /\n/, + variants: [ + { begin: /%r\{/, end: /\}[a-z]*/ }, + { begin: /%r\(/, end: /\)[a-z]*/ }, + { begin: /%r!/, end: /![a-z]*/ }, + { begin: /%r\[/, end: /\][a-z]*/ } + ] + }; + const PARAMS = { variants: [ { @@ -324,6 +352,7 @@ export default function(hljs) { UPPER_CASE_CONSTANT, CLASS_REFERENCE, METHOD_DEFINITION, + REGEXP, { // swallow namespace qualifiers before symbols begin: hljs.IDENT_RE + '::' }, @@ -372,22 +401,6 @@ export default function(hljs) { { begin: '/', end: '/[a-z]*' - }, - { - begin: /%r\{/, - end: /\}[a-z]*/ - }, - { - begin: '%r\\(', - end: '\\)[a-z]*' - }, - { - begin: '%r!', - end: '![a-z]*' - }, - { - begin: '%r\\[', - end: '\\][a-z]*' } ] } diff --git a/test/markup/ruby/regexes.expect.txt b/test/markup/ruby/regexes.expect.txt index 0c108383cf..2a9a63d80d 100644 --- a/test/markup/ruby/regexes.expect.txt +++ b/test/markup/ruby/regexes.expect.txt @@ -3,3 +3,9 @@ str =~ %r{foo|bar|buz$} str =~ %r!foo|bar$! str =~ %r[foo|bar$] str =~ %r(\(foo|bar\)$) +str =~ %r{(\.{2}|\A/)} +str =~ /[{}]/ +str =~ /[\]]/ +str =~ /[a-z]{3}/ +str =~ %r{[{}]+} +str =~ /#{var}[{}]/ diff --git a/test/markup/ruby/regexes.txt b/test/markup/ruby/regexes.txt index 9d31e03b44..d60c2a24e1 100644 --- a/test/markup/ruby/regexes.txt +++ b/test/markup/ruby/regexes.txt @@ -3,3 +3,9 @@ str =~ %r{foo|bar|buz$} str =~ %r!foo|bar$! str =~ %r[foo|bar$] str =~ %r(\(foo|bar\)$) +str =~ %r{(\.{2}|\A/)} +str =~ /[{}]/ +str =~ /[\]]/ +str =~ /[a-z]{3}/ +str =~ %r{[{}]+} +str =~ /#{var}[{}]/