context-1

This commit is contained in:
Guilherme Carreiro
2025-02-05 15:31:48 +01:00
parent bfe29e11be
commit 432c171be9
5 changed files with 191 additions and 19 deletions
+21 -19
View File
@@ -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
+40
View File
@@ -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