class Liquid::BlockBody

Constants

ContentOfVariable
FullToken
TAGSTART
VARSTART
WhitespaceOrNothing

Attributes

nodelist[R]

Public Class Methods

new() click to toggle source
# File lib/liquid/block_body.rb, line 11
def initialize
  @nodelist = []
  @blank = true
end

Public Instance Methods

blank?() click to toggle source
# File lib/liquid/block_body.rb, line 65
def blank?
  @blank
end
parse(tokenizer, parse_context) { |tag_name, markup| ... } click to toggle source
# File lib/liquid/block_body.rb, line 16
def parse(tokenizer, parse_context)
  parse_context.line_number = tokenizer.line_number
  while token = tokenizer.shift
    next if token.empty?
    case
    when token.start_with?(TAGSTART)
      whitespace_handler(token, parse_context)
      unless token =~ FullToken
        raise_missing_tag_terminator(token, parse_context)
      end
      tag_name = $1
      markup = $2
      # fetch the tag from registered blocks
      unless tag = registered_tags[tag_name]
        # end parsing if we reach an unknown tag and let the caller decide
        # determine how to proceed
        return yield tag_name, markup
      end
      new_tag = tag.parse(tag_name, markup, tokenizer, parse_context)
      @blank &&= new_tag.blank?
      @nodelist << new_tag
    when token.start_with?(VARSTART)
      whitespace_handler(token, parse_context)
      @nodelist << create_variable(token, parse_context)
      @blank = false
    else
      if parse_context.trim_whitespace
        token.lstrip!
      end
      parse_context.trim_whitespace = false
      @nodelist << token
      @blank &&= !!(token =~ WhitespaceOrNothing)
    end
    parse_context.line_number = tokenizer.line_number
  end

  yield nil, nil
end
render(context) click to toggle source
# File lib/liquid/block_body.rb, line 69
def render(context)
  output = []
  context.resource_limits.render_score += @nodelist.length

  idx = 0
  while node = @nodelist[idx]
    case node
    when String
      check_resources(context, node)
      output << node
    when Variable
      render_node_to_output(node, output, context)
    when Block
      render_node_to_output(node, output, context, node.blank?)
      break if context.interrupt? # might have happened in a for-block
    when Continue, Break
      # If we get an Interrupt that means the block must stop processing. An
      # Interrupt is any command that stops block execution such as {% break %}
      # or {% continue %}
      context.push_interrupt(node.interrupt)
      break
    else # Other non-Block tags
      render_node_to_output(node, output, context)
      break if context.interrupt? # might have happened through an include
    end
    idx += 1
  end

  output.join
end
render_node_with_profiling(node, output, context, skip_output = false) click to toggle source
# File lib/liquid/profiler/hooks.rb, line 3
def render_node_with_profiling(node, output, context, skip_output = false)
  Profiler.profile_node_render(node) do
    render_node_without_profiling(node, output, context, skip_output)
  end
end
Also aliased as: render_node_to_output
render_node_without_profiling(node, output, context, skip_output = false)
whitespace_handler(token, parse_context) click to toggle source
# File lib/liquid/block_body.rb, line 55
def whitespace_handler(token, parse_context)
  if token[2] == WhitespaceControl
    previous_token = @nodelist.last
    if previous_token.is_a? String
      previous_token.rstrip!
    end
  end
  parse_context.trim_whitespace = (token[-3] == WhitespaceControl)
end

Private Instance Methods

check_resources(context, node_output) click to toggle source
# File lib/liquid/block_body.rb, line 117
def check_resources(context, node_output)
  context.resource_limits.render_length += node_output.length
  return unless context.resource_limits.reached?
  raise MemoryError.new("Memory limits exceeded".freeze)
end
create_variable(token, parse_context) click to toggle source
# File lib/liquid/block_body.rb, line 123
def create_variable(token, parse_context)
  token.scan(ContentOfVariable) do |content|
    markup = content.first
    return Variable.new(markup, parse_context)
  end
  raise_missing_variable_terminator(token, parse_context)
end
raise_missing_tag_terminator(token, parse_context) click to toggle source
# File lib/liquid/block_body.rb, line 131
def raise_missing_tag_terminator(token, parse_context)
  raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_termination".freeze, token: token, tag_end: TagEnd.inspect))
end
raise_missing_variable_terminator(token, parse_context) click to toggle source
# File lib/liquid/block_body.rb, line 135
def raise_missing_variable_terminator(token, parse_context)
  raise SyntaxError.new(parse_context.locale.t("errors.syntax.variable_termination".freeze, token: token, tag_end: VariableEnd.inspect))
end
registered_tags() click to toggle source
# File lib/liquid/block_body.rb, line 139
def registered_tags
  Template.tags
end
render_node_to_output(node, output, context, skip_output = false) click to toggle source
# File lib/liquid/block_body.rb, line 102
def render_node_to_output(node, output, context, skip_output = false)
  node_output = node.render(context)
  node_output = node_output.is_a?(Array) ? node_output.join : node_output.to_s
  check_resources(context, node_output)
  output << node_output unless skip_output
rescue MemoryError => e
  raise e
rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e
  context.handle_error(e, node.line_number)
  output << nil
rescue ::StandardError => e
  line_number = node.is_a?(String) ? nil : node.line_number
  output << context.handle_error(e, line_number)
end