算法评测平台前端。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

54 lines
1.7 KiB

let child_process = require('child_process');
let streamToString = require('stream-to-string');
let tempfile = require('tempfile');
let fs = require('fs-extra');
module.exports = async (code, lang) => {
let timer, result, tempFile;
try {
let process, pascalAddProgram;
if (lang === 'pas') {
tempFile = tempfile('.pas');
if (code.indexOf('program') === -1) {
code = 'program format\n' + code;
pascalAddProgram = true;
}
await fs.writeFile(tempFile, code);
process = child_process.spawn(`${__dirname}/../bin/jcf`, [tempFile, '-inplace']);
} else {
process = child_process.spawn(`clang-format -style="{BasedOnStyle: Google, IndentWidth: 4, AccessModifierOffset: -4, SortIncludes: false, AllowShortIfStatementsOnASingleLine: false, ColumnLimit: 110, Cpp11BracedListStyle: false }" -assume-filename="a.${lang}"`, { shell: true });
process.stdin.setEncoding('utf-8');
process.stdin.write(code);
process.stdin.end();
}
timer = setTimeout(() => process.kill(), 5000);
if (lang === 'pas') {
await streamToString(process.stdout);
result = await fs.readFile(tempFile, 'utf-8');
if (pascalAddProgram) result = result.replace('program format\n', '');
} else {
result = await streamToString(process.stdout);
}
await new Promise((resolve, reject) => {
let exit = () => {
if (process.exitCode === 0) resolve();
else reject(process.exitCode);
}
if (process.exitCode !== null) exit();
else process.on('close', () => exit());
});
} catch (e) {
console.log(e);
result = null;
}
clearTimeout(timer);
try { if (tempFile) await fs.delete(tempFile); } catch (e) {}
return result;
}