class Renderer

Public Instance Methods

render(runtime, element, parentDom, replace = true) click to toggle source
# File lib/renderer.rb, line 5
def render(runtime, element, parentDom, replace = true)
  document = Native(`window.document`)
  dom = element[:type] == 'text' ? document.createTextNode('') : document.createElement(element[:type])

  add_event_listeners(element, dom, runtime)
  set_attributes(element, dom)

  childElements = element[:children] || [];
  childElements.each { |child| render(runtime, child, dom, false) }

  update_dom(parentDom, dom, replace)
end

Private Instance Methods

add_event_listeners(element, dom, runtime) click to toggle source
# File lib/renderer.rb, line 20
def add_event_listeners(element, dom, runtime)
  listeners = element[:props].select { |key, _value| listener?(key) }
  listeners.each do |key, value|
    event_type = key.downcase[2..-1]
    dom.addEventListener(event_type, lambda { runtime.push(value); runtime.process })
  end
end
listener?(key) click to toggle source
# File lib/renderer.rb, line 28
def listener?(key)
  key.start_with?('on')
end
set_attributes(element, dom) click to toggle source
# File lib/renderer.rb, line 32
def set_attributes(element, dom)
  attributes = element[:props].reject { |key, _value| listener?(key) }
  attributes.each { |key, value| key != :class ? dom[key] = value : dom.className = value }
end
update_dom(parent_dom, dom, replace) click to toggle source
# File lib/renderer.rb, line 37
def update_dom(parent_dom, dom, replace)
  if replace
    while (parent_dom.firstChild) do
      parent_dom.removeChild(parent_dom.firstChild)
    end
  end
  parent_dom.appendChild(dom)
end