import React from 'react';
import Embed from './Embed';
import Highlight from './Highlight';
import regexSplit from '~/utils/regexSplit';
// const codeRegex = /(```[^`]+?```)/g;
const codeRegex = /(```[\s\S]*?```)/g;
const inLineRegex = /(`[^`]+?`)/g;
const matchRegex = /(`[^`]+?`)/g;
const languageMatch = /^```(\w+)/;
const newLineMatch = /^```(\n+)/;
const languages = [
'java',
'c',
'python',
'c++',
'javascript',
'csharp',
'php',
'typescript',
'swift',
'objectivec',
'sql',
'r',
'kotlin',
'ruby',
'go',
'x86asm',
'matlab',
'perl',
'pascal'
];
const inLineWrap = (parts) =>
parts.map((part, i) => {
if (part.match(matchRegex)) {
return {part.slice(1, -1)};
} else {
// return
{part}
; return part; } }); export default function CodeWrapper({ text }) { if (text.includes('```')) { // const parts = text.split(codeRegex); const parts = regexSplit(text); console.log(parts); const codeParts = parts.map((part, i) => { if (part.match(codeRegex)) { let language = 'javascript'; if (part.match(languageMatch)) { language = part.match(languageMatch)[1].toLowerCase(); 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 { // map over the parts and wrap any text between tildes with tags
const parts = text.split(matchRegex);
const codeParts = inLineWrap(parts);
return <>{codeParts}>; // return the wrapped text
}
}