Merge branch 'feed-urls' into 'master'
fix: Correct rss feed urls See merge request mythic-insight/legendary!16
This commit is contained in:
commit
f7f5e5bf6b
10 changed files with 97 additions and 58 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
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"},
|
||||
"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"},
|
||||
|
|
Loading…
Reference in a new issue