diff --git a/apps/content/lib/content/post.ex b/apps/content/lib/content/post.ex index de038def..e429c8a5 100644 --- a/apps/content/lib/content/post.ex +++ b/apps/content/lib/content/post.ex @@ -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 diff --git a/apps/content/lib/content_web.ex b/apps/content/lib/content_web.ex index 782a6861..1eaca38c 100644 --- a/apps/content/lib/content_web.ex +++ b/apps/content/lib/content_web.ex @@ -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 diff --git a/apps/content/lib/content_web/templates/feeds/index.rss.eex b/apps/content/lib/content_web/templates/feeds/index.rss.eex index a1c39fe8..5b3808b3 100644 --- a/apps/content/lib/content_web/templates/feeds/index.rss.eex +++ b/apps/content/lib/content_web/templates/feeds/index.rss.eex @@ -1,10 +1,10 @@ - <%= LayoutView.title(@view_module, @view_template, assigns) %> - <%= LayoutView.excerpt(@view_module, @view_template, assigns) %> - https://pre.hn - + <%= title(@view_module, @view_template, assigns) %> + <%= excerpt(@view_module, @view_template, assigns) %> + <%= Content.Router.Helpers.url(CoreWeb.Endpoint) %> + <%= for post <- @posts do %> diff --git a/apps/content/lib/content_web/views/feeds_view.ex b/apps/content/lib/content_web/views/feeds_view.ex index 6409ba91..c4e6f60f 100644 --- a/apps/content/lib/content_web/views/feeds_view.ex +++ b/apps/content/lib/content_web/views/feeds_view.ex @@ -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 diff --git a/apps/content/lib/content_web/views/layout_view.ex b/apps/content/lib/content_web/views/layout_view.ex index 0e86a5ac..9bec107a 100644 --- a/apps/content/lib/content_web/views/layout_view.ex +++ b/apps/content/lib/content_web/views/layout_view.ex @@ -1,11 +1,22 @@ defmodule Content.LayoutView do use Content, :view + def feed_tag(conn, view_module, view_template, assigns) do + ~E""" + + """ + 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 diff --git a/apps/content/test/content_web/views/layout_view_test.exs b/apps/content/test/content_web/views/layout_view_test.exs index 55cfe45d..8a94146d 100644 --- a/apps/content/test/content_web/views/layout_view_test.exs +++ b/apps/content/test/content_web/views/layout_view_test.exs @@ -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")} diff --git a/apps/core/lib/core_web/templates/layout/app.html.eex b/apps/core/lib/core_web/templates/layout/app.html.eex index 6f5e3edc..0fad2027 100644 --- a/apps/core/lib/core_web/templates/layout/app.html.eex +++ b/apps/core/lib/core_web/templates/layout/app.html.eex @@ -4,8 +4,9 @@ - <%= I18n.t! "en", "site.title" %> + <%= title(@view_module, @view_template, assigns) %> "/> + <%= feed_tag(@conn, @view_module, @view_template, assigns) %> diff --git a/apps/core/lib/core_web/views/layout_view.ex b/apps/core/lib/core_web/views/layout_view.ex index c628224f..173e5273 100644 --- a/apps/core/lib/core_web/views/layout_view.ex +++ b/apps/core/lib/core_web/views/layout_view.ex @@ -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 diff --git a/apps/core/test/core_web/views/layout_view_test.exs b/apps/core/test/core_web/views/layout_view_test.exs index e0bee0ad..d47ae502 100644 --- a/apps/core/test/core_web/views/layout_view_test.exs +++ b/apps/core/test/core_web/views/layout_view_test.exs @@ -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 diff --git a/mix.lock b/mix.lock index b6589632..7518cbfa 100644 --- a/mix.lock +++ b/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"},