blog / src /utils /url-utils.ts
cacode's picture
Upload 434 files
96dd062 verified
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
/**
* 移除文件扩展名(.md, .mdx, .markdown)
* 用于将 Astro v5 Content Layer API 的 id 转换为 URL 友好的 slug
*/
export function removeFileExtension(id: string): string {
return id.replace(/\.(md|mdx|markdown)$/i, "");
}
export function pathsEqual(path1: string, path2: string) {
const normalizedPath1 = path1.replace(/^\/|\/$/g, "").toLowerCase();
const normalizedPath2 = path2.replace(/^\/|\/$/g, "").toLowerCase();
return normalizedPath1 === normalizedPath2;
}
function joinUrl(...parts: string[]): string {
const joined = parts.join("/");
return joined.replace(/\/+/g, "/");
}
export function getPostUrlBySlug(slug: string): string {
// 移除文件扩展名(如 .md, .mdx 等)
const slugWithoutExt = removeFileExtension(slug);
return url(`/posts/${slugWithoutExt}/`);
}
export function getTagUrl(tag: string): string {
if (!tag) return url("/archive/");
return url(`/archive/?tag=${encodeURIComponent(tag.trim())}`);
}
export function getCategoryUrl(category: string | null): string {
if (
!category ||
category.trim() === "" ||
category.trim().toLowerCase() === i18n(I18nKey.uncategorized).toLowerCase()
)
return url("/archive/?uncategorized=true");
return url(`/archive/?category=${encodeURIComponent(category.trim())}`);
}
export function getDir(path: string): string {
// 移除文件扩展名
const pathWithoutExt = removeFileExtension(path);
const lastSlashIndex = pathWithoutExt.lastIndexOf("/");
if (lastSlashIndex < 0) {
return "/";
}
return pathWithoutExt.substring(0, lastSlashIndex + 1);
}
export function getFileDirFromPath(filePath: string): string {
return filePath.replace(/^src\//, "").replace(/\/[^/]+$/, "");
}
export function getSearchUrl(query: string): string {
return url(`/search/?q=${encodeURIComponent(query.trim())}`);
}
export function url(path: string) {
return joinUrl("", import.meta.env.BASE_URL, path);
}