class Mobiledoc::Renderer_0_2

Constants

MOBILEDOC_VERSIONS

Attributes

card_options[RW]
cards[RW]
doc[RW]
marker_types[RW]
root[RW]
sections[RW]
unknown_card_handler[RW]

Public Class Methods

new(mobiledoc, state) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 16
def initialize(mobiledoc, state)
  version, section_data = *mobiledoc.values_at('version', 'sections')
  validate_version(version)

  self.marker_types, self.sections = *section_data

  self.doc = Nokogiri::HTML.fragment('')
  self.root = create_document_fragment
  self.cards = state[:cards]
  self.card_options = state[:card_options]
  self.unknown_card_handler = state[:unknown_card_handler]
end

Public Instance Methods

_create_card_argument(card_name, payload={}) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 162
def _create_card_argument(card_name, payload={})
  env = {
    name: card_name
  }

  [ env, payload, card_options ]
end
_create_card_element() click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 158
def _create_card_element
  create_element('div')
end
_render_card_section(card, name, payload) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 131
def _render_card_section(card, name, payload)
  card_wrapper = _create_card_element
  card_arg = _create_card_argument(name, payload)
  rendered = card.render(*card_arg)

  _validate_card_render(rendered, card.name)

  if rendered
    append_child(card_wrapper, rendered)
  end

  card_wrapper
end
_render_markers_on_element(element, markers) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 178
def _render_markers_on_element(element, markers)
  elements = [element]
  current_element = element

  markers.each do |marker|
    open_types, close_count, text = *marker

    open_types.each do |open_type|
      marker_type = marker_types[open_type]
      tag_name = marker_type.first

      if valid_marker_type?(tag_name)
        opened_element = create_element_from_marker_type(*marker_type)
        append_child(current_element, opened_element)
        elements.push(opened_element)
        current_element = opened_element
      else
        close_count -= 1
      end
    end

    append_child(current_element, create_text_node(text))

    close_count.times do
      elements.pop
      current_element = elements.last
    end
  end
end
_validate_card_render(rendered, card_name) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 170
def _validate_card_render(rendered, card_name)
  return unless rendered

  unless rendered.is_a?(String)
    raise Mobiledoc::Error.new(%Q[Card "#{card_name}" must render html, but result was #{rendered.class}"]);
  end
end
append_child(target, child) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 76
def append_child(target, child)
  target.add_child(child)
end
create_document_fragment() click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 49
def create_document_fragment
  create_element('div')
end
create_element(tag_name) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 53
def create_element(tag_name)
  tag_name = normalize_tag_name(tag_name)
  Nokogiri::XML::Node.new(tag_name, doc)
end
create_element_from_marker_type(tag_name='', attributes=[]) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 66
def create_element_from_marker_type(tag_name='', attributes=[])
  element = create_element(tag_name)

  attributes.each_slice(2) do |prop_name, prop_value|
    set_attribute(element, prop_name, prop_value)
  end

  element
end
create_text_node(text) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 62
def create_text_node(text)
  Nokogiri::XML::Text.new(text, doc)
end
find_card(name) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 145
def find_card(name)
  card = cards.find { |c| c.name == name }

  case
  when card
    card
  when ImageCard.name == name
    ImageCard
  else
    unknown_card_handler
  end
end
render() click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 35
def render
  root = create_document_fragment

  sections.each do |section|
    rendered = render_section(section)

    if rendered
      append_child(root, rendered)
    end
  end

  root.to_html(save_with: 0).gsub('  ', '  ')
end
render_card_section(type, name, payload={}) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 125
def render_card_section(type, name, payload={})
  card = find_card(name)

  _render_card_section(card, name, payload)
end
render_image_section(type, url) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 102
def render_image_section(type, url)
  element = create_element('img')
  set_attribute(element, 'src', url)
  element
end
render_list_item(markers) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 119
def render_list_item(markers)
  element = create_element('li')
  _render_markers_on_element(element, markers)
  element
end
render_list_section(type, tag_name, items) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 108
def render_list_section(type, tag_name, items)
  return unless valid_section_tag_name?(tag_name, LIST_SECTION_TYPE)

  element = create_element(tag_name)
  items.each do |item|
    append_child(element, render_list_item(item))
  end

  element
end
render_markup_section(type, tag_name, markers) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 94
def render_markup_section(type, tag_name, markers)
  return unless valid_section_tag_name?(tag_name, MARKUP_SECTION_TYPE)

  element = create_element(tag_name)
  _render_markers_on_element(element, markers)
  element
end
render_section(section) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 80
def render_section(section)
  type = section.first
  case type
  when MARKUP_SECTION_TYPE
    render_markup_section(*section)
  when IMAGE_SECTION_TYPE
    render_image_section(*section)
  when LIST_SECTION_TYPE
    render_list_section(*section)
  when CARD_SECTION_TYPE
    render_card_section(*section)
  end
end
set_attribute(element, prop_name, prop_value) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 58
def set_attribute(element, prop_name, prop_value)
  element.set_attribute(prop_name, prop_value)
end
valid_marker_type?(type) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 221
def valid_marker_type?(type)
  type = normalize_tag_name(type)

  MARKUP_TYPES.include?(type)
end
valid_section_tag_name?(tag_name, section_type) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 208
def valid_section_tag_name?(tag_name, section_type)
  tag_name = normalize_tag_name(tag_name)

  case section_type
  when MARKUP_SECTION_TYPE
    MARKUP_SECTION_TAG_NAMES.include?(tag_name)
  when LIST_SECTION_TYPE
    LIST_SECTION_TAG_NAMES.include?(tag_name)
  else
    raise Mobiledoc::Error.new(%Q[Cannot validate tag_name for unknown section type "#{section_type}"])
  end
end
validate_version(version) click to toggle source
# File lib/mobiledoc/renderers/0.2.rb, line 29
def validate_version(version)
  unless self.class::MOBILEDOC_VERSIONS.to_a.include? version
    raise Mobiledoc::Error.new(%Q[Unexpected Mobiledoc version "#{version}"])
  end
end