class Mobiledoc::Renderer_0_3

Constants

MOBILEDOC_VERSIONS

Attributes

atom_types[RW]
atoms[RW]
card_types[RW]
unknown_atom_handler[RW]

Public Class Methods

new(mobiledoc, state) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 13
def initialize(mobiledoc, state)
  version, sections, atom_types, card_types, marker_types = *mobiledoc.values_at('version', 'sections', 'atoms', 'cards', 'markups')
  validate_version(version)

  self.doc = Nokogiri::HTML.fragment('')
  self.root = create_document_fragment
  self.sections = sections
  self.atom_types = atom_types
  self.card_types = card_types
  self.marker_types = marker_types
  self.cards = state[:cards]
  self.atoms = state[:atoms]
  self.card_options = state[:card_options]
  self.unknown_card_handler = state[:unknown_card_handler]
  self.unknown_atom_handler = state[:unknown_atom_handler]
end

Public Instance Methods

_create_atom_argument(atom, atom_name, value, payload={}) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 126
def _create_atom_argument(atom, atom_name, value, payload={})
  env = {
    name: atom_name
  }

  [ env, value, payload, card_options ]
end
_find_atom_by_index(index) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 113
def _find_atom_by_index(index)
  atom_type = atom_types[index]

  unless atom_type
    raise Mobiledoc::Error.new("No atom definition found at index #{index}")
  end

  name, value, payload = *atom_type
  atom = find_atom(name)

  [ atom, name, value, payload ]
end
_find_card_by_index(index) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 47
def _find_card_by_index(index)
  card_type = card_types[index]

  unless card_type
    raise Mobiledoc::Error.new("No card definition found at index #{index}")
  end

  name, payload = *card_type
  card = find_card(name)

  [ card, name, payload ]
end
_render_atom(index) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 103
def _render_atom(index)
  atom, name, value, payload = _find_atom_by_index(index)
  atom_arg = _create_atom_argument(atom, name, value, payload)
  rendered = atom.render(*atom_arg)

  _validate_atom_render(rendered, atom.name)

  rendered || create_text_node('')
end
_render_markers_on_element(element, markers) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 60
def _render_markers_on_element(element, markers)
  elements = [element]
  current_element = element

  markers.each do |marker|
    type, open_types, close_count, value = *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

    case type
    when MARKUP_MARKER_TYPE
      append_child(current_element, create_text_node(value))
    when ATOM_MARKER_TYPE
      append_child(current_element, _render_atom(value))
    else
      raise Mobiledoc::Error.new("Unknown markup type (#{type})");
    end

    close_count.times do
      elements.pop
      current_element = elements.last
    end
  end
end
_validate_atom_render(rendered, atom_name) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 134
def _validate_atom_render(rendered, atom_name)
  return unless rendered

  unless rendered.is_a?(String)
    raise Mobiledoc::Error.new(%Q[Atom "#{atom_name}" must render html, but result was #{rendered.class}"]);
  end
end
find_atom(name) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 97
def find_atom(name)
  atom = atoms.find { |a| a.name == name }

  atom || unknown_atom_handler
end
render_card_section(type, index) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 41
def render_card_section(type, index)
  card, name, payload = _find_card_by_index(index)

  _render_card_section(card, name, payload)
end
render_markup_section(type, tag_name, markers, attributes = []) click to toggle source
# File lib/mobiledoc/renderers/0.3.rb, line 30
def render_markup_section(type, tag_name, markers, attributes = [])
  return unless valid_section_tag_name?(tag_name, MARKUP_SECTION_TYPE)

  element = create_element(tag_name)
  attributes.each_slice(2) do |prop_name, prop_value|
    set_attribute(element, prop_name, prop_value)
  end
  _render_markers_on_element(element, markers)
  element
end