From c4a13f2e2714719c12eb44dbfdfa659590043189 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 20 Jul 2020 16:03:22 +0800 Subject: [PATCH] move docs, remove katex --- .npmignore | 1 - README.md | 2 +- TODO | 3 +- bin/hydrooj.js | 7 +- {wiki/admin => docs}/deploy.md | 4 + {wiki/development => docs}/development.md | 0 {wiki/admin => docs}/judge.md | 0 {wiki/admin => docs}/oauth.md | 0 entry.js | 14 -- hydro/entry/common.ts | 41 +----- hydro/entry/setup.ts | 5 +- hydro/entry/worker.ts | 3 +- hydro/handler/misc.ts | 9 +- hydro/handler/problem.ts | 2 +- hydro/handler/wiki.ts | 31 ----- hydro/interface.ts | 1 - hydro/lib/markdown.ts | 56 +++----- hydro/lib/template.ts | 5 +- hydro/loader.ts | 6 +- hydro/markdown/katex.ts | 137 -------------------- hydro/model/setting.ts | 22 ++-- hydro/service/server.ts | 6 +- locales/zh_CN.yaml | 25 ---- package.json | 9 +- wiki/wiki/about.md | 108 ---------------- wiki/wiki/help.md | 94 -------------- yarn.lock | 149 +++++++++++++++++++--- 27 files changed, 190 insertions(+), 550 deletions(-) rename {wiki/admin => docs}/deploy.md (97%) rename {wiki/development => docs}/development.md (100%) rename {wiki/admin => docs}/judge.md (100%) rename {wiki/admin => docs}/oauth.md (100%) delete mode 100644 entry.js delete mode 100644 hydro/handler/wiki.ts delete mode 100644 hydro/markdown/katex.ts delete mode 100644 wiki/wiki/about.md delete mode 100644 wiki/wiki/help.md diff --git a/.npmignore b/.npmignore index 3e1c86b27..8c1804986 100644 --- a/.npmignore +++ b/.npmignore @@ -9,7 +9,6 @@ __* *.hydro locales templates -wiki .vscode .github examples diff --git a/README.md b/README.md index a7b181c54..45a4c21e8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Hydro是一个高效的信息学在线测评系统。 特点: 易于部署,轻量,功能强大。 -[中文文档](wiki/admin/deploy.md) +[中文文档](docs/deploy.md) Hydro 的界面基于 Vijos 二次开发。 diff --git a/TODO b/TODO index b63a0ea2b..cfcc7f00c 100644 --- a/TODO +++ b/TODO @@ -9,4 +9,5 @@ SETTINGS_PRIVACY.allowRegisteredUsers model.setting.ui.name pdoc.secretConfig? 在线IDE 更换颜色主题, fix resize -better place to store config.json +move to @hydrooj/core? +remove koa-router diff --git a/bin/hydrooj.js b/bin/hydrooj.js index 6b024bcb5..a04c41e35 100644 --- a/bin/hydrooj.js +++ b/bin/hydrooj.js @@ -1,15 +1,18 @@ #!/usr/bin/env node +const { argv } = require('yargs'); const hydro = require('../dist/loader'); +const ui = argv.ui || '@hydrooj/ui-default'; + try { - require.resolve('@hydrooj/ui-default'); + require.resolve(ui); } catch (e) { console.error('Please also install @hydrooj/ui-default'); process.exit(1); } -hydro.addon('@hydrooj/ui-default'); +hydro.addon(ui); hydro.load().catch((e) => { console.error(e); diff --git a/wiki/admin/deploy.md b/docs/deploy.md similarity index 97% rename from wiki/admin/deploy.md rename to docs/deploy.md index fab0b6642..189867ed4 100644 --- a/wiki/admin/deploy.md +++ b/docs/deploy.md @@ -35,3 +35,7 @@ Hydro 会自行初始化并监听 8888 端口(可使用 `--port=1234` 指定 数据库配置完成后,会自动创建 Root 用户。(账号 `Root` ,密码 `rootroot`),请及时修改。 之后的进阶配置可在 管理 面板进行。 + +## 杂项 + +[OAuth 配置](./oauth.md) diff --git a/wiki/development/development.md b/docs/development.md similarity index 100% rename from wiki/development/development.md rename to docs/development.md diff --git a/wiki/admin/judge.md b/docs/judge.md similarity index 100% rename from wiki/admin/judge.md rename to docs/judge.md diff --git a/wiki/admin/oauth.md b/docs/oauth.md similarity index 100% rename from wiki/admin/oauth.md rename to docs/oauth.md diff --git a/entry.js b/entry.js deleted file mode 100644 index 0cb7db60b..000000000 --- a/entry.js +++ /dev/null @@ -1,14 +0,0 @@ -const loader = require('./dist/loader'); - -function load(callback) { - callback({ addon: loader.addon }); - loader.load().catch((e) => { - console.error(e); - process.exit(1); - }); -} - -load.load = loader.load; -load.addon = loader.addon; - -module.exports = load; diff --git a/hydro/entry/common.ts b/hydro/entry/common.ts index 9543c5a36..498d1dc67 100644 --- a/hydro/entry/common.ts +++ b/hydro/entry/common.ts @@ -21,7 +21,7 @@ export const builtinModel = [ export const builtinHandler = [ 'home', 'problem', 'record', 'judge', 'user', 'contest', 'training', 'discussion', 'manage', 'import', - 'misc', 'homework', 'domain', 'wiki', + 'misc', 'homework', 'domain', ]; export const builtinScript = [ @@ -212,42 +212,3 @@ export async function script(pending: string[], fail: string[], active: string[] active.push(i); } } - -export async function wiki(pending: string[], fail: string[]) { - for (const i of pending) { - const p = path.resolve(i, 'wiki'); - if (fs.existsSync(p) && fs.statSync(p).isDirectory() && !fail.includes(i)) { - try { - const categories = fs.readdirSync(p); - for (const category of categories) { - if (!fs.statSync(p).isDirectory()) return; - const pages = fs.readdirSync(path.join(p, category)); - if (!global.Hydro.wiki[category]) global.Hydro.wiki[category] = {}; - for (const page of pages) { - const c = fs.readFileSync(path.join(p, category, page)).toString().split('\n'); - const pagename = page.split('.')[0]; - global.Hydro.wiki[category][pagename] = []; - let content = null; - for (let j = 0; j < c.length; j++) { - const line = c[j]; - if (line.startsWith('# ')) { - if (content) global.Hydro.wiki[category][pagename].push(content); - content = {}; - const t = line.split('# ')[1].split('|'); - [content.title, content.id] = t.map((q) => q.trim()); - content.content = ''; - } else { - content.content = `${content.content}${line}\n`; - } - } - } - } - console.log(`Wiki init: ${i}`); - } catch (e) { - fail.push(i); - console.error(`Wiki Load Fail: ${i}`); - console.error(e); - } - } - } -} diff --git a/hydro/entry/setup.ts b/hydro/entry/setup.ts index 195319232..e86baf538 100644 --- a/hydro/entry/setup.ts +++ b/hydro/entry/setup.ts @@ -8,9 +8,6 @@ import Router from 'koa-router'; import cache from 'koa-static-cache'; import nunjucks from 'nunjucks'; import mongodb from 'mongodb'; -import parse from 'yargs-parser'; - -const argv = parse(process.argv.slice(2)); class Loader { getSource(name: string) { // eslint-disable-line class-methods-use-this @@ -110,7 +107,7 @@ export function load() { ctx.body = await render('setup.html'); ctx.response.type = 'text/html'; }); - const listenPort = argv.port || 8888; + const listenPort = global.argv.port || 8888; router.post('/', async (ctx) => { const { host, port, name, username, password, diff --git a/hydro/entry/worker.ts b/hydro/entry/worker.ts index 7b6835232..994d77d38 100644 --- a/hydro/entry/worker.ts +++ b/hydro/entry/worker.ts @@ -1,7 +1,7 @@ /* eslint-disable no-await-in-loop */ /* eslint-disable import/no-dynamic-require */ import { - locale, template, lib, service, model, handler, script, setting, wiki, uistatic, + locale, template, lib, service, model, handler, script, setting, uistatic, builtinLib, builtinScript, builtinHandler, builtinModel, } from './common'; @@ -17,7 +17,6 @@ export async function load(call, args) { locale(pending, fail), template(pending, fail), uistatic(pending, fail), - wiki(pending, fail), ]); const bus = require('../service/bus'); await new Promise((resolve) => { diff --git a/hydro/handler/misc.ts b/hydro/handler/misc.ts index 84f246f98..88fef538e 100644 --- a/hydro/handler/misc.ts +++ b/hydro/handler/misc.ts @@ -103,10 +103,11 @@ class SwitchLanguageHandler extends Handler { } class MarkdownHandler extends Handler { - async post({ text, safe = true }) { - this.response.body = safe - ? markdown.safe.render(text) - : markdown.unsafe.render(text); + async post({ text, html = false, inline = false }) { + this.response.body = inline + ? markdown.renderInline(text, html) + : markdown.render(text, html); + this.response.type = 'text/html'; } } diff --git a/hydro/handler/problem.ts b/hydro/handler/problem.ts index 224ce5123..e35ac891f 100644 --- a/hydro/handler/problem.ts +++ b/hydro/handler/problem.ts @@ -355,7 +355,7 @@ class ProblemEditHandler extends ProblemManageHandler { const pid = checkPid(this.request.body.pid); const pdoc = await problem.get(domainId, this.request.params.pid); await problem.edit(domainId, pdoc.docId, { title, content, pid }); - this.back(); + this.response.redirect = this.url('problem_detail', this.request.params.pid); } } diff --git a/hydro/handler/wiki.ts b/hydro/handler/wiki.ts deleted file mode 100644 index e3772d026..000000000 --- a/hydro/handler/wiki.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NotFoundError } from '../error'; -import { - Route, Handler, Types, param, -} from '../service/server'; - -class WikiHandler extends Handler { - @param('category', Types.String, true) - @param('page', Types.String) - async get(domainId: string, category = 'wiki', page: string) { - if (!global.Hydro.wiki[category]) throw new NotFoundError(category); - if (!global.Hydro.wiki[category][page]) throw new NotFoundError(category, page); - const contents = global.Hydro.wiki[category][page]; - const pages = Object.keys(global.Hydro.wiki[category]); - const path = [ - ['Hydro', 'homepage'], - [`wiki_${category}`, null], - [`wiki_${category}_${page}`, null], - ]; - this.response.body = { - path, contents, pages, page_name: `wiki_${category}_${page}`, - }; - this.response.template = 'wiki.html'; - } -} - -export async function apply() { - Route('wiki', '/wiki/:page', WikiHandler); - Route('wiki_with_category', '/wiki/:category/:page', WikiHandler); -} - -global.Hydro.handler.wiki = apply; diff --git a/hydro/interface.ts b/hydro/interface.ts index e567a5500..932c0aaae 100644 --- a/hydro/interface.ts +++ b/hydro/interface.ts @@ -281,7 +281,6 @@ declare global { [key: string]: any }, stat: any, - wiki: { [category: string]: { [page: string]: any } }, ui: { manifest: Dict, nav: any, diff --git a/hydro/lib/markdown.ts b/hydro/lib/markdown.ts index fbc9349c2..b6f4ffc9e 100644 --- a/hydro/lib/markdown.ts +++ b/hydro/lib/markdown.ts @@ -17,21 +17,15 @@ belong to the previous footnote. import Footnote from 'markdown-it-footnote'; // ==Highlight== import Mark from 'markdown-it-mark'; -// :::warn This page requires javascript. ::: -// :::record-pass Accepted ::: -import Container from 'markdown-it-container'; - import TOC from 'markdown-it-table-of-contents'; - import Anchor from 'markdown-it-anchor'; -import katex from '../markdown/katex'; - -const md = MarkdownIt(); require('prismjs/components/index'); +type Plugin = MarkdownIt.PluginSimple | MarkdownIt.PluginWithOptions | MarkdownIt.PluginWithParams; + class Markdown extends MarkdownIt { - constructor(safe) { + constructor() { super({ linkify: true, highlight(str, lang) { @@ -42,44 +36,32 @@ class Markdown extends MarkdownIt { } return ''; }, - html: !safe, }); this.linkify.tlds('.py', false); - this.use(katex); this.use(Imsize); this.use(Footnote); this.use(Mark); this.use(Anchor); this.use(TOC); - const RE_CONTAINER = /^(note|warn|record-pending|record-progress|record-fail|record-pass|record-ignored)\s+(.*?):::(.*)$/; - const CONTAINER_MAP = { - note: ['
', '
'], - warn: ['
', '
'], - 'record-pending': ['', ''], - 'record-progress': ['', ''], - 'record-fail': ['', ''], - 'record-pass': ['', ''], - 'record-ignored': ['', ''], - }; - this.use(Container, 'blockquote', { - validate(params) { - return params.trim().match(RE_CONTAINER); - }, - render(tokens, idx) { - const m = tokens[idx].info.trim().match(RE_CONTAINER); - if (!m) return ''; - if (CONTAINER_MAP[m[1]]) { - return `${CONTAINER_MAP[m[1]][0]}${md.utils.escapeHtml(m[2])}\n${CONTAINER_MAP[m[1]][1]}\n${md.utils.escapeHtml(m[3])}`; - } - return `[${m[1]}]\n${md.utils.escapeHtml(m[2])}\n[/${m[1]}]\n${md.utils.escapeHtml(m[3])}`; - }, - }); } } -export const safe = new Markdown(true); -export const unsafe = new Markdown(false); +export const md = new Markdown(); + +export function plugin(func: Plugin, ...args: any[]) { + md.use(func, ...args); +} + +export function render(text: string, html = false) { + md.set({ html: !!html }); + return md.render(text); +} + +export function renderInline(text: string, html = false) { + md.set({ html: !!html }); + return md.renderInline(text); +} global.Hydro.lib.markdown = { - safe, unsafe, + md, plugin, render, renderInline, }; diff --git a/hydro/lib/template.ts b/hydro/lib/template.ts index 14df5af46..aff957513 100644 --- a/hydro/lib/template.ts +++ b/hydro/lib/template.ts @@ -35,10 +35,7 @@ class Nunjucks extends nunjucks.Environment { this.addFilter('json', (self) => JSON.stringify(self), false); this.addFilter('serialize', (self, ignoreFunction = true) => serialize(self, { ignoreFunction })); this.addFilter('assign', (self, data) => Object.assign(self, data)); - this.addFilter('markdown', (self, safe = true) => { - if (safe) return markdown.safe.render(self); - return markdown.unsafe.render(self); - }); + this.addFilter('markdown', (self, html = false) => markdown.render(self, html)); this.addFilter('ansi', (self) => misc.ansiToHtml(self)); this.addFilter('base64_encode', (s) => Buffer.from(s).toString('base64')); this.addFilter('bitand', (self, val) => self & val); diff --git a/hydro/loader.ts b/hydro/loader.ts index d40e15f0b..e7a574888 100644 --- a/hydro/loader.ts +++ b/hydro/loader.ts @@ -8,11 +8,10 @@ import os from 'os'; import path from 'path'; import cluster from 'cluster'; import fs from 'fs-extra'; -import parse from 'yargs-parser'; +import { argv } from 'yargs'; import AdmZip from 'adm-zip'; -global.argv = parse(process.argv.slice(2)); - +global.argv = argv; global.Hydro = { stat: { reqCount: 0 }, handler: {}, @@ -23,7 +22,6 @@ global.Hydro = { script: {}, // @ts-ignore lib: {}, - wiki: {}, ui: { manifest: {}, nav: [], diff --git a/hydro/markdown/katex.ts b/hydro/markdown/katex.ts deleted file mode 100644 index a581c23d5..000000000 --- a/hydro/markdown/katex.ts +++ /dev/null @@ -1,137 +0,0 @@ -// https://github.com/hydro-dev/markdown-it-katex/blob/master/index.js -import katex from 'katex'; -import MarkdownIt from 'markdown-it'; - -function isValidDelim(state, pos: number) { - const max = state.posMax; - const prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1; - const nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1; - let canOpen = true; - let canClose = true; - if (prevChar === 0x20/* " " */ || prevChar === 0x09 - ||/* \t */ (nextChar >= 0x30/* "0" */ && nextChar <= 0x39/* "9" */)) { - canClose = false; - } - if (nextChar === 0x20/* " " */ || nextChar === 0x09/* \t */) { - canOpen = false; - } - return { canOpen, canClose }; -} - -function mathInline(state, silent: boolean) { - let match; - let res; - let pos; - if (state.src[state.pos] !== '$') return false; - res = isValidDelim(state, state.pos); - if (!res.canOpen) { - if (!silent) state.pending += '$'; - state.pos += 1; - return true; - } - const start = state.pos + 1; - match = start; - // eslint-disable-next-line no-cond-assign - while ((match = state.src.indexOf('$', match)) !== -1) { - pos = match - 1; - while (state.src[pos] === '\\') pos -= 1; - if (((match - pos) % 2) === 1) break; - match += 1; - } - if (match === -1) { - if (!silent) state.pending += '$'; - state.pos = start; - return true; - } - if (match - start === 0) { - if (!silent) state.pending += '$$'; - state.pos = start + 1; - return true; - } - res = isValidDelim(state, match); - if (!res.can_close) { - if (!silent) state.pending += '$'; - state.pos = start; - return true; - } - if (!silent) { - const token = state.push('math_inline', 'math', 0); - token.markup = '$'; - token.content = state.src.slice(start, match); - } - state.pos = match + 1; - return true; -} - -function mathBlock(state, start, end, silent) { - let lastLine; - let next; - let lastPos; - let found = false; - let pos = state.bMarks[start] + state.tShift[start]; - let max = state.eMarks[start]; - if (pos + 2 > max) return false; - if (state.src.slice(pos, pos + 2) !== '$$') return false; - pos += 2; - let firstLine = state.src.slice(pos, max); - if (silent) return true; - if (firstLine.trim().slice(-2) === '$$') { - firstLine = firstLine.trim().slice(0, -2); - found = true; - } - for (next = start; !found;) { - next++; - if (next >= end) break; - pos = state.bMarks[next] + state.tShift[next]; - max = state.eMarks[next]; - if (pos < max && state.tShift[next] < state.blkIndent) break; - if (state.src.slice(pos, max).trim().slice(-2) === '$$') { - lastPos = state.src.slice(0, max).lastIndexOf('$$'); - lastLine = state.src.slice(pos, lastPos); - found = true; - } - } - state.line = next + 1; - const token = state.push('math_block', 'math', 0); - token.block = true; - token.content = (firstLine && firstLine.trim() ? `${firstLine}\n` : '') - + state.getLines(start + 1, next, state.tShift[start], true) - + (lastLine && lastLine.trim() ? lastLine : ''); - token.map = [start, state.line]; - token.markup = '$$'; - return true; -} - -export default function plugin(md: MarkdownIt, options) { - options = options || {}; - function katexInline(latex: string) { - options.displayMode = false; - try { - return katex.renderToString(latex, options); - } catch (error) { - if (options.throwOnError) console.log(error); - return latex; - } - } - function inlineRenderer(tokens, idx) { - return katexInline(tokens[idx].content); - } - function katexBlock(latex: string) { - options.displayMode = true; - try { - return `

${katex.renderToString(latex, options)}

`; - } catch (error) { - if (options.throwOnError) console.log(error); - return latex; - } - } - function blockRenderer(tokens, idx) { - return `${katexBlock(tokens[idx].content)}\n`; - } - md.inline.ruler.after('escape', 'math_inline', mathInline); - md.block.ruler.after('blockquote', 'math_block', mathBlock, { - alt: ['paragraph', 'reference', 'blockquote', 'list'], - }); - md.renderer.rules.math_inline = inlineRenderer; - md.renderer.rules.math_block = blockRenderer; -} diff --git a/hydro/model/setting.ts b/hydro/model/setting.ts index 52d1fb87e..17eba5763 100644 --- a/hydro/model/setting.ts +++ b/hydro/model/setting.ts @@ -131,17 +131,17 @@ SystemSetting( Setting('setting_oauth', 'oauth.googleappid', null, null, 'text', 'Google Oauth ClientID', null), Setting('setting_oauth', 'oauth.googlesecret', null, null, 'text', 'Google Oauth Secret', null, FLAG_SECRET), Setting('setting_proxy', 'proxy', null, null, 'text', 'Proxy Server URL'), - Setting('setting_constant', 'PROBLEM_PER_PAGE', null, 100, 'number', 'Problems per Page'), - Setting('setting_constant', 'CONTEST_PER_PAGE', null, 20, 'number', 'Contests per Page'), - Setting('setting_constant', 'DISCUSSION_PER_PAGE', null, 50, 'number', 'Discussion per Page'), - Setting('setting_constant', 'RECORD_PER_PAGE', null, 100, 'number', 'Record per Page'), - Setting('setting_constant', 'SOLUTION_PER_PAGE', null, 20, 'number', 'Solutions per Page'), - Setting('setting_constant', 'TRAINING_PER_PAGE', null, 10, 'number', 'Training per Page'), - Setting('setting_constant', 'REPLY_PER_PAGE', null, 50, 'number', 'Reply per Page'), - Setting('setting_constant', 'HOMEWORK_ON_MAIN', null, 5, 'number', 'HOMEWORK_ON_MAIN'), - Setting('setting_constant', 'DISCUSSION_ON_MAIN', null, 20, 'number', 'DISCUSSION_ON_MAIN'), - Setting('setting_constant', 'CONTEST_ON_MAIN', null, 10, 'number', 'CONTEST_ON_MAIN'), - Setting('setting_constant', 'TRAINING_ON_MAIN', null, 10, 'number', 'TRAINING_ON_MAIN'), + Setting('setting_constant', 'PROBLEM_PER_PAGE', null, 100, 'number', 'Problems per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'CONTEST_PER_PAGE', null, 20, 'number', 'Contests per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'DISCUSSION_PER_PAGE', null, 50, 'number', 'Discussion per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'RECORD_PER_PAGE', null, 100, 'number', 'Record per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'SOLUTION_PER_PAGE', null, 20, 'number', 'Solutions per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'TRAINING_PER_PAGE', null, 10, 'number', 'Training per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'REPLY_PER_PAGE', null, 50, 'number', 'Reply per Page', null, FLAG_HIDDEN), + Setting('setting_constant', 'HOMEWORK_ON_MAIN', null, 5, 'number', 'HOMEWORK_ON_MAIN', null, FLAG_HIDDEN), + Setting('setting_constant', 'DISCUSSION_ON_MAIN', null, 20, 'number', 'DISCUSSION_ON_MAIN', null, FLAG_HIDDEN), + Setting('setting_constant', 'CONTEST_ON_MAIN', null, 10, 'number', 'CONTEST_ON_MAIN', null, FLAG_HIDDEN), + Setting('setting_constant', 'TRAINING_ON_MAIN', null, 10, 'number', 'TRAINING_ON_MAIN', null, FLAG_HIDDEN), Setting('setting_storage', 'db.ver', null, 1, 'number', 'Database version', null, FLAG_DISABLED | FLAG_HIDDEN), Setting('setting_storage', 'user', null, 1, 'number', 'User Counter', null, FLAG_DISABLED | FLAG_HIDDEN), ); diff --git a/hydro/service/server.ts b/hydro/service/server.ts index 94e747194..b6b888337 100644 --- a/hydro/service/server.ts +++ b/hydro/service/server.ts @@ -13,7 +13,6 @@ import Router from 'koa-router'; import cache from 'koa-static-cache'; import sockjs from 'sockjs'; import serialize, { SerializeJSOptions } from 'serialize-javascript'; -import parse from 'yargs-parser'; import { lrucache } from '../utils'; import { User, DomainDoc } from '../interface'; import { @@ -32,7 +31,6 @@ import * as blacklist from '../model/blacklist'; import * as token from '../model/token'; import * as opcount from '../model/opcount'; -const argv = parse(process.argv.slice(2)); const app = new Koa(); let server; const router = new Router(); @@ -774,8 +772,8 @@ export async function start() { } app.use(router.routes()).use(router.allowedMethods()); Route('notfound_handler', '*', Handler); - server.listen(argv.port || port); - console.log('Server listening at: %s', argv.port || port); + server.listen(global.argv.port || port); + console.log('Server listening at: %s', global.argv.port || port); } global.Hydro.service.server = { diff --git a/locales/zh_CN.yaml b/locales/zh_CN.yaml index 92ffe6d76..9bb158bf4 100644 --- a/locales/zh_CN.yaml +++ b/locales/zh_CN.yaml @@ -552,16 +552,6 @@ Quit Scratchpad: 退出在线编程模式 Quote: 引用 Rank: 排名 ranking: 排名 -Read data of own problems: 读取自己题目的数据 -Read data of problem: 读取题目数据 -Read record codes: 读取记录的代码 -Ready (☆▽☆): 马上开始 (☆▽☆) -Ready: 即将开始 -Recent {0} Records: 最近 {0} 条记录 -Recent Activities: 最近活动 -Recent Solutions: 最近编写的题解 -Recent Submissions: 最近递交 -Recently Created Discussions: 最近创建的讨论 Recommended: 推荐 Record {0} not found.: 记录 {0} 不存在。 record_detail: 记录详情 @@ -647,13 +637,6 @@ Sign up mail has been sent to your email.: 注册邮件已经发送到您的电 Sign Up Now: 现在注册 Sign Up: 注册 Size: 大小 -Solutions Liked: 题解被赞 -Solutions: 题解 -Solve: 解决 -Solved Problems: 解决题目 -Sorry, there is no problem in the problem set: 题库中没有题目 -Sorry, there is no training plan.: 目前没有训练计划。 -Sorry, there is no user in this domain.: 对不起,此域中没有用户。 Sorry: 对不起 Sort by: 排序 Source type: 来源类型 @@ -666,13 +649,6 @@ Status: 状态 Submission Statistics: 递交统计 Submission: 递交 Submissions: 递交 -Submit At: 递交时间 -Submit By: 递交者 -Submit problem: 递交题目 -Submit Solution: 递交评测 -Submit Time: 递交时间 -Submit to Judge: 递交以评测 -Submit Your Code: 递交代码进行正式评测 Submit: 递交 Submitted: 已递交 Support: 支持 @@ -799,7 +775,6 @@ What's domain?: 什么是域? What's script?: 什么是脚本? What's this?: 这是什么? Whether to show tags in the problem list.: 是否在题目列表中显示题目的标签。 -wiki_help: 帮助 Will be used as the domain icon.: 将被用作系统图标。 With this feature, you can copy problems that you can view from a domain to some other domain. Their title, content, tags and categories will be copied. However, their test data are not copied directly.: 您可以通过这个功能将某域下您能查看的题目复制到其它域中,题目的标题、描述、标签与分类将被复制过来。但是测试数据不会被直接复制。 Write Your Comment: 发表您的评论 diff --git a/package.json b/package.json index fbe938747..943bf0739 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "hydrooj", - "version": "2.9.2", - "main": "entry.js", + "version": "2.9.3", + "main": "dist/loader.js", "bin": "bin/hydrooj.js", "repository": "https://github.com/hydro-dev/Hydro.git", "author": "masnn", @@ -15,7 +15,6 @@ "detect-browser": "^5.1.1", "fs-extra": "^9.0.1", "js-yaml": "^3.13.1", - "katex": "^0.12.0", "koa": "^2.13.0", "koa-body": "^4.2.0", "koa-morgan": "^1.0.1", @@ -25,7 +24,6 @@ "lru-cache": "^6.0.0", "markdown-it": "^11.0.0", "markdown-it-anchor": "^5.3.0", - "markdown-it-container": "^3.0.0", "markdown-it-footnote": "^3.0.2", "markdown-it-imsize": "^2.0.1", "markdown-it-mark": "^3.0.0", @@ -40,11 +38,12 @@ "superagent": "^5.2.2", "superagent-proxy": "^2.0.0", "systeminformation": "^4.26.10", - "yargs-parser": "^18.1.3" + "yargs": "^15.4.1" }, "devDependencies": { "@types/adm-zip": "^0.4.33", "@types/fs-extra": "^9.0.1", + "@types/js-yaml": "^3.12.5", "@types/katex": "^0.11.0", "@types/koa": "^2.11.3", "@types/koa-morgan": "^1.0.4", diff --git a/wiki/wiki/about.md b/wiki/wiki/about.md deleted file mode 100644 index 50cc9ea6d..000000000 --- a/wiki/wiki/about.md +++ /dev/null @@ -1,108 +0,0 @@ -# Privacy | privacy - -#### 1. 收集的信息 - -我们收集信息是为了向所有用户提供更好的服务。我们有两种信息收集方式: - -- 您向我们提供信息。在您注册 Hydro 帐户时,我们会要求您提供个人信息,例如您的电子邮件地址、QQ号码等。 -- 我们在您使用服务的过程中获取信息。我们会收集关于您使用的服务以及使用方式的信息,例如您在何时使用了我们服务。 - -#### 2. 如何使用收集到的信息 - -我们利用从所有服务中收集的信息来提供、维护、保护和改进这些服务,同时开发新的服务并保护 Hydro 以及用户的隐私。 -当我们要将信息用于本隐私权政策未载明的其它用途时,则会事先征求您的同意。 - -#### 3. 访问和更新您的个人信息 - -无论您在何时使用我们的服务,我们都力求让您能够访问自己的个人信息。如果这些信息有误,我们会努力通过各种方式让您快速更新信息或删除信息。在更新您的个人信息时,我们可能会要求您先验证自己的身份,然后再处理您的请求。 -我们力求对服务进行完善的维护,以保护信息免遭意外或恶意的破坏。因此,当您从我们的服务中删除信息后,我们可能不会立即从在用的服务器中删除这些信息的残留副本,也可能不会从备份系统中删除相应的信息。 - -#### 4. 信息安全 - -我们为您提供SSL加密访问服务,您可以通过SSL(https)使用我们的服务,这可以很大程度上保障在传输过程中您信息的安全。 -对于敏感数据(如您的密码),我们承诺在存储时进行高强度不可逆加密。Hydro 的管理员、维护人员等均不能够访问到敏感数据的明文,所有操作均无人工介入。 - -# Terms of Service | tos - -#### 0. 欢迎使用 Hydro - -注册 Hydro 帐户和/或使用 Hydro 提供的服务(包括网页提供的在线服务和题目评测的非在线服务等),即表示您已同意本条款。请您务必审慎阅读,充分理解条款各项内容。 - -#### 1. 使用服务 - -您必须遵守各项服务中提供的所有政策(包括但不限于讨论和题解的版规)。 -请勿滥用我们的服务。如,请勿干扰我们的服务,或尝试使用除我们提供的界面和指示以外的方法访问这些服务,或使用我们服务中出现的缺陷干扰其他网站或设施的正常运行。您仅能在法律允许的范围内使用我们的服务。 -您在使用我们服务时须遵守我们服务器所在地的法律法规,不得利用我们服务从事违法违规行为,包括但不限于: - -- 发布、传送、传播、储存危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容; -- 发布、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容; -- 恶意虚构事实、隐瞒真相以误导、欺骗他人; -- 发布、传送、传播广告信息及垃圾信息; -- 其他法律法规禁止的行为。 - -如果您违反了约定,相关国家相关机关或机构可能会对您提起诉讼、进行行政处罚或采取其他制裁措施,Hydro 将给于协助。造成损害的,您应依法予以赔偿,Hydro 不承担任何责任。 -如果 Hydro 发现或收到他人举报您发布的信息违反约定,Hydro 有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,Hydro 有权视用户的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止账户使用,追究法律责任等措施。 - -#### 2. 版权 - -使用我们的服务并不代表您拥有我们的服务或您所访问的内容的任何知识产权。网站上的所有材料(包括但不限于题目内容、用户界面、Wiki)版权均受保护,归 Hydro 所有。除非另有说明,本网站上的材料和服务仅用于个人和非商业用途,未经 Hydro 书面许可,不得复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发从本网站获得的任何信息、文件、产品或服务。 - -#### 3. 您在我们服务中发布的内容 - -我们的某些服务允许您提交内容。您保留对该内容持有的任何知识产权的所有权。 -当您上传内容或通过其他方式向我们的服务提交内容时,您授予 Hydro 使用、持有、存储、复制、修改、创建衍生作品、传播、出版、公开演示、公开展示和分发此内容等权利。您在此许可中授予的权限,仅能用于运营、宣传和改进我们的服务,以及开发新的服务。该项许可在您停止使用我们的服务后依然有效。某些服务可能会向您提供一些方法,用于访问和删除您提供给该服务的内容。对于您提交至我们服务的任何内容,请确保您拥有向我们授予此许可的必要权利。我们有权在未通知您的情况下删除我们认为侵犯了知识产权或违反了相关法律法规的内容。 - -#### 4. 对于发布题目的附加条款 - -您可以在 Hydro 上创建新题目。您上传到 Hydro 的题目,除了适用于本协议第三条(即“您在我们服务中发布的内容”)条款,还包含以下附加条款(若有冲突的条款,以附加条款中的优先): - -- 您上传到 Hydro 上的题目版权为 Hydro 和您共同拥有,我们会在相关页面或在对其进行分发、传播等操作时标明版权所有者。 -- Hydro 尊重他人知识产权和合法权益,请您在上传题目前确保拥有题目内容(包括但不限于题目描述、数据、图片等)的著作权及信息网络传播权或者已经取得上述全部权利人的许可并不存在任何著作权纠纷。Hydro有权在不通知的情况下删除被认为侵权的题目。 -- 您可以申请将自己上传的优质题目合并到题库主干。我们的管理员会对您创建的题目的内容(包括但不限于评测数据等对用户不可见的信息)进行人工审核和适当修改以确认其符合国家基本法律法规。出于质量的考虑,我们也可能会拒绝您完全合法的合并到题库主干的请求。 -- 我们会维护服务的稳定,并对数据(包括您递交的题目)进行定期的备份,并尽量在关闭服务前通知您,但我们仍然不对任何题目(包括主干和非主干)提供永久存储或保留的承诺,出于安全的考虑推荐您自行保留题目的内容。 -- 您有权决定 Hydro 是否公开您上传的题目的数据。公开题目数据意味着 Hydro 上的用户均有权利获取到您递交的题目的所有评测数据,但相关版权协议仍然生效。 - -#### 5. 隐私保护 - -[Hydro 隐私声明](/wiki/about#privacy) 介绍了您在使用我们的服务时,我们会如何处理您的个人数据和保护您的隐私。使用我们的服务即表示您同意 Hydro 可以按照我们的隐私权政策使用您的个人数据。 - -#### 6. 修改和终止服务 - -我们始终在不断更改和改进我们的服务。我们可能会增加或删除功能,也可能暂停或彻底停止某项服务。 -您可以随时停止使用我们的服务,尽管我们对此表示非常遗憾。Hydro 也可能随时停止向您提供服务,或随时对我们的服务增加或设置新的限制。 - -#### 7. 保证和免责声明 - -我们对服务内容、服务的具体功能,或其可靠性、可用性或满足您需要的能力不作任何承诺。我们的服务是按照现有技术和条件所能达到的现状提供的。我们会尽最大努力向您提供服务,确保服务的连贯性和安全性。但我们不能随时预见和防范法律、技术以及其他风险,包括但不限于不可抗力、病毒、木马、黑客攻击、系统不稳定、第三方服务瑕疵、政府行为等原因可能导致的服务中断、数据丢失以及其他的损失和风险。 - -#### 8. 关于本条款 - -我们可以修改上述条款或任何适用于某项服务的附加条款,您应当定期查阅本条款。所有修改的适用不具有追溯力,且会在公布十四天或更长时间后方始生效。但是,对服务新功能的特别修改或由于法律原因所作的修改将立即生效。如果您不同意服务的修改条款,应停止使用服务。 - -#### 9. 其他 - -如果您对这个协议或我们的服务有意见或建议,可与我们联系,我们会给予您必要的帮助。 - -# Discussion: Terms Of Service | discussion - -为了更好地发挥讨论、题解的积极作用,使广大用户学到知识、获得利益,进一步规范讨论和题解功能的使用,我们制定了《讨论和题解版规》(简称《版规》)。您在发布(或回复)讨论和题解时,即代表您已充分阅读、理解、接受并保证遵守此版规。 -您在发布(或回复)讨论和题解或使用相关功能时须遵守以下规定: - -- 第一次使用编辑器前,要先阅读编辑器快速入门和 Markdown 详细帮助。 -- 不得将讨论、题解混淆。例如,不得将题解发布到讨论中,题解应发布在相应题目的题解区中。 -- 发布(或回复)的所有内容不得包含会干扰 Hydro 用户界面呈现的相关内容。 -- 发布(或回复)的所有内容不得包含恶意代码和指向恶意网站或 Hydro 明确禁止的网站的链接。 -- 特别地,发布(或回复)含有代码的内容时,应当将代码高亮。一个简单的方法是选中代码块然后按下 Tab 键。 -- 发布的题解禁止只包含无详细注释的代码。题解中难以理解的代码应当有尽可能详细的注释。 -- 打分、投票和评价应当客观。例如,对于题解的打分、投票和评价应当关注于题解本身的质量。 -- 我们欢迎原创作品,并会对其作者给予数量不等的 RP 奖励。 - -您在发布、回复讨论和题解时还须遵守法律法规,不得发布违法违规内容,包括但不限于: - -- 危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容; -- 侵害他人知识产权、商业秘密等合法权利的内容; -- 恶意虚构事实、隐瞒真相以误导、欺骗他人的内容; -- 广告信息及垃圾信息; -- 其他法律法规禁止的内容。 - -对于违反《版规》的,我们将进行警告并删除相关内容、临时冻结用户、永久冻结用户等操作。 diff --git a/wiki/wiki/help.md b/wiki/wiki/help.md deleted file mode 100644 index 2bd886fc7..000000000 --- a/wiki/wiki/help.md +++ /dev/null @@ -1,94 +0,0 @@ -# Compilers' Version and Parameters - -Hydro使用 [HydroJudger](https://github.com/hydro-dev/HydroJudger) 进行评测,以docker镜像的形式安装至评测机。 -所使用的编译器均为创建镜像时 [debian testing](https://wiki.debian.org/DebianTesting) 分支的最新版。编译参数如下: - -- Free Pascal `fpc -O2 -o/out/foo /in/foo.pas` -- C `gcc -O2 -Wall -std=c99 -o /out/foo /in/foo.c -lm` -- C++ `g++ -O2 -Wall -std=c++11 -o /out/foo /in/foo.cc -lm` -- Java `javac Main.java` -- Python `python foo.py` -- Python 3 `python3 foo.py` -- PHP `php foo.php` -- Rust `rustc -O -o /out/foo /in/foo.rs` -- Haskell `ghc -O -outputdir /tmp -o /out/foo /in/foo.hs` - -# Limitations - -Hydro 评测机使用进程的CPU时间计算时间消耗,时间的限定为题目中评测点所指定的时间。 -Hydro 评测机使用进程虚拟内存与物理内存总和计算内存空间消耗。内存空间默认限定为256MiB,题目中特别指明的,限定为题目中评测点所指定的内存空间。 - -# IO - -若无特殊说明,Hydro 使用标准输入输出(控制台输入输出,屏幕输入输出,STD I/O)。 - -# Judge Status - -- :::record-pending Waiting::: 评测:评测请求正在等待被评测机抓取 -- :::record-progress Fetched::: 评测:评测请求已被评测机抓取,正在准备开始评测 -- :::record-progress Compiling::: 评测:正在编译中 -- :::record-progress Judging::: 评测:编译成功,正在评测中 -- :::record-pass Accepted::: 通过:程序输出完全正确 -- :::record-fail Wrong Answer::: 不通过:程序输出与标准答案不一致(不包括行末空格以及文件末空行) -- :::record-fail Time Exceeded::: 不通过:程序运行时间超过了题目限制 -- :::record-fail Memory Exceeded::: 不通过:程序运行内存空间超过了题目限制 -- :::record-fail Runtime Error::: 不通过:程序运行时错误(如数组越界、被零除、运算溢出、栈溢出、无效指针等) -- :::record-fail Compile Error::: 不通过:编译失败 -- :::record-fail System Error::: 错误:系统错误(如果您遇到此问题,请及时在讨论区进行反馈) -- :::record-ignored Canceled::: 其他:评测被取消 -- :::record-fail Unknown Error::: 其他:未知错误 - -:::note 有“成绩取消”字样则说明管理员手动标记此记录为取消,可能违反了服务条款,比如代码被发现与其他用户的代码十分相似。::: - -# Compile Error - -可能有以下情况: - -- 递交时选错了编程语言 -- Java 的主类名没有使用 "Main" -- 对于 C/C++:见下 -- 一般性的编译错误 - -
-

对 C/C++ 选手的特别提醒:

-
    -
  • 1. __int64 在 GNU C++ 中应写成 long long 类型
  • -
  • 2. main() 返回值必须定义为 int ,而不是 void
  • -
  • 3. for 语句中的指标变量 i 将会在如"for (int i = 0...) {...}"语句之后变为无效
  • -
  • 4. itoa 不是一个通用 ANSI 函数(标准 C/C++ 中无此函数)
  • -
  • 5. printf 中使用 %lf 格式是不正确的
  • -
-
- -# Training - -我们精心挑选了一些题目组成了训练计划。单击导航栏的“训练”即可进入! - -# Contest - -按照赛制不同,有不同的递交、排名规则。 -OI 赛制所有题目均以最后一次递交为准,特别地,请避免编译错误。 -OI 赛制排名规则为:总分高的排在前面,总分相等则排名相同。 -ACM/ICPC 赛制所有题目递交后立即评测,以是否通过为准。 -ACM/ICPC 赛制排名规则为:通过题目数多的排在前面,通过题目数相同的做题耗时(含罚时)少的排在前。 -时间与空间限制以题目说明为准,默认限制参见[Limitations](#Limits)。 - -# Accepted Ratio - -通过率的影响极其恶劣,Hydro 不提供也不承认通过率。 - -# RP - -Hydro RP 分为固定 RP 与浮动 RP ,固定 RP 可由活动、比赛等的奖励获得,浮动 RP 由一般性通过题目获得。 -浮动 RP 是一个动态的数值,每个用户在每道题上获得的 RP 都不一样,并且未来也不固定(即浮动之意)。 - -:::note 每道题的浮动 RP 由该题通过总人数与该用户通过此题的名次计算得来。::: - -# Dataset Format - -TODO - -# Forgot Password and/or Username - -如果您无法登录,请仔细想想,是不是用户名记错了。比如,自己原本想要注册的用户名已经被注册,所以使用了一个带有前和/或后缀的用户名。 -如果您确信您的账号被盗或者忘记了账号和/或密码,请及时[{{ _('Reset Password or Find Username') }}](/lostpass)。 diff --git a/yarn.lock b/yarn.lock index 418015abc..d543facd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -133,6 +133,11 @@ resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== +"@types/js-yaml@^3.12.5": + version "3.12.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" + integrity sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww== + "@types/json-schema@^7.0.3": version "7.0.5" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" @@ -456,7 +461,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -640,6 +645,15 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + co-body@^5.1.1: version "5.2.0" resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124" @@ -686,11 +700,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -891,6 +900,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + encodeurl@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -1198,6 +1212,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -1274,6 +1296,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-uri@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" @@ -1492,6 +1519,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-function@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" @@ -1582,13 +1614,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -katex@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" - integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== - dependencies: - commander "^2.19.0" - keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -1725,6 +1750,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" @@ -1749,11 +1781,6 @@ markdown-it-anchor@^5.3.0: resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== -markdown-it-container@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b" - integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw== - markdown-it-footnote@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.2.tgz#1575ee7a093648d4e096aa33386b058d92ac8bc1" @@ -2041,6 +2068,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -2048,11 +2082,23 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pac-proxy-agent@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" @@ -2102,6 +2148,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2282,6 +2333,16 @@ regexpp@^3.0.0, regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + require_optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" @@ -2358,6 +2419,11 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -2476,6 +2542,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" @@ -2773,6 +2848,11 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2785,6 +2865,15 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -2802,6 +2891,11 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -2812,7 +2906,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^18.1.3: +yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -2820,6 +2914,23 @@ yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + ylru@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"