mirror of
https://github.com/StepanovPlaton/AboutMe.git
synced 2026-04-04 04:40:51 +04:00
Initial commit
This commit is contained in:
76
src/utils/url.ts
Normal file
76
src/utils/url.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import type { CollectionEntry } from "astro:content";
|
||||
|
||||
import { i18n } from "@i18n/translation";
|
||||
import I18nKey from "@i18n/i18nKey";
|
||||
|
||||
|
||||
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 removeFileExtension(id: string): string {
|
||||
return id.replace(/\.(md|mdx|markdown)$/i, "");
|
||||
}
|
||||
|
||||
export function getPostUrlBySlug(slug: string): string {
|
||||
// 移除文件扩展名(如 .md, .mdx 等)
|
||||
const slugWithoutExt = removeFileExtension(slug);
|
||||
return url(`/posts/${slugWithoutExt}/`);
|
||||
}
|
||||
|
||||
export function getPostUrlByRouteName(routeName: string): string {
|
||||
// 移除开头的斜杠并确保固定链接在 /posts/ 路径下
|
||||
const cleanRouteName = routeName.replace(/^\/+/, "");
|
||||
return url(`/posts/${cleanRouteName}/`);
|
||||
}
|
||||
|
||||
export function getPostUrl(post: CollectionEntry<"posts">): string;
|
||||
export function getPostUrl(post: { id: string; data: { routeName?: string } }): string;
|
||||
export function getPostUrl(post: any): string {
|
||||
// 如果文章有自定义固定链接,优先使用固定链接
|
||||
if (post.data.routeName) {
|
||||
return getPostUrlByRouteName(post.data.routeName);
|
||||
}
|
||||
// 否则使用默认的 slug 路径
|
||||
return getPostUrlBySlug(post.id);
|
||||
}
|
||||
|
||||
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 url(path: string) {
|
||||
return joinUrl("", import.meta.env.BASE_URL, path);
|
||||
}
|
||||
Reference in New Issue
Block a user