Current section
Files
Jump to
Current section
Files
lib/renderers/renderer_0_3.ex
defmodule MobileDoc.Text.Renderer_0_3 do
def render(%{"sections" => sections, "atoms" => atom_types}, cards \\ %{}, atoms \\ %{}) do
sections
|> Enum.reduce("", fn (section, root) ->
root <> render_section(section, %{atom_types: atom_types, cards: cards, atoms: atoms})
end)
end
# markup section type
def render_section([1, _tagname, markers], meta) do
render_markers(markers, meta)
end
# image section type
def render_section([2, _], _meta) do
""
end
# list section type
def render_section([3, _tagName, items], meta) do
Enum.join(Enum.map(items, fn(item) ->
render_markers(item, meta)
end), "\n")
end
# card section type
def render_section([10, _card_index], _meta) do
""
end
def render_markers(markers, meta) do
Enum.reduce(markers, "", fn(marker, string) ->
string <> render_marker(marker, meta)
end)
end
# markup marker type
def render_marker([0, _, _, text], _meta), do: text
# atom marker type
def render_marker([1, _, _, atom_id], meta) do
atom_for_id(meta, atom_id)
|> render_atom
end
def render_atom({atom, text, payload}) when not is_nil(atom) do
Module.concat(atom, Text).render(text, {}, {}, payload)
end
def render_atom({nil, text, _payload}), do: text
defp atom_for_id(meta, id) do
case Enum.at(meta.atom_types, id) do
[atom_name, text, payload] -> {Dict.get(meta.atoms, atom_name), text, payload}
nil -> {nil, nil, nil}
end
end
end