UNPKG

@docusaurus/core

Version:

Easy to Maintain Open Source Documentation Websites

48 lines (47 loc) 1.96 kB
/** * 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); }