Packages
literature
0.4.19
0.5.1
0.5.0
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
retired
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.32
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A simple CMS / Blog
Current section
Files
Jump to
Current section
Files
lib/literature/controllers/rss_controller.ex
defmodule Literature.RSSController do
use Literature.Web, :controller
alias Atomex.Entry
alias Atomex.Feed
alias Literature.Repo
@default_path "/feed"
def rss(conn, _params) do
publication_slug = conn.private[:publication_slug]
publication =
Literature.get_publication!(slug: publication_slug) |> Repo.preload(:public_tags)
base_path = String.replace(current_path(conn), @default_path, "")
base_url = publication.rss_url <> base_path
view_module = conn.private.view_module
favicon_path =
if function_exported?(view_module, :favicon_path, 1) do
base_url <> view_module.favicon_path(conn)
else
nil
end
conn
|> put_resp_content_type("text/xml")
|> send_resp(200, render_feed(base_url, favicon_path, publication))
end
defp render_feed(base_url, favicon_path, publication) do
%{
"status" => "published",
"publication_slug" => publication.slug,
"max" => 10
}
|> Literature.list_posts()
|> build_feed(publication, favicon_path, base_url)
end
def build_feed(posts, publication, favicon_path, base_url) do
Feed.new(base_url <> @default_path, DateTime.utc_now(), publication.name)
|> maybe_author(publication)
|> Feed.icon(favicon_path)
|> Feed.generator("Literature",
uri: "https://github.com/martide/literature",
version: Application.spec(:literature, :vsn)
)
|> Feed.link(base_url <> @default_path, rel: "self")
|> feed_categories(publication.public_tags)
|> Feed.entries(Enum.map(posts, &get_entry(base_url, publication, &1)))
|> Feed.build()
|> Atomex.generate_document()
end
defp maybe_author(feed, publication) do
case {publication.rss_author, publication.rss_email} do
{nil, _} -> feed
{author, nil} -> Feed.author(feed, author)
{author, email} -> Feed.author(feed, author, email: email)
end
end
defp feed_categories(feed, []) do
feed
end
defp feed_categories(feed, [tag | rest]) do
feed_categories(Feed.add_field(feed, :category, %{}, {:cdata, tag.name}), rest)
end
defp get_entry(base_url, publication, %{
id: id,
title: title,
slug: slug,
html: html,
excerpt: excerpt,
published_at: published_at,
updated_at: updated_at,
authors: [author | _]
}) do
post_path = "#{base_url}/#{slug}"
entry_id = "urn:uuid:#{id}"
excerpt =
case excerpt do
nil -> nil
_ -> {:cdata, excerpt}
end
content =
case html do
nil -> nil
_ -> {:cdata, html}
end
Entry.new(entry_id, DateTime.from_naive!(updated_at, "Etc/UTC"), {:cdata, title}, "html")
|> Entry.link(post_path)
|> Entry.author(author.name)
|> Entry.published(DateTime.from_naive!(published_at, "Etc/UTC"))
|> Entry.summary(excerpt, "html")
|> maybe_content(publication, content)
|> Entry.build()
end
defp maybe_content(entry, publication, content) do
case publication.rss_is_excerpt_only do
false -> Entry.content(entry, content, %{type: "html"})
_ -> entry
end
end
end