diff --git a/lib/rouge/lexers/biml.rb b/lib/rouge/lexers/biml.rb index e1c8c6cf69..3d789a792c 100644 --- a/lib/rouge/lexers/biml.rb +++ b/lib/rouge/lexers/biml.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative 'xml' +require_relative 'csharp' module Rouge module Lexers @@ -14,22 +15,48 @@ def self.detect?(text) return true if text =~ /<\s*Biml\b/ end + start do + @csharp = CSharp.new(options) + end + + state :biml_interp do + rule %r(<#[=]?)m do + token Name::Tag + push :directive_as_csharp + end + end + prepend :root do rule %r(<#\@\s*)m, Name::Tag, :directive_tag - rule %r(<#[=]?\s*)m, Name::Tag, :directive_as_csharp + mixin :biml_interp end prepend :attr do - #TODO: how to deal with embedded <# tags inside a attribute string - #rule %r("<#[=]?\s*)m, Name::Tag, :directive_as_csharp + rule(%r/"/) { token Str::Double; goto :biml_dq } + rule(%r/'/) { token Str::Double; goto :biml_sq } + + mixin :biml_interp + end + + state :biml_dq do + rule %r/[^<"]+/, Str::Double + mixin :biml_interp + rule %r/"/, Str::Double, :pop! + rule %r/\s*/m, Name::Tag, :pop! - rule %r(.*?(?=\s*#>\s*))m do - delegate CSharp - end + rule(/[^#]+/) { delegate @csharp } + rule /#>/, Name::Tag, :pop! + rule(/[#>]/) { delegate @csharp } end state :directive_tag do