class Scribble::Parsing::Nester

Public Class Methods

new(nodes) click to toggle source
# File lib/scribble/parsing/nester.rb, line 4
def initialize nodes
  @nodes = nodes
end

Public Instance Methods

nodes(root = true) click to toggle source
# File lib/scribble/parsing/nester.rb, line 8
def nodes root = true
  [].tap do |nodes|
    while step(root)
      nodes << node
      if node.block?
        @current = node
        node.nodes = nodes false
      end
    end
  end
end

Private Instance Methods

node() click to toggle source
# File lib/scribble/parsing/nester.rb, line 36
def node
  @nodes[@cursor]
end
step(root) click to toggle source
# File lib/scribble/parsing/nester.rb, line 22
def step root
  @cursor = @cursor ? @cursor + 1 : 0

  if node.is_a? Nodes::Ending
    raise unexpected_end if root
    false
  elsif node.nil?
    raise unexpected_eot unless root
    false
  else
    true
  end
end
unexpected_end() click to toggle source
# File lib/scribble/parsing/nester.rb, line 40
def unexpected_end
  Errors::Syntax.new "Unexpected 'end' #{node.line_and_column}; no block currently open"
end
unexpected_eot() click to toggle source
# File lib/scribble/parsing/nester.rb, line 44
def unexpected_eot
  Errors::Syntax.new "Unexpected end of template; unclosed '#{@current.name}' block #{@current.line_and_column}"
end