diff --git a/api/app/index.js b/api/app/index.js index 235b22b2ef..35e2b9454e 100644 --- a/api/app/index.js +++ b/api/app/index.js @@ -6,7 +6,6 @@ const customClient = require('./clients/chatgpt-custom'); const titleConvo = require('./titleConvo'); const getCitations = require('../lib/parse/getCitations'); const citeText = require('../lib/parse/citeText'); -const detectCode = require('../lib/parse/detectCode'); module.exports = { askClient, @@ -17,5 +16,4 @@ module.exports = { titleConvo, getCitations, citeText, - detectCode -}; \ No newline at end of file +}; diff --git a/api/lib/parse/citeText.js b/api/lib/parse/citeText.js index 8132446f52..da943976a0 100644 --- a/api/lib/parse/citeText.js +++ b/api/lib/parse/citeText.js @@ -1,4 +1,4 @@ -const citationRegex = /\[\^\d+?\^]/g; +const citationRegex = /\[\^\d+?\^\]/g; const citeText = (res, noLinks = false) => { let result = res.text || res; diff --git a/api/lib/parse/detectCode.js b/api/lib/parse/detectCode.js deleted file mode 100644 index 3456c21b34..0000000000 --- a/api/lib/parse/detectCode.js +++ /dev/null @@ -1,52 +0,0 @@ -const { ModelOperations } = require('@vscode/vscode-languagedetection'); -const languages = require('./languages.js'); -const codeRegex = /(```[\s\S]*?```)/g; -// const languageMatch = /```(\w+)/; -const replaceRegex = /```\w+\n/g; - -const detectCode = async (input) => { - try { - let text = input; - if (!text.match(codeRegex)) { - return text; - } - - const langMatches = text.match(replaceRegex); - - if (langMatches?.length > 0) { - langMatches.forEach(match => { - let lang = match.split('```')[1].trim(); - - if (languages.has(lang)) { - return; - } - - console.log('[detectCode.js] replacing', match, 'with', '```shell'); - text = text.replace(match, '```shell\n'); - }); - - return text; - } - - const modelOperations = new ModelOperations(); - const regexSplit = (await import('./regexSplit.mjs')).default; - const parts = regexSplit(text, codeRegex); - - const output = parts.map(async (part) => { - if (part.match(codeRegex)) { - const code = part.slice(3, -3); - let lang = (await modelOperations.runModel(code))[0].languageId; - return part.replace(/^```/, `\`\`\`${languages.has(lang) ? lang : 'shell'}`); - } else { - return part; - } - }); - - return (await Promise.all(output)).join(''); - } catch (e) { - console.log('Error in detectCode function\n', e); - return input; - } -}; - -module.exports = detectCode; diff --git a/api/lib/parse/languages.js b/api/lib/parse/languages.js deleted file mode 100644 index 443a81a753..0000000000 --- a/api/lib/parse/languages.js +++ /dev/null @@ -1,318 +0,0 @@ -const languages = new Set([ - 'adoc', - 'apacheconf', - 'arm', - 'as', - 'asc', - 'atom', - 'bat', - 'bf', - 'bind', - 'c++', - 'capnp', - 'cc', - 'clj', - 'cls', - 'cmake.in', - 'cmd', - 'coffee', - 'console', - 'cr', - 'craftcms', - 'crm', - 'cs', - 'cson', - 'cts', - 'cxx', - 'dfm', - 'docker', - 'dst', - 'erl', - 'f90', - 'f95', - 'fs', - 'gawk', - 'gemspec', - 'gms', - 'golang', - 'gololang', - 'gss', - 'gyp', - 'h', - 'h++', - 'hbs', - 'hh', - 'hpp', - 'hs', - 'html', - 'html.handlebars', - 'html.hbs', - 'https', - 'hx', - 'hxx', - 'hylang', - 'i7', - 'iced', - 'ino', - 'instances', - 'irb', - 'jinja', - 'js', - 'jsp', - 'jsx', - 'julia-repl', - 'kdb', - 'kt', - 'lassoscript', - 'ls', - 'ls', - 'mak', - 'make', - 'mawk', - 'md', - 'mipsasm', - 'mk', - 'mkd', - 'mkdown', - 'ml', - 'ml', - 'mm', - 'mma', - 'moon', - 'mts', - 'nawk', - 'nc', - 'nginxconf', - 'nimrod', - 'objc', - 'obj-c', - 'obj-c++', - 'objective-c++', - 'osascript', - 'pas', - 'pascal', - 'patch', - 'pcmk', - 'pf.conf', - 'pl', - 'plist', - 'pm', - 'podspec', - 'postgres', - 'postgresql', - 'pp', - 'ps', - 'ps1', - 'py', - 'pycon', - 'rb', - 're', - 'rs', - 'rss', - 'sas', - 'scad', - 'sci', - 'sh', - 'st', - 'stanfuncs', - 'step', - 'stp', - 'styl', - 'svg', - 'tao', - 'text', - 'thor', - 'tk', - 'toml', - 'ts', - 'tsx', - 'txt', - 'v', - 'vb', - 'vbs', - 'wl', - 'x++', - 'xhtml', - 'xjb', - 'xls', - 'xlsx', - 'xpath', - 'xq', - 'xsd', - 'xsl', - 'yaml', - 'zep', - 'zone', - 'zsh', - '1c', - 'abnf', - 'accesslog', - 'actionscript', - 'ada', - 'angelscript', - 'apache', - 'applescript', - 'arcade', - 'arduino', - 'armasm', - 'asciidoc', - 'aspectj', - 'autohotkey', - 'autoit', - 'avrasm', - 'awk', - 'axapta', - 'bash', - 'basic', - 'bnf', - 'brainfuck', - 'c', - 'cal', - 'capnproto', - 'clojure', - 'cmake', - 'coffeescript', - 'coq', - 'cos', - 'cpp', - 'crmsh', - 'crystal', - 'csharp', - 'csp', - 'css', - 'd', - 'dart', - 'diff', - 'django', - 'dns', - 'dockerfile', - 'dos', - 'dpr', - 'dsconfig', - 'dts', - 'dust', - 'ebnf', - 'elixir', - 'elm', - 'erlang', - 'excel', - 'fix', - 'fortran', - 'fsharp', - 'gams', - 'gauss', - 'gcode', - 'gherkin', - 'glsl', - 'go', - 'golo', - 'gradle', - 'graph', - 'graphql', - 'groovy', - 'haml', - 'handlebars', - 'haskell', - 'haxe', - 'http', - 'hy', - 'inform7', - 'ini', - 'irpf90', - 'java', - 'javascript', - 'json', - 'julia', - 'k', - 'kotlin', - 'lasso', - 'ldif', - 'leaf', - 'less', - 'lisp', - 'livecodeserver', - 'livescript', - 'lua', - 'makefile', - 'markdown', - 'mathematica', - 'matlab', - 'maxima', - 'mel', - 'mercury', - 'mips', - 'mizar', - 'mojolicious', - 'monkey', - 'moonscript', - 'n1ql', - 'nginx', - 'nim', - 'nix', - 'nsis', - 'objectivec', - 'ocaml', - 'openscad', - 'oxygene', - 'p21', - 'parser3', - 'perl', - 'pf', - 'pgsql', - 'php', - 'plaintext', - 'pony', - 'powershell', - 'processing', - 'profile', - 'prolog', - 'properties', - 'protobuf', - 'puppet', - 'python', - 'python-repl', - 'qml', - 'r', - 'reasonml', - 'rib', - 'rsl', - 'ruby', - 'ruleslanguage', - 'rust', - 'SAS', - 'scala' , - 'scheme', - 'scilab', - 'scss', - 'shell', - 'smali', - 'smalltalk', - 'sml', - 'sql', - 'stan', - 'stata', - 'stylus', - 'subunit', - 'swift', - 'tap', - 'tcl', - 'tex', - 'thrift', - 'tp', - 'twig', - 'typescript', - 'vala', - 'vbnet', - 'vbscript', - 'verilog', - 'vhdl', - 'vim', - 'x86asm', - 'xl', - 'xml', - 'xquery', - 'yml', - 'zephir', -]); - -module.exports = languages; \ No newline at end of file diff --git a/api/lib/parse/regexSplit.mjs b/api/lib/parse/regexSplit.mjs deleted file mode 100644 index 802ec343b7..0000000000 --- a/api/lib/parse/regexSplit.mjs +++ /dev/null @@ -1,46 +0,0 @@ -const primaryRegex = /```([^`\n]*?)\n([\s\S]*?)\n```/g; -const secondaryRegex = /```([^`\n]*?)\n?([\s\S]*?)\n?```/g; - -const unenclosedCodeTest = (text) => { - let workingText = text; - // if (workingText.startsWith('<') || (!workingText.startsWith('`') && workingText.match(/```/g)?.length === 1)) { - // workingText = `\`\`\`${workingText}` - // } - - return workingText.trim(); -}; - -export default function regexSplit(string) { - let matches = [...string.matchAll(primaryRegex)]; - - if (!matches[0]) { - matches = [...string.matchAll(secondaryRegex)]; - } - - const output = [matches[0].input.slice(0, matches[0].index)]; - - // console.log(matches); - - for (let i = 0; i < matches.length; i++) { - const [fullMatch, language, code] = matches[i]; - // const formattedCode = code.replace(/`+/g, '\\`'); - output.push(`\`\`\`${language}\n${code}\n\`\`\``); - if (i < matches.length - 1) { - let nextText = string.slice(matches[i].index + fullMatch.length, matches[i + 1].index); - nextText = unenclosedCodeTest(nextText); - output.push(nextText); - } else { - const lastMatch = matches[matches.length - 1][0]; - // console.log(lastMatch); - // console.log(matches[0].input.split(lastMatch)); - let rest = matches[0].input.split(lastMatch)[1] - - if (rest) { - rest = unenclosedCodeTest(rest); - output.push(rest); - } - } - } - - return output; -} diff --git a/api/package-lock.json b/api/package-lock.json index 7ba58a52ab..0504951d22 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -10,7 +10,6 @@ "license": "ISC", "dependencies": { "@keyv/mongo": "^2.1.8", - "@vscode/vscode-languagedetection": "^1.0.22", "@waylaidwanderer/chatgpt-api": "^1.32.8", "axios": "^1.3.4", "chatgpt-latest": "npm:@waylaidwanderer/chatgpt-api@^1.31.6", @@ -1626,14 +1625,6 @@ "@types/webidl-conversions": "*" } }, - "node_modules/@vscode/vscode-languagedetection": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.22.tgz", - "integrity": "sha512-rQ/BgMyLuIXSmbA0MSkIPHtcOw14QkeDbAq19sjvaS9LTRr905yij0S8lsyqN5JgOsbtIx7pAcyOxFMzPmqhZQ==", - "bin": { - "vscode-languagedetection": "cli/index.js" - } - }, "node_modules/@waylaidwanderer/chatgpt-api": { "version": "1.32.8", "resolved": "https://registry.npmjs.org/@waylaidwanderer/chatgpt-api/-/chatgpt-api-1.32.8.tgz", @@ -6977,11 +6968,6 @@ "@types/webidl-conversions": "*" } }, - "@vscode/vscode-languagedetection": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.22.tgz", - "integrity": "sha512-rQ/BgMyLuIXSmbA0MSkIPHtcOw14QkeDbAq19sjvaS9LTRr905yij0S8lsyqN5JgOsbtIx7pAcyOxFMzPmqhZQ==" - }, "@waylaidwanderer/chatgpt-api": { "version": "1.32.8", "resolved": "https://registry.npmjs.org/@waylaidwanderer/chatgpt-api/-/chatgpt-api-1.32.8.tgz", diff --git a/api/package.json b/api/package.json index 1959793a50..48643acc1a 100644 --- a/api/package.json +++ b/api/package.json @@ -20,7 +20,6 @@ "homepage": "https://github.com/danny-avila/chatgpt-clone#readme", "dependencies": { "@keyv/mongo": "^2.1.8", - "@vscode/vscode-languagedetection": "^1.0.22", "@waylaidwanderer/chatgpt-api": "^1.32.8", "axios": "^1.3.4", "chatgpt-latest": "npm:@waylaidwanderer/chatgpt-api@^1.31.6", diff --git a/client/package-lock.json b/client/package-lock.json index bcf2e1b701..6c0c23665a 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -19,13 +19,10 @@ "class-variance-authority": "^0.4.0", "clsx": "^1.2.1", "crypto-browserify": "^3.12.0", - "highlight.js": "^11.7.0", "lodash": "^4.17.21", "lucide-react": "^0.113.0", - "markdown-to-jsx": "^7.1.9", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-highlight": "^0.15.0", "react-lazy-load": "^4.0.1", "react-markdown": "^8.0.5", "react-redux": "^8.0.5", @@ -7941,17 +7938,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdown-to-jsx": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.9.tgz", - "integrity": "sha512-x4STVIKIJR0mGgZIZ5RyAeQD7FEZd5tS8m/htbcVGlex32J+hlSLj+ExrHCxP6nRKF1EKbcO7i6WhC1GtOpBlA==", - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10591,22 +10577,6 @@ "react": "^18.2.0" } }, - "node_modules/react-highlight": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.15.0.tgz", - "integrity": "sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==", - "dependencies": { - "highlight.js": "^10.5.0" - } - }, - "node_modules/react-highlight/node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "engines": { - "node": "*" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -18976,12 +18946,6 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" }, - "markdown-to-jsx": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.9.tgz", - "integrity": "sha512-x4STVIKIJR0mGgZIZ5RyAeQD7FEZd5tS8m/htbcVGlex32J+hlSLj+ExrHCxP6nRKF1EKbcO7i6WhC1GtOpBlA==", - "requires": {} - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -20638,21 +20602,6 @@ "scheduler": "^0.23.0" } }, - "react-highlight": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/react-highlight/-/react-highlight-0.15.0.tgz", - "integrity": "sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==", - "requires": { - "highlight.js": "^10.5.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - } - } - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/client/package.json b/client/package.json index 1050739668..1357b72066 100644 --- a/client/package.json +++ b/client/package.json @@ -29,13 +29,10 @@ "class-variance-authority": "^0.4.0", "clsx": "^1.2.1", "crypto-browserify": "^3.12.0", - "highlight.js": "^11.7.0", "lodash": "^4.17.21", "lucide-react": "^0.113.0", - "markdown-to-jsx": "^7.1.9", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-highlight": "^0.15.0", "react-lazy-load": "^4.0.1", "react-markdown": "^8.0.5", "react-redux": "^8.0.5", diff --git a/client/src/components/Messages/Content/Content.jsx b/client/src/components/Messages/Content/Content.jsx index e240c9986f..38812f4c2c 100644 --- a/client/src/components/Messages/Content/Content.jsx +++ b/client/src/components/Messages/Content/Content.jsx @@ -8,7 +8,7 @@ import rehypeRaw from 'rehype-raw' import CodeBlock from './CodeBlock'; import { langSubset } from '~/utils/languages'; -const Content = React.memo(({ content, isCreatedByUser = true }) => { +const Content = React.memo(({ content }) => { let rehypePlugins = [ [rehypeKatex, { output: 'mathml' }], [ @@ -22,23 +22,19 @@ const Content = React.memo(({ content, isCreatedByUser = true }) => { [rehypeRaw], ]; - rehypePlugins = isCreatedByUser ? rehypePlugins.slice(0, -1) : rehypePlugins; - return ( - <> - - {content} - - + + {content} + ); }); diff --git a/client/src/components/Messages/Content/Embed.jsx b/client/src/components/Messages/Content/Embed.jsx deleted file mode 100644 index 02ea36069f..0000000000 --- a/client/src/components/Messages/Content/Embed.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, { useState } from 'react'; -import Clipboard from '~/components/svg/Clipboard'; -import CheckMark from '~/components/svg/CheckMark'; - -const Embed = React.memo(({ children, lang = '', code, matched }) => { - const [buttonText, setButtonText] = useState('Copy code'); - const isClicked = buttonText === 'Copy code'; - - const clickHandler = () => { - navigator.clipboard.writeText(code.trim()); - setButtonText('Copied!'); - setTimeout(() => { - setButtonText('Copy code'); - }, 3000); - }; - - return ( -
-      
-
- {lang === 'javascript' && !matched ? '' : lang} - -
-
{children}
-
-
- ); -}); - -export default Embed; diff --git a/client/src/components/Messages/Content/Highlight.jsx b/client/src/components/Messages/Content/Highlight.jsx deleted file mode 100644 index 5a85326534..0000000000 --- a/client/src/components/Messages/Content/Highlight.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import Highlighter from 'react-highlight'; -import hljs from 'highlight.js'; -import { languages } from '~/utils/languages'; - -const Highlight = React.memo(({ language, code }) => { - const [highlightedCode, setHighlightedCode] = useState(code); - const lang = languages.has(language) ? language : 'javascript'; - - useEffect(() => { - setHighlightedCode(hljs.highlight(code, { language: lang }).value); - }, [code, lang]); - - return ( -
-      {!highlightedCode ? (
-        // 
-        
-          {code}
-        
-      ) : (
-        
-      )}
-    
- ); -}); - -export default Highlight; - diff --git a/client/src/components/Messages/Content/TabLink.jsx b/client/src/components/Messages/Content/TabLink.jsx deleted file mode 100644 index e095f85a6c..0000000000 --- a/client/src/components/Messages/Content/TabLink.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; - -export default function TabLink(a) { - return ( - - {a.children} - - ); -} diff --git a/client/src/components/Messages/Content/TextWrapper.jsx b/client/src/components/Messages/Content/TextWrapper.jsx deleted file mode 100644 index b8a242cf1e..0000000000 --- a/client/src/components/Messages/Content/TextWrapper.jsx +++ /dev/null @@ -1,162 +0,0 @@ -import React from 'react'; -import TabLink from './TabLink'; -import Markdown from 'markdown-to-jsx'; -import Embed from './Embed'; -import Highlight from './Highlight'; -import regexSplit from '~/utils/regexSplit'; -import { wrapperRegex } from '~/utils'; -const { codeRegex, inLineRegex, markupRegex, languageMatch, newLineMatch } = wrapperRegex; -const mdOptions = { - wrapper: React.Fragment, - forceWrapper: true, - overrides: { - a: { - component: TabLink, - // props: { - // className: 'foo' - // } - } - } -}; - -const inLineWrap = (parts) => { - let previousElement = null; - return parts.map((part, i) => { - if (part.match(markupRegex)) { - const codeElement = {part.slice(1, -1)}; - if (previousElement && typeof previousElement !== 'string') { - // Append code element as a child to previous non-code element - previousElement = ( - - {previousElement} - {codeElement} - - ); - return previousElement; - } else { - return codeElement; - } - } else { - previousElement = part; - return previousElement; - } - }); -}; - -function TextWrapper({ text, generateCursor }) { - let embedTest = false; - let result = null; - - // to match unenclosed code blocks - if (text.match(/```/g)?.length === 1) { - embedTest = true; - } - - // match enclosed code blocks - if (text.match(codeRegex)) { - const parts = regexSplit(text); - // console.log(parts); - const codeParts = parts.map((part, i) => { - if (part.match(codeRegex)) { - let language = 'javascript'; - let matched = false; - - if (part.match(languageMatch)) { - language = part.match(languageMatch)[1].toLowerCase(); - part = part.replace(languageMatch, '```'); - matched = true; - // highlight.js language validation - // const validLanguage = languages.some((lang) => language === lang); - // part = validLanguage ? part.replace(languageMatch, '```') : part; - // language = validLanguage ? language : 'javascript'; - } - - part = part.replace(newLineMatch, '```'); - - return ( - - - - ); - } else if (part.match(inLineRegex)) { - const innerParts = part.split(inLineRegex); - return inLineWrap(innerParts); - } else { - return ( - - {part} - - ); - } - }); - - return <>{codeParts}; // return the wrapped text - } else if (embedTest) { - const language = text.match(/```(\w+)/)?.[1].toLowerCase() || 'javascript'; - const parts = text.split(text.match(/```(\w+)/)?.[0] || '```'); - const codeParts = parts.map((part, i) => { - if (i === 1) { - part = part.replace(/^\n+/, ''); - - return ( - - - - ); - } else if (part.match(inLineRegex)) { - const innerParts = part.split(inLineRegex); - return inLineWrap(innerParts); - } else { - return ( - - {part} - - ); - } - }); - - // return <>{codeParts}; // return the wrapped text - result = <>{codeParts}; - } else if (text.match(markupRegex)) { - // map over the parts and wrap any text between tildes with tags - const parts = text.split(markupRegex); - const codeParts = inLineWrap(parts); - // return <>{codeParts}; // return the wrapped text - result = <>{codeParts}; - } else { - // return {text}; - result = {text}; - } - - return ( - <> - {result} - {generateCursor()} - - ); -} - -export default React.memo(TextWrapper); \ No newline at end of file diff --git a/client/src/components/Messages/Content/Wrapper.jsx b/client/src/components/Messages/Content/Wrapper.jsx deleted file mode 100644 index 99b095cbd8..0000000000 --- a/client/src/components/Messages/Content/Wrapper.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import TextWrapper from './TextWrapper'; -import Content from './Content'; - -const Wrapper = React.memo(({ text, generateCursor, isCreatedByUser, searchResult }) => { - if (searchResult) { - return ( - - ); - } else if (!isCreatedByUser) { - return ( - - ); - } else if (isCreatedByUser) { - return <>{text}; - } -}); - -export default Wrapper; diff --git a/client/src/components/Messages/Message.jsx b/client/src/components/Messages/Message.jsx index 2ee58c67aa..7f4f32803f 100644 --- a/client/src/components/Messages/Message.jsx +++ b/client/src/components/Messages/Message.jsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef, useCallback } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import SubRow from './Content/SubRow'; -import Wrapper from './Content/Wrapper'; +import Content from './Content/Content'; import MultiMessage from './MultiMessage'; import HoverButtons from './HoverButtons'; import SiblingSwitch from './SiblingSwitch'; @@ -199,12 +199,17 @@ export default function Message({
{/*
*/}
- + {!isCreatedByUser ? + <> + + {generateCursor()} + : + <> + {text} + + }
)} diff --git a/client/src/utils/index.js b/client/src/utils/index.js index 7b7634c587..60637d2cda 100644 --- a/client/src/utils/index.js +++ b/client/src/utils/index.js @@ -38,14 +38,6 @@ export const languages = [ 'pascal' ]; -export const wrapperRegex = { - codeRegex: /(```[\s\S]*?```)/g, - inLineRegex: /(`[^`]+?`)/g, - markupRegex: /(`[^`]+?`)/g, - languageMatch: /^```(\w+)/, - newLineMatch: /^```(\n+)/ -}; - export const getIconOfModel = ({ size=30, sender, isCreatedByUser, searchResult, model, chatGptLabel, error, ...props }) => { // 'ai' is used as 'model' is not accurate for search results let ai = searchResult ? sender : model; diff --git a/client/src/utils/regexSplit.js b/client/src/utils/regexSplit.js deleted file mode 100644 index 802ec343b7..0000000000 --- a/client/src/utils/regexSplit.js +++ /dev/null @@ -1,46 +0,0 @@ -const primaryRegex = /```([^`\n]*?)\n([\s\S]*?)\n```/g; -const secondaryRegex = /```([^`\n]*?)\n?([\s\S]*?)\n?```/g; - -const unenclosedCodeTest = (text) => { - let workingText = text; - // if (workingText.startsWith('<') || (!workingText.startsWith('`') && workingText.match(/```/g)?.length === 1)) { - // workingText = `\`\`\`${workingText}` - // } - - return workingText.trim(); -}; - -export default function regexSplit(string) { - let matches = [...string.matchAll(primaryRegex)]; - - if (!matches[0]) { - matches = [...string.matchAll(secondaryRegex)]; - } - - const output = [matches[0].input.slice(0, matches[0].index)]; - - // console.log(matches); - - for (let i = 0; i < matches.length; i++) { - const [fullMatch, language, code] = matches[i]; - // const formattedCode = code.replace(/`+/g, '\\`'); - output.push(`\`\`\`${language}\n${code}\n\`\`\``); - if (i < matches.length - 1) { - let nextText = string.slice(matches[i].index + fullMatch.length, matches[i + 1].index); - nextText = unenclosedCodeTest(nextText); - output.push(nextText); - } else { - const lastMatch = matches[matches.length - 1][0]; - // console.log(lastMatch); - // console.log(matches[0].input.split(lastMatch)); - let rest = matches[0].input.split(lastMatch)[1] - - if (rest) { - rest = unenclosedCodeTest(rest); - output.push(rest); - } - } - } - - return output; -}