LibreChat/api/app/detectCode.js

53 lines
1.4 KiB
JavaScript
Raw Normal View History

const { ModelOperations } = require('@vscode/vscode-languagedetection');
const languages = require('../utils/languages.js');
const codeRegex = /(```[\s\S]*?```)/g;
// const languageMatch = /```(\w+)/;
2023-03-11 21:42:08 -05:00
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');
2023-03-11 21:42:08 -05:00
text = text.replace(match, '```shell\n');
});
return text;
}
const modelOperations = new ModelOperations();
2023-03-06 12:49:22 -05:00
const regexSplit = (await import('./regexSplit.mjs')).default;
const parts = regexSplit(text, codeRegex);
2023-03-06 12:49:22 -05:00
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 {
2023-03-02 16:31:00 -05:00
return part;
}
});
return (await Promise.all(output)).join('');
} catch (e) {
console.log('Error in detectCode function\n', e);
2023-03-11 14:46:21 -05:00
return input;
}
};
module.exports = detectCode;