lib/octopress-ink/helpers/var.rb in octopress-ink-1.0.0.alpha.31 vs lib/octopress-ink/helpers/var.rb in octopress-ink-1.0.0.alpha.32

- old
+ new

@@ -1,100 +1,102 @@ module Octopress - module Helpers - module Var - TERNARY = /(.*?)\(\s*(.+?)\s+\?\s+(.+?)\s+:\s+(.+?)\s*\)(.+)?/ - HAS_FILTERS = /(.*?)(\s+\|\s+.+)/ + module Ink + 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? - when '+=' - if context.scopes.last[var].nil? - context.scopes.last[var] = value + def self.set_var(var, operator, value, context) + case operator + when '||=' + context.scopes.last[var] = value if context.scopes.last[var].nil? + when '+=' + if context.scopes.last[var].nil? + context.scopes.last[var] = value + else + context.scopes.last[var] += value + end else - context.scopes.last[var] += value + context.scopes.last[var] = value end - else - context.scopes.last[var] = value + context end - context - 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| - context[v.strip] - }.compact + 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| + context[v.strip] + }.compact - var = vars.first - if filters - var = Liquid::Variable.new("'#{var}'"+ filters).render(context) + var = vars.first + if filters + var = Liquid::Variable.new("'#{var}'"+ filters).render(context) + end + var end - var - end - def self.evaluate_ternary(markup, context) - if markup =~ TERNARY - $1 + (Conditional.parse(" if #{$2}", context) ? $3 : $4) + $5 - else - markup + def self.evaluate_ternary(markup, context) + if markup =~ TERNARY + $1 + (Conditional.parse(" if #{$2}", context) ? $3 : $4) + $5 + else + markup + end 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] + # 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 - 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] + # 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 - 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." + 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