class Bob::Compiler::Walker

Public Class Methods

new(node) click to toggle source
Calls superclass method Bob::Compiler::Base::new
# File lib/bob/compiler/walker.rb, line 11
def initialize(node)
  super()
  @node = node
end

Private Instance Methods

after_element(node, root) click to toggle source
# File lib/bob/compiler/walker.rb, line 79
def after_element(node, root)
  append_element(node) unless root
end
append_element(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 99
def append_element(node)
  @buffer << "dom.appendElement();"
end
build_comment_node(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 107
def build_comment_node(node)
  @buffer << "dom.appendComment(#{quote_and_substitute node.text, node});"
end
build_element(node, root) click to toggle source
# File lib/bob/compiler/walker.rb, line 91
def build_element(node, root)
  @buffer << "dom.createElement(#{quote node.node_name});"

  filtered_attributes(node).each do |attr|
    @buffer << "dom.setAttribute(#{quote attr.name}, #{quote_and_substitute attr.value, node});"
  end
end
build_text_node(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 103
def build_text_node(node)
  @buffer << "dom.appendTextNode(#{quote_and_substitute node.text, node});"
end
compile() click to toggle source
# File lib/bob/compiler/walker.rb, line 17
def compile
  @buffer << "function(dom, env) {"

  @buffer.indented do
    @buffer << "var descriptor = #{pretty_quote descriptor};"

    @buffer.blankline!

    walk(@node, true)

    @buffer.blankline!

    @buffer << "descriptor.element = dom.getElement();"

    @buffer.blankline!

    @buffer << "return descriptor;"
  end

  @buffer << "}"
end
descriptor() click to toggle source
# File lib/bob/compiler/walker.rb, line 39
def descriptor
  {
    element: nil,
    editables: []
  }
end
filtered_attributes(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 70
def filtered_attributes(node)
  # TODO: switch to a whitelist
  node.attribute_nodes.reject { |attr| attr.name.start_with?('bob-') }
end
filtered_children(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 66
def filtered_children(node)
  node.children.select { |child| child.element? || child.text? || child.cdata? || child.comment? }
end
visit_comment_node(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 87
def visit_comment_node(node)
  build_comment_node(node)
end
visit_element(node, root) click to toggle source
# File lib/bob/compiler/walker.rb, line 75
def visit_element(node, root)
  build_element(node, root)
end
visit_text_node(node) click to toggle source
# File lib/bob/compiler/walker.rb, line 83
def visit_text_node(node)
  build_text_node(node)
end
walk(node, root = false) click to toggle source
# File lib/bob/compiler/walker.rb, line 46
def walk(node, root = false)
  if node.element?
    visit_element(node, root)
  elsif node.text? || node.cdata?
    visit_text_node(node)
  elsif node.comment?
    visit_comment_node(node)
  else
    raise TypeError, "Unsupported node type #{node.type}"
  end

  if node.element?
    filtered_children(node).each do |child|
      walk(child)
    end

    after_element(node, root)
  end
end