Просмотр исходного кода

change style to enable slide overview

reiji-h 2 лет назад
Родитель
Сommit
2f55c1f97b

+ 10 - 9
apps/app/src/components/Page/RevisionRenderer.tsx

@@ -1,6 +1,5 @@
 import React, { useEffect, useState } from 'react';
 import React, { useEffect, useState } from 'react';
 
 
-import { presentationSlideStyle } from '@growi/presentation';
 import dynamic from 'next/dynamic';
 import dynamic from 'next/dynamic';
 import { ErrorBoundary, FallbackProps } from 'react-error-boundary';
 import { ErrorBoundary, FallbackProps } from 'react-error-boundary';
 import ReactMarkdown from 'react-markdown';
 import ReactMarkdown from 'react-markdown';
@@ -47,13 +46,15 @@ const RevisionRenderer = React.memo((props: Props): JSX.Element => {
     rendererOptions, markdown, additionalClassName, isSlidesOverviewEnabled,
     rendererOptions, markdown, additionalClassName, isSlidesOverviewEnabled,
   } = props;
   } = props;
 
 
-  const [slideStyle, setSlideStyle] = useState<presentationSlideStyle | null>();
+  const [hasSlideFlag, setHasSlideFlag] = useState<boolean>();
+  const [hasMarpFlag, setHasMarpFlag] = useState<boolean>();
 
 
   // useEffect avoid ssr
   // useEffect avoid ssr
   useEffect(() => {
   useEffect(() => {
     if (isSlidesOverviewEnabled) {
     if (isSlidesOverviewEnabled) {
       const processMarkdown = () => (tree) => {
       const processMarkdown = () => (tree) => {
-        setSlideStyle(null);
+        setHasSlideFlag(false);
+        setHasMarpFlag(false);
         visit(tree, 'yaml', (node) => {
         visit(tree, 'yaml', (node) => {
           if (node.value != null) {
           if (node.value != null) {
             const lines = node.value.split('\n');
             const lines = node.value.split('\n');
@@ -61,11 +62,11 @@ const RevisionRenderer = React.memo((props: Props): JSX.Element => {
             lines.forEach((line) => {
             lines.forEach((line) => {
               const [key, value] = line.split(':').map(part => part.trim());
               const [key, value] = line.split(':').map(part => part.trim());
 
 
-              if (key === 'presentation') {
-                setSlideStyle(value === 'marp' || value === 'true' ? value : null);
+              if (key === 'slide' && value === 'true') {
+                setHasSlideFlag(true);
               }
               }
               else if (key === 'marp' && value === 'true') {
               else if (key === 'marp' && value === 'true') {
-                setSlideStyle('marp');
+                setHasMarpFlag(true);
               }
               }
             });
             });
           }
           }
@@ -79,9 +80,9 @@ const RevisionRenderer = React.memo((props: Props): JSX.Element => {
         .use(processMarkdown)
         .use(processMarkdown)
         .process(markdown);
         .process(markdown);
     }
     }
-  }, [markdown, setSlideStyle, isSlidesOverviewEnabled]);
+  }, [markdown, setHasSlideFlag, setHasMarpFlag, isSlidesOverviewEnabled]);
 
 
-  if (isSlidesOverviewEnabled && slideStyle != null) {
+  if (isSlidesOverviewEnabled && (hasSlideFlag || hasMarpFlag)) {
     const options = {
     const options = {
       rendererOptions: rendererOptions as ReactMarkdownOptions,
       rendererOptions: rendererOptions as ReactMarkdownOptions,
       isDarkMode: false,
       isDarkMode: false,
@@ -90,7 +91,7 @@ const RevisionRenderer = React.memo((props: Props): JSX.Element => {
     return (
     return (
       <Slides
       <Slides
         options={options}
         options={options}
-        slideStyle={slideStyle}
+        hasMarpFlag={hasMarpFlag}
       >{markdown}</Slides>
       >{markdown}</Slides>
     );
     );
   }
   }

+ 18 - 43
packages/presentation/src/components/Slides.tsx

@@ -6,7 +6,6 @@ import Head from 'next/head';
 import { ReactMarkdown } from 'react-markdown/lib/react-markdown';
 import { ReactMarkdown } from 'react-markdown/lib/react-markdown';
 
 
 import type { PresentationOptions } from '../consts';
 import type { PresentationOptions } from '../consts';
-import { SLIDE_STYLE, presentationSlideStyle } from '../interfaces';
 import * as extractSections from '../services/renderer/extract-sections';
 import * as extractSections from '../services/renderer/extract-sections';
 
 
 import './Slides.global.scss';
 import './Slides.global.scss';
@@ -27,7 +26,6 @@ const marp = new Marp({
 
 
 // TODO: to change better slide style
 // TODO: to change better slide style
 // https://redmine.weseek.co.jp/issues/125680
 // https://redmine.weseek.co.jp/issues/125680
-const marpDefaultTheme = marp.themeSet.default;
 const marpSlideTheme = marp.themeSet.add(`
 const marpSlideTheme = marp.themeSet.add(`
     /*!
     /*!
      * @theme slide_preview
      * @theme slide_preview
@@ -36,74 +34,51 @@ const marpSlideTheme = marp.themeSet.add(`
       max-width: 90%;
       max-width: 90%;
     }
     }
 `);
 `);
+marp.themeSet.default = marpSlideTheme;
 
 
 
 
 type Props = {
 type Props = {
   options: PresentationOptions,
   options: PresentationOptions,
   children?: string,
   children?: string,
-  slideStyle?: presentationSlideStyle,
+  hasMarpFlag?: boolean,
 }
 }
 
 
 export const Slides = (props: Props): JSX.Element => {
 export const Slides = (props: Props): JSX.Element => {
-  const { options, children, slideStyle } = props;
+  const { options, children, hasMarpFlag } = props;
   const {
   const {
     rendererOptions, isDarkMode, disableSeparationByHeader,
     rendererOptions, isDarkMode, disableSeparationByHeader,
   } = options;
   } = options;
 
 
-  rendererOptions.remarkPlugins?.push([
-    extractSections.remarkPlugin,
-    {
-      isDarkMode,
-      disableSeparationByHeader,
-    },
-  ]);
-
-
-  if (slideStyle === SLIDE_STYLE.true) {
-    // TODO: to change better slide style
-    // https://redmine.weseek.co.jp/issues/125680
-    // classname = "marpit" cannot be used in SSR.
-    // And RevisionRenderer.tsx is used in SSR.
-    // so use classname = "marpit" in Slides.tsx is dynamic imported.
-    marp.themeSet.default = marpSlideTheme;
-    const { css } = marp.render('', { htmlAsArray: true });
-    return (
-      <>
-        <Head>
-          <style>{css}</style>
-        </Head>
-        <div className={`${MARP_CONTAINER_CLASS_NAME}`}>
-          <div className="slides">
-            <ReactMarkdown {...rendererOptions}>
-              { children ?? '## No Contents' }
-            </ReactMarkdown>
-          </div>
-        </div>
-      </>
-    );
-  }
 
 
   // TODO: can Marp rendering
   // TODO: can Marp rendering
   // https://redmine.weseek.co.jp/issues/115673
   // https://redmine.weseek.co.jp/issues/115673
-  if (slideStyle === SLIDE_STYLE.marp) {
+  if (hasMarpFlag) {
     return (
     return (
       <></>
       <></>
     );
     );
   }
   }
 
 
+  rendererOptions.remarkPlugins?.push([
+    extractSections.remarkPlugin,
+    {
+      isDarkMode,
+      disableSeparationByHeader,
+    },
+  ]);
 
 
-  marp.themeSet.default = marpDefaultTheme;
   const { css } = marp.render('', { htmlAsArray: true });
   const { css } = marp.render('', { htmlAsArray: true });
   return (
   return (
     <>
     <>
       <Head>
       <Head>
         <style>{css}</style>
         <style>{css}</style>
       </Head>
       </Head>
-      <ReactMarkdown {...rendererOptions}>
-        { children ?? '## No Contents' }
-      </ReactMarkdown>
+      <div className={`${MARP_CONTAINER_CLASS_NAME}`}>
+        <div className="slides">
+          <ReactMarkdown {...rendererOptions}>
+            { children ?? '## No Contents' }
+          </ReactMarkdown>
+        </div>
+      </div>
     </>
     </>
   );
   );
-
-
 };
 };

+ 0 - 2
packages/presentation/src/interfaces/index.ts

@@ -1,2 +0,0 @@
-export const SLIDE_STYLE = { true: 'true', marp: 'marp' } as const;
-export type presentationSlideStyle = typeof SLIDE_STYLE[keyof typeof SLIDE_STYLE];