Merge branch 'feed-urls' into 'master'

fix: Correct rss feed urls

See merge request mythic-insight/legendary!16
This commit is contained in:
Robert Prehn 2020-08-18 15:55:20 +00:00
commit f7f5e5bf6b
10 changed files with 97 additions and 58 deletions

View file

@ -115,14 +115,16 @@ defmodule Content.Post do
end
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)
case slug do
nil -> changeset
_ ->
base = url(CoreWeb.Endpoint)
changeset
|> put_default(:guid, posts_url(CoreWeb.Endpoint, :show, slug))
|> put_default(:guid, posts_url(URI.merge(base, "/pages"), :show, slug))
end
end
end

View file

@ -46,7 +46,6 @@ defmodule Content do
|> Earmark.as_html!()
end
import CoreWeb.Helpers
# Include shared imports and aliases for views
unquote(view_helpers())
end
@ -76,6 +75,8 @@ defmodule Content do
# Import basic rendering functionality (render, render_layout, etc)
import Phoenix.View
import CoreWeb.Helpers
import Content.ErrorHelpers
import Content.Gettext
alias Content.Router.Helpers, as: Routes

View file

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><%= LayoutView.title(@view_module, @view_template, assigns) %></title>
<description><%= LayoutView.excerpt(@view_module, @view_template, assigns) %></description>
<link>https://pre.hn</link>
<atom:link href="https://pre.hn<%= @feed_url %>" rel="self" type="application/rss+xml" />
<title><%= title(@view_module, @view_template, assigns) %></title>
<description><%= excerpt(@view_module, @view_template, assigns) %></description>
<link><%= Content.Router.Helpers.url(CoreWeb.Endpoint) %></link>
<atom:link href="<%= Content.Router.Helpers.url(CoreWeb.Endpoint) %><%= @feed_url %>" rel="self" type="application/rss+xml" />
<%= for post <- @posts do %>
<item>

View file

@ -3,7 +3,8 @@ defmodule Content.FeedsView do
use Phoenix.HTML
alias Phoenix.HTML
alias Phoenix.HTML.Tag
alias Content.LayoutView
import Content.LayoutView, only: [title: 3, excerpt: 3]
def gravatar_url_for_email(email) do
email

View file

@ -1,11 +1,22 @@
defmodule Content.LayoutView do
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
"Page #{assigns.page} | #{title(nil, nil, nil)}"
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)}"
end
@ -13,45 +24,28 @@ defmodule Content.LayoutView do
(assigns.post.title |> HtmlSanitizeEx.strip_tags()) <> " | " <> title(nil, nil, nil)
end
def title(_, _, _) do
I18n.t! "en", "site.title"
end
def title(_, _, _), do: I18n.t! "en", "site.title"
def excerpt(Content.PostsView, "show.html", assigns) do
assigns.post.excerpt
|> HtmlSanitizeEx.strip_tags()
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)}"
end
def excerpt(_, _, _) do
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 excerpt(_, _, _), do: I18n.t! "en", "site.excerpt"
def corresponding_feed_url(conn, _, _, %{category: nil}) do
Routes.index_feed_url(conn, :index)
Content.Router.Helpers.index_feed_url(conn, :index)
end
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
def corresponding_feed_url(conn, _, _, _) do
Routes.index_feed_url(conn, :index)
Content.Router.Helpers.index_feed_url(conn, :index)
end
end

View file

@ -1,10 +1,5 @@
defmodule Content.LayoutViewTest do
use Content.ConnCase
# 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
use Content.ConnCase, async: true
import Content.LayoutView
@ -24,10 +19,6 @@ defmodule Content.LayoutViewTest do
test "for category" do
assert title(Content.PostsView, "show.html", %{post: %{title: "Test"}}) =~ "Test | #{default_title()}"
end
test "for nil" do
title(nil, nil, nil)
end
end
describe "excerpt/3" do
@ -40,16 +31,6 @@ defmodule Content.LayoutViewTest do
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
setup %{conn: conn} do
%{conn: put_private(conn, :phoenix_router_url, "/pages")}

View file

@ -4,8 +4,9 @@
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<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") %>"/>
<%= feed_tag(@conn, @view_module, @view_template, assigns) %>
<script defer type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
</head>
<body>

View file

@ -1,3 +1,39 @@
defmodule CoreWeb.LayoutView do
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

View file

@ -1,8 +1,31 @@
defmodule CoreWeb.LayoutViewTest do
use CoreWeb.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 CoreWeb.LayoutView
describe "title/3" do
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

View file

@ -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"},
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
"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"},
"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"},