class Exclaim::Renderer

Public Class Methods

new(parsed_ui, should_escape_html = true) click to toggle source
# File lib/exclaim/renderer.rb, line 5
def initialize(parsed_ui, should_escape_html = true)
  @parsed_ui = parsed_ui
  @should_escape_html = should_escape_html
end

Public Instance Methods

call(env: {}) click to toggle source
# File lib/exclaim/renderer.rb, line 10
def call(env: {})
  top_level_component = @parsed_ui
  render_element(top_level_component, env)
end

Private Instance Methods

escape_html!(value) click to toggle source
# File lib/exclaim/renderer.rb, line 32
def escape_html!(value)
  case value
  when String
    CGI.escape_html(value)
  when Hash
    value.transform_values! { |v| escape_html!(v) }
  when Array
    value.map! { |v| escape_html!(v) }
  when Numeric, TrueClass, FalseClass, NilClass
    value
  else
    # assumed to be a custom wrapper class returned by a helper
    value
  end
end
render_element(element, env) click to toggle source
# File lib/exclaim/renderer.rb, line 17
def render_element(element, env)
  case element
  in Component => component
    resolved_config = resolve_component_config(component, env)
    render_child = method(:render_element)
    component.implementation.call(resolved_config, env, &render_child)
  else
    resolve(element, env)
  end
end
resolve(element, env) click to toggle source
# File lib/exclaim/renderer.rb, line 48
def resolve(element, env)
  case element
  in Component => component
    component # will be resolved by calling its implementation later
  in Bind => bind
    bind.evaluate(env)
  in Helper => helper
    resolved_helper_config = resolve(helper.config, env)
    helper.implementation.call(resolved_helper_config, env)
  in Hash => hash
    hash.transform_values { |value| resolve(value, env) }
  in Array => array
    array.map { |item| resolve(item, env) }
  else
    element
  end
end
resolve_component_config(component, env) click to toggle source
# File lib/exclaim/renderer.rb, line 28
def resolve_component_config(component, env)
  resolve(component.config, env).transform_values! { |value| @should_escape_html ? escape_html!(value) : value }
end