diff --git a/packages/fps-importer/handler.ts b/packages/fps-importer/handler.ts index 13d8cfb45..1b95918f7 100644 --- a/packages/fps-importer/handler.ts +++ b/packages/fps-importer/handler.ts @@ -77,7 +77,7 @@ class FpsProblemImportHandler extends Handler { const content = buf.toString(); const result = await xml2js.parseStringPromise(content); tasks.push(result); - } catch { } // eslint-disable-line no-empty + } catch { } } } if (!tasks.length) throw new ValidationError('file'); diff --git a/packages/hydrooj/src/handler/discussion.ts b/packages/hydrooj/src/handler/discussion.ts index 1beccc375..af381ac49 100644 --- a/packages/hydrooj/src/handler/discussion.ts +++ b/packages/hydrooj/src/handler/discussion.ts @@ -217,7 +217,7 @@ class DiscussionDetailHandler extends DiscussionHandler { const replies: Drdoc[] = await discussion.getMultiReply(domainId, did).toArray(); const uids = new Set(replies.map((drdoc) => drdoc.owner)); uids.delete(this.user._id); - const str = JSON.stringify({ message: '{0} replied to discussion {1}{2}.', params: [this.user._id, domainId, did] }); + const str = JSON.stringify({ message: '{0} replied to discussion {1}/{2}.', params: [this.user._id, domainId, did] }); const tasks = Array.from(uids).map((uid) => message.send(1, uid, str)); await Promise.all(tasks); this.back(); @@ -229,7 +229,7 @@ class DiscussionDetailHandler extends DiscussionHandler { this.checkPerm(PERM.PERM_REPLY_DISCUSSION); await this.limitRate('add_discussion', 3600, 60); await discussion.addTailReply(domainId, drid, this.user._id, content, this.request.ip); - const str = JSON.stringify({ message: '{0} replied to discussion reply {1}{2}.', params: [this.user._id, domainId, drid] }); + const str = JSON.stringify({ message: '{0} replied to discussion reply {1}/{2}.', params: [this.user._id, domainId, drid] }); if (this.drdoc.owner !== this.user._id) await message.send(1, this.drdoc.owner, str); this.back(); } diff --git a/packages/hydrooj/src/lib/validator.ts b/packages/hydrooj/src/lib/validator.ts index 5c66ce5ac..fd2af4d52 100644 --- a/packages/hydrooj/src/lib/validator.ts +++ b/packages/hydrooj/src/lib/validator.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-empty */ import { ValidationError } from '../error'; const RE_UID = /^-?\d+$/i; diff --git a/packages/ui-default/.eslintrc.js b/packages/ui-default/.eslintrc.js index c542fe1b3..21d6a6ee2 100644 --- a/packages/ui-default/.eslintrc.js +++ b/packages/ui-default/.eslintrc.js @@ -71,6 +71,7 @@ module.exports = { 'import/first': 'off', 'import/no-extraneous-dependencies': 'off', 'max-classes-per-file': 'off', + 'no-empty': ['warn', { allowEmptyCatch: true }], 'no-unused-vars': 'warn', 'no-console': 'off', 'no-continue': 'off', diff --git a/packages/ui-default/backendlib/markdown.js b/packages/ui-default/backendlib/markdown.js index 80a72db92..9ce870ba4 100644 --- a/packages/ui-default/backendlib/markdown.js +++ b/packages/ui-default/backendlib/markdown.js @@ -35,7 +35,7 @@ class Markdown extends MarkdownIt { if (lang && Prism.languages[lang]) { try { return Prism.highlight(str, Prism.languages[lang], lang); - } catch (__) { } // eslint-disable-line no-empty + } catch (__) { } } return ''; }, diff --git a/packages/ui-default/components/messagepad/MessagePadDialogueContentContainer.jsx b/packages/ui-default/components/messagepad/MessagePadDialogueContentContainer.jsx index 35eda40f5..c006efaab 100644 --- a/packages/ui-default/components/messagepad/MessagePadDialogueContentContainer.jsx +++ b/packages/ui-default/components/messagepad/MessagePadDialogueContentContainer.jsx @@ -5,7 +5,6 @@ import TimeAgo from 'timeago-react'; import moment from 'moment'; import 'jquery-scroll-lock'; import 'jquery.easing'; - import i18n from 'vj/utils/i18n'; import { parse as parseMongoId } from 'vj/utils/mongoId'; import Message from './MessageComponent'; @@ -17,7 +16,7 @@ const mapStateToProps = (state) => ({ : null, }); -export default connect(mapStateToProps, null)(class MessagePadDialogueContentContainer extends React.PureComponent { +export default connect(mapStateToProps)(class MessagePadDialogueContentContainer extends React.PureComponent { componentDidMount() { $(this.refs.list).scrollLock({ strict: true }); } @@ -42,23 +41,33 @@ export default connect(mapStateToProps, null)(class MessagePadDialogueContentCon } } - renderInner() { - if (this.props.activeId === null) { - return []; + renderContent(msg) { + if (msg.from === 1) { + // Is system message + try { + const data = JSON.parse(msg.content); + return i18n(data.message, ...data.params); + } catch (e) { } + return i18n(msg.content); } - return _.map(this.props.item.messages, (reply) => ( + return msg.content; + } + + renderInner() { + if (this.props.activeId === null) return []; + return _.map(this.props.item.messages, (msg) => ( - {reply.content} - - + {this.renderContent(msg)} + + )); diff --git a/packages/ui-default/components/scratchpad/ScratchpadPretestContainer.jsx b/packages/ui-default/components/scratchpad/ScratchpadPretestContainer.jsx index f1eeb85c3..68ea4d228 100644 --- a/packages/ui-default/components/scratchpad/ScratchpadPretestContainer.jsx +++ b/packages/ui-default/components/scratchpad/ScratchpadPretestContainer.jsx @@ -1,11 +1,14 @@ import React from 'react'; import { connect } from 'react-redux'; +import AnsiUp from 'ansi_up'; import i18n from 'vj/utils/i18n'; import Icon from 'vj/components/react/IconComponent'; import Panel from './PanelComponent'; import DataInput from './DataInputComponent'; +const AU = new AnsiUp(); + const mapStateToProps = (state) => ({ input: state.pretest.input, output: state.pretest.output, @@ -44,7 +47,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(class ScratchpadPret /> diff --git a/packages/ui-default/jsconfig.json b/packages/ui-default/jsconfig.json index 991b251e2..f1c6a4a3b 100644 --- a/packages/ui-default/jsconfig.json +++ b/packages/ui-default/jsconfig.json @@ -1,9 +1,10 @@ { "exclude": [ - "node_modules" + "./node_modules", + "./public", + "../../node_modules" ], "compilerOptions": { - "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES6", "baseUrl": ".", diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 9fd3d84ad..774baac3f 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.6.12", + "version": "4.6.13", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", @@ -23,6 +23,7 @@ "@babel/register": "^7.13.14", "@babel/runtime-corejs2": "^7.13.10", "@hydrooj/utils": "^1.0.7", + "ansi_up": "^5.0.1", "autoprefixer": "^9.8.6", "babel-loader": "^8.2.2", "babel-plugin-lodash": "^3.3.4", diff --git a/packages/ui-default/pages/problem_detail.page.jsx b/packages/ui-default/pages/problem_detail.page.jsx index 5621f4f22..1adb0d5c8 100644 --- a/packages/ui-default/pages/problem_detail.page.jsx +++ b/packages/ui-default/pages/problem_detail.page.jsx @@ -229,7 +229,6 @@ const page = new NamedPage(['problem_detail', 'contest_detail_problem', 'homewor $('.problem-content').get(0), ); $('.outer-loader-container').hide(); - // eslint-disable-next-line no-empty } catch (e) { } }