class Liquid::Block

Constants

MAX_DEPTH

Public Class Methods

new(tag_name, markup, options) click to toggle source
Calls superclass method
# File lib/liquid/block.rb, line 7
def initialize(tag_name, markup, options)
  super
  @blank = true
end
raise_unknown_tag(tag, block_name, block_delimiter, parse_context) click to toggle source

@api private

# File lib/liquid/block.rb, line 37
def self.raise_unknown_tag(tag, block_name, block_delimiter, parse_context)
  if tag == 'else'
    raise SyntaxError, parse_context.locale.t("errors.syntax.unexpected_else",
      block_name: block_name)
  elsif tag.start_with?('end')
    raise SyntaxError, parse_context.locale.t("errors.syntax.invalid_delimiter",
      tag: tag,
      block_name: block_name,
      block_delimiter: block_delimiter)
  else
    raise SyntaxError, parse_context.locale.t("errors.syntax.unknown_tag", tag: tag)
  end
end

Public Instance Methods

blank?() click to toggle source
# File lib/liquid/block.rb, line 24
def blank?
  @blank
end
block_delimiter() click to toggle source
# File lib/liquid/block.rb, line 59
def block_delimiter
  @block_delimiter ||= "end#{block_name}"
end
block_name() click to toggle source
# File lib/liquid/block.rb, line 55
def block_name
  @tag_name
end
nodelist() click to toggle source
# File lib/liquid/block.rb, line 28
def nodelist
  @body.nodelist
end
parse(tokens) click to toggle source
# File lib/liquid/block.rb, line 12
def parse(tokens)
  @body = new_body
  while parse_body(@body, tokens)
  end
  @body.freeze
end
raise_tag_never_closed(block_name) click to toggle source
# File lib/liquid/block.rb, line 51
def raise_tag_never_closed(block_name)
  raise SyntaxError, parse_context.locale.t("errors.syntax.tag_never_closed", block_name: block_name)
end
render(context) click to toggle source

For backwards compatibility

# File lib/liquid/block.rb, line 20
def render(context)
  @body.render(context)
end
unknown_tag(tag_name, _markup, _tokenizer) click to toggle source
# File lib/liquid/block.rb, line 32
def unknown_tag(tag_name, _markup, _tokenizer)
  Block.raise_unknown_tag(tag_name, block_name, block_delimiter, parse_context)
end

Private Instance Methods

new_body() click to toggle source

@api public

# File lib/liquid/block.rb, line 66
def new_body
  parse_context.new_block_body
end
parse_body(body, tokens) click to toggle source

@api public

# File lib/liquid/block.rb, line 71
def parse_body(body, tokens)
  if parse_context.depth >= MAX_DEPTH
    raise StackLevelError, "Nesting too deep"
  end
  parse_context.depth += 1
  begin
    body.parse(tokens, parse_context) do |end_tag_name, end_tag_params|
      @blank &&= body.blank?

      return false if end_tag_name == block_delimiter
      raise_tag_never_closed(block_name) unless end_tag_name

      # this tag is not registered with the system
      # pass it to the current block for special handling or error reporting
      unknown_tag(end_tag_name, end_tag_params, tokens)
    end
  ensure
    parse_context.depth -= 1
  end

  true
end