diff options
author | João Augusto Costa Branco Marado Torres <torres.dev@disroot.org> | 2025-07-06 22:27:04 -0300 |
---|---|---|
committer | João Augusto Costa Branco Marado Torres <torres.dev@disroot.org> | 2025-07-06 22:27:04 -0300 |
commit | 449f71511e539878af4c65f073cdc373b469c45e (patch) | |
tree | 6c264a77426284d97d1c9b9d7a27a6015c3077a8 /src/components | |
parent | 4ae2b810b68538ba4c287b0c80d6c2e002fe9ddd (diff) |
feat: more structured data
Signed-off-by: João Augusto Costa Branco Marado Torres <torres.dev@disroot.org>
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/BaseHead.astro | 15 | ||||
-rw-r--r-- | src/components/Footer.astro | 25 | ||||
-rw-r--r-- | src/components/Header.astro | 3 | ||||
-rw-r--r-- | src/components/organisms/Date.astro | 3 | ||||
-rw-r--r-- | src/components/organisms/KeywordsList.astro | 2 | ||||
-rw-r--r-- | src/components/templates/MicroBlog.astro | 27 | ||||
-rw-r--r-- | src/components/templates/Search.astro | 15 | ||||
-rw-r--r-- | src/components/templates/SimplePostList.astro | 33 |
8 files changed, 90 insertions, 33 deletions
diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro index 885447c..b57127a 100644 --- a/src/components/BaseHead.astro +++ b/src/components/BaseHead.astro @@ -58,13 +58,22 @@ const { type="text/html" title={`${isOnion ? "Clearnet" : "Tor"} version`} > +<link + rel="license" + href="https://www.gnu.org/licenses/agpl-3.0.html" + itemprop="license" +/> <!-- Primary Meta Tags --> <title>{title}</title> -<meta name="title" content={title} /> -<meta name="description" content={description} /> +<meta name="title" content={title} itemprop="name" /> +<meta name="description" content={description} itemprop="description" /> <meta name="author" content={PUBLIC_SITE_AUTHOR} /> -{keywords.length > 0 && <meta name="keywords" content={keywords.join(",")} />} +{ + keywords.length > 0 && ( + <meta name="keywords" content={keywords.join(",")} itemprop="keywords" /> + ) +} <meta name="theme-color" content="oklch(0.4564 0.1835 20.81)" /> <meta name="theme-color" diff --git a/src/components/Footer.astro b/src/components/Footer.astro index 3238c50..f69ba8a 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -22,10 +22,20 @@ const git = isOnion ? PUBLIC_GIT_TOR_URL ?? PUBLIC_GIT_URL : PUBLIC_GIT_URL; </p> ) } - <address> + <address + itemprop="maintainer author" + itemscope + itemtype="https://schema.org/Person" + > + <link href={site} rel="author" itemprop="url" /> <p> - Sítio web de <a href={site} target="_blank" rel="author" - >João Augusto Costa Branco Marado Torres</a> + Sítio web de <a href={site} target="_blank" rel="author" itemprop="name" + >João Augusto Costa Branco Marado Torres</a> <<a + href="mailto:torres.dev@disroot.pt" + target="_blank" + rel="author" + itemprop="email" + >torres.dev@disroot.pt</a>> </p> { PUBLIC_SIMPLE_X_ADDRESS && ( @@ -42,10 +52,15 @@ const git = isOnion ? PUBLIC_GIT_TOR_URL ?? PUBLIC_GIT_URL : PUBLIC_GIT_URL; </p> <section id="copying" class="mute"> <h2 class="sr-only">Licença de <span lang="en">Software</span></h2> - <div lang="en"> + <div lang="en" itemprop="copyrightNotice"> <p> <<a href="/" hreflang="pt-PT">cravodeabril.pt</a>> Copyright - © 2025 João Augusto Costa Branco Marado Torres + © <time datetime="2025" itemprop="copyrightYear">2025</time> <span + itemprop="copyrightHolder" + itemscope + itemtype="Person" + ><span itemprop="name" + >João Augusto Costa Branco Marado Torres</span></span> </p> <p> This program is free software: you can redistribute it and/or modify it diff --git a/src/components/Header.astro b/src/components/Header.astro index 496337f..39fe35f 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -5,7 +5,8 @@ import Search from "./templates/Search.astro"; <header> <h1> - <span class="bracket"><</span><a href="/">cravodeabril.pt</a><span + <span class="bracket"><</span><a itemprop="url" href="/" + >cravodeabril.pt</a><span class="bracket" >></span> </h1> diff --git a/src/components/organisms/Date.astro b/src/components/organisms/Date.astro index c1ec7e5..960cfb7 100644 --- a/src/components/organisms/Date.astro +++ b/src/components/organisms/Date.astro @@ -1,8 +1,11 @@ --- +import type { HTMLAttributes } from "astro/types"; + interface Props { date: Date; locales: Intl.LocalesArgument; options: Intl.DateTimeFormatOptions; + itemprop: HTMLAttributes<"time">["itemprop"]; } const { date, locales, options } = Astro.props; diff --git a/src/components/organisms/KeywordsList.astro b/src/components/organisms/KeywordsList.astro index 4d4b140..d3b9e7f 100644 --- a/src/components/organisms/KeywordsList.astro +++ b/src/components/organisms/KeywordsList.astro @@ -7,7 +7,7 @@ const { keywords } = Astro.props; --- <p> - {keywords.map((x) => <span>#<b>{x}</b></span>)} + {keywords.map((x) => <span>#<b itemprop="keywords">{x}</b></span>)} </p> <style> diff --git a/src/components/templates/MicroBlog.astro b/src/components/templates/MicroBlog.astro index c16155e..88321dc 100644 --- a/src/components/templates/MicroBlog.astro +++ b/src/components/templates/MicroBlog.astro @@ -2,12 +2,9 @@ import Date from "@components/organisms/Date.astro"; import KeywordsList from "@components/organisms/KeywordsList.astro"; import { getFirstUserID, getLastUpdate } from "@lib/collection/helpers"; -import { Micro } from "@lib/collection/schemas"; -import type { CollectionEntry, z } from "astro:content"; +import type { Micro, MicroEntry } from "@lib/collection/schemas"; -interface Props extends CollectionEntry<"blog"> { - data: z.infer<typeof Micro>; -} +interface Props extends MicroEntry {} const micro = Astro.props; const { id, data, rendered } = micro; @@ -19,10 +16,14 @@ const [first, ...names] = display.split(/\s/); const last = names.length > 0 ? names[names.length - 1] : ""; const little = ((first?.[0] ?? "") + (last?.[0] ?? "")).slice(0, 2); --- -<article> +<article + itemprop="blogPost" + itemscope + itemtype="https://schema.org/BlogPosting" +> <header> <h3 class="title"> - <a href={`/blog/read/${id}`}>{title}</a> + <a href={`/blog/read/${id}`} itemprop="headline name">{title}</a> </h3> <span class="profile_picture">{ user?.website ? <a href={user.website}>{little}</a> : ( @@ -30,15 +31,21 @@ const little = ((first?.[0] ?? "") + (last?.[0] ?? "")).slice(0, 2); ) }</span> <div> - {first} {last} <small>· <Date + <span + itemprop="author" + itemscope + itemtype="https://schema.org/Person" + ><span itemprop="alternateName">{first} {last}</span></span> + <span class="small">· <Date {date} locales={lang} options={{ month: "short", day: "numeric" }} - /></small> + itemprop="dateModified" + /></span> </div> </header> <div class="content small"> - <div {lang}> + <div {lang} itemprop="articleBody text"> <Fragment set:html={rendered?.html} /> </div> <footer> diff --git a/src/components/templates/Search.astro b/src/components/templates/Search.astro index 5245643..ae80d32 100644 --- a/src/components/templates/Search.astro +++ b/src/components/templates/Search.astro @@ -2,8 +2,16 @@ const { site } = Astro; --- -<search> - <link rel="dns-prefetch" href="https://www.google.com/search"> +<search + itemprop="potentialAction" + itemscope + itemtype="https://schema.org/SearchAction" +> + <link + rel="dns-prefetch" + href="https://www.google.com/search" + itemprop="target" + > <form action="https://www.google.com/search" target="_blank" @@ -13,7 +21,7 @@ const { site } = Astro; name="search" > <details> - <summary>Pesquisar no website</summary> + <summary itemprop="description">Pesquisar no website</summary> <div class="details"> <p> <label>Barra de pesquisa <input @@ -25,6 +33,7 @@ const { site } = Astro; title={`"site:${site} " é usado para que os resultados da pesquisa fiquem restritos a este website`} pattern={`site:${site} .+`} size={`site:${site} .+`.length} + itemprop="query" /></label> </p> <p class="mute"> diff --git a/src/components/templates/SimplePostList.astro b/src/components/templates/SimplePostList.astro index c2c002b..164b32b 100644 --- a/src/components/templates/SimplePostList.astro +++ b/src/components/templates/SimplePostList.astro @@ -21,14 +21,22 @@ const { posts } = Astro.props; const display = name ?? email ?? entity; return ( <li> - <article> - <h3><a href={`/blog/read/${id}`}>{title}</a></h3> - { - description && - description.split("\n\n").map((paragraph) => ( - <p class="small">{paragraph}</p> - )) - } + <article + itemprop="blogPost" + itemscope + itemtype="https://schema.org/BlogPosting" + > + <h3> + <a href={`/blog/read/${id}`} itemprop="headline name">{title}</a> + </h3> + <div itemprop="abstract"> + { + description && + description.split("\n\n").map((paragraph) => ( + <p class="small">{paragraph}</p> + )) + } + </div> <footer class="small"> <Date @@ -39,7 +47,12 @@ const { posts } = Astro.props; month: "long", day: "numeric", }} - />{display} + itemprop="dateModified" + /><span + itemprop="author" + itemscope + itemtype="https://schema.org/Person" + ><span itemprop="alternateName">{display}</span></span> <KeywordsList {keywords} /> </footer> </article> @@ -58,7 +71,7 @@ const { posts } = Astro.props; & > article { padding-inline-end: calc(var(--size-9) * 1em); - & > p:not(:first-of-type) { + & > [itemprop="abstract"] > p:not(:first-of-type) { margin-block-start: 1.5em; } |