Sha256: 2e911cc24917022d06163054501a8b6226da28995bd392520775b97f2f478809

Contents?: true

Size: 1.26 KB

Versions: 1

Compression:

Stored size: 1.26 KB

Contents

require 'native'
require 'event_loop'

class VirtualDOM
  def render(event_loop, element, parentDom, replace = true)
    document = Native(`window.document`)
    dom = element[:type] == 'text' ? document.createTextNode('') : document.createElement(element[:type])

    add_event_listeners(element, dom, event_loop)
    set_attributes(element, dom)

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

    update_dom(parentDom, dom, replace)
  end

  private

  def add_event_listeners(element, dom, event_loop)
    listener_props = element[:props].select { |key, _value| listener?(key) }
    listener_props.each do |key, value|
      event_type = key.downcase[2..-1]
      dom.addEventListener(event_type, lambda { event_loop.push(value); event_loop.process })
    end
  end

  def listener?(key)
    key.start_with?('on')
  end

  def set_attributes(element, dom)
    attribute_props = element[:props].reject { |key, _value| listener?(key) }
    attribute_props.each { |key, value| dom[key] = value }
  end

  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
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
beryl-0.1.0 lib/virtual_dom.rb