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}[{}]/