This is an automated email from the ASF dual-hosted git repository.
tison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
The following commit(s) were added to refs/heads/main by this push:
new a14ce8e53ab [feat] Add canonical link for SEO (#481)
a14ce8e53ab is described below
commit a14ce8e53ab5535f0fce4da94c9bbea094ca601b
Author: tison <[email protected]>
AuthorDate: Wed Mar 22 10:10:10 2023 +0800
[feat] Add canonical link for SEO (#481)
Signed-off-by: tison <[email protected]>
---
src/theme/DocPage/index.tsx | 74 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/src/theme/DocPage/index.tsx b/src/theme/DocPage/index.tsx
new file mode 100644
index 00000000000..a8567d06bdd
--- /dev/null
+++ b/src/theme/DocPage/index.tsx
@@ -0,0 +1,74 @@
+import React from 'react';
+import clsx from 'clsx';
+import {HtmlClassNameProvider, PageMetadata, ThemeClassNames,} from
'@docusaurus/theme-common';
+import {
+ DocsSidebarProvider,
+ DocsVersionProvider,
+ docVersionSearchTag,
+ useDocRouteMetadata,
+} from '@docusaurus/theme-common/internal';
+import DocPageLayout from '@theme/DocPage/Layout';
+import NotFound from '@theme/NotFound';
+import SearchMetadata from '@theme/SearchMetadata';
+import type {Props} from '@theme/DocPage';
+import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
+import useBaseUrl from "@docusaurus/useBaseUrl";
+
+function createCanonicalHref(props: Props): string {
+ const {siteConfig} = useDocusaurusContext();
+ const {versionMetadata, location, match} = props;
+ if (versionMetadata.version === 'current') {
+ // 1. The NEXT version docs should not forward to the latest stable version
+ // 2. Other plugins-doc instance (contribute, release-note, ...) happens
to keep the link
+ return siteConfig.url + useBaseUrl(location.pathname);
+ }
+ const basename = location.pathname.replace(match.path, '');
+ return siteConfig.url + useBaseUrl(`/docs/${basename}`);
+}
+function DocPageMetadata(props: Props): JSX.Element {
+ const {versionMetadata} = props;
+ return (
+ <>
+ <SearchMetadata
+ version={versionMetadata.version}
+ tag={docVersionSearchTag(
+ versionMetadata.pluginId,
+ versionMetadata.version,
+ )}
+ />
+ <PageMetadata>
+ {versionMetadata.noIndex && (
+ <meta name="robots" content="noindex, nofollow" />
+ )}
+ <link rel="canonical" href={createCanonicalHref(props)}/>
+ </PageMetadata>
+ </>
+ );
+}
+
+export default function DocPage(props: Props): JSX.Element {
+ const {versionMetadata} = props;
+ const currentDocRouteMetadata = useDocRouteMetadata(props);
+ if (!currentDocRouteMetadata) {
+ return <NotFound />;
+ }
+ const {docElement, sidebarName, sidebarItems} = currentDocRouteMetadata;
+ return (
+ <>
+ <DocPageMetadata {...props} />
+ <HtmlClassNameProvider
+ className={clsx(
+ // TODO: it should be removed from here
+ ThemeClassNames.wrapper.docsPages,
+ ThemeClassNames.page.docsDocPage,
+ props.versionMetadata.className,
+ )}>
+ <DocsVersionProvider version={versionMetadata}>
+ <DocsSidebarProvider name={sidebarName} items={sidebarItems}>
+ <DocPageLayout>{docElement}</DocPageLayout>
+ </DocsSidebarProvider>
+ </DocsVersionProvider>
+ </HtmlClassNameProvider>
+ </>
+ );
+}