Skip to content

Commit eb40cc7

Browse files
committed
fix(ruby): handle braces correctly inside regex character classes
- Add character class handling to prevent {} inside [] from being treated as interpolation - Support escaped closing brackets (\]) within character classes - Ensure quantifiers like {3} still work outside character classes - Add test cases to verify edge cases are handled properly
1 parent 71fdc0d commit eb40cc7

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

src/languages/ruby.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,14 @@ export default function(hljs) {
232232
contains: [
233233
hljs.BACKSLASH_ESCAPE,
234234
SUBST,
235+
{
236+
begin: /\[/,
237+
end: /\]/,
238+
contains: [
239+
hljs.BACKSLASH_ESCAPE,
240+
{ begin: /\\./ }
241+
]
242+
},
235243
{
236244
begin: /\{/, end: /\}/,
237245
contains: ['self', hljs.BACKSLASH_ESCAPE, SUBST],
@@ -241,10 +249,10 @@ export default function(hljs) {
241249
illegal: /\n/,
242250
variants: [
243251
{ begin: /%r\{/, end: /\}[a-z]*/ },
244-
{ begin: '%r\\(', end: '\\)[a-z]*' },
245-
{ begin: '%r!', end: '![a-z]*' },
246-
{ begin: '%r\\[', end: '\\][a-z]*' },
247-
{ begin: '/', end: '/[a-z]*' }
252+
{ begin: /%r\(/, end: /\)[a-z]*/ },
253+
{ begin: /%r!/, end: /![a-z]*/ },
254+
{ begin: /%r\[/, end: /\][a-z]*/ },
255+
{ begin: /\//, end: /\/[a-z]*/ }
248256
]
249257
};
250258

test/markup/ruby/regexes.expect.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@ str =~ <span class="hljs-regexp">%r!foo|bar$!</span>
44
str =~ <span class="hljs-regexp">%r[foo|bar$]</span>
55
str =~ <span class="hljs-regexp">%r(\(foo|bar\)$)</span>
66
str =~ <span class="hljs-regexp">%r{(\.{2}|\A/)}</span>
7+
str =~ <span class="hljs-regexp">/[{}]/</span>
8+
str =~ <span class="hljs-regexp">/[\]]/</span>
9+
str =~ <span class="hljs-regexp">/[a-z]{3}/</span>
10+
str =~ <span class="hljs-regexp">%r{[{}]+}</span>
11+
str =~ <span class="hljs-regexp">/<span class="hljs-subst">#{var}</span>[{}]/</span>

test/markup/ruby/regexes.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@ str =~ %r!foo|bar$!
44
str =~ %r[foo|bar$]
55
str =~ %r(\(foo|bar\)$)
66
str =~ %r{(\.{2}|\A/)}
7+
str =~ /[{}]/
8+
str =~ /[\]]/
9+
str =~ /[a-z]{3}/
10+
str =~ %r{[{}]+}
11+
str =~ /#{var}[{}]/

0 commit comments

Comments
 (0)