vjudge: codeforces: support data-line

This commit is contained in:
undefined committed 2022-08-31 01:04:23 +08:00
1 parent e67ecd9768
commit 4e9e6ddbcb
2 files changed
+25 -6

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@hydrooj/vjudge", "name": "@hydrooj/vjudge",
"version": "1.5.0-next.8", "version": "1.5.0-next.10",
"description": "Submit problems to remote oj", "description": "Submit problems to remote oj",
"main": "package.json", "main": "package.json",
"repository": "https://github.com/hydro-dev/Hydro.git", "repository": "https://github.com/hydro-dev/Hydro.git",
+24 -5
View File
@@ -57,6 +57,25 @@ export function getDifficulty(tags: string[]) {
return 10; return 10;
} }
const sampleParser = (mode: 'input' | 'output') =>
function parseSample(node: Element, index: number) {
if (!node.innerHTML.includes('test-example-line')) {
return `\n
\`\`\`${mode}${index + 1}
${node.innerHTML.trim()}
\`\`\`
\n`;
}
const lines = [...node.children];
const highlighted = lines.map((i, l) => [i, l] as [Element, number])
.filter(([i]) => i.className.includes('odd')).map(([, i]) => i + 1);
return `\n
\`\`\`${mode}${index + 1}|${highlighted.join(',')}
${lines.map((i) => i.innerHTML).join('\n').trim()}
\`\`\`
\n`;
};
export default class CodeforcesProvider implements IBasicProvider { export default class CodeforcesProvider implements IBasicProvider {
constructor(public account: RemoteAccount, private save: (data: any) => Promise<void>) { constructor(public account: RemoteAccount, private save: (data: any) => Promise<void>) {
if (account.cookie) this.cookie = account.cookie; if (account.cookie) this.cookie = account.cookie;
@@ -285,8 +304,8 @@ export default class CodeforcesProvider implements IBasicProvider {
document.querySelector('.note')?.firstChild.remove(); document.querySelector('.note')?.firstChild.remove();
const input = document.querySelector('.input-specification')?.innerHTML.trim(); const input = document.querySelector('.input-specification')?.innerHTML.trim();
const output = document.querySelector('.output-specification')?.innerHTML.trim(); const output = document.querySelector('.output-specification')?.innerHTML.trim();
const inputs = Array.from(document.querySelectorAll('.input>pre')).map((i) => i.innerHTML.trim().replace(/<br>/g, '\n')); const inputs = Array.from(document.querySelectorAll('.input>pre')).map(sampleParser('input'));
const outputs = Array.from(document.querySelectorAll('.output>pre')).map((i) => i.innerHTML.trim().replace(/<br>/g, '\n')); const outputs = Array.from(document.querySelectorAll('.output>pre')).map(sampleParser('output'));
const note = document.querySelector('.note')?.innerHTML.trim(); const note = document.querySelector('.note')?.innerHTML.trim();
document.querySelector('.note')?.remove(); document.querySelector('.note')?.remove();
document.querySelector('.sample-tests')?.remove(); document.querySelector('.sample-tests')?.remove();
@@ -314,9 +333,9 @@ export default class CodeforcesProvider implements IBasicProvider {
...output ? [{ ...output ? [{
type: 'Text', sectionTitle: 'Output', subType: 'markdown', text: output, type: 'Text', sectionTitle: 'Output', subType: 'markdown', text: output,
}] : [], }] : [],
...inputs.map((_, i) => ({ ...inputs.length ? [{
type: 'Sample', payload: [inputs[i], outputs[i]], text: '', sectionTitle: 'Samples', type: 'Plain', text: [...inputs, ...outputs].join('\n'),
}) as any), }] : [] as any,
...note ? [{ ...note ? [{
type: 'Text', sectionTitle: 'Note', subType: 'markdown', text: note, type: 'Text', sectionTitle: 'Note', subType: 'markdown', text: note,
}] : [], }] : [],