diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 24af2354..50ee7f8c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.24.11", + "version": "2.24.12", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 1e3176ec..060d6439 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -19,8 +19,9 @@ class RecordListHandler extends Handler { @param('pid', Types.Name, true) @param('tid', Types.ObjectID, true) @param('uidOrName', Types.Name, true) + @param('status', Types.Int, true) @param('allDomain', Types.Boolean, true) - async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string, all = false) { + async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string, status?: number, all = false) { this.response.template = 'record_main.html'; const q: FilterQuery = { 'contest.tid': tid, hidden: false }; if (tid) { @@ -42,6 +43,7 @@ class RecordListHandler extends Handler { if (pdoc) q.pid = pdoc.docId; else q.pid = null; } + if (status) q.status = status; const [rdocs] = await paginate( record.getMulti(domainId, q).sort('_id', -1), page, diff --git a/packages/hydrooj/src/lib/content.ts b/packages/hydrooj/src/lib/content.ts index 0b34a961..6d0e9478 100644 --- a/packages/hydrooj/src/lib/content.ts +++ b/packages/hydrooj/src/lib/content.ts @@ -11,6 +11,7 @@ export interface ProblemSource { export function buildContent(source: ProblemSource | ContentNode[], type: 'markdown' | 'html' = 'markdown', translate?: Function) { const _ = translate || ((s: string) => s); + let cnt = 0; if (source instanceof Array) { return type === 'html' ? source.map((node) => [ @@ -25,11 +26,11 @@ export function buildContent(source: ProblemSource | ContentNode[], type: 'markd ...node.type === 'Sample' ? [ `## ${_('Sample Input')}`, - '```', + `\`\`\`input${++cnt}`, node.payload[0], '```', `## ${_('Sample Output')}`, - '```', + `\`\`\`output${cnt}`, node.payload[1], '```', ] @@ -43,11 +44,11 @@ export function buildContent(source: ProblemSource | ContentNode[], type: 'markd ...source.input ? [`

${_('Input Format')}

`, source.input] : [], ...source.output ? [`

${_('Output Format')}

`, source.output] : [], ...(source.samples).map((sample, i) => [ - `

${_('Sample Input')} ${i + 1}

`,
+                `
`,
                 sample[0],
-                `

${_('Sample Output')} ${i + 1}

`,
+                `
`,
                 sample[1],
-                '
', + '
', ].join('\n')), ...source.hint ? [`

${_('Hint')}

`, source.hint] : [], ...source.source ? [`

${_('Source')}

`, source.source] : [], diff --git a/packages/hydrooj/src/model/builtin.ts b/packages/hydrooj/src/model/builtin.ts index ecc67abe..e37da03e 100644 --- a/packages/hydrooj/src/model/builtin.ts +++ b/packages/hydrooj/src/model/builtin.ts @@ -462,7 +462,13 @@ export const CATEGORIES = { 'Hashing', '函数式编程', ], - 博弈论: [], + 博弈论: [ + '巴什博弈', + '尼姆博弈', + '威佐夫博弈', + '斐波那契博弈', + 'SG定理', + ], 字符串: [ 'KMP', '后缀数据结构', @@ -506,6 +512,10 @@ export const CATEGORIES = { '数学', '排序', '构造', + '打表', + '位运算', + '离散化', + '莫队', ], }; diff --git a/packages/ui-default/backendlib/template.js b/packages/ui-default/backendlib/template.js index d3d237f6..1ac3c836 100644 --- a/packages/ui-default/backendlib/template.js +++ b/packages/ui-default/backendlib/template.js @@ -7,6 +7,7 @@ const { filter } = require('lodash'); const { argv } = require('yargs'); const Xss = require('xss'); const { findFileSync } = require('@hydrooj/utils/lib/utils'); +const status = require('@hydrooj/utils/lib/status'); const markdown = require('./markdown'); const { misc, buildContent, avatar } = global.Hydro.lib; @@ -143,7 +144,7 @@ class Nunjucks extends nunjucks.Environment { } if (typeof s === 'object' && !(s instanceof Array)) { const langs = Object.keys(s); - const f = langs.filter(i => i.startsWith(language)); + const f = langs.filter((i) => i.startsWith(language)); if (s[language]) s = s[language]; else if (f.length) s = s[f[0]]; else s = s[langs[0]]; @@ -190,6 +191,7 @@ env.addGlobal('typeof', (o) => typeof o); env.addGlobal('datetimeSpan', misc.datetimeSpan); env.addGlobal('paginate', misc.paginate); env.addGlobal('size', misc.size); +env.addGlobal('utils', { status }); env.addGlobal('avatarUrl', avatar); env.addGlobal('formatSeconds', misc.formatSeconds); env.addGlobal('model', global.Hydro.model); diff --git a/packages/ui-default/components/highlighter/prismjs.js b/packages/ui-default/components/highlighter/prismjs.js index 09492b2c..583c76bf 100644 --- a/packages/ui-default/components/highlighter/prismjs.js +++ b/packages/ui-default/components/highlighter/prismjs.js @@ -95,9 +95,6 @@ const prismjsApiWrap = { const $code = $(code); const $pre = $code.parent(); $pre.addClass('syntax-hl'); - if ($pre.closest('[data-syntax-hl-show-line-number]')) { - $pre.addClass('line-numbers'); - } const language = ($(code).attr('class') || '').trim(); const astyle = language.match(/astyle-([a-z]+)/); if (format && astyle && astyle[1]) { diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 07a8160e..a5ab34a8 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.6.34", + "version": "4.7.0", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", @@ -22,7 +22,7 @@ "@babel/preset-react": "^7.13.13", "@babel/register": "^7.13.14", "@babel/runtime-corejs2": "^7.14.0", - "@hydrooj/utils": "^1.0.7", + "@hydrooj/utils": "^1.0.10", "ansi_up": "^5.0.1", "autoprefixer": "^9.8.6", "babel-loader": "^8.2.2", diff --git a/packages/ui-default/templates/components/record.html b/packages/ui-default/templates/components/record.html index 67fd3596..3dd57090 100644 --- a/packages/ui-default/templates/components/record.html +++ b/packages/ui-default/templates/components/record.html @@ -2,6 +2,7 @@
+ {{ rdoc.score|default(0) }} {{ model.builtin.STATUS_TEXTS[rdoc.status] }} diff --git a/packages/ui-default/templates/contest_scoreboard.html b/packages/ui-default/templates/contest_scoreboard.html index fbec2a83..7333771d 100644 --- a/packages/ui-default/templates/contest_scoreboard.html +++ b/packages/ui-default/templates/contest_scoreboard.html @@ -40,7 +40,9 @@ {% if column.type == 'user' %} {{ user.render_inline(udict[column.raw], badge=false) }} {% elif column.type == 'record' and column.raw %} - {{ column.value }} + + {{ column.value }} + {% else %} {{ column.value }} {% endif %} diff --git a/packages/ui-default/templates/record_detail.html b/packages/ui-default/templates/record_detail.html index 75d369ea..7726c31b 100644 --- a/packages/ui-default/templates/record_detail.html +++ b/packages/ui-default/templates/record_detail.html @@ -10,28 +10,11 @@

{{ _('Code') }}

-
-
{{ rdoc['code'] }}
+
+
{{ rdoc['code'] }}
{% endif %} - {% if rdoc['stdout'] or rdoc['stderr'] %} -
-
-

{{ _('Stdout') }}

-
- {% if rdoc['stdout'] %} -
-
{{ rdoc['stdout']|ansi|safe }}
-
- {% endif %} - {% if rdoc['stderr'] %} -
-
{{ rdoc['stderr']|ansi|safe }}
-
- {% endif %} -
- {% endif %}
diff --git a/packages/ui-default/templates/record_detail_status.html b/packages/ui-default/templates/record_detail_status.html index 59f84625..1d289ede 100644 --- a/packages/ui-default/templates/record_detail_status.html +++ b/packages/ui-default/templates/record_detail_status.html @@ -2,6 +2,7 @@

+ {{ rdoc.score|default(0) }} {{ model.builtin.STATUS_TEXTS[rdoc['status']] }} diff --git a/packages/ui-default/templates/record_main.html b/packages/ui-default/templates/record_main.html index b167ab2d..7e9fd129 100644 --- a/packages/ui-default/templates/record_main.html +++ b/packages/ui-default/templates/record_main.html @@ -16,24 +16,40 @@
-
+
-
+
-
+
+
+ + + +
diff --git a/packages/utils/lib/status.ts b/packages/utils/lib/status.ts index 98255548..f2d2abf9 100644 --- a/packages/utils/lib/status.ts +++ b/packages/utils/lib/status.ts @@ -55,6 +55,22 @@ export const STATUS_CODES = { 30: 'ignored', }; +export function getScoreColor(score: number | string): string { + return [ + '#ff4f4f', + '#ff694f', + '#f8603a', + '#fc8354', + '#fa9231', + '#f7bb3b', + '#ecdb44', + '#e2ec52', + '#b0d628', + '#93b127', + '#25ad40', + ][Math.floor((Number(score) || 0) / 10)]; +} + export const USER_GENDER_MALE = 0; export const USER_GENDER_FEMALE = 1; export const USER_GENDER_OTHER = 2; diff --git a/packages/utils/package.json b/packages/utils/package.json index 0e596ce8..fb1f77c5 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/utils", - "version": "1.0.9", + "version": "1.0.10", "description": "hydrooj utils", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git",