# -*- coding: utf-8 -*- # module Rouge module Lexers class Liquid < RegexLexer title "Liquid" desc 'Liquid is a templating engine for Ruby (liquidmarkup.org)' tag 'liquid' filenames '*.liquid' state :root do rule /[^\{]+/, Text rule /(\{%)(\s*)/ do groups Punctuation, Text::Whitespace push :tag_or_block end rule /(\{\{)(\s*)/ do groups Punctuation, Text::Whitespace push :output end rule /\{/, Text end state :tag_or_block do # builtin logic blocks rule /(if|unless|elsif|case)(?=\s+)/, Keyword::Reserved, :condition rule /(when)(\s+)/ do groups Keyword::Reserved, Text::Whitespace push :when end rule /(else)(\s*)(%\})/ do groups Keyword::Reserved, Text::Whitespace, Punctuation pop! end # other builtin blocks rule /(capture)(\s+)([^\s%]+)(\s*)(%\})/ do groups Name::Tag, Text::Whitespace, Name::Attribute, Text::Whitespace, Punctuation pop! end rule /(comment)(\s*)(%\})/ do groups Name::Tag, Text::Whitespace, Punctuation push :comment end rule /(raw)(\s*)(%\})/ do groups Name::Tag, Text::Whitespace, Punctuation push :raw end rule /assign/, Name::Tag, :assign rule /include/, Name::Tag, :include # end of block rule /(end(case|unless|if))(\s*)(%\})/ do groups Keyword::Reserved, nil, Text::Whitespace, Punctuation pop! end rule /(end([^\s%]+))(\s*)(%\})/ do groups Name::Tag, nil, Text::Whitespace, Punctuation pop! end # builtin tags rule /(cycle)(\s+)(([^\s:]*)(:))?(\s*)/ do |m| token Name::Tag, m[1] token Text::Whitespace, m[2] if m[4] =~ /'[^']*'/ token Str::Single, m[4] elsif m[4] =~ /"[^"]*"/ token Str::Double, m[4] else token Name::Attribute, m[4] end token Punctuation, m[5] token Text::Whitespace, m[6] push :variable_tag_markup end # other tags or blocks rule /([^\s%]+)(\s*)/ do groups Name::Tag, Text::Whitespace push :tag_markup end end state :output do mixin :whitespace mixin :generic rule /\}\}/, Punctuation, :pop! rule /\|/, Punctuation, :filters end state :filters do mixin :whitespace rule (/\}\}/) { token Punctuation; reset_stack } rule /([^\s\|:]+)(:?)(\s*)/ do groups Name::Function, Punctuation, Text::Whitespace push :filter_markup end end state :filter_markup do rule /\|/, Punctuation, :pop! mixin :end_of_tag mixin :end_of_block mixin :default_param_markup end state :condition do mixin :end_of_block mixin :whitespace rule /([=!><]=?)/, Operator rule /\b((!)|(not\b))/ do groups nil, Operator, Operator::Word end rule /(contains)/, Operator::Word mixin :generic mixin :whitespace end state :when do mixin :end_of_block mixin :whitespace mixin :generic end state :operator do rule /(\s*)((=|!|>|<)=?)(\s*)/ do groups Text::Whitespace, Operator, nil, Text::Whitespace pop! end rule /(\s*)(\bcontains\b)(\s*)/ do groups Text::Whitespace, Operator::Word, Text::Whitespace pop! end end state :end_of_tag do rule (/\}\}/) { token Punctuation; reset_stack } end state :end_of_block do rule (/%\}/) { token Punctuation; reset_stack } end # states for unknown markup state :param_markup do mixin :whitespace mixin :string rule /([^\s=:]+)(\s*)(=|:)/ do groups Name::Attribute, Text::Whitespace, Operator end rule /(\{\{)(\s*)([^\s\}])(\s*)(\}\})/ do groups Punctuation, Text::Whitespace, nil, Text::Whitespace, Punctuation end mixin :number mixin :keyword rule /,/, Punctuation end state :default_param_markup do mixin :param_markup rule /./, Text end state :variable_param_markup do mixin :param_markup mixin :variable rule /./, Text end state :tag_markup do 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 /\b(false|true)\b/, Keyword::Constant end state :variable do rule /\.(?=\w)/, Punctuation rule /[a-zA-Z_]\w*/, Name::Variable end state :string do rule /'[^']*'/, Str::Single rule /"[^"]*"/, Str::Double end state :number do rule /\d+\.\d+/, Num::Float rule /\d+/, Num::Integer end state :array_index do rule /\[/, Punctuation rule /\]/, Punctuation end state :generic do mixin :array_index mixin :keyword mixin :string mixin :variable mixin :number end state :whitespace do rule /[ \t]+/, Text::Whitespace end state :comment do rule /(\{%)(\s*)(endcomment)(\s*)(%\})/ do groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation reset_stack end rule /./, Comment end state :raw do rule /[^\{]+/, Text rule /(\{%)(\s*)(endraw)(\s*)(%\})/ do groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation reset_stack end rule /\{/, Text end state :assign do mixin :whitespace mixin :end_of_block rule /(\s*)(=)(\s*)/ do groups Text::Whitespace, Operator, Text::Whitespace end rule /\|/, Punctuation, :filters mixin :generic end state :include do mixin :whitespace rule /([^\.]+)(\.)(html|liquid)/ do groups Name::Attribute, Punctuation, Name::Attribute end mixin :variable_tag_markup end end end end