lib/rouge/lexers/liquid.rb in rouge-4.1.0 vs lib/rouge/lexers/liquid.rb in rouge-4.1.1

- old
+ new

@@ -6,280 +6,280 @@ class Liquid < RegexLexer title "Liquid" desc 'Liquid is a templating engine for Ruby (liquidmarkup.org)' tag 'liquid' filenames '*.liquid' + mimetypes 'text/html+liquid' state :root do rule %r/[^\{]+/, Text rule %r/(\{%-?)(\s*)/ do - groups Punctuation, Text::Whitespace - push :tag_or_block + groups Comment::Preproc, Text::Whitespace + push :logic end rule %r/(\{\{-?)(\s*)/ do - groups Punctuation, Text::Whitespace + groups Comment::Preproc, Text::Whitespace push :output end rule %r/\{/, Text end - state :tag_or_block do + state :end_logic do + rule(/(\s*)(-?%\})/) do + groups Text::Whitespace, Comment::Preproc + reset_stack + end + + rule(/\n\s*/) do + token Text::Whitespace + if in_state? :liquid + pop! until state? :liquid + end + end + + mixin :whitespace + end + + state :end_output do + rule(/(\s*)(-?\}\})/) do + groups Text::Whitespace, Comment::Preproc + reset_stack + end + end + + state :liquid do + mixin :end_logic + mixin :logic + end + + state :logic do + rule %r/(liquid)\b/, Name::Tag, :liquid + # builtin logic blocks - rule %r/(if|elsif|unless|case)\b/, Keyword::Reserved, :condition - rule %r/(when)\b/, Keyword::Reserved, :when + rule %r/(if|elsif|unless|case)\b/, Name::Tag, :condition + rule %r/(when)\b/, Name::Tag, :value + rule %r/(else|ifchanged|end\w+)\b/, Name::Tag, :end_logic + rule %r/(break|continue)\b/, Keyword::Reserved, :end_logic - rule %r/(else)(\s*)(-?%\})/ do - groups Keyword::Reserved, Text::Whitespace, Punctuation - pop! + # builtin iteration blocks + rule %r/(for|tablerow)(\s+)(\S+)(\s+)(in)(\s+)/ do + groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, + Name::Tag, Text::Whitespace + push :iteration_args end # other builtin blocks - rule %r/(capture|(?:in|de)crement)(\s+)([^\s%]+)(\s*)(-?%\})/ do - groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, Punctuation - pop! + rule %r/(capture|(?:in|de)crement)(\s+)([a-zA-Z_](?:\w|-(?!%))*)/ do + groups Name::Tag, Text::Whitespace, Name::Variable + push :end_logic end rule %r/(comment)(\s*)(-?%\})/ do - groups Name::Tag, Text::Whitespace, Punctuation + groups Name::Tag, Text::Whitespace, Comment::Preproc push :comment end rule %r/(raw)(\s*)(-?%\})/ do - groups Name::Tag, Text::Whitespace, Punctuation + groups Name::Tag, Text::Whitespace, Comment::Preproc push :raw end - # end of block - rule %r/(end(?:if|unless|case))(\s*)(-?%\})/ do - groups Keyword::Reserved, Text::Whitespace, Punctuation - pop! - end - - rule %r/(end(?:[^\s%]+))(\s*)(-?%\})/ do - groups Name::Tag, Text::Whitespace, Punctuation - pop! - end - # builtin tags rule %r/(assign|echo)\b/, Name::Tag, :assign - rule %r/(include|render)\b/, Name::Tag, :include - rule %r/(cycle)(\s+)(?:([^\s:]*)(\s*)(:))?(\s*)/ do |m| + rule %r/(include|render)(\s+)([\/\w-]+(?:\.[\w-]+)+\b)?/ do + groups Name::Tag, Text::Whitespace, Text + push :include + end + + rule %r/(cycle)(\s+)(?:([\w-]+|'[^']*'|"[^"]*")(\s*)(:))?(\s*)/ do |m| token_class = case m[3] when %r/'[^']*'/ then Str::Single when %r/"[^"]*"/ then Str::Double else Name::Attribute end - groups Name::Tag, Text::Whitespace, token_class, Text::Whitespace, Punctuation, Text::Whitespace - - push :variable_tag_markup + push :tag_args end - # iteration - rule %r/ - (for|tablerow)(\s+) - ([\w-]+)(\s+) - (in)(\s+) - ( - (?: [^\s%,\|'"] | (?:"[^"]*"|'[^']*') )+ - )(\s*) - /x do |m| - groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, - Name::Tag, Text::Whitespace + # custom tags or blocks + rule %r/(\w+)\b/, Name::Tag, :block_args - token_class = case m[7] - when %r/'[^']*'/ then Str::Single - when %r/"[^"]*"/ then Str::Double - else - Name::Variable - end - token token_class, m[7] - token Text::Whitespace, m[8] - push :tag_markup - end - - # other tags or blocks - rule %r/([^\s%]+)(\s*)/ do - groups Name::Tag, Text::Whitespace - push :tag_markup - end + mixin :end_logic end state :output do - rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do - groups Punctuation, Text::Whitespace, Name::Function + rule %r/(\|)(\s*)/ do + groups Punctuation, Text::Whitespace push :filters + push :filter end - mixin :end_of_tag - mixin :generic + mixin :end_output + mixin :static + mixin :variable end - state :filters do - rule %r/(\|)(\s*)([a-zA-Z_][^\s%}\|:]*)/ do - groups Punctuation, Text::Whitespace, Name::Function - end - - mixin :end_of_tag - mixin :end_of_block - mixin :variable_param_markup - end - state :condition do rule %r/([=!]=|[<>]=?)/, Operator rule %r/(and|or|contains)\b/, Operator::Word - mixin :end_of_block - mixin :generic + mixin :value end - state :when do - mixin :end_of_block - mixin :generic + state :value do + mixin :end_logic + mixin :static + mixin :variable end - state :end_of_tag do - rule(/-?\}\}/) { token Punctuation; reset_stack } - end + state :iteration_args do + rule %r/(reversed|continue)\b/, Name::Attribute + rule %r/\(/, Punctuation, :range - state :end_of_block do - rule(/-?%\}/) { token Punctuation; reset_stack } + mixin :tag_args end - # states for unknown markup - state :param_markup do - mixin :whitespace - mixin :keyword - mixin :string - mixin :number + state :block_args do + rule %r/(\{\{-?)/, Comment::Preproc, :output_embed - rule %r/([^\s=:]+)(\s*)(=|:)/ do - groups Name::Attribute, Text::Whitespace, Operator + rule %r/(\|)(\s*)/ do + groups Punctuation, Text::Whitespace + push :filters + push :filter end - rule %r/[,:]/, Punctuation + mixin :tag_args end - state :default_param_markup do - mixin :param_markup - - rule %r/\S+/, Text + state :tag_args do + mixin :end_logic + mixin :args end - state :variable_param_markup do - mixin :param_markup - mixin :variable - - rule %r/\S+/, Text - end - - state :tag_markup do - rule %r/(reversed)\b/, Name::Attribute - - mixin :end_of_block - mixin :default_param_markup - end - - state :variable_tag_markup do - mixin :end_of_block - mixin :variable_param_markup - end - - # states for different values types - state :keyword do - rule %r/(false|true|nil)\b/, Keyword::Constant - end - - state :variable do - rule %r/(empty|blank|forloop\.[^\s%}\|:]+)\b/, Name::Builtin - rule %r/\.(?=\w)|\[|\]/, Punctuation - rule %r/(first|last|size)\b/, Name::Function - rule %r/[a-zA-Z_][\w-]*\??/, Name::Variable - end - - state :string do - rule %r/'[^']*'/, Str::Single - rule %r/"[^"]*"/, Str::Double - end - - state :number do - rule %r/-/, Operator - rule %r/\d+\.\d+/, Num::Float - rule %r/\d+/, Num::Integer - end - - state :generic do - mixin :whitespace - mixin :keyword - mixin :string - mixin :number - mixin :variable - end - - state :whitespace do - rule %r/[ \t]+/, Text::Whitespace - end - state :comment do rule %r/[^\{]+/, Comment rule %r/(\{%-?)(\s*)(endcomment)(\s*)(-?%\})/ do - groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation + groups Comment::Preproc, Text::Whitespace, Name::Tag, Text::Whitespace, Comment::Preproc reset_stack end rule %r/\{/, Comment end state :raw do rule %r/[^\{]+/, Text rule %r/(\{%-?)(\s*)(endraw)(\s*)(-?%\})/ do - groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation + groups Comment::Preproc, Text::Whitespace, Name::Tag, Text::Whitespace, Comment::Preproc reset_stack end rule %r/\{/, Text end state :assign do rule %r/=/, Operator + rule %r/\(/, Punctuation, :range - rule %r/(\|)(\s*)([a-zA-Z_][^\s%\|:]*)/ do - groups Punctuation, Text::Whitespace, Name::Function + rule %r/(\|)(\s*)/ do + groups Punctuation, Text::Whitespace push :filters + push :filter end - mixin :end_of_block - mixin :generic + mixin :value end state :include do - rule %r/(\{\{-?)(\s*)/ do + rule %r/(\{\{-?)/, Comment::Preproc, :output_embed + rule %r/(with|for|as)\b/, Keyword::Reserved + + mixin :tag_args + end + + state :output_embed do + rule %r/(\|)(\s*)([a-zA-Z_](?:\w|-(?!}))*)/ do + groups Punctuation, Text::Whitespace, Name::Function + end + + rule %r/-?\}\}/, Comment::Preproc, :pop! + + mixin :args + end + + state :range do + rule %r/\.\./, Punctuation + rule %r/\)/, Punctuation, :pop! + + mixin :whitespace + mixin :number + mixin :variable + end + + state :filters do + rule %r/(\|)(\s*)/ do groups Punctuation, Text::Whitespace - push :output_embed + push :filter end - rule %r/(with|for)\b/, Name::Tag - rule %r/[\/\w-]+(\.[\w-]+)+\b/, Text + mixin :end_logic + mixin :end_output + mixin :args + end - mixin :variable_tag_markup + state :filter do + rule %r/[a-zA-Z_](?:\w|-(?![%}]))*/, Name::Function, :pop! + + mixin :whitespace end - state :output_embed do - rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do - groups Punctuation, Text::Whitespace, Name::Function + state :args do + mixin :static + + rule %r/([a-zA-Z_][\w-]*)(\s*)(=|:)/ do + groups Name::Attribute, Text::Whitespace, Operator end - rule %r/-?\}\}/, Punctuation, :pop! + mixin :variable + end - mixin :variable_param_markup + state :static do + rule %r/(false|true|nil)\b/, Keyword::Constant + rule %r/'[^']*'/, Str::Single + rule %r/"[^"]*"/, Str::Double + rule %r/[,:]/, Punctuation + + mixin :whitespace + mixin :number + end + + state :whitespace do + rule %r/\s+/, Text::Whitespace + rule %r/#.*?(?=$|-?[}%]})/, Comment + end + + state :number do + rule %r/-/, Operator + rule %r/\d+\.\d+/, Num::Float + rule %r/\d+/, Num::Integer + end + + state :variable do + rule %r/(\.)(\s*)(first|last|size)\b(?![?!\/])/ do + groups Punctuation, Text::Whitespace, Name::Function + end + + rule %r/\.(?= *\w)|\[|\]/, Punctuation + rule %r/(empty|blank|(for|tablerow)loop\.(parentloop\.)*\w+)\b(?![?!\/])/, Name::Builtin + rule %r/[a-zA-Z_][\w-]*\b-?(?![?!\/])/, Name::Variable + rule %r/\S+/, Text end end end end