mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-19 10:52:48 -07:00
context-1
This commit is contained in:
+21
-19
@@ -1,24 +1,25 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative "tags/table_row"
|
||||
require_relative "tags/echo"
|
||||
require_relative "tags/if"
|
||||
require_relative "tags/break"
|
||||
require_relative "tags/inline_comment"
|
||||
require_relative "tags/for"
|
||||
require_relative "tags/assign"
|
||||
require_relative "tags/ifchanged"
|
||||
require_relative "tags/case"
|
||||
require_relative "tags/include"
|
||||
require_relative "tags/continue"
|
||||
require_relative "tags/capture"
|
||||
require_relative "tags/decrement"
|
||||
require_relative "tags/unless"
|
||||
require_relative "tags/increment"
|
||||
require_relative "tags/comment"
|
||||
require_relative "tags/raw"
|
||||
require_relative "tags/render"
|
||||
require_relative "tags/cycle"
|
||||
require_relative 'tags/table_row'
|
||||
require_relative 'tags/echo'
|
||||
require_relative 'tags/if'
|
||||
require_relative 'tags/break'
|
||||
require_relative 'tags/inline_comment'
|
||||
require_relative 'tags/for'
|
||||
require_relative 'tags/assign'
|
||||
require_relative 'tags/ifchanged'
|
||||
require_relative 'tags/case'
|
||||
require_relative 'tags/include'
|
||||
require_relative 'tags/continue'
|
||||
require_relative 'tags/capture'
|
||||
require_relative 'tags/decrement'
|
||||
require_relative 'tags/unless'
|
||||
require_relative 'tags/increment'
|
||||
require_relative 'tags/comment'
|
||||
require_relative 'tags/raw'
|
||||
require_relative 'tags/render'
|
||||
require_relative 'tags/cycle'
|
||||
require_relative 'tags/let'
|
||||
|
||||
module Liquid
|
||||
module Tags
|
||||
@@ -42,6 +43,7 @@ module Liquid
|
||||
'if' => If,
|
||||
'echo' => Echo,
|
||||
'tablerow' => TableRow,
|
||||
'let' => Let,
|
||||
}.freeze
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Liquid
|
||||
class Let < Liquid::Block
|
||||
MULTI_ASSIGNMENT = /\A\(\s*(?<vars>[^)]+)\s*\):\s*(?<source>[^\s]+)\z/
|
||||
VAR_ASSIGNMENTS = /(?<var>[\w-]+)\s*:\s*(?<expr>[^\s,]+)/
|
||||
|
||||
def initialize(tag_name, markup, options)
|
||||
super(tag_name, markup, options)
|
||||
@assignments = parse_markup(markup.strip)
|
||||
end
|
||||
|
||||
def render(context)
|
||||
subcontext = context.new_isolated_subcontext
|
||||
|
||||
@assignments.each do |var, expression|
|
||||
subcontext[var] = lookup(context, expression)
|
||||
end
|
||||
|
||||
super(subcontext)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse_markup(markup)
|
||||
if (m = MULTI_ASSIGNMENT.match(markup))
|
||||
variables = m[:vars].split(/\s*,\s*/)
|
||||
source = m[:source]
|
||||
variables.map { |v| [v, "#{source}.#{v}"] }.to_h
|
||||
else
|
||||
markup.scan(VAR_ASSIGNMENTS).to_h
|
||||
end
|
||||
end
|
||||
|
||||
def lookup(context, expression)
|
||||
variable_lookup = Liquid::VariableLookup.new(expression)
|
||||
variable_lookup.evaluate(context)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user