2021-03-01 15:06:11 +08:00

49 lines
1.5 KiB
JavaScript

import { useSiteData } from 'vitepress';
export const hashRE = /#.*$/;
export const extRE = /(index)?\.(md|html)$/;
export const endingSlashRE = /\/$/;
export const outboundRE = /^[a-z]+:/i;
export function withBase(path) {
return (useSiteData().value.base + path).replace(/\/+/g, '/');
}
export function isExternal(path) {
return outboundRE.test(path);
}
export function isActive(route, path) {
if (path === undefined) {
return false;
}
const routePath = normalize(route.path);
const pagePath = normalize(path);
return routePath === pagePath;
}
export function normalize(path) {
return decodeURI(path).replace(hashRE, '').replace(extRE, '');
}
export function joinUrl(base, path) {
const baseEndsWithSlash = base.endsWith('/');
const pathStartsWithSlash = path.startsWith('/');
if (baseEndsWithSlash && pathStartsWithSlash) {
return base.slice(0, -1) + path;
}
if (!baseEndsWithSlash && !pathStartsWithSlash) {
return `${base}/${path}`;
}
return base + path;
}
/**
* get the path without filename (the last segment). for example, if the given
* path is `/guide/getting-started.html`, this method will return `/guide/`.
* Always with a trailing slash.
*/
export function getPathDirName(path) {
const segments = path.split('/');
if (segments[segments.length - 1]) {
segments.pop();
}
return ensureEndingSlash(segments.join('/'));
}
export function ensureEndingSlash(path) {
return /(\.html|\/)$/.test(path) ? path : `${path}/`;
}