open graph metadata

This commit is contained in:
Zach Daniel 2022-12-27 04:31:13 -05:00
parent 95a6fae77a
commit 437fc69c88
3 changed files with 86 additions and 1 deletions

View file

@ -20,6 +20,10 @@ defmodule AshHqWeb.Pages.Blog do
<div class="flex flex-col sm:flex-row sm:pt-32 sm:mx-32 min-h-screen">
<div class="sm:w-9/12">
{#if @post}
<head>
<meta property="og:title" content={"Ash Framework Blog: #{@post.title}"}>
<meta property="og:description" content={@post.tag_line}>
</head>
<div class="border shadow-sm rounded-lg px-8 pb-6 mb-6 dark:border-gray-600" ">
<div class="border-b">
<h1 class="mt-6 text-3xl font-semibold mb-4">{@post.title}</h1>
@ -42,6 +46,13 @@ defmodule AshHqWeb.Pages.Blog do
</div>
</div>
{#else}
<head>
<meta property="og:title" content="Ash Framework Blog">
<meta
property="og:description"
content="A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
/>
</head>
{#if @tag}
<h2 class="text-3xl font-semibold mb-1">Showing posts with tag: {@tag}</h2>
{#else}

View file

@ -32,11 +32,17 @@ defmodule AshHqWeb.Pages.Docs do
data module, :any
data mix_task, :any
data positional_options, :list
data description, :string
data title, :string
@spec render(any) :: Phoenix.LiveView.Rendered.t()
def render(assigns) do
~F"""
<div class="flex flex-col xl:flex-row justify-center">
<head>
<meta property="og:title" content={@title}>
<meta property="og:description" content={@description}>
</head>
<div class="xl:hidden sticky top-20 z-40 h-14 bg-white dark:bg-base-dark-850 flex flex-row justify-start w-full space-x-12 items-center border-b border-t border-base-light-300 dark:border-base-dark-700 py-3">
<button class="dark:hover:text-base-dark-600" phx-click={show_sidebar()}>
<Heroicons.Outline.MenuIcon class="w-8 h-8 ml-4" />
@ -765,6 +771,8 @@ defmodule AshHqWeb.Pages.Docs do
socket.assigns.module ->
assign(socket,
docs: socket.assigns.module.html_for,
title: "Module: #{socket.assigns.module.name}",
description: "View the documentation for #{socket.assigns.module.name} on Ash HQ.",
doc_path: [socket.assigns.library.name, socket.assigns.module.name],
options: []
)
@ -772,13 +780,28 @@ defmodule AshHqWeb.Pages.Docs do
socket.assigns.mix_task ->
assign(socket,
docs: socket.assigns.mix_task.html_for,
title: "Mix Task: #{socket.assigns.mix_task.name}",
description: "View the documentation for #{socket.assigns.mix_task.name} on Ash HQ.",
doc_path: [socket.assigns.library.name, socket.assigns.mix_task.name],
options: []
)
socket.assigns.dsl ->
meta_name =
Enum.join(
[
socket.assigns.library.name,
socket.assigns.extension.name
] ++ socket.assigns.dsl.path ++ [socket.assigns.dsl.name],
" > "
)
meta_type = String.capitalize(to_string(socket.assigns.dsl.type))
assign(socket,
docs: socket.assigns.dsl.html_for,
title: "DSL #{meta_type}: #{meta_name}",
description: "View the documentation for DSL #{meta_type}: #{meta_name} on Ash HQ.",
doc_path:
[
socket.assigns.library.name,
@ -794,22 +817,54 @@ defmodule AshHqWeb.Pages.Docs do
socket.assigns.extension ->
assign(socket,
docs: socket.assigns.extension.html_for,
title: "Extension: #{socket.assigns.extension.name}",
description: "View the documentation for #{socket.assigns.extension.name} on Ash HQ.",
doc_path: [socket.assigns.library.name, socket.assigns.extension.name],
options: []
)
socket.assigns.guide ->
assign(socket,
title: "Guide: #{socket.assigns.guide.name}",
docs: socket.assigns.guide.html_for,
description: "Read the \"#{socket.assigns.guide.name}\" guide on Ash HQ",
doc_path: [socket.assigns.library.name, socket.assigns.guide.name],
options: []
)
true ->
assign(socket, docs: "", doc_path: [], dsls: [], options: [])
assign(socket,
docs: "",
title: "Ash Framework",
description: default_description(),
doc_path: [],
dsls: [],
options: []
)
end
end
# defp description(html) do
# This isn't predictably good content to put in a snippet :(
# html
# |> Floki.parse_fragment()
# |> elem(1)
# |> Floki.text()
# |> String.split("\n", trim: true)
# |> Stream.map(&String.trim/1)
# |> Stream.map(&String.replace(&1, ~r/{{.*(?!}})$/, ""))
# |> Stream.reject(&(&1 == ""))
# |> Stream.take(4)
# |> Enum.join("\n")
# rescue
# _ ->
# default_description()
# end
defp default_description do
"A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
end
# workaround for https://github.com/patrick-steele-idem/morphdom/pull/231
# Adding a unique ID on the container for the rendered docs prevents morphdom
# merging them incorrectly.

View file

@ -45,6 +45,25 @@ defmodule AshHqWeb.AppViewLive do
class={classes([@configured_theme, "h-full font-sans": true])}
phx-hook="ColorTheme"
>
<head>
<meta property="og:type" content="text/html">
<meta property="og:image" content="https://ash-hq.org/images/ash-logo.png">
<meta property="og:url" content={to_string(@uri)}>
<meta property="og:site_name" content="Ash HQ">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="ash-hq.org">
<meta property="twitter:site" content="@AshFramework">
<!-- Need to adjust this for future blog writers -->
<meta property="twitter:creator" content="@ZachSDaniel1">
{#if @live_action not in [:docs_dsl, :blog]}
<meta property="og:title" content="Ash Framework">
<meta
property="og:description"
content="A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
/>
{/if}
</head>
<div id="snowflakeContainer" phx-hook="Snowflakes">
<span class="snowflake" />
</div>