summaryrefslogtreecommitdiffstats
path: root/src/pages
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-03-23 22:05:30 +0100
committerArmand Philippot <git@armandphilippot.com>2022-03-24 15:01:03 +0100
commit9226671f49b507ce6f71e6e2c3621014f05f74e9 (patch)
tree73a148d12ceebbf0d8a95b82353d3d84f6a7a76a /src/pages
parent4e7a96c5a831882463802cdd4f84fe1464969cb0 (diff)
refactor: load prism plugins without babel
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/_app.tsx2
-rw-r--r--src/pages/article/[slug].tsx58
-rw-r--r--src/pages/projet/[slug].tsx1
3 files changed, 45 insertions, 16 deletions
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index e8c00de..84c2469 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,7 +1,7 @@
import { AppPropsWithLayout } from '@ts/types/app';
import { settings } from '@utils/config';
import { AckeeProvider } from '@utils/providers/ackee';
-import { PrismThemeProvider } from '@utils/providers/prism';
+import { PrismThemeProvider } from '@utils/providers/prism-theme';
import { ThemeProvider } from 'next-themes';
import { useRouter } from 'next/router';
import { IntlProvider } from 'react-intl';
diff --git a/src/pages/article/[slug].tsx b/src/pages/article/[slug].tsx
index 41b84b6..27a6f7b 100644
--- a/src/pages/article/[slug].tsx
+++ b/src/pages/article/[slug].tsx
@@ -14,21 +14,20 @@ import {
import styles from '@styles/pages/Page.module.scss';
import { NextPageWithLayout } from '@ts/types/app';
import { ArticleMeta, ArticleProps } from '@ts/types/articles';
+import { PrismDefaultPlugins, PrismPlugins } from '@ts/types/prism';
import { settings } from '@utils/config';
import { getFormattedPaths } from '@utils/helpers/format';
import { loadTranslation } from '@utils/helpers/i18n';
import { addPrismClasses } from '@utils/helpers/prism';
-import { usePrismTheme } from '@utils/providers/prism';
import { GetStaticPaths, GetStaticProps, GetStaticPropsContext } from 'next';
import Head from 'next/head';
import { useRouter } from 'next/router';
-import { highlightAll } from 'prismjs';
+import Script from 'next/script';
+import Prism from 'prismjs';
import { ParsedUrlQuery } from 'querystring';
-import { useEffect } from 'react';
+import { useCallback, useEffect, useMemo } from 'react';
import { useIntl } from 'react-intl';
import { Blog, BlogPosting, Graph, WebPage } from 'schema-dts';
-import '@utils/plugins/prism-color-scheme';
-import Script from 'next/script';
const SingleArticle: NextPageWithLayout<ArticleProps> = ({
comments,
@@ -37,19 +36,48 @@ const SingleArticle: NextPageWithLayout<ArticleProps> = ({
const intl = useIntl();
const router = useRouter();
- useEffect(() => {
- addPrismClasses();
- highlightAll();
- });
+ const loadPrismPlugins = useCallback(
+ async (prismPlugins: (PrismDefaultPlugins | PrismPlugins)[]) => {
+ for (const plugin of prismPlugins) {
+ try {
+ if (plugin === 'color-scheme') {
+ await import(`@utils/plugins/prism-${plugin}`);
+ } else {
+ await import(`prismjs/plugins/${plugin}/prism-${plugin}.min.js`);
- const { setCodeBlocks } = usePrismTheme();
+ if (plugin === 'autoloader')
+ Prism.plugins.autoloader.languages_path = '/prism/';
+ }
+ } catch (error) {
+ console.error('Article: an error occurred with Prism.');
+ console.error(error);
+ }
+ }
+ },
+ []
+ );
+
+ const plugins: (PrismDefaultPlugins | PrismPlugins)[] = useMemo(
+ () => [
+ 'autoloader',
+ 'toolbar',
+ 'show-language',
+ 'copy-to-clipboard',
+ 'color-scheme',
+ 'command-line',
+ 'line-numbers',
+ 'match-braces',
+ 'normalize-whitespace',
+ ],
+ []
+ );
useEffect(() => {
- const allPre: NodeListOf<HTMLPreElement> = document.querySelectorAll(
- 'pre[data-prismjs-color-scheme-current]'
- );
- setCodeBlocks(allPre);
- }, [setCodeBlocks, router.asPath]);
+ loadPrismPlugins(plugins).then(() => {
+ addPrismClasses();
+ Prism.highlightAll();
+ });
+ }, [plugins, loadPrismPlugins]);
if (router.isFallback) return <Spinner />;
diff --git a/src/pages/projet/[slug].tsx b/src/pages/projet/[slug].tsx
index b9a8f39..1f09fed 100644
--- a/src/pages/projet/[slug].tsx
+++ b/src/pages/projet/[slug].tsx
@@ -41,6 +41,7 @@ const Project: NextPageWithLayout<ProjectProps> = ({
};
const components: NestedMDXComponents = {
+ CodeBlock: (props) => CodeBlock(props),
Gallery: (props) => Gallery(props),
Image: (props) => ResponsiveImage({ caption: props.caption, ...props }),
Link: (props) => Link(props),