@docusaurus/core
Version:
Easy to Maintain Open Source Documentation Websites
48 lines (47 loc) • 1.96 kB
JavaScript
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import { useCallback } from 'react';
import useDocusaurusContext from './useDocusaurusContext';
import { hasProtocol } from './isInternalUrl';
export function addBaseUrl({ siteUrl, baseUrl, url, options: { forcePrependBaseUrl = false, absolute = false } = {}, router, }) {
// It never makes sense to add base url to a local anchor url, or one with a
// protocol
if (!url || url.startsWith('#') || hasProtocol(url)) {
return url;
}
// TODO hash router + /baseUrl/ is unlikely to work well in all situations
// This will support most cases, but not all
// See https://github.com/facebook/docusaurus/pull/9859
if (router === 'hash') {
return url.startsWith('/') ? `.${url}` : `./${url}`;
}
if (forcePrependBaseUrl) {
return baseUrl + url.replace(/^\//, '');
}
// /baseUrl -> /baseUrl/
// https://github.com/facebook/docusaurus/issues/6315
if (url === baseUrl.replace(/\/$/, '')) {
return baseUrl;
}
// We should avoid adding the baseurl twice if it's already there
const shouldAddBaseUrl = !url.startsWith(baseUrl);
const basePath = shouldAddBaseUrl ? baseUrl + url.replace(/^\//, '') : url;
return absolute ? siteUrl + basePath : basePath;
}
export function useBaseUrlUtils() {
const { siteConfig } = useDocusaurusContext();
const { baseUrl, url: siteUrl } = siteConfig;
const router = siteConfig.future.experimental_router;
const withBaseUrl = useCallback((url, options) => addBaseUrl({ siteUrl, baseUrl, url, options, router }), [siteUrl, baseUrl, router]);
return {
withBaseUrl,
};
}
export default function useBaseUrl(url, options = {}) {
const { withBaseUrl } = useBaseUrlUtils();
return withBaseUrl(url, options);
}