diff --git a/packages/docusaurus-theme-common/src/internal.ts b/packages/docusaurus-theme-common/src/internal.ts index ca12647f23..d18237e888 100644 --- a/packages/docusaurus-theme-common/src/internal.ts +++ b/packages/docusaurus-theme-common/src/internal.ts @@ -43,7 +43,7 @@ export { export {DEFAULT_SEARCH_TAG} from './utils/searchUtils'; -export {useTitleFormatter} from './utils/generalUtils'; +export {useTitleFormatter} from './utils/titleFormatterUtils'; export {useLocationChange} from './utils/useLocationChange'; diff --git a/packages/docusaurus-theme-common/src/utils/__tests__/titleFormatter.test.tsx b/packages/docusaurus-theme-common/src/utils/__tests__/titleFormatterUtils.test.tsx similarity index 94% rename from packages/docusaurus-theme-common/src/utils/__tests__/titleFormatter.test.tsx rename to packages/docusaurus-theme-common/src/utils/__tests__/titleFormatterUtils.test.tsx index f1314aa3f2..091117e46a 100644 --- a/packages/docusaurus-theme-common/src/utils/__tests__/titleFormatter.test.tsx +++ b/packages/docusaurus-theme-common/src/utils/__tests__/titleFormatterUtils.test.tsx @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import {DefaultTitleFormatter} from '../generalUtils'; +import {DefaultTitleFormatter} from '../titleFormatterUtils'; describe('DefaultTitleFormatter', () => { it('works', () => { diff --git a/packages/docusaurus-theme-common/src/utils/metadataUtils.tsx b/packages/docusaurus-theme-common/src/utils/metadataUtils.tsx index 110753a84e..e81ca52ca3 100644 --- a/packages/docusaurus-theme-common/src/utils/metadataUtils.tsx +++ b/packages/docusaurus-theme-common/src/utils/metadataUtils.tsx @@ -10,7 +10,7 @@ import clsx from 'clsx'; import Head from '@docusaurus/Head'; import useRouteContext from '@docusaurus/useRouteContext'; import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; -import {useTitleFormatter} from './generalUtils'; +import {useTitleFormatter} from './titleFormatterUtils'; type PageMetadataProps = { readonly title?: string; @@ -25,20 +25,21 @@ type PageMetadataProps = { * Works in the same way as Helmet. */ export function PageMetadata({ - title, + title: pageTitle, description, keywords, image, children, }: PageMetadataProps): ReactNode { - const pageTitle = useTitleFormatter(title); + const titleFormatter = useTitleFormatter(); const {withBaseUrl} = useBaseUrlUtils(); const pageImage = image ? withBaseUrl(image, {absolute: true}) : undefined; + const title = pageTitle ? titleFormatter.format(pageTitle) : undefined; return ( - {title && {pageTitle}} - {title && } + {title && {title}} + {title && } {description && } {description && } diff --git a/packages/docusaurus-theme-common/src/utils/titleFormatter.tsx b/packages/docusaurus-theme-common/src/utils/titleFormatterUtils.tsx similarity index 89% rename from packages/docusaurus-theme-common/src/utils/titleFormatter.tsx rename to packages/docusaurus-theme-common/src/utils/titleFormatterUtils.tsx index d882fdd6c5..bbea718021 100644 --- a/packages/docusaurus-theme-common/src/utils/titleFormatter.tsx +++ b/packages/docusaurus-theme-common/src/utils/titleFormatterUtils.tsx @@ -27,12 +27,12 @@ export const DefaultTitleFormatter: TitleFormatterFn = ({ return `${trimmedTitle} ${titleDelimiter} ${siteTitle}`; }; -type TitleFormatter = {format: (title?: string) => string}; +type TitleFormatterUtils = {format: (title?: string) => string}; /** * Returns a function to format the page title */ -export function useTitleFormatter(): TitleFormatter { +export function useTitleFormatter(): TitleFormatterUtils { const {siteConfig} = useDocusaurusContext(); const formatter = DefaultTitleFormatter; const {title: siteTitle, titleDelimiter} = siteConfig; diff --git a/packages/docusaurus-theme-search-algolia/src/theme/SearchPage/index.tsx b/packages/docusaurus-theme-search-algolia/src/theme/SearchPage/index.tsx index 7e392fee20..0dd822f6e8 100644 --- a/packages/docusaurus-theme-search-algolia/src/theme/SearchPage/index.tsx +++ b/packages/docusaurus-theme-search-algolia/src/theme/SearchPage/index.tsx @@ -25,11 +25,11 @@ import Link from '@docusaurus/Link'; import {useAllDocsData} from '@docusaurus/plugin-content-docs/client'; import { HtmlClassNameProvider, + PageMetadata, useEvent, usePluralForm, useSearchQueryString, } from '@docusaurus/theme-common'; -import {useTitleFormatter} from '@docusaurus/theme-common/internal'; import Translate, {translate} from '@docusaurus/Translate'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import { @@ -160,6 +160,25 @@ type ResultDispatcher = | {type: 'update'; value: ResultDispatcherState} | {type: 'advance'; value?: undefined}; +function getSearchPageTitle(searchQuery: string | undefined): string { + return searchQuery + ? translate( + { + id: 'theme.SearchPage.existingResultsTitle', + message: 'Search results for "{query}"', + description: 'The search page title for non-empty query', + }, + { + query: searchQuery, + }, + ) + : translate({ + id: 'theme.SearchPage.emptyResultsTitle', + message: 'Search the documentation', + description: 'The search page title for empty query', + }); +} + function SearchPageContent(): ReactNode { const { i18n: {currentLocale}, @@ -167,12 +186,13 @@ function SearchPageContent(): ReactNode { const { algolia: {appId, apiKey, indexName, contextualSearch}, } = useAlgoliaThemeConfig(); - const processSearchResultUrl = useSearchResultUrlProcessor(); const documentsFoundPlural = useDocumentsFoundPlural(); const docsSearchVersionsHelpers = useDocsSearchVersionsHelpers(); const [searchQuery, setSearchQuery] = useSearchQueryString(); + const pageTitle = getSearchPageTitle(searchQuery); + const initialSearchResultState: ResultDispatcherState = { items: [], query: null, @@ -310,24 +330,6 @@ function SearchPageContent(): ReactNode { ), ); - const getTitle = () => - searchQuery - ? translate( - { - id: 'theme.SearchPage.existingResultsTitle', - message: 'Search results for "{query}"', - description: 'The search page title for non-empty query', - }, - { - query: searchQuery, - }, - ) - : translate({ - id: 'theme.SearchPage.emptyResultsTitle', - message: 'Search the documentation', - description: 'The search page title for empty query', - }); - const makeSearch = useEvent((page: number = 0) => { if (contextualSearch) { algoliaHelper.addDisjunctiveFacetRefinement('docusaurus_tag', 'default'); @@ -380,8 +382,9 @@ function SearchPageContent(): ReactNode { return ( + + - {useTitleFormatter(getTitle())} {/* We should not index search pages See https://github.com/facebook/docusaurus/pull/3233 @@ -390,7 +393,7 @@ function SearchPageContent(): ReactNode {
- {getTitle()} + {pageTitle}
e.preventDefault()}>