app-template/packages/seo-geo/src/url.ts

44 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** 去掉尾部 /(根路径除外处理后为空串)。 */
export function stripTrailingSlash(url: string): string {
if (url === "/" || url === "") return url;
return url.replace(/\/+$/, "");
}
/** 确保 base 不带尾部 /。 */
export function normalizeSiteUrl(siteUrl: string): string {
return stripTrailingSlash(siteUrl.trim());
}
/**
* 将站内 path 或绝对 URL 解析为绝对地址。
* - 已是 http(s) → 规范化后原样返回
* - 以 / 开头 → 拼到 siteUrl
* - 相对路径 → 补 /
*/
export function absoluteUrl(siteUrl: string, pathOrUrl: string): string {
const base = normalizeSiteUrl(siteUrl);
const raw = pathOrUrl.trim();
if (/^https?:\/\//i.test(raw)) {
return raw;
}
const path = raw.startsWith("/") ? raw : `/${raw}`;
return new URL(path, `${base}/`).toString();
}
/** 路径规范化:保证以 / 开头、去掉多余尾 /(根除外)。 */
export function normalizePath(path: string): string {
const raw = path.trim() || "/";
const withSlash = raw.startsWith("/") ? raw : `/${raw}`;
if (withSlash === "/") return "/";
return stripTrailingSlash(withSlash);
}
/** 从绝对 URL 取 pathname(含查询则保留)。 */
export function urlPathname(absOrPath: string): string {
if (/^https?:\/\//i.test(absOrPath)) {
const u = new URL(absOrPath);
return `${u.pathname}${u.search}`;
}
return normalizePath(absOrPath);
}