123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import ReactMarkdown from "react-markdown";
- import "katex/dist/katex.min.css";
- import RemarkMath from "remark-math";
- import RemarkBreaks from "remark-breaks";
- import RehypeKatex from "rehype-katex";
- import RemarkGfm from "remark-gfm";
- import SyntaxHighlighter from 'react-syntax-highlighter'
- import { atelierHeathLight } from 'react-syntax-highlighter/dist/esm/styles/hljs'
- import { useRef, useState, RefObject, useEffect } from "react";
- // import { copyToClipboard } from "../utils";
- export function PreCode(props: { children: any }) {
- const ref = useRef<HTMLPreElement>(null);
- return (
- <pre ref={ref}>
- <span
- className="copy-code-button"
- onClick={() => {
- if (ref.current) {
- const code = ref.current.innerText;
- // copyToClipboard(code);
- }
- }}
- ></span>
- {props.children}
- </pre>
- );
- }
- const useLazyLoad = (ref: RefObject<Element>): boolean => {
- const [isIntersecting, setIntersecting] = useState<boolean>(false);
- useEffect(() => {
- const observer = new IntersectionObserver(([entry]) => {
- if (entry.isIntersecting) {
- setIntersecting(true);
- observer.disconnect();
- }
- });
- if (ref.current) {
- observer.observe(ref.current);
- }
- return () => {
- observer.disconnect();
- };
- }, [ref]);
- return isIntersecting;
- };
- export function Markdown(props: { content: string }) {
- return (
- <div className="markdown-body">
- <ReactMarkdown
- remarkPlugins={[RemarkMath, RemarkGfm, RemarkBreaks]}
- rehypePlugins={[
- RehypeKatex,
- ]}
- components={{
- code({ node, inline, className, children, ...props }) {
- const match = /language-(\w+)/.exec(className || '')
- return !inline && match ? (
- <SyntaxHighlighter
- {...props}
- children={String(children).replace(/\n$/, '')}
- style={atelierHeathLight}
- language={match[1]}
- showLineNumbers
- PreTag="div"
- />
- ) : (
- <code {...props} className={className}>
- {children}
- </code>
- )
- }
- }}
- linkTarget={"_blank"}
- >
- {props.content}
- </ReactMarkdown>
- </div>
- );
- }
|