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