"use client";
import { useEffect, useRef } from "react";
import Reveal from 'reveal.js';
import 'reveal.js/dist/reveal.css';
import 'reveal.js/dist/theme/white.css';
import { marked } from 'marked';
export default function UI({ data, showNavButtons = false }) {
const deckRef = useRef(null);
const revealRef = useRef(null);
useEffect(() => {
if (!data) return;
// 配置 marked 解析器
marked.setOptions({
breaks: true,
gfm: true,
headerIds: false,
mangle: false,
});
// 将 markdown 内容转换为幻灯片
const slides = parseMarkdownToSlides(data);
// 更新 deck 内容
if (deckRef.current) {
deckRef.current.innerHTML = slides;
}
// 初始化 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();
// 清理函数
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(`正在加载内容...