mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 17:00:15 +01:00
handles in-line code in model response text (not multi-line yet)
This commit is contained in:
parent
1a6cddb8bb
commit
187f7b5b03
7 changed files with 52 additions and 7 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Messages from './components/Main/Messages';
|
import Messages from './components/Messages';
|
||||||
import Landing from './components/Main/Landing';
|
import Landing from './components/Main/Landing';
|
||||||
import TextChat from './components/Main/TextChat';
|
import TextChat from './components/Main/TextChat';
|
||||||
import Nav from './components/Nav';
|
import Nav from './components/Nav';
|
||||||
|
|
|
||||||
18
src/components/Messages/CodeWrapper.jsx
Normal file
18
src/components/Messages/CodeWrapper.jsx
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
export default function CodeWrapper({ text }) {
|
||||||
|
const matchRegex = /(`[^`]+?`)/g;
|
||||||
|
const parts = text.split(matchRegex);
|
||||||
|
// console.log('parts', parts);
|
||||||
|
|
||||||
|
// map over the parts and wrap any text between tildes with <code> tags
|
||||||
|
const codeParts = parts.map((part, index) => {
|
||||||
|
if (part.match(matchRegex)) {
|
||||||
|
return <code key={index}>{part.slice(1, -1)}</code>;
|
||||||
|
} else {
|
||||||
|
return part;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return <>{codeParts}</>; // return the wrapped text
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import CodeWrapper from './CodeWrapper';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import GPTIcon from '../svg/GPTIcon';
|
import GPTIcon from '../svg/GPTIcon';
|
||||||
import BingIcon from '../svg/BingIcon';
|
import BingIcon from '../svg/BingIcon';
|
||||||
|
|
@ -52,6 +53,8 @@ export default function Message({
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const wrapText = (text) => <CodeWrapper text={text} />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
{...props}
|
{...props}
|
||||||
|
|
@ -64,14 +67,16 @@ export default function Message({
|
||||||
{error ? (
|
{error ? (
|
||||||
<div className="flex flex min-h-[20px] flex-row flex-col items-start gap-4 gap-2 whitespace-pre-wrap text-red-500">
|
<div className="flex flex min-h-[20px] flex-row flex-col items-start gap-4 gap-2 whitespace-pre-wrap text-red-500">
|
||||||
<div className="rounded-md border border-red-500 bg-red-500/10 py-2 px-3 text-sm text-gray-600 dark:text-gray-100">
|
<div className="rounded-md border border-red-500 bg-red-500/10 py-2 px-3 text-sm text-gray-600 dark:text-gray-100">
|
||||||
{text}
|
{wrapText(text)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<span>
|
<div className="flex min-h-[20px] flex-col items-start gap-4 whitespace-pre-wrap">
|
||||||
{text}
|
<div className="markdown prose dark:prose-invert light w-full break-words">
|
||||||
{blinker && <span className="result-streaming">█</span>}
|
{wrapText(text)}
|
||||||
</span>
|
{blinker && <span className="result-streaming">█</span>}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -160,7 +160,7 @@ export default function TextChat({ messages }) {
|
||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
onChange={changeHandler}
|
onChange={changeHandler}
|
||||||
placeholder=""
|
placeholder=""
|
||||||
className="m-0 h-auto max-h-52 resize-none overflow-auto border-0 bg-transparent p-0 pl-9 pr-9 leading-6 focus:outline-none focus:ring-0 focus-visible:ring-0 dark:bg-transparent md:pl-8"
|
className="m-0 h-auto max-h-52 resize-none overflow-auto border-0 bg-transparent p-0 pl-9 pr-8 leading-6 focus:outline-none focus:ring-0 focus-visible:ring-0 dark:bg-transparent md:pl-8"
|
||||||
/>
|
/>
|
||||||
<SubmitButton submitMessage={submitMessage} />
|
<SubmitButton submitMessage={submitMessage} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,28 @@
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
outline: 1px solid limegreen !important;
|
outline: 1px solid limegreen !important;
|
||||||
} */
|
} */
|
||||||
|
.prose :where(code):not(:where([class~="not-prose"] *)) {
|
||||||
|
color: var(--tw-prose-code);
|
||||||
|
font-size: .875em;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prose :where(code):not(:where([class~="not-prose"] *))::before {
|
||||||
|
content: "`";
|
||||||
|
}
|
||||||
|
|
||||||
|
.prose :where(code):not(:where([class~="not-prose"] *))::after {
|
||||||
|
content: "`";
|
||||||
|
}
|
||||||
|
|
||||||
|
code, pre {
|
||||||
|
font-family: Söhne Mono,Monaco,Andale Mono,Ubuntu Mono,monospace !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
code, kbd, pre, samp {
|
||||||
|
font-family: Söhne Mono,Monaco,Andale Mono,Ubuntu Mono,monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
.scroll-down-enter {
|
.scroll-down-enter {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue