| import I18nKey from "@i18n/i18nKey";
|
| import { i18n } from "@i18n/translation";
|
|
|
| |
| |
| |
|
|
| 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 {
|
|
|
| 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);
|
| }
|
|
|