import React, { memo, useEffect, useRef, useState } from 'react'; import classnames from 'classnames'; import styles from './style.less'; import hljs from 'highlight.js'; import Icon from '../icon'; const InlineCode = memo( ({ language = 'typescript', children, }: { language?: 'vim' | 'typescript'; children: string; }) => { return ( ); }, ); type CodeProps = { link?: string; collapse?: boolean; language?: 'vim' | 'typescript'; lineCount?: number; className?: string; children?: (key: string) => React.ReactNode | void; }; const Code: React.FC = ({ className, collapse = false, link, lineCount = 0, language, children, }) => { const [lines, setLines] = useState(); const [collapseCode, setCollapseCode] = useState(collapse); useEffect(() => { if (!link) return; fetch(link) .then((response) => { if (!response.ok || !response.body) { throw new Error('获取代码失败'); } // 读取文件链接中的内容 const reader = response.body.getReader(); const decoder = new TextDecoder(); let result = ''; return new Promise((resolve) => { const read = () => { return reader.read().then(({ done, value }) => { if (done) { return resolve(result); } result += decoder.decode(value, { stream: true }); return read(); }); }; read(); }); }) .then((data) => { const lines = data .split('\n') .filter(Boolean) .map((line, index) => { const parts = line.split(/(\/\*-.+?-\*\/.+?\/\*\*\/)/); return ( {parts.map((part, partIdx) => { const result = part.match(/\/\*-(.+?)-\*\/(.+?)\/\*\*\//); if (!result) return ( {part} ); const [_, key, string] = result; return ( {children?.(key) ?? {string}} ); })} ); }); setLines(lines); }); }, [link, children]); return ( {lines} {collapse && ( setCollapseCode(!collapseCode)}> )} ); }; export default Code;
{lines}