From 4e9e6ddbcbf7627a649ad7c629565861bfe12a37 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 31 Aug 2022 01:04:23 +0800 Subject: [PATCH] vjudge: codeforces: support data-line --- packages/vjudge/package.json | 2 +- packages/vjudge/src/providers/codeforces.ts | 29 +++++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/vjudge/package.json b/packages/vjudge/package.json index 1cf59ad65..90a1fa4ae 100644 --- a/packages/vjudge/package.json +++ b/packages/vjudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/vjudge", - "version": "1.5.0-next.8", + "version": "1.5.0-next.10", "description": "Submit problems to remote oj", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/vjudge/src/providers/codeforces.ts b/packages/vjudge/src/providers/codeforces.ts index 43e1e36ba..60bd19180 100644 --- a/packages/vjudge/src/providers/codeforces.ts +++ b/packages/vjudge/src/providers/codeforces.ts @@ -57,6 +57,25 @@ export function getDifficulty(tags: string[]) { 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 { constructor(public account: RemoteAccount, private save: (data: any) => Promise) { if (account.cookie) this.cookie = account.cookie; @@ -285,8 +304,8 @@ export default class CodeforcesProvider implements IBasicProvider { document.querySelector('.note')?.firstChild.remove(); const input = document.querySelector('.input-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(/
/g, '\n')); - const outputs = Array.from(document.querySelectorAll('.output>pre')).map((i) => i.innerHTML.trim().replace(/
/g, '\n')); + const inputs = Array.from(document.querySelectorAll('.input>pre')).map(sampleParser('input')); + const outputs = Array.from(document.querySelectorAll('.output>pre')).map(sampleParser('output')); const note = document.querySelector('.note')?.innerHTML.trim(); document.querySelector('.note')?.remove(); document.querySelector('.sample-tests')?.remove(); @@ -314,9 +333,9 @@ export default class CodeforcesProvider implements IBasicProvider { ...output ? [{ type: 'Text', sectionTitle: 'Output', subType: 'markdown', text: output, }] : [], - ...inputs.map((_, i) => ({ - type: 'Sample', payload: [inputs[i], outputs[i]], text: '', sectionTitle: 'Samples', - }) as any), + ...inputs.length ? [{ + type: 'Plain', text: [...inputs, ...outputs].join('\n'), + }] : [] as any, ...note ? [{ type: 'Text', sectionTitle: 'Note', subType: 'markdown', text: note, }] : [],