0
mirror of https://github.com/valentineus/popov.link.git synced 2025-07-03 16:10:26 +03:00

feat: enhance blog post and page schema with new properties

- Added optional `basedOn` field to blog post schema for better content attribution.
- Updated blog post markdown to include `basedOn` reference for improved context.
- Refactored page schema to replace deprecated website schema, enhancing structured data representation.
- Adjusted 404 and index pages to utilize the new page schema for consistency and SEO improvements.
This commit is contained in:
2025-06-14 11:47:17 +00:00
parent 17f9a467d7
commit a65e9c8455
9 changed files with 47 additions and 28 deletions

View File

@ -1,9 +1,10 @@
--- ---
basedOn: "https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/"
title: 'Create ".lib" file from ".dll" (archive)' title: 'Create ".lib" file from ".dll" (archive)'
description: "Learn how to generate a *.lib file from a *.dll with this comprehensive guide. Using the Visual Studio Command Prompt and Microsoft's recommended tools, this article walks you through the steps for a seamless process. Perfect for developers working with 3rd party win dll's." description: "Learn how to generate a *.lib file from a *.dll with this comprehensive guide. Using the Visual Studio Command Prompt and Microsoft's recommended tools, this article walks you through the steps for a seamless process. Perfect for developers working with 3rd party win dll's."
datePublished: "2023-05-04" datePublished: "2023-05-04"
dateModified: "2023-05-04" dateModified: "2023-05-04"
author: "Adrian Henke" author: "Valentin Popov"
lang: "en" lang: "en"
--- ---

View File

@ -4,6 +4,7 @@ const blog = defineCollection({
type: "content", type: "content",
schema: z.object({ schema: z.object({
author: z.string(), author: z.string(),
basedOn: z.optional(z.string()),
dateModified: z.coerce.date(), dateModified: z.coerce.date(),
datePublished: z.coerce.date(), datePublished: z.coerce.date(),
description: z.string(), description: z.string(),

View File

@ -1,15 +1,17 @@
--- ---
import Layout from "../layouts/BaseLayout.astro"; import Layout from "../layouts/BaseLayout.astro";
import websiteSchema from "../utils/schemas/websiteSchema"; import pageSchema from "../utils/schemas/pageSchema";
const title = "404 — Page Not Found | Valentin Popov"; const title = "404 — Page Not Found | Valentin Popov";
const description = "The page you're looking for doesn't exist!"; const description = "The page you're looking for doesn't exist!";
const lang = "en"; const lang = "en";
const schema = websiteSchema({ const schema = pageSchema({
siteUrl: new URL("/", Astro.site).toString(), siteUrl: new URL("/", Astro.site).toString(),
page: "/404",
title, title,
description, description,
lang,
}); });
--- ---

View File

@ -22,15 +22,16 @@ const post = Astro.props;
const { Content, remarkPluginFrontmatter } = await post.render(); const { Content, remarkPluginFrontmatter } = await post.render();
const title = post.data.title;
const description = post.data.description;
const author = post.data.author; const author = post.data.author;
const description = post.data.description;
const isBasedOn = post.data.basedOn;
const lang = post.data.lang; const lang = post.data.lang;
const formattedDate = dayjs(post.data.datePublished.toString()).format("MMMM DD, YYYY");
const datePublished = post.data.datePublished.toISOString();
const dateModified = post.data.dateModified?.toISOString();
const slug = post.slug; const slug = post.slug;
const title = post.data.title;
const dateModified = post.data.dateModified?.toISOString();
const datePublished = post.data.datePublished.toISOString();
const formattedDate = dayjs(post.data.datePublished.toString()).format("MMMM DD, YYYY");
const schema = blogPostSchema({ const schema = blogPostSchema({
siteUrl: new URL("/", Astro.site).toString(), siteUrl: new URL("/", Astro.site).toString(),
@ -41,6 +42,7 @@ const schema = blogPostSchema({
dateModified, dateModified,
author, author,
lang, lang,
isBasedOn,
}); });
--- ---
@ -61,7 +63,6 @@ const schema = blogPostSchema({
<small> <small>
Posted Posted
<time datetime={datePublished} lang="en">{formattedDate}</time> <time datetime={datePublished} lang="en">{formattedDate}</time>
by&nbsp;{author}
<span>&nbsp;•&nbsp;</span> <span>&nbsp;•&nbsp;</span>
<span>{remarkPluginFrontmatter.minutesRead}</span> <span>{remarkPluginFrontmatter.minutesRead}</span>
</small> </small>

View File

@ -3,16 +3,18 @@ import Layout from "../layouts/BaseLayout.astro";
import LatestPostsSection from "../components/Sections/LatestPosts.astro"; import LatestPostsSection from "../components/Sections/LatestPosts.astro";
import SocialLinksSection from "../components/Sections/SocialLinks.astro"; import SocialLinksSection from "../components/Sections/SocialLinks.astro";
import WelcomeSection from "../components/Sections/Welcome.astro"; import WelcomeSection from "../components/Sections/Welcome.astro";
import websiteSchema from "../utils/schemas/websiteSchema"; import pageSchema from "../utils/schemas/pageSchema";
const title = "Valentin Popov Software Developer & Team Lead | Tech Insights"; const title = "Valentin Popov Software Developer & Team Lead | Tech Insights";
const description = "Blog by Valentin Popov — software developer and team lead writing about code, side projects, digital tools, and fun experiments."; const description = "Blog by Valentin Popov — software developer and team lead writing about code, side projects, digital tools, and fun experiments.";
const lang = "en"; const lang = "en";
const schema = websiteSchema({ const schema = pageSchema({
siteUrl: new URL("/", Astro.site).toString(), siteUrl: new URL("/", Astro.site).toString(),
page: "/",
title, title,
description, description,
lang,
}); });
--- ---

View File

@ -5,13 +5,14 @@ export type BlogPostSchemaParams = {
readonly dateModified: string; readonly dateModified: string;
readonly datePublished: string; readonly datePublished: string;
readonly description: string; readonly description: string;
readonly isBasedOn?: string;
readonly lang: string; readonly lang: string;
readonly siteUrl: string; readonly siteUrl: string;
readonly slug: string; readonly slug: string;
readonly title: string; readonly title: string;
}; };
export default ({ siteUrl, slug, title, description, datePublished, dateModified, author, lang }: BlogPostSchemaParams): WithContext<BlogPosting> => ({ export default ({ siteUrl, slug, title, description, datePublished, dateModified, author, lang, isBasedOn }: BlogPostSchemaParams): WithContext<BlogPosting> => ({
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "BlogPosting", "@type": "BlogPosting",
"url": new URL(`/blog/${slug}`, siteUrl).toString(), "url": new URL(`/blog/${slug}`, siteUrl).toString(),
@ -28,4 +29,5 @@ export default ({ siteUrl, slug, title, description, datePublished, dateModified
"@type": "WebPage", "@type": "WebPage",
"@id": new URL(`/blog/${slug}`, siteUrl).toString(), "@id": new URL(`/blog/${slug}`, siteUrl).toString(),
}, },
...(isBasedOn && { isBasedOn: isBasedOn }),
}); });

View File

@ -14,6 +14,8 @@ export default ({ siteUrl, title, posts }: BlogSchemaParams): WithContext<Collec
"name": title, "name": title,
"mainEntity": { "mainEntity": {
"@type": "ItemList", "@type": "ItemList",
"itemListOrder": "https://schema.org/ItemListOrderDescending",
"numberOfItems": posts.length,
"itemListElement": posts.map((post, index) => ({ "itemListElement": posts.map((post, index) => ({
"@type": "ListItem", "@type": "ListItem",
"position": index + 1, "position": index + 1,

View File

@ -0,0 +1,23 @@
import type { WithContext, WebPage } from "schema-dts";
export type WebsiteSchemaParams = {
readonly description: string;
readonly page: string;
readonly siteUrl: string;
readonly title: string;
readonly lang: string;
};
export default ({ siteUrl, page, title, description, lang }: WebsiteSchemaParams): WithContext<WebPage> => ({
"@context": "https://schema.org",
"@type": "WebPage",
"@id": new URL(page, siteUrl).toString(),
"url": new URL(page, siteUrl).toString(),
"name": title,
"description": description,
"inLanguage": lang,
"mainEntity": {
"@type": "WebSite",
"@id": new URL("/", siteUrl).toString(),
},
});

View File

@ -1,15 +0,0 @@
import type { WithContext, WebSite } from "schema-dts";
export type WebsiteSchemaParams = {
readonly description: string;
readonly siteUrl: string;
readonly title: string;
};
export default ({ siteUrl, title, description }: WebsiteSchemaParams): WithContext<WebSite> => ({
"@context": "https://schema.org",
"@type": "WebSite",
"url": new URL("/", siteUrl).toString(),
"name": title,
"description": description,
});