From baab7bb68c8bb9e2b66920ea6c6b500257b8b19a Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 10 Jul 2022 22:27:46 +0800 Subject: [PATCH] core: move lib/misc to ui --- packages/hydrooj/package.json | 1 - packages/hydrooj/src/handler/contest.ts | 1 + packages/hydrooj/src/interface.ts | 1 - packages/hydrooj/src/lib/index.ts | 1 - packages/hydrooj/src/lib/misc.ts | 55 ---------------------- packages/hydrooj/src/model/contest.ts | 15 +++--- packages/hydrooj/src/upgrade.ts | 2 +- packages/ui-default/backendlib/misc.ts | 50 ++++++++++++++++++++ packages/ui-default/backendlib/template.js | 3 +- packages/ui-default/package.json | 2 +- 10 files changed, 62 insertions(+), 69 deletions(-) delete mode 100644 packages/hydrooj/src/lib/misc.ts create mode 100644 packages/ui-default/backendlib/misc.ts diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 2f4272825..05150df41 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -16,7 +16,6 @@ "@hydrooj/utils": "workspace:*", "adm-zip": "0.5.5", "ajv": "^8.11.0", - "ansi_up": "^5.1.0", "cac": "^6.7.12", "cookies": "^0.8.0", "detect-browser": "^5.3.0", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 8e78ac35e..276da84fa 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -376,6 +376,7 @@ export class ContestFilesHandler extends ContestDetailBaseHandler { if (!this.user.own(this.tdoc)) this.checkPerm(PERM.PERM_EDIT_CONTEST); const body = { tdoc: this.tdoc, + tsdoc: this.tsdoc, owner_udoc: await user.getById(domainId, this.tdoc.owner), files: sortFiles(this.tdoc.files || []), urlForFile: (filename: string) => this.url('contest_file_download', { tid, filename }), diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 0add56fe0..995cc0b4f 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -666,7 +666,6 @@ export interface Lib extends Record { mail: typeof import('./lib/mail'), md5: typeof import('./lib/crypto').md5, sha1: typeof import('./lib/crypto').sha1, - misc: typeof import('./lib/misc'), paginate: typeof import('./lib/paginate'), rank: typeof import('./lib/rank'), rating: typeof import('./lib/rating'), diff --git a/packages/hydrooj/src/lib/index.ts b/packages/hydrooj/src/lib/index.ts index 84d51587a..22955b1d9 100644 --- a/packages/hydrooj/src/lib/index.ts +++ b/packages/hydrooj/src/lib/index.ts @@ -4,7 +4,6 @@ import './i18n'; import './mail'; import './useragent'; import './crypto'; -import './misc'; import './paginate'; import './hash.hydro'; import './rank'; diff --git a/packages/hydrooj/src/lib/misc.ts b/packages/hydrooj/src/lib/misc.ts deleted file mode 100644 index 8e90c3625..000000000 --- a/packages/hydrooj/src/lib/misc.ts +++ /dev/null @@ -1,55 +0,0 @@ -import AnsiUp from 'ansi_up'; -import moment from 'moment-timezone'; -import { ObjectID } from 'mongodb'; -import { formatSeconds, size } from '@hydrooj/utils/lib/utils'; - -export { size, formatSeconds } from '@hydrooj/utils/lib/utils'; - -const AU = new AnsiUp(); - -export function ansiToHtml(str: string, whiteToBlack = true) { - const res = AU.ansi_to_html(str); - return whiteToBlack ? res.replace(/style="color:rgb\(255,255,255\)"/g, 'style="color:black"') : res; -} - -export function datetimeSpan(dt: Date | ObjectID, relative = true, format = 'YYYY-M-D H:mm:ss', tz = 'Asia/Shanghai') { - if (!dt) return 'DATETIME_SPAN_ERROR'; - if (dt instanceof ObjectID) dt = new Date(dt.generationTime * 1000); - else if (typeof dt === 'string' && ObjectID.isValid(dt)) dt = new Date(new ObjectID(dt).generationTime * 1000); - else if (typeof dt === 'number' || typeof dt === 'string') dt = new Date(dt); - return '{2}'.format( - relative ? ' relative' : '', - dt.getTime() / 1000, - moment(dt).tz(tz).format(format), - ); -} - -export function* paginate(page: number, numPages: number) { - const radius = 5; - let first: number; - let last: number; - if (page > 1) { - if (page > 2) yield ['first', 1]; - yield ['previous', page - 1]; - } - if (page <= radius) [first, last] = [1, Math.min(1 + radius * 2, numPages)]; - else if (page >= numPages - radius) { - [first, last] = [Math.max(1, numPages - radius * 2), numPages]; - } else { - [first, last] = [page - radius, page + radius]; - } - if (first > 1) yield ['ellipsis', 0]; - for (let page0 = first; page0 < last + 1; page0++) { - if (page0 !== page) yield ['page', page0]; - else yield ['current', page]; - } - if (last < numPages) yield ['ellipsis', 0]; - if (page < numPages) { - yield ['next', page + 1]; - if (page < numPages - 1) yield ['last', numPages]; - } -} - -global.Hydro.lib.misc = { - datetimeSpan, paginate, size, formatSeconds, ansiToHtml, -}; diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index b8733b648..63744828b 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -1,5 +1,5 @@ import { FilterQuery, ObjectID } from 'mongodb'; -import { Counter, Time } from '@hydrooj/utils/lib/utils'; +import { Counter, formatSeconds, Time } from '@hydrooj/utils/lib/utils'; import { ContestAlreadyAttendedError, ContestNotAttendedError, ContestNotFoundError, ContestScoreboardHiddenError, ValidationError, @@ -9,7 +9,6 @@ import { ScoreboardNode, ScoreboardRow, Tdoc, Udict, } from '../interface'; -import * as misc from '../lib/misc'; import ranked from '../lib/rank'; import * as bus from '../service/bus'; import type { Handler } from '../service/server'; @@ -142,13 +141,13 @@ const acm = buildContestRule({ if (isExport) row.push({ type: 'email', value: udict[tsdoc.uid].mail }); row.push({ type: 'time', - value: `${tsdoc.accept || 0}\n${misc.formatSeconds(tsdoc.time || 0.0, false)}`, - hover: misc.formatSeconds(tsdoc.time || 0.0), + value: `${tsdoc.accept || 0}\n${formatSeconds(tsdoc.time || 0.0, false)}`, + hover: formatSeconds(tsdoc.time || 0.0), }); for (const pid of tdoc.pids) { const doc = tsddict[pid] || {} as Partial; const accept = doc.status === STATUS.STATUS_ACCEPTED; - const colTime = accept ? misc.formatSeconds(doc.real, false).toString() : ''; + const colTime = accept ? formatSeconds(doc.real, false).toString() : ''; const colPenalty = doc.rid ? Math.ceil(doc.penalty / 60).toString() : ''; if (isExport) { row.push( @@ -164,7 +163,7 @@ const acm = buildContestRule({ : doc.rid ? `-${doc.naccept}` : '', - hover: accept ? misc.formatSeconds(doc.time) : '', + hover: accept ? formatSeconds(doc.time) : '', raw: doc.rid, style: accept && doc.rid.generationTime === first[pid] ? 'background-color: rgb(217, 240, 199);' @@ -406,13 +405,13 @@ const homework = buildContestRule({ if (isExport) { row.push({ type: 'string', value: tsdoc.score || 0 }); } - row.push({ type: 'time', value: misc.formatSeconds(tsdoc.time || 0, false), raw: tsdoc.time }); + row.push({ type: 'time', value: formatSeconds(tsdoc.time || 0, false), raw: tsdoc.time }); for (const pid of tdoc.pids) { const rid = tsddict[pid]?.rid; const colScore = tsddict[pid]?.penaltyScore || ''; const colOriginalScore = tsddict[pid]?.score || ''; const colTime = tsddict[pid]?.time || ''; - const colTimeStr = colTime ? misc.formatSeconds(colTime, false) : ''; + const colTimeStr = colTime ? formatSeconds(colTime, false) : ''; if (isExport) { row.push( { type: 'string', value: colScore }, diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 81614060b..a461d683f 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -9,8 +9,8 @@ import moment from 'moment'; import { GridFSBucket, ObjectID } from 'mongodb'; import Queue from 'p-queue'; import { convertIniConfig } from '@hydrooj/utils/lib/cases'; +import { size } from '@hydrooj/utils/lib/utils'; import { buildContent } from './lib/content'; -import { size } from './lib/misc'; import { Logger } from './logger'; import { PRIV, STATUS } from './model/builtin'; import * as contest from './model/contest'; diff --git a/packages/ui-default/backendlib/misc.ts b/packages/ui-default/backendlib/misc.ts new file mode 100644 index 000000000..5f345f658 --- /dev/null +++ b/packages/ui-default/backendlib/misc.ts @@ -0,0 +1,50 @@ +import AnsiUp from 'ansi_up'; +import moment from 'moment-timezone'; +import { ObjectID } from 'mongodb'; + +export { size, formatSeconds } from '@hydrooj/utils/lib/utils'; + +const AU = new AnsiUp(); + +export function ansiToHtml(str: string, whiteToBlack = true) { + const res = AU.ansi_to_html(str); + return whiteToBlack ? res.replace(/style="color:rgb\(255,255,255\)"/g, 'style="color:black"') : res; +} + +export function datetimeSpan(dt: Date | ObjectID, relative = true, format = 'YYYY-M-D H:mm:ss', tz = 'Asia/Shanghai') { + if (!dt) return 'DATETIME_SPAN_ERROR'; + if (dt instanceof ObjectID) dt = new Date(dt.generationTime * 1000); + else if (typeof dt === 'string' && ObjectID.isValid(dt)) dt = new Date(new ObjectID(dt).generationTime * 1000); + else if (typeof dt === 'number' || typeof dt === 'string') dt = new Date(dt); + return '{2}'.format( + relative ? ' relative' : '', + dt.getTime() / 1000, + moment(dt).tz(tz).format(format), + ); +} + +export function* paginate(page: number, numPages: number) { + const radius = 5; + let first: number; + let last: number; + if (page > 1) { + if (page > 2) yield ['first', 1]; + yield ['previous', page - 1]; + } + if (page <= radius) [first, last] = [1, Math.min(1 + radius * 2, numPages)]; + else if (page >= numPages - radius) { + [first, last] = [Math.max(1, numPages - radius * 2), numPages]; + } else { + [first, last] = [page - radius, page + radius]; + } + if (first > 1) yield ['ellipsis', 0]; + for (let page0 = first; page0 < last + 1; page0++) { + if (page0 !== page) yield ['page', page0]; + else yield ['current', page]; + } + if (last < numPages) yield ['ellipsis', 0]; + if (page < numPages) { + yield ['next', page + 1]; + if (page < numPages - 1) yield ['last', numPages]; + } +} diff --git a/packages/ui-default/backendlib/template.js b/packages/ui-default/backendlib/template.js index d9a686401..625b1a094 100644 --- a/packages/ui-default/backendlib/template.js +++ b/packages/ui-default/backendlib/template.js @@ -9,8 +9,9 @@ const { findFileSync } = require('@hydrooj/utils/lib/utils'); const status = require('@hydrooj/utils/lib/status'); const markdown = require('./markdown'); const { xss, ensureTag } = require('./markdown-it-xss'); +const misc = require('./misc'); -const { misc, buildContent, avatar } = global.Hydro.lib; +const { buildContent, avatar } = global.Hydro.lib; let { template } = argv.options; if (template && typeof template !== 'string') template = findFileSync('@hydrooj/ui-default/templates'); diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index adaaceedb..0f509a476 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -29,7 +29,6 @@ "@types/qrcode": "^1.4.2", "@types/react-dom": "^18.0.6", "@types/redux-logger": "^3.0.9", - "ansi_up": "^5.1.0", "autoprefixer": "^9.8.8", "browser-update": "^3.3.38", "chalk": "^5.0.1", @@ -112,6 +111,7 @@ "webpackbar": "^5.0.2" }, "dependencies": { + "ansi_up": "^5.1.0", "esbuild": "0.14.3", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0",