import { useEffect, FC, CSSProperties } from 'react' import Prism from 'prismjs' import ReactMarkdown from 'react-markdown' import gfm from 'remark-gfm' import remarkMath from 'remark-math' import rehypeKatex from 'rehype-katex' import rehypeRaw from 'rehype-raw' import 'katex/dist/katex.min.css' import FourOhFour from '../FourOhFour' import Loading from '../Loading' import DownloadButtonGroup from '../DownloadBtnGtoup' import useFileContent from '../../utils/fetchOnMount' import { DownloadBtnContainer, PreviewContainer } from './Containers' const MarkdownPreview: FC<{ file: any; path: string; standalone?: boolean }> = ({ file, path, standalone = true, }) => { const { content, error, validating } = useFileContent(file['@microsoft.graph.downloadUrl']) // The parent folder of the markdown file, which is also the relative image folder const parentPath = path.substring(0, path.lastIndexOf('/')) // Check if the image is relative path instead of a absolute url const isUrlAbsolute = (url: string | string[]) => url.indexOf('://') > 0 || url.indexOf('//') === 0 // Custom renderer to render images with relative path const relativeImagePathRenderer = { img: ({ alt, src, title, width, height, style, }: { alt?: string src?: string title?: string width?: string | number height?: string | number style?: CSSProperties }) => { if (isUrlAbsolute(src as string)) { return ( // eslint-disable-next-line @next/next/no-img-element {alt} ) } return ( // eslint-disable-next-line @next/next/no-img-element {alt} ) }, } useEffect(() => { Prism.highlightAll() }, [content]) if (error) { return ( ) } if (validating) { return ( ) } return (
{/* Using rehypeRaw to render HTML inside Markdown is potentially dangerous, use under safe environments. (#18) */} {content}
{standalone && ( )}
) } export default MarkdownPreview