Skip to content

Commit 0101fa1

Browse files
author
jneen
committed
BIML: properly delegate to C# within strings
1 parent 02bf963 commit 0101fa1

File tree

1 file changed

+34
-7
lines changed

1 file changed

+34
-7
lines changed

lib/rouge/lexers/biml.rb

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require_relative 'xml'
4+
require_relative 'csharp'
45

56
module Rouge
67
module Lexers
@@ -14,22 +15,48 @@ def self.detect?(text)
1415
return true if text =~ /<\s*Biml\b/
1516
end
1617

18+
start do
19+
@csharp = CSharp.new(options)
20+
end
21+
22+
state :biml_interp do
23+
rule %r(<#[=]?)m do
24+
token Name::Tag
25+
push :directive_as_csharp
26+
end
27+
end
28+
1729
prepend :root do
1830
rule %r(<#\@\s*)m, Name::Tag, :directive_tag
1931

20-
rule %r(<#[=]?\s*)m, Name::Tag, :directive_as_csharp
32+
mixin :biml_interp
2133
end
2234

2335
prepend :attr do
24-
#TODO: how to deal with embedded <# tags inside a attribute string
25-
#rule %r("<#[=]?\s*)m, Name::Tag, :directive_as_csharp
36+
rule(%r/"/) { token Str::Double; goto :biml_dq }
37+
rule(%r/'/) { token Str::Double; goto :biml_sq }
38+
39+
mixin :biml_interp
40+
end
41+
42+
state :biml_dq do
43+
rule %r/[^<"]+/, Str::Double
44+
mixin :biml_interp
45+
rule %r/"/, Str::Double, :pop!
46+
rule %r/</, Str::Double
47+
end
48+
49+
state :biml_sq do
50+
rule %r/[^<']+/, Str::Single
51+
mixin :biml_interp
52+
rule %r/'/, Str::Single, :pop!
53+
rule %r/</, Str::Single
2654
end
2755

2856
state :directive_as_csharp do
29-
rule %r/\s*#>\s*/m, Name::Tag, :pop!
30-
rule %r(.*?(?=\s*#>\s*))m do
31-
delegate CSharp
32-
end
57+
rule(/[^#]+/) { delegate @csharp }
58+
rule /#>/, Name::Tag, :pop!
59+
rule(/[#>]/) { delegate @csharp }
3360
end
3461

3562
state :directive_tag do

0 commit comments

Comments
 (0)