defmodule Replica do @break "---\n" def read(key) do schema = key |> Path.extname address = case schema do ".md" -> key "" -> key <> ".md" "." <> _ -> key end body = replica() |> Source.Node.read(address) if address |> Path.extname() == ".md", do: body |> parse, else: body end def pages do {_, drops} = Cachex.fetch(:replica, "pages", fn key -> {:commit, replica() |> Source.Node.all |> Enum.map(& &1.address) |> Enum.filter(& not (&1 =~ ~r'^response/' or &1 =~ ~r'\.png$')) |> Enum.map(& &1 |> String.replace_suffix(".md", "")) } end, expire: 1 * 60 * 60 * 1000) end def replica, do: (Source.Index.scheme(:page) |> hd) def page(key), do: read(key).page def all do replica() |> Source.Node.all |> Enum.map(& &1.address) |> Enum.map(&read/1) |> Enum.reject(&is_nil/1) end def parse(page) do case page |> String.split(@break) do ["", header | page] -> %{ header: header |> YamlElixir.read_all_from_string! |> hd, page: page |> Enum.join(@break), } _ -> %{ header: %{}, page: page, } end end end