'use client';
import { useEffect, useRef } from 'react';
import Reveal from 'reveal.js';
import 'reveal.js/dist/reveal.css';
import 'reveal.js/dist/theme/black.css';
import { marked } from 'marked';
export default function Presentation({ data }) {
const deckRef = useRef(null);
const revealRef = useRef(null);
useEffect(() => {
if (!data) return;
// 配置 marked 解析器
marked.setOptions({
breaks: true,
gfm: true,
headerIds: false,
mangle: false,
});
// 初始化 Reveal.js
if (revealRef.current) {
revealRef.current.destroy();
}
revealRef.current = new Reveal(deckRef.current, {
hash: true,
transition: 'slide',
transitionSpeed: 'default',
backgroundTransition: 'fade',
controls: true,
progress: true,
center: true,
touch: true,
loop: false,
rtl: false,
navigationMode: 'default',
shuffle: false,
fragments: true,
fragmentInURL: false,
embedded: false,
help: true,
showNotes: false,
autoPlayMedia: null,
preloadIframes: null,
autoSlide: 0,
autoSlideStoppable: true,
autoSlideMethod: Reveal.navigateNext,
defaultTiming: null,
mouseWheel: false,
hideInactiveCursor: true,
hideCursorTime: 5000,
previewLinks: false,
postMessage: true,
postMessageEvents: false,
focusBodyOnPageVisibilityChange: true,
viewDistance: 3,
mobileViewDistance: 2,
display: 'block',
hideAnchorsOnUrl: false,
plugins: []
});
revealRef.current.initialize();
// 在Reveal.js初始化后,更新slides内容
setTimeout(() => {
if (deckRef.current) {
const slides = parseMarkdownToSlides(data);
const slidesContainer = deckRef.current.querySelector('.slides');
if (slidesContainer) {
slidesContainer.innerHTML = slides;
}
}
}, 100);
// 清理函数
return () => {
if (revealRef.current) {
revealRef.current.destroy();
}
};
}, [data]);
// 将数据解析为幻灯片
const parseMarkdownToSlides = (data) => {
if (!data) {
return ` 暂无内容演示文稿
${data.subtitle}
` : ''} ${data.description ? `${item.item_subtitle}
`); } // 描述 if (item.item_description) { slideContent.push(`正在加载内容...