diff --git a/packages/ui-default/backendlib/markdown.js b/packages/ui-default/backendlib/markdown.js index 9ce870ba4..04272214c 100644 --- a/packages/ui-default/backendlib/markdown.js +++ b/packages/ui-default/backendlib/markdown.js @@ -1,5 +1,4 @@ const MarkdownIt = require('markdown-it'); -const Prism = require('prismjs'); // For math: $a\times b\eq 10$ // Specific image size: ![image](image.png =100x100) @@ -31,14 +30,6 @@ class Markdown extends MarkdownIt { constructor() { super({ linkify: true, - highlight(str, lang) { - if (lang && Prism.languages[lang]) { - try { - return Prism.highlight(str, Prism.languages[lang], lang); - } catch (__) { } - } - return ''; - }, }); this.linkify.tlds('.py', false); this.use(Media); diff --git a/packages/ui-default/components/highlighter/highlighter.page.js b/packages/ui-default/components/highlighter/highlighter.page.js index aa7265707..780ba9efc 100644 --- a/packages/ui-default/components/highlighter/highlighter.page.js +++ b/packages/ui-default/components/highlighter/highlighter.page.js @@ -1,6 +1,8 @@ import { AutoloadPage } from 'vj/misc/Page'; import load from 'vj/components/wastyle/index'; import Notification from 'vj/components/notification/index'; +import tpl from 'vj/utils/tpl'; +import i18n from 'vj/utils/i18n'; const highlighterPage = new AutoloadPage('highlighterPage', async () => { const [{ default: prismjs }, [success, format]] = await Promise.all([ @@ -10,7 +12,28 @@ const highlighterPage = new AutoloadPage('highlighterPage', async () => { if (!success) Notification.error(`Astyle load fail: ${format}`); function runHighlight($container) { prismjs.highlightBlocks($container, success ? format : null); + $container.find('pre code').get().forEach((code) => { + const $code = $(code); + const $root = $code.parent().parent(); + const language = ($(code).attr('class') || '').trim(); + const m = language.match(/language-([a-z0-9]+)/); + if (m && m[1] && m[1].toLowerCase().startsWith('input')) { + const id = +m[1].substr(5, m[1].length - 5); + if (Number.isSafeInteger(id)) { + const $output = $container.find(`pre.language-output${id}`); + if ($output.length) { + const $c = $(document.createElement('div')).addClass('row'); + $root.clone(true).prepend($(tpl`

${i18n('Sample Input')} ${id}

`)) + .addClass('medium-6 columns sample').appendTo($c); + $output.parent().prepend($(tpl`

${i18n('Sample Output')} ${id}

`)) + .addClass('medium-6 columns sample').appendTo($c); + $root.replaceWith($c); + } + } + } + }); } + runHighlight($('body')); $(document).on('vjContentNew', (e) => runHighlight($(e.target))); }); diff --git a/packages/ui-default/components/highlighter/highlighter.page.styl b/packages/ui-default/components/highlighter/highlighter.page.styl index 6749385d1..53ad8f6f2 100644 --- a/packages/ui-default/components/highlighter/highlighter.page.styl +++ b/packages/ui-default/components/highlighter/highlighter.page.styl @@ -25,6 +25,10 @@ code [data-syntax-hl-show-line-number] pre.line-numbers > code white-space: pre +.sample > .toolbar + right: 12px !important + top: 59px !important + .toolbar position: absolute white-space: no-wrap diff --git a/packages/ui-default/handler.js b/packages/ui-default/handler.js index 32e0d7b77..19946e000 100644 --- a/packages/ui-default/handler.js +++ b/packages/ui-default/handler.js @@ -11,6 +11,11 @@ const { system, domain, user } = global.Hydro.model; const { Route, Handler, UiContextBase } = global.Hydro.service.server; class WikiHelpHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get() { const [langstr, langtexts] = system.getMany(['hydrojudge.langs', 'lang.texts']); if (langstr) { @@ -31,12 +36,22 @@ class WikiHelpHandler extends Handler { } class WikiAboutHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get() { this.response.template = 'about.html'; } } class UiConstantsHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get() { const [LANG_TEXTS, LANG_HIGHLIGHT_ID, MONACO_MODES] = system.getMany([ 'lang.texts', @@ -53,6 +68,11 @@ window.MONACO_MODES=${JSON.stringify(yaml.load(MONACO_MODES))}`; } class UiSettingsHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get({ domainId }) { const [ header_logo, header_logo_2x, @@ -83,6 +103,11 @@ class UiSettingsHandler extends Handler { } class LocaleHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get({ id }) { // eslint-disable-next-line prefer-destructuring id = id.split('.')[0]; @@ -95,6 +120,11 @@ class LocaleHandler extends Handler { } class SetThemeHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async get({ theme }) { await user.setById(this.user._id, { theme }); this.back(); @@ -102,6 +132,11 @@ class SetThemeHandler extends Handler { } class MarkdownHandler extends Handler { + constructor(args) { + super(args); + this.noCheckPermView = true; + } + async post({ text, html = false, inline = false }) { this.response.body = inline ? markdown.renderInline(text, html) diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 453034174..e63fa2c3e 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.6.27", + "version": "4.6.30", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/problem_detail.html b/packages/ui-default/templates/problem_detail.html index 5e7278733..ac2012c7d 100644 --- a/packages/ui-default/templates/problem_detail.html +++ b/packages/ui-default/templates/problem_detail.html @@ -24,34 +24,31 @@
-
- {% if rdoc %} -

- - - {{ model.builtin.STATUS_TEXTS[rdoc.status] }}{% if rdoc.status != model.builtin.STATUS.STATUS_ACCEPTED %} {{ rdoc.score }}{% endif %} - + {% if rdoc %} +
+

+ + + {{ model.builtin.STATUS_TEXTS[rdoc.status] }}{% if rdoc.status != model.builtin.STATUS.STATUS_ACCEPTED %} {{ rdoc.score }}{% endif %} +

- {% endif %} -

- {{ pdoc.title }} -

+
+ {% else %} +
+

{{ pdoc.title }}

+ {% endif %}
{% if not pdoc.data.length %}

{{ _('No testdata at current.') }}

{% endif %} - {% if tdoc %} - {% if tdoc.docType == model.document.TYPE_CONTEST %} - {% if model.contest.isDone(tdoc) %} + {% if tdoc and tdoc.docType == model.document.TYPE_CONTEST and model.contest.isDone(tdoc) %}

{{ _('You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.') }}

- {% endif %}{# handler.isDone(tdoc) #} - {% endif %}{# tdoc['docType'] == model.document.TYPE_CONTEST #} - {% endif %}{# tdoc #} + {% endif %} {{ pdoc.content|content(handler.user.viewLang, pdoc.html)|safe }}