Class: WebRubyUI::DOM

Inherits:
Object
  • Object
show all
Defined in:
lib/web_ruby_ui/dom.rb

Overview

Bridge to browser DOM via WebAssembly JS interop (JS::Object) or in-memory simulation.

Class Method Summary collapse

Class Method Details

.event_registryObject



9
10
11
# File 'lib/web_ruby_ui/dom.rb', line 9

def event_registry
  @event_registry ||= {}
end

.register_event(element_id, event_type, handler) ⇒ Object



13
14
15
16
# File 'lib/web_ruby_ui/dom.rb', line 13

def register_event(element_id, event_type, handler)
  key = "#{element_id}_#{event_type}"
  event_registry[key] = handler
end

.render_html_string(vnode) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/web_ruby_ui/dom.rb', line 37

def render_html_string(vnode)
  return CGI.escapeHTML(vnode.text_content.to_s) unless vnode.is_a?(VNode)

  attrs = vnode.attributes.map do |k, v|
    next if k.to_s.start_with?('on') # Skip event handlers in HTML attributes

    "#{k}=\"#{v}\""
  end.compact.join(' ')

  attr_str = attrs.empty? ? '' : " #{attrs}"

  if vnode.children.empty? && vnode.text_content
    escaped_text = CGI.escapeHTML(vnode.text_content.to_s)
    "<#{vnode.tag}#{attr_str}>#{escaped_text}</#{vnode.tag}>"
  else
    children_html = vnode.children.map { |c| render_html_string(c) }.join
    "<#{vnode.tag}#{attr_str}>#{children_html}</#{vnode.tag}>"
  end
end

.render_to_element(element_id, vnode) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/web_ruby_ui/dom.rb', line 24

def render_to_element(element_id, vnode)
  if Object.const_defined?(:JS)
    js_document = JS.global[:document]
    js_target = js_document.getElementById(element_id.to_s)
    if js_target
      js_target[:innerHTML] = render_html_string(vnode)
      bind_js_events(js_document, vnode)
    end
  end

  render_html_string(vnode)
end

.trigger_event(element_id, event_type, event_data = {}) ⇒ Object



18
19
20
21
22
# File 'lib/web_ruby_ui/dom.rb', line 18

def trigger_event(element_id, event_type, event_data = {})
  key = "#{element_id}_#{event_type}"
  handler = event_registry[key]
  handler&.call(event_data)
end