From ab58505b9d22c583ba84505e37f47d8e0755167c Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 20 Jun 2021 14:05:59 +0800 Subject: [PATCH] judge: config.template --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/judge/default.ts | 8 +- .../components/marker/marker.page.styl | 2 +- .../ui-default/components/monaco/index.js | 115 +++++++++++------- packages/ui-default/modules.js | 2 + packages/ui-default/package.json | 3 +- .../ui-default/pages/problem_files.page.js | 1 + 7 files changed, 85 insertions(+), 48 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 7230f0829..0c4f07d77 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.8.10", + "version": "2.8.11", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/judge/default.ts b/packages/hydrojudge/src/judge/default.ts index 02a35928b..9380b3d56 100644 --- a/packages/hydrojudge/src/judge/default.ts +++ b/packages/hydrojudge/src/judge/default.ts @@ -2,7 +2,7 @@ import Queue from 'p-queue'; import path from 'path'; import fs from 'fs-extra'; import * as STATUS from '../status'; -import { SystemError } from '../error'; +import { CompileError, SystemError } from '../error'; import { parseFilename } from '../utils'; import { run } from '../sandbox'; import compile from '../compile'; @@ -18,6 +18,12 @@ const Score = { function judgeCase(c, sid) { return async (ctx, ctxSubtask) => { + if (ctx.config.template) { + if (ctx.config.template[ctx.lang]) { + const tpl = ctx.config.template[ctx.lang]; + ctx.code = tpl[0] + ctx.code + tpl[1]; + } else throw new CompileError('Language not supported by provided templates'); + } if ((ctxSubtask.subtask.type === 'min' && !ctxSubtask.score) || (ctxSubtask.subtask.type === 'max' && ctxSubtask.score === ctxSubtask.subtask.score) || (ctxSubtask.subtask.if && ctx.failed[sid]) diff --git a/packages/ui-default/components/marker/marker.page.styl b/packages/ui-default/components/marker/marker.page.styl index 33fc3c3c1..96e59d169 100644 --- a/packages/ui-default/components/marker/marker.page.styl +++ b/packages/ui-default/components/marker/marker.page.styl @@ -1,7 +1,7 @@ [data-marker-enabled] outline: 0 -.marker +body > .marker position: fixed z-index: 100 display: none diff --git a/packages/ui-default/components/monaco/index.js b/packages/ui-default/components/monaco/index.js index 8fe886705..ff36a9c5c 100644 --- a/packages/ui-default/components/monaco/index.js +++ b/packages/ui-default/components/monaco/index.js @@ -15,6 +15,76 @@ const libSource = [ const libUri = 'ts:filename/basic.d.ts'; monaco.languages.typescript.javascriptDefaults.addExtraLib(libSource, libUri); monaco.editor.createModel(libSource, 'typescript', monaco.Uri.parse(libUri)); + +/** @type {Record} */ +const problemConfigSchemaDef = { + cases: { type: 'array', items: { $ref: '#/def/case' } }, + case: { + type: 'object', + properties: { + input: { type: 'string' }, + output: { type: 'string' }, + }, + required: ['input'], + additionalProperties: false, + }, + subtask: { + description: 'Subtask Info', + type: 'object', + properties: { + type: { enum: ['min', 'max', 'sum'] }, + time: { $ref: '#/def/time' }, + memory: { $ref: '#/def/memory' }, + score: { $ref: '#/def/score', description: 'score' }, + cases: { $ref: '#/def/cases' }, + if: { type: 'array', items: { type: 'integer' } }, + id: { type: 'integer' }, + }, + required: ['score'], + additionalProperties: false, + }, + time: { type: 'string', pattern: '^([0-9]+(?:\\.[0-9]*)?)([mu]?)s?$' }, + memory: { type: 'string', pattern: '^([0-9]+(?:\\.[0-9]*)?)([kmg])b?$' }, + score: { type: 'integer', maximum: 100, minimum: 1 }, +}; + +/** @type {import('json-schema').JSONSchema7Definition} */ +const problemConfigSchema = { + type: 'object', + def: problemConfigSchemaDef, + properties: { + type: { enum: ['default', 'interactive', 'submit_answer', 'subjective'] }, + checker_type: { enum: ['default', 'lemon', 'syzoj', 'testlib', 'strict', 'qduoj'] }, + checker: { type: 'string', pattern: '\\.' }, + interactor: { type: 'string', pattern: '\\.' }, + user_extra_files: { type: 'array', items: { type: 'string' } }, + judge_extra_files: { type: 'array', items: { type: 'string' } }, + cases: { $ref: '#/def/cases' }, + subtasks: { type: 'array', items: { $ref: '#/def/subtask' } }, + filename: { type: 'string' }, + time: { $ref: '#/def/time' }, + memory: { $ref: '#/def/memory' }, + score: { $ref: '#/def/score' }, + template: { + type: 'object', + patternProperties: { + '^.*$': { + type: 'array', + minLength: 2, + maxLength: 2, + items: { type: 'string' }, + }, + }, + additionalProperties: false, + }, + outputs: { + type: 'array', + minLength: 1, + }, + }, + additionalProperties: false, +}; + monaco.languages.yaml.yamlDefaults.setDiagnosticsOptions({ validate: true, enableSchemaRequest: true, @@ -25,50 +95,7 @@ monaco.languages.yaml.yamlDefaults.setDiagnosticsOptions({ { uri: 'https://hydro.js.org/schema/problemConfig.json', fileMatch: ['hydro://problem/file/config.yaml'], - schema: { - type: 'object', - def: { - cases: { type: 'array', items: { $ref: '#/def/case' } }, - case: { - type: 'object', - properties: { - input: { type: 'string' }, - output: { type: 'string' }, - }, - required: ['input'], - }, - subtask: { - description: 'Subtask Info', - type: 'object', - properties: { - type: { enum: ['min', 'max', 'sum'] }, - time: { $ref: '#/def/time' }, - memory: { $ref: '#/def/memory' }, - score: { $ref: '#/def/score', description: 'score' }, - cases: { $ref: '#/def/cases' }, - if: { type: 'array', items: { type: 'integer' } }, - }, - }, - time: { type: 'string', pattern: '^([0-9]+(?:\\.[0-9]*)?)([mu]?)s?$' }, - memory: { type: 'string', pattern: '^([0-9]+(?:\\.[0-9]*)?)([kmg])b?$' }, - score: { type: 'integer', maximum: 100, minimum: 1 }, - }, - properties: { - type: { enum: ['default', 'interactive', 'submit_answer', 'subjective'] }, - checker_type: { enum: ['default', 'lemon', 'syzoj', 'testlib', 'strict', 'qduoj'] }, - checker: { type: 'string', pattern: '\\.' }, - interactor: { type: 'string', pattern: '\\.' }, - user_extra_files: { type: 'array', items: { type: 'string' } }, - judge_extra_files: { type: 'array', items: { type: 'string' } }, - cases: { $ref: '#/def/cases' }, - subtasks: { type: 'array', items: { $ref: '#/def/subtask' } }, - outputs: { type: 'array' }, - filename: { type: 'string' }, - time: { $ref: '#/def/time' }, - memory: { $ref: '#/def/memory' }, - score: { $ref: '#/def/score' }, - }, - }, + schema: problemConfigSchema, }, ], }); diff --git a/packages/ui-default/modules.js b/packages/ui-default/modules.js index b9d9ed9ab..affc21fef 100644 --- a/packages/ui-default/modules.js +++ b/packages/ui-default/modules.js @@ -23,3 +23,5 @@ import './components/notification'; import './components/nprogress'; window.node_modules = { _, $ }; +window.$ = $; +window.jQuery = $; diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 6fe1b7550..aa8a50ae0 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.11.31", + "version": "4.11.32", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", @@ -27,6 +27,7 @@ "@blueprintjs/icons": "^3.26.1", "@blueprintjs/select": "^3.16.4", "@hydrooj/utils": "^1.0.20", + "@types/json-schema": "^7.0.7", "@types/katex": "^0.11.0", "@undefined-moe/monaco-yaml": "^2.5.0", "ansi_up": "^5.0.1", diff --git a/packages/ui-default/pages/problem_files.page.js b/packages/ui-default/pages/problem_files.page.js index 56c96507b..2943331d4 100644 --- a/packages/ui-default/pages/problem_files.page.js +++ b/packages/ui-default/pages/problem_files.page.js @@ -178,6 +178,7 @@ const page = new NamedPage('problem_files', () => { `, width: `${window.innerWidth - 200}px`, height: `${window.innerHeight - 100}px`, + cancelByEsc: false, }).open(); const language = { yaml: 'yaml',