Class: Liquid::Include

Inherits:
Tag
  • Object
show all
Includes:
Tag::Disableable
Defined in:
lib/liquid/tags/include.rb

Defined Under Namespace

Classes: ParseTreeVisitor

Constant Summary collapse

SYNTAX =
/(#{QuotedFragment}+)(\s+(?:with|for)\s+(#{QuotedFragment}+))?(\s+(?:as)\s+(#{VariableSegment}+))?/o
Syntax =
SYNTAX

Instance Attribute Summary collapse

Attributes inherited from Tag

#line_number, #nodelist, #tag_name

Instance Method Summary collapse

Methods included from Tag::Disableable

#disabled_error

Methods inherited from Tag

#blank?, disable_tags, #name, parse, #raw, #render

Methods included from ParserSwitching

#parse_with_selected_parser, #strict2_mode?, #strict_parse_with_error_mode_fallback

Constructor Details

#initialize(tag_name, markup, options) ⇒ Include

Returns a new instance of Include.



28
29
30
31
# File 'lib/liquid/tags/include.rb', line 28

def initialize(tag_name, markup, options)
  super
  parse_with_selected_parser(markup)
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



26
27
28
# File 'lib/liquid/tags/include.rb', line 26

def attributes
  @attributes
end

#template_name_exprObject (readonly)

Returns the value of attribute template_name_expr.



26
27
28
# File 'lib/liquid/tags/include.rb', line 26

def template_name_expr
  @template_name_expr
end

#variable_name_exprObject (readonly)

Returns the value of attribute variable_name_expr.



26
27
28
# File 'lib/liquid/tags/include.rb', line 26

def variable_name_expr
  @variable_name_expr
end

Instance Method Details

#lax_parse(markup) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/liquid/tags/include.rb', line 111

def lax_parse(markup)
  if markup =~ SYNTAX
    template_name = Regexp.last_match(1)
    variable_name = Regexp.last_match(3)

    @alias_name         = Regexp.last_match(5)
    @variable_name_expr = variable_name ? parse_expression(variable_name) : nil
    @template_name_expr = parse_expression(template_name)
    @attributes         = {}

    markup.scan(TagAttributes) do |key, value|
      @attributes[key] = parse_expression(value)
    end

  else
    raise SyntaxError, options[:locale].t("errors.syntax.include")
  end
end

#parse(_tokens) ⇒ Object



33
34
# File 'lib/liquid/tags/include.rb', line 33

def parse(_tokens)
end

#render_to_output_buffer(context, output) ⇒ Object

Raises:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/liquid/tags/include.rb', line 36

def render_to_output_buffer(context, output)
  template_name = context.evaluate(@template_name_expr)
  raise ArgumentError, options[:locale].t("errors.argument.include") unless template_name.is_a?(String)

  partial = PartialCache.load(
    template_name,
    context: context,
    parse_context: parse_context,
  )

  context_variable_name = @alias_name || template_name.split('/').last

  variable = if @variable_name_expr
    context.evaluate(@variable_name_expr)
  else
    context.find_variable(template_name, raise_on_not_found: false)
  end

  old_template_name = context.template_name
  old_partial       = context.partial

  begin
    context.template_name = partial.name
    context.partial = true

    context.stack do
      @attributes.each do |key, value|
        context[key] = context.evaluate(value)
      end

      if variable.is_a?(Array)
        variable.each do |var|
          context[context_variable_name] = var
          partial.render_to_output_buffer(context, output)
        end
      else
        context[context_variable_name] = variable
        partial.render_to_output_buffer(context, output)
      end
    end
  ensure
    context.template_name = old_template_name
    context.partial       = old_partial
  end

  output
end

#strict2_parse(markup) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/liquid/tags/include.rb', line 87

def strict2_parse(markup)
  p = @parse_context.new_parser(markup)

  @template_name_expr = safe_parse_expression(p)
  @variable_name_expr = safe_parse_expression(p) if p.id?("for") || p.id?("with")
  @alias_name         = p.consume(:id) if p.id?("as")

  p.consume?(:comma)

  @attributes = {}
  while p.look(:id)
    key = p.consume
    p.consume(:colon)
    @attributes[key] = safe_parse_expression(p)
    p.consume?(:comma)
  end

  p.consume(:end_of_string)
end

#strict_parse(markup) ⇒ Object



107
108
109
# File 'lib/liquid/tags/include.rb', line 107

def strict_parse(markup)
  lax_parse(markup)
end