Class: WebRubyUI::DOM
- Inherits:
-
Object
- Object
- WebRubyUI::DOM
- 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
- .event_registry ⇒ Object
- .register_event(element_id, event_type, handler) ⇒ Object
- .render_html_string(vnode) ⇒ Object
- .render_to_element(element_id, vnode) ⇒ Object
- .trigger_event(element_id, event_type, event_data = {}) ⇒ Object
Class Method Details
.event_registry ⇒ Object
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 |