diff options
-rw-r--r-- | pygments/lexers/ruby.py | 3 | ||||
-rw-r--r-- | tests/test_ruby.py | 63 |
2 files changed, 64 insertions, 2 deletions
diff --git a/pygments/lexers/ruby.py b/pygments/lexers/ruby.py index e9973eea..52ba23ad 100644 --- a/pygments/lexers/ruby.py +++ b/pygments/lexers/ruby.py @@ -335,7 +335,8 @@ class RubyLexer(ExtendedRegexLexer): include('root') ], 'in-intp': [ - ('}', String.Interpol, '#pop'), + (r'{', String.Interpol, '#push'), + (r'}', String.Interpol, '#pop'), include('root'), ], 'string-intp': [ diff --git a/tests/test_ruby.py b/tests/test_ruby.py index 8f719d10..8420826e 100644 --- a/tests/test_ruby.py +++ b/tests/test_ruby.py @@ -9,7 +9,7 @@ import unittest -from pygments.token import Operator, Number, Text +from pygments.token import Operator, Number, Text, Token from pygments.lexers import RubyLexer @@ -50,3 +50,64 @@ class RubyTest(unittest.TestCase): ] self.assertEqual(tokens, list(self.lexer.get_tokens(fragment))) + def testInterpolationNestedCurly(self): + fragment = ( + u'"A#{ (3..5).group_by { |x| x/2}.map ' + u'do |k,v| "#{k}" end.join }" + "Z"\n') + + tokens = [ + (Token.Literal.String.Double, u'"'), + (Token.Literal.String.Double, u'A'), + (Token.Literal.String.Interpol, u'#{'), + (Token.Text, u' '), + (Token.Punctuation, u'('), + (Token.Literal.Number.Integer, u'3'), + (Token.Operator, u'..'), + (Token.Literal.Number.Integer, u'5'), + (Token.Punctuation, u')'), + (Token.Operator, u'.'), + (Token.Name, u'group_by'), + (Token.Text, u' '), + (Token.Literal.String.Interpol, u'{'), + (Token.Text, u' '), + (Token.Operator, u'|'), + (Token.Name, u'x'), + (Token.Operator, u'|'), + (Token.Text, u' '), + (Token.Name, u'x'), + (Token.Operator, u'/'), + (Token.Literal.Number.Integer, u'2'), + (Token.Literal.String.Interpol, u'}'), + (Token.Operator, u'.'), + (Token.Name, u'map'), + (Token.Text, u' '), + (Token.Keyword, u'do'), + (Token.Text, u' '), + (Token.Operator, u'|'), + (Token.Name, u'k'), + (Token.Punctuation, u','), + (Token.Name, u'v'), + (Token.Operator, u'|'), + (Token.Text, u' '), + (Token.Literal.String.Double, u'"'), + (Token.Literal.String.Interpol, u'#{'), + (Token.Name, u'k'), + (Token.Literal.String.Interpol, u'}'), + (Token.Literal.String.Double, u'"'), + (Token.Text, u' '), + (Token.Keyword, u'end'), + (Token.Operator, u'.'), + (Token.Name, u'join'), + (Token.Text, u' '), + (Token.Literal.String.Interpol, u'}'), + (Token.Literal.String.Double, u'"'), + (Token.Text, u' '), + (Token.Operator, u'+'), + (Token.Text, u' '), + (Token.Literal.String.Double, u'"'), + (Token.Literal.String.Double, u'Z'), + (Token.Literal.String.Double, u'"'), + (Token.Text, u'\n'), + ] + self.assertEqual(tokens, list(self.lexer.get_tokens(fragment))) + |