lib/octopress-ink/helpers/var.rb in octopress-ink-1.0.0.alpha.24 vs lib/octopress-ink/helpers/var.rb in octopress-ink-1.0.0.alpha.25

- old
+ new

@@ -1,9 +1,10 @@ module Octopress module Helpers module Var TERNARY = /(.*?)\(\s*(.+?)\s+\?\s+(.+?)\s+:\s+(.+?)\s*\)(.+)?/ + HAS_FILTERS = /(.+?)(\s+\|\s+.+)/ def self.set_var(var, operator, value, context) case operator when '||=' context.scopes.last[var] = value if context.scopes.last[var].nil? @@ -20,24 +21,83 @@ end def self.get_value(vars, context) vars = evaluate_ternary(vars, context) vars = vars.strip.gsub(/ or /, ' || ') + filters = false + if vars =~ HAS_FILTERS + vars = $1 + filters = $2 + end vars = vars.split(/ \|\| /).map { |v| - Liquid::Variable.new(v.strip).render(context) + context[v.strip] }.compact - vars.empty? ? nil : vars.first + var = vars.first + if filters + var = Liquid::Variable.new("'#{var}'"+ filters).render(context) + end + var end def self.evaluate_ternary(markup, context) if markup =~ TERNARY - $1 + (Conditional.parse("if #{$2}", context) ? $3 : $4) + $5 + $1 + (Conditional.parse(" if #{$2}", context) ? $3 : $4) + $5 else markup end end + # Parses filters into arrays + # + # input - a string of one or more filters, e.g. "| upcase | replace:'a','b'" + # + # Returns nested arrays of filters and arguments + # + def self.parse_filters(input) + output = [] + if input.match(/#{Liquid::FilterSeparator}\s*(.*)/o) + filters = Regexp.last_match(1).scan(Liquid::Variable::FilterParser) + filters.each do |f| + if matches = f.match(/\s*(\w+)/) + filtername = matches[1] + filterargs = f.scan(/(?:#{Liquid::FilterArgumentSeparator}|#{Liquid::ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{Liquid::QuotedFragment})/o).flatten + output << [filtername, filterargs] + end + end + end + output + end + + # Passes input through Liquid filters + # + # content - a string to be parsed + # filters - a series of liquid filters e.g. "| upcase | replace:'a','b'" + # context - the current Liquid context object + # + # Returns a filtered string + # + def self.render_filters(content, filters, context) + filters = parse_filters(filters) + return '' if content.nil? + filters.inject(content) do |output, filter| + filterargs = [] + keyword_args = {} + filter[1].to_a.each do |a| + if matches = a.match(/\A#{Liquid::TagAttributes}\z/o) + keyword_args[matches[1]] = context[matches[2]] + else + filterargs << context[a] + end + end + filterargs << keyword_args unless keyword_args.empty? + begin + output = context.invoke(filter[0], output, *filterargs) + rescue + raise "Error - filter '#{filter[0]}' could not be found." + end + end + end end end end