lobe-chat
46 строк · 1.0 Кб
1'use client';
2
3import { Pre, PreSingleLine } from '@lobehub/ui/mdx';
4import { FC, PropsWithChildren } from 'react';
5
6const countLines = (str: string): number => {
7const regex = /\n/g;
8const matches = str.match(regex);
9return matches ? matches.length : 1;
10};
11
12const useCode = (raw: any) => {
13if (!raw) return;
14
15const { children, className } = raw.props;
16
17if (!children) return;
18
19const content = (Array.isArray(children) ? (children[0] as string) : children).trim();
20
21const lang = className?.replace('language-', '') || 'txt';
22
23const isSingleLine = countLines(content) <= 1 && content.length <= 32;
24
25return {
26content,
27isSingleLine,
28lang,
29};
30};
31
32const CodeBlock: FC<PropsWithChildren> = ({ children }) => {
33const code = useCode(children);
34
35if (!code) return;
36
37if (code.isSingleLine) return <PreSingleLine language={code.lang}>{code.content}</PreSingleLine>;
38
39return (
40<Pre allowChangeLanguage={false} fullFeatured language={code.lang}>
41{code.content}
42</Pre>
43);
44};
45
46export default CodeBlock;
47