diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 71cebc8cf..5242488cf 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -1,4 +1,4 @@ -import type { AttestationFormat, CredentialDeviceType, } from '@simplewebauthn/server'; +import type { AttestationFormat, CredentialDeviceType } from '@simplewebauthn/server'; import type { AuthenticationExtensionsAuthenticatorOutputs } from '@simplewebauthn/server/esm/helpers/decodeAuthenticatorExtensions'; import type fs from 'fs'; import type { Dictionary, NumericDictionary } from 'lodash'; diff --git a/packages/ui-default/backendlib/template.ts b/packages/ui-default/backendlib/template.ts index 0d696a624..86165628a 100644 --- a/packages/ui-default/backendlib/template.ts +++ b/packages/ui-default/backendlib/template.ts @@ -1,5 +1,6 @@ import * as status from '@hydrooj/common/status'; import { findFileSync } from '@hydrooj/utils/lib/utils'; +import { convert } from 'html-to-text'; import { avatar, Context, fs, PERM, PRIV, STATUS, yaml, } from 'hydrooj'; @@ -94,6 +95,14 @@ class Nunjucks extends nunjucks.Environment { } return ensureTag(html ? xss.process(s) : markdown.render(s)); }); + this.addFilter('problemPreview', (html) => { + const res = convert(html, { + selectors: [ + { selector: 'math', format: 'skip' }, + ], + }); + return res.split('\n').map((i) => i.trim()).join('\n').replace(/\n+/g, '\n'); + }); this.addFilter('contentLang', (content) => { let s: any = ''; try { diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 744e9bcc5..da7cd7ea0 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -29,6 +29,7 @@ "@sentry/webpack-plugin": "^3.1.2", "@simplewebauthn/browser": "13.1.0", "@svgr/webpack": "^8.1.0", + "@types/html-to-text": "^9.0.4", "@types/jquery": "^3.5.32", "@types/jquery.transit": "^0.9.33", "@types/json-schema": "^7.0.15", @@ -127,6 +128,7 @@ "cssfilter": "^0.0.11", "esbuild": "0.24.0", "fs-extra": "^11.3.0", + "html-to-text": "^9.0.5", "js-yaml": "^4.1.0", "jsesc": "^3.1.0", "katex": "^0.16.21", diff --git a/packages/ui-default/templates/layout/basic.html b/packages/ui-default/templates/layout/basic.html index b0341c810..4e574b9b1 100644 --- a/packages/ui-default/templates/layout/basic.html +++ b/packages/ui-default/templates/layout/basic.html @@ -23,3 +23,5 @@ {% if UserContext and not handler.user._id %}{% include "partials/login_dialog.html" %}{% endif %} {% endblock %} +{% block ogp %} +{% endblock %} diff --git a/packages/ui-default/templates/layout/html5.html b/packages/ui-default/templates/layout/html5.html index 96ee85864..2f3139b81 100644 --- a/packages/ui-default/templates/layout/html5.html +++ b/packages/ui-default/templates/layout/html5.html @@ -19,12 +19,14 @@ {% if handler.context.request.url %}{% endif %} - {% block ogp %} + {% block ogp_site %} - {% endblock %} + {% block ogp %} + + {% endblock %} {{ handler.renderTitle(page_name) }}