| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | 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 type { RefObject } from 'react'import { useEffect, useRef, useState } from 'react'// import { copyToClipboard } from "../utils";// https://txtfiddle.com/~hlshwya/extract-urls-from-text// const urlRegex = /\b((https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/ig// function highlightURL(content: string) {//   return content.replace(urlRegex, (url) => {//     // fix http:// in [] will be parsed to link agin//     const res = `[${url.replace('://', '://')}](${url})`//     return res//   })// }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'}      >        {/* Markdown detect has problem. */}        {props.content}      </ReactMarkdown>    </div>  )}
 |