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: 
@@ -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 @@