refactor: change article url pattern

This commit is contained in:
Sergey Yarkov 2022-08-20 16:58:11 +03:00
parent 8e22ccd84f
commit 718d91dd16
6 changed files with 15 additions and 18 deletions

View File

@ -1,5 +1,6 @@
import solid from "@astrojs/solid-js";
// import image from "@astrojs/image";
// import compress from 'astro-compress'
import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap";
import { defineConfig } from "astro/config";
@ -26,8 +27,8 @@ export default defineConfig({
i18n: {
defaultLocale: "ru",
locales: {
ru: "ru-RU",
en: "en-US",
ru: "ru",
en: "en",
},
},
}),
@ -76,7 +77,7 @@ export default defineConfig({
],
}),
],
trailingSlash: "always",
trailingSlash: "ignore",
markdown: {
syntaxHighlight: "prism",
},

View File

@ -14,7 +14,7 @@ export const ArticleItem: Component<ArticleItemProps> = (props) => {
const hrefLangPrefix = props.data.lang && props.data.lang !== DEFAULT_LANGUAGE ? "/en" : "";
return (
<article class="article-item">
<a href={`/blog/${new Date(props.data.published_at).toLocaleDateString("en-CA")}${hrefLangPrefix}/${props.data.slug}/`}>
<a href={`${hrefLangPrefix}/blog/${new Date(props.data.published_at).toLocaleDateString("en-CA")}/${props.data.slug}/`}>
<div class="flex">
<h3>{props.data.title}</h3>
{isNonDefaultLanguage && <sup>{props.data.lang.toLocaleUpperCase()}</sup>}

View File

@ -9,13 +9,13 @@ const lang = getLanguageFromURL(Astro.url.pathname);
const canonicalUrl = new URL(Astro.url.pathname, Astro.site);
export async function getStaticPaths() {
const modules = import.meta.glob<MDXInstance<ArticleType>>("../../../content/articles/**/*.mdx", { eager: true });
const entries = Object.keys(modules).map((key) => [key, key.split("/").slice(7)[0]]);
const modules = import.meta.glob<MDXInstance<ArticleType>>("../../content/articles/**/*.mdx", { eager: true });
const entries = Object.keys(modules).map((key) => [key, key.split("/").slice(6)[0]]);
return entries.map(([key, lang]) => {
const article = modules[key];
const published_at = new Date(article.frontmatter.published_at).toLocaleDateString("en-CA");
const slug = `${published_at}/${lang !== DEFAULT_LANGUAGE ? lang + "/" : ""}${article.frontmatter.slug}`;
const slug = `${lang !== DEFAULT_LANGUAGE ? `${lang}/` : ""}blog/${published_at}/${article.frontmatter.slug}`;
return { params: { slug }, props: article };
});

View File

@ -14,9 +14,10 @@ for (const key of Object.keys(articles)) {
const { title, description, slug, published_at, coverImage } = article[lang].frontmatter;
items.push({
link:
`${import.meta.env.SITE}blog/` +
`${import.meta.env.SITE}` +
`${lang !== DEFAULT_LANGUAGE ? `${lang}/` : ""}` +
"blog/" +
new Date(published_at).toLocaleDateString("en-CA") +
`${lang !== DEFAULT_LANGUAGE ? "/" + lang : ""}` +
`/${slug}/`,
title,
description: `${description}${coverImage !== undefined ? `<img src="${coverImage}" alt="${title}">` : ""}`,

View File

@ -9,10 +9,3 @@ export function isEmail(email: string): boolean {
export function isURL(url: string): boolean {
return new RegExp(/(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\\/~+#-]*[\w@?^=%&\\/~+#-])/).test(url);
}
export function normalizeLangTag(tag: string) {
if (!tag.includes("-")) return tag.toLowerCase();
const [lang, region] = tag.split("-");
return lang.toLowerCase() + "-" + region.toUpperCase();
}

View File

@ -1,4 +1,5 @@
import { DEFAULT_LANGUAGE } from "@root/config";
import languages from "@i18n/languages";
export const encode = (data: object) => {
return Object.keys(data)
@ -7,6 +8,7 @@ export const encode = (data: object) => {
};
export const getLanguageFromURL = (pathname: string) => {
const langCodeMatch = pathname.match(/\/([a-z]{1}-?[a-z]{1})\//);
return langCodeMatch ? langCodeMatch[1] : DEFAULT_LANGUAGE;
const lang = pathname.split("/")[1];
if (Object.hasOwn(languages, lang)) return lang;
return DEFAULT_LANGUAGE;
};