fix: Correct rss feed urls
This commit is contained in:
parent
a9a5a58b8a
commit
ad0a26325a
10 changed files with 97 additions and 58 deletions
|
@ -115,14 +115,16 @@ defmodule Content.Post do
|
||||||
end
|
end
|
||||||
|
|
||||||
def maybe_put_guid(changeset) do
|
def maybe_put_guid(changeset) do
|
||||||
import Content.Router.Helpers, only: [posts_url: 3]
|
import Content.Router.Helpers, only: [url: 1, posts_url: 3]
|
||||||
slug = changeset |> get_field(:name)
|
slug = changeset |> get_field(:name)
|
||||||
|
|
||||||
case slug do
|
case slug do
|
||||||
nil -> changeset
|
nil -> changeset
|
||||||
_ ->
|
_ ->
|
||||||
|
base = url(CoreWeb.Endpoint)
|
||||||
|
|
||||||
changeset
|
changeset
|
||||||
|> put_default(:guid, posts_url(CoreWeb.Endpoint, :show, slug))
|
|> put_default(:guid, posts_url(URI.merge(base, "/pages"), :show, slug))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,7 +46,6 @@ defmodule Content do
|
||||||
|> Earmark.as_html!()
|
|> Earmark.as_html!()
|
||||||
end
|
end
|
||||||
|
|
||||||
import CoreWeb.Helpers
|
|
||||||
# Include shared imports and aliases for views
|
# Include shared imports and aliases for views
|
||||||
unquote(view_helpers())
|
unquote(view_helpers())
|
||||||
end
|
end
|
||||||
|
@ -76,6 +75,8 @@ defmodule Content do
|
||||||
# Import basic rendering functionality (render, render_layout, etc)
|
# Import basic rendering functionality (render, render_layout, etc)
|
||||||
import Phoenix.View
|
import Phoenix.View
|
||||||
|
|
||||||
|
import CoreWeb.Helpers
|
||||||
|
|
||||||
import Content.ErrorHelpers
|
import Content.ErrorHelpers
|
||||||
import Content.Gettext
|
import Content.Gettext
|
||||||
alias Content.Router.Helpers, as: Routes
|
alias Content.Router.Helpers, as: Routes
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
<channel>
|
<channel>
|
||||||
<title><%= LayoutView.title(@view_module, @view_template, assigns) %></title>
|
<title><%= title(@view_module, @view_template, assigns) %></title>
|
||||||
<description><%= LayoutView.excerpt(@view_module, @view_template, assigns) %></description>
|
<description><%= excerpt(@view_module, @view_template, assigns) %></description>
|
||||||
<link>https://pre.hn</link>
|
<link><%= Content.Router.Helpers.url(CoreWeb.Endpoint) %></link>
|
||||||
<atom:link href="https://pre.hn<%= @feed_url %>" rel="self" type="application/rss+xml" />
|
<atom:link href="<%= Content.Router.Helpers.url(CoreWeb.Endpoint) %><%= @feed_url %>" rel="self" type="application/rss+xml" />
|
||||||
|
|
||||||
<%= for post <- @posts do %>
|
<%= for post <- @posts do %>
|
||||||
<item>
|
<item>
|
||||||
|
|
|
@ -3,7 +3,8 @@ defmodule Content.FeedsView do
|
||||||
use Phoenix.HTML
|
use Phoenix.HTML
|
||||||
alias Phoenix.HTML
|
alias Phoenix.HTML
|
||||||
alias Phoenix.HTML.Tag
|
alias Phoenix.HTML.Tag
|
||||||
alias Content.LayoutView
|
|
||||||
|
import Content.LayoutView, only: [title: 3, excerpt: 3]
|
||||||
|
|
||||||
def gravatar_url_for_email(email) do
|
def gravatar_url_for_email(email) do
|
||||||
email
|
email
|
||||||
|
|
|
@ -1,11 +1,22 @@
|
||||||
defmodule Content.LayoutView do
|
defmodule Content.LayoutView do
|
||||||
use Content, :view
|
use Content, :view
|
||||||
|
|
||||||
|
def feed_tag(conn, view_module, view_template, assigns) do
|
||||||
|
~E"""
|
||||||
|
<link
|
||||||
|
rel="alternate"
|
||||||
|
type="application/rss+xml"
|
||||||
|
title="<%= title(view_module, view_template, assigns) %>"
|
||||||
|
href="<%= corresponding_feed_url(conn, view_module, view_template, assigns) %>"
|
||||||
|
/>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
def title(Content.PostsView, "index.html", assigns) do
|
def title(Content.PostsView, "index.html", assigns) do
|
||||||
"Page #{assigns.page} | #{title(nil, nil, nil)}"
|
"Page #{assigns.page} | #{title(nil, nil, nil)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def title(Content.FeedsView, "index.rss", %{category: category}) do
|
def title(Content.FeedsView, "index.rss", %{category: category}) when not(is_nil(category)) do
|
||||||
"#{category} | #{title(nil, nil, nil)}"
|
"#{category} | #{title(nil, nil, nil)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -13,45 +24,28 @@ defmodule Content.LayoutView do
|
||||||
(assigns.post.title |> HtmlSanitizeEx.strip_tags()) <> " | " <> title(nil, nil, nil)
|
(assigns.post.title |> HtmlSanitizeEx.strip_tags()) <> " | " <> title(nil, nil, nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
def title(_, _, _) do
|
def title(_, _, _), do: I18n.t! "en", "site.title"
|
||||||
I18n.t! "en", "site.title"
|
|
||||||
end
|
|
||||||
|
|
||||||
def excerpt(Content.PostsView, "show.html", assigns) do
|
def excerpt(Content.PostsView, "show.html", assigns) do
|
||||||
assigns.post.excerpt
|
assigns.post.excerpt
|
||||||
|> HtmlSanitizeEx.strip_tags()
|
|> HtmlSanitizeEx.strip_tags()
|
||||||
end
|
end
|
||||||
|
|
||||||
def excerpt(Content.FeedsView, "index.rss", %{category: category}) do
|
def excerpt(Content.FeedsView, "index.rss", %{category: category}) when not(is_nil(category)) do
|
||||||
"#{category} | #{excerpt(nil, nil, nil)}"
|
"#{category} | #{excerpt(nil, nil, nil)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def excerpt(_, _, _) do
|
def excerpt(_, _, _), do: I18n.t! "en", "site.excerpt"
|
||||||
I18n.t! "en", "site.excerpt"
|
|
||||||
end
|
|
||||||
|
|
||||||
def author(Content.PostsView, "show.html", assigns) do
|
|
||||||
case assigns do
|
|
||||||
%{author: %{display_name: name}} ->
|
|
||||||
name
|
|
||||||
_ ->
|
|
||||||
"Anonymous"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def author(_, _, _) do
|
|
||||||
"Anonymous"
|
|
||||||
end
|
|
||||||
|
|
||||||
def corresponding_feed_url(conn, _, _, %{category: nil}) do
|
def corresponding_feed_url(conn, _, _, %{category: nil}) do
|
||||||
Routes.index_feed_url(conn, :index)
|
Content.Router.Helpers.index_feed_url(conn, :index)
|
||||||
end
|
end
|
||||||
|
|
||||||
def corresponding_feed_url(conn, Content.PostsView, "index.html", %{category: category}) do
|
def corresponding_feed_url(conn, Content.PostsView, "index.html", %{category: category}) do
|
||||||
Routes.category_feed_url(conn, :index, category)
|
Content.Router.Helpers.category_feed_url(conn, :index, category)
|
||||||
end
|
end
|
||||||
|
|
||||||
def corresponding_feed_url(conn, _, _, _) do
|
def corresponding_feed_url(conn, _, _, _) do
|
||||||
Routes.index_feed_url(conn, :index)
|
Content.Router.Helpers.index_feed_url(conn, :index)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
defmodule Content.LayoutViewTest do
|
defmodule Content.LayoutViewTest do
|
||||||
use Content.ConnCase
|
use Content.ConnCase, async: true
|
||||||
|
|
||||||
# When testing helpers, you may want to import Phoenix.HTML and
|
|
||||||
# use functions such as safe_to_string() to convert the helper
|
|
||||||
# result into an HTML string.
|
|
||||||
# import Phoenix.HTML
|
|
||||||
|
|
||||||
import Content.LayoutView
|
import Content.LayoutView
|
||||||
|
|
||||||
|
@ -24,10 +19,6 @@ defmodule Content.LayoutViewTest do
|
||||||
test "for category" do
|
test "for category" do
|
||||||
assert title(Content.PostsView, "show.html", %{post: %{title: "Test"}}) =~ "Test | #{default_title()}"
|
assert title(Content.PostsView, "show.html", %{post: %{title: "Test"}}) =~ "Test | #{default_title()}"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "for nil" do
|
|
||||||
title(nil, nil, nil)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "excerpt/3" do
|
describe "excerpt/3" do
|
||||||
|
@ -40,16 +31,6 @@ defmodule Content.LayoutViewTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "author/3" do
|
|
||||||
test "with a display name" do
|
|
||||||
assert author(Content.PostsView, "show.html", %{author: %{display_name: "Rufus"}}) =~ "Rufus"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "without a display name" do
|
|
||||||
assert author(Content.PostsView, "show.html", %{}) =~ "Anonymous"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "corresponding_feed_url/4" do
|
describe "corresponding_feed_url/4" do
|
||||||
setup %{conn: conn} do
|
setup %{conn: conn} do
|
||||||
%{conn: put_private(conn, :phoenix_router_url, "/pages")}
|
%{conn: put_private(conn, :phoenix_router_url, "/pages")}
|
||||||
|
|
|
@ -4,8 +4,9 @@
|
||||||
<meta charset="utf-8"/>
|
<meta charset="utf-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<title><%= I18n.t! "en", "site.title" %></title>
|
<title><%= title(@view_module, @view_template, assigns) %></title>
|
||||||
<link rel="stylesheet" href="<%= Routes.static_path(@conn, "/css/app.css") %>"/>
|
<link rel="stylesheet" href="<%= Routes.static_path(@conn, "/css/app.css") %>"/>
|
||||||
|
<%= feed_tag(@conn, @view_module, @view_template, assigns) %>
|
||||||
<script defer type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
|
<script defer type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -1,3 +1,39 @@
|
||||||
defmodule CoreWeb.LayoutView do
|
defmodule CoreWeb.LayoutView do
|
||||||
use CoreWeb, :view
|
use CoreWeb, :view
|
||||||
|
|
||||||
|
def title(view_module, template, assigns) do
|
||||||
|
delegate_with_default(view_module, :title, [view_module, template, assigns], I18n.t!("en", "site.title"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def excerpt(view_module, template, assigns) do
|
||||||
|
delegate_with_default(view_module, :excerpt, [view_module, template, assigns], I18n.t!("en", "site.excerpt"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def feed_tag(conn, view_module, view_template, assigns) do
|
||||||
|
delegate_with_default(view_module, :feed_tag, [conn, view_module, view_template, assigns], nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp delegate_with_default(nil, _, _, default), do: default
|
||||||
|
defp delegate_with_default(view_module, function_name, args, default) do
|
||||||
|
sibling_layout = sibling_layout_view(view_module)
|
||||||
|
if function_exported?(sibling_layout, function_name, args |> Enum.count()) do
|
||||||
|
apply(sibling_layout, function_name, args)
|
||||||
|
else
|
||||||
|
default
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp sibling_layout_view(view_module) do
|
||||||
|
view_module
|
||||||
|
|> parent_module()
|
||||||
|
|> Module.concat("LayoutView")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parent_module(mod) do
|
||||||
|
[_|tail] = Module.split(mod) |> Enum.reverse()
|
||||||
|
|
||||||
|
tail
|
||||||
|
|> Enum.reverse()
|
||||||
|
|> Module.concat()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,8 +1,31 @@
|
||||||
defmodule CoreWeb.LayoutViewTest do
|
defmodule CoreWeb.LayoutViewTest do
|
||||||
use CoreWeb.ConnCase, async: true
|
use CoreWeb.ConnCase, async: true
|
||||||
|
|
||||||
# When testing helpers, you may want to import Phoenix.HTML and
|
import CoreWeb.LayoutView
|
||||||
# use functions such as safe_to_string() to convert the helper
|
|
||||||
# result into an HTML string.
|
describe "title/3" do
|
||||||
# import Phoenix.HTML
|
def default_title do
|
||||||
|
I18n.t! "en", "site.title"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "for nil" do
|
||||||
|
assert title(nil, nil, nil) =~ default_title()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "excerpt/3" do
|
||||||
|
def default_excerpt do
|
||||||
|
I18n.t! "en", "site.excerpt"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "for nil" do
|
||||||
|
assert excerpt(nil, nil, nil) =~ default_excerpt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "feed_tag/4" do
|
||||||
|
test "for nil" do
|
||||||
|
assert feed_tag(nil, nil, nil, nil) == nil
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
2
mix.lock
2
mix.lock
|
@ -36,7 +36,7 @@
|
||||||
"linguist": {:hex, :linguist, "0.3.0", "2984dfce6720d1212ddd7bba82496f92627a39aecd4d32c7016ec00393e1f925", [:mix], [{:ex_cldr, "~> 2.0", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.0", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "1923876545db22b63334c9d203ef56397a2946daa018117767b068f856be41e4"},
|
"linguist": {:hex, :linguist, "0.3.0", "2984dfce6720d1212ddd7bba82496f92627a39aecd4d32c7016ec00393e1f925", [:mix], [{:ex_cldr, "~> 2.0", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.0", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "1923876545db22b63334c9d203ef56397a2946daa018117767b068f856be41e4"},
|
||||||
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
||||||
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
|
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
|
||||||
"mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm", "6cbe761d6a0ca5a31a0931bf4c63204bceb64538e664a8ecf784a9a6f3b875f1"},
|
"mime": {:hex, :mime, "1.4.0", "5066f14944b470286146047d2f73518cf5cca82f8e4815cf35d196b58cf07c47", [:mix], [], "hexpm", "75fa42c4228ea9a23f70f123c74ba7cece6a03b1fd474fe13f6a7a85c6ea4ff6"},
|
||||||
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
|
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
|
||||||
"mochiweb": {:hex, :mochiweb, "2.12.2", "80804ad342afa3d7f3524040d4eed66ce74b17a555de454ac85b07c479928e46", [:make, :rebar], [], "hexpm", "d3e681d4054b74a96cf2efcd09e94157ab83a5f55ddc4ce69f90b8144673bd7a"},
|
"mochiweb": {:hex, :mochiweb, "2.12.2", "80804ad342afa3d7f3524040d4eed66ce74b17a555de454ac85b07c479928e46", [:make, :rebar], [], "hexpm", "d3e681d4054b74a96cf2efcd09e94157ab83a5f55ddc4ce69f90b8144673bd7a"},
|
||||||
"mock": {:hex, :mock, "0.3.5", "feb81f52b8dcf0a0d65001d2fec459f6b6a8c22562d94a965862f6cc066b5431", [:mix], [{:meck, "~> 0.8.13", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "6fae404799408300f863550392635d8f7e3da6b71abdd5c393faf41b131c8728"},
|
"mock": {:hex, :mock, "0.3.5", "feb81f52b8dcf0a0d65001d2fec459f6b6a8c22562d94a965862f6cc066b5431", [:mix], [{:meck, "~> 0.8.13", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "6fae404799408300f863550392635d8f7e3da6b71abdd5c393faf41b131c8728"},
|
||||||
|
|
Loading…
Reference in a new issue