diff --git a/.github/workflows/preview-cleanup.yml b/.github/workflows/preview-cleanup.yml
deleted file mode 100644
index 1b9842f..0000000
--- a/.github/workflows/preview-cleanup.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: PR preview cleanup
-
-on:
- pull_request:
- types: [closed]
-
-permissions:
- contents: read
-
-jobs:
- cleanup:
- name: Delete FTP preview
- runs-on: ubuntu-latest
- steps:
- - name: Install lftp
- run: sudo apt-get install -y lftp
-
- - name: Remove preview directory from FTP
- env:
- FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
- FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
- PR_NUMBER: ${{ github.event.pull_request.number }}
- run: |
- lftp -c "
- set ftp:ssl-allow no;
- open -u $FTP_USERNAME,$FTP_PASSWORD ftpupload.net;
- rm -rf htdocs/pr-$PR_NUMBER/;
- bye
- "
diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml
deleted file mode 100644
index ab7dad8..0000000
--- a/.github/workflows/preview.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: PR preview
-
-on:
- pull_request:
- types: [opened, synchronize, reopened]
-
-permissions:
- contents: read
- pull-requests: write
-
-jobs:
- preview:
- name: Build & deploy preview
- runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 20
- cache: npm
-
- - name: Install dependencies
- run: npm ci
-
- - name: Build docs
- run: npm run docs:build -- --base /pr-${{ github.event.pull_request.number }}/
-
- - name: Deploy to FTP
- uses: SamKirkland/FTP-Deploy-Action@v4.3.5
- with:
- server: ftpupload.net
- port: 21
- username: ${{ secrets.FTP_USERNAME }}
- password: ${{ secrets.FTP_PASSWORD }}
- local-dir: .vitepress/dist/
- server-dir: htdocs/pr-${{ github.event.pull_request.number }}/
-
- - name: Comment on PR
- uses: actions/github-script@v7
- with:
- script: |
- const prNumber = context.payload.pull_request.number;
- const previewUrl = `http://xmoj-docs.infinityfreeapp.com/pr-${prNumber}/`;
- const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
- const body = [
- '## 📖 文档预览',
- '',
- `构建成功!点击下方链接在线预览文档(PR 关闭后自动删除)。`,
- '',
- `**[🔗 在线预览](${previewUrl})**`,
- '',
- `> 预览地址:\`${previewUrl}\``,
- `> 构建运行:[#${context.runNumber}](${runUrl})`,
- ].join('\n');
-
- const { data: comments } = await github.rest.issues.listComments({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number,
- });
-
- const botComment = comments.find(
- c => c.user.type === 'Bot' && c.body.includes('## 📖 文档预览')
- );
-
- if (botComment) {
- await github.rest.issues.updateComment({
- owner: context.repo.owner,
- repo: context.repo.repo,
- comment_id: botComment.id,
- body,
- });
- } else {
- await github.rest.issues.createComment({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number,
- body,
- });
- }
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
index 3b6c1db..7156a1a 100644
--- a/.vitepress/config.mts
+++ b/.vitepress/config.mts
@@ -11,12 +11,14 @@ const customElements = [
]
export default defineConfig({
- title: '小明的OJ增强脚本',
- description: '小明的OJ增强脚本用户帮助文档',
+ title: 'XMOJ-Script 文档',
+ description: 'XMOJ-Script(小明的OJ增强脚本)的安装和使用说明',
lang: 'zh-CN',
head: [
['link', { rel: 'icon', href: '/logo.png' }],
+ ['link', { rel: 'preconnect', href: 'https://fonts.loli.net' }],
+ ['link', { rel: 'stylesheet', href: 'https://fonts.loli.net/css2?family=Playfair+Display:wght@400;700&family=Source+Serif+4:wght@400;600;700&family=JetBrains+Mono:wght@400;500&display=swap' }],
],
markdown: {
@@ -37,8 +39,7 @@ export default defineConfig({
logo: '/logo.png',
nav: [
- { text: '首页', link: '/' },
- { text: '安装指南', link: '/guide/installation' },
+ { text: '安装', link: '/guide/installation' },
{
text: '功能介绍',
items: [
@@ -63,13 +64,8 @@ export default defineConfig({
{ text: 'ELXMOJ 桌面客户端', link: '/apps/elxmoj' },
],
},
- {
- text: '更多',
- items: [
- { text: '常见问题', link: '/qa/discussion' },
- { text: '用户协议', link: '/legal/eula' },
- ],
- },
+ { text: '常见问题', link: '/qa/discussion' },
+ { text: '官网', link: 'https://www.xmoj-script.uk' },
],
sidebar: [
@@ -107,7 +103,9 @@ export default defineConfig({
text: '更多',
items: [
{ text: '常见问题', link: '/qa/discussion' },
- { text: '用户协议', link: '/legal/eula' },
+ { text: '使用条款', link: 'https://www.xmoj-script.uk/terms.html' },
+ { text: '隐私说明', link: 'https://www.xmoj-script.uk/privacy.html' },
+ { text: '未成年人保护', link: 'https://www.xmoj-script.uk/child-protection.html' },
],
},
],
@@ -117,13 +115,13 @@ export default defineConfig({
],
footer: {
- message: '基于 GPLv3 许可证发布',
- copyright: 'Copyright © XMOJ-Script-dev',
+ message: '以 GPL-3.0 开源 · 使用条款 · 隐私说明',
+ copyright: '原项目作者 langningchen · 由 XMOJ-Script-dev 维护',
},
editLink: {
pattern: 'https://github.com/XMOJ-Script-dev/docs/edit/master/:path',
- text: '在 GitHub 上编辑此页',
+ text: '在 GitHub 上改这一页',
},
lastUpdated: {
diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css
index cc179cb..335983d 100644
--- a/.vitepress/theme/style.css
+++ b/.vitepress/theme/style.css
@@ -1,540 +1,384 @@
-/**
- * GitHub Primer-inspired theme for VitePress
- * https://primer.style/foundations/color
+/*
+ * XMOJ-Script 文档主题
+ * 与 xmoj-script.uk 官网和脚本的黑白主题(MonochromeUI)保持一致:
+ * 黑白灰配色、衬线字体、直角、无阴影。改动时请同步官网的 site.css。
*/
-/* ============================================================
- Typography
- ============================================================ */
:root {
- --vp-font-family-base:
- -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
- Helvetica, Arial, sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji";
- --vp-font-family-mono:
- ui-monospace, SFMono-Regular, "SF Mono", Menlo,
- Consolas, "Liberation Mono", monospace;
-}
-
-/* ============================================================
- Light Mode — GitHub fg/bg/border palette
- ============================================================ */
-:root {
- /* Brand — GitHub Blue */
- --vp-c-brand-1: #0969da;
- --vp-c-brand-2: #0550ae;
- --vp-c-brand-3: #0a3069;
- --vp-c-brand-soft: rgba(9, 105, 218, 0.08);
-
- /* Text */
- --vp-c-text-1: #1f2328;
- --vp-c-text-2: #59636e;
- --vp-c-text-3: #848d97;
-
- /* Background */
- --vp-c-bg: #ffffff;
- --vp-c-bg-soft: #f6f8fa;
- --vp-c-bg-alt: #f6f8fa;
- --vp-c-bg-elv: #ffffff;
-
- /* Borders */
- --vp-c-border: #d0d7de;
- --vp-c-divider: #d0d7de;
- --vp-c-gutter: #eaeef2;
-
- /* Hero buttons — GitHub green */
- --vp-button-brand-bg: #1a7f37;
- --vp-button-brand-hover-bg: #1a7f37;
- --vp-button-brand-active-bg: #116329;
- --vp-button-brand-border: rgba(31, 35, 40, 0.15);
- --vp-button-brand-hover-border: rgba(31, 35, 40, 0.15);
- --vp-button-brand-active-border: rgba(31, 35, 40, 0.15);
- --vp-button-brand-shadow: 0 1px 0 rgba(31, 35, 40, 0.1);
- --vp-button-brand-text: #ffffff;
- --vp-button-brand-hover-text: #ffffff;
- --vp-button-brand-active-text: #ffffff;
-
- --vp-button-alt-border: #d0d7de;
- --vp-button-alt-bg: #f6f8fa;
- --vp-button-alt-hover-bg: #eaeef2;
- --vp-button-alt-text: #24292f;
- --vp-button-alt-hover-text: #24292f;
-
- /* Custom blocks — GitHub alert colors */
- --vp-custom-block-tip-bg: #ddf4ff;
- --vp-custom-block-tip-border: #54aeff;
- --vp-custom-block-tip-text: #0550ae;
- --vp-custom-block-tip-code-bg: rgba(31, 111, 235, 0.1);
-
- --vp-custom-block-info-bg: #f6f8fa;
- --vp-custom-block-info-border: #d0d7de;
- --vp-custom-block-info-text: #1f2328;
- --vp-custom-block-info-code-bg: #eaeef2;
-
- --vp-custom-block-note-bg: #ddf4ff;
- --vp-custom-block-note-border: #54aeff;
- --vp-custom-block-note-text: #0550ae;
-
- --vp-custom-block-warning-bg: #fff8c5;
- --vp-custom-block-warning-border: #d4a72c;
- --vp-custom-block-warning-text: #633c01;
- --vp-custom-block-warning-code-bg: rgba(212, 167, 44, 0.15);
-
- --vp-custom-block-danger-bg: #ffebe9;
- --vp-custom-block-danger-border: #ff8182;
- --vp-custom-block-danger-text: #82071e;
- --vp-custom-block-danger-code-bg: rgba(255, 129, 130, 0.15);
-
- --vp-custom-block-details-bg: #f6f8fa;
- --vp-custom-block-details-border: #d0d7de;
- --vp-custom-block-details-text: #1f2328;
-
- /* Code */
- --vp-code-bg: #f6f8fa;
- --vp-code-color: #1f2328;
- --vp-code-line-highlight-color: rgba(9, 105, 218, 0.06);
-}
-
-/* ============================================================
- Dark Mode — GitHub dark palette (#0d1117 canvas)
- ============================================================ */
-.dark {
- /* Brand */
- --vp-c-brand-1: #58a6ff;
- --vp-c-brand-2: #79c0ff;
- --vp-c-brand-3: #cae8ff;
- --vp-c-brand-soft: rgba(88, 166, 255, 0.12);
-
- /* Text */
- --vp-c-text-1: #e6edf3;
- --vp-c-text-2: #848d97;
- --vp-c-text-3: #6e7681;
-
- /* Background */
- --vp-c-bg: #0d1117;
- --vp-c-bg-soft: #161b22;
- --vp-c-bg-alt: #161b22;
- --vp-c-bg-elv: #1c2128;
-
- /* Borders */
- --vp-c-border: #30363d;
- --vp-c-divider: #21262d;
- --vp-c-gutter: #21262d;
-
- /* Hero buttons */
- --vp-button-brand-bg: #238636;
- --vp-button-brand-hover-bg: #2ea043;
- --vp-button-brand-active-bg: #238636;
- --vp-button-brand-border: rgba(240, 246, 252, 0.1);
- --vp-button-brand-shadow: 0 0 0 0;
- --vp-button-brand-text: #ffffff;
- --vp-button-brand-hover-text: #ffffff;
-
- --vp-button-alt-border: #30363d;
- --vp-button-alt-bg: #21262d;
- --vp-button-alt-hover-bg: #30363d;
- --vp-button-alt-text: #c9d1d9;
- --vp-button-alt-hover-text: #e6edf3;
-
- /* Custom blocks */
- --vp-custom-block-tip-bg: rgba(31, 111, 235, 0.1);
- --vp-custom-block-tip-border: #1f6feb;
- --vp-custom-block-tip-text: #58a6ff;
-
- --vp-custom-block-info-bg: rgba(22, 27, 34, 0.8);
- --vp-custom-block-info-border: #30363d;
- --vp-custom-block-info-text: #e6edf3;
-
- --vp-custom-block-warning-bg: rgba(187, 128, 9, 0.1);
- --vp-custom-block-warning-border: #9e6a03;
- --vp-custom-block-warning-text: #e3b341;
- --vp-custom-block-warning-code-bg: rgba(187, 128, 9, 0.2);
-
- --vp-custom-block-danger-bg: rgba(248, 81, 73, 0.1);
- --vp-custom-block-danger-border: #da3633;
- --vp-custom-block-danger-text: #f85149;
- --vp-custom-block-danger-code-bg: rgba(248, 81, 73, 0.2);
-
- --vp-custom-block-details-bg: #161b22;
- --vp-custom-block-details-border: #30363d;
- --vp-custom-block-details-text: #e6edf3;
-
- /* Code */
- --vp-code-bg: #161b22;
- --vp-code-color: #e6edf3;
-}
-
-/* ============================================================
- Navigation
- ============================================================ */
-.VPNavBar {
- background-color: var(--vp-c-bg) !important;
- border-bottom: 1px solid var(--vp-c-border) !important;
- box-shadow: none !important;
+ --mono-black: #000;
+ --mono-white: #fff;
+ --mono-gray-100: #f5f5f5;
+ --mono-gray-200: #e5e5e5;
+ --mono-gray-300: #d4d4d4;
+ --mono-gray-400: #a3a3a3;
+ --mono-gray-500: #737373;
+ --mono-ok: #52c41a;
+ --mono-err: #fe4c61;
+ --mono-warn: #ffa900;
+ --mono-cjk-serif: 'Noto Serif CJK SC', 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', 'STSong', 'SimSun', serif;
+
+ --vp-font-family-base: 'Source Serif 4', 'Source Serif Pro', Georgia, var(--mono-cjk-serif);
+ --vp-font-family-mono: 'JetBrains Mono', Consolas, 'Courier New', monospace;
+ --mono-font-heading: 'Playfair Display', Georgia, var(--mono-cjk-serif);
}
-.VPNav .divider {
- display: none !important;
+.dark {
+ --mono-black: #e5e5e5;
+ --mono-white: #1a1a1a;
+ --mono-gray-100: #222;
+ --mono-gray-200: #2a2a2a;
+ --mono-gray-300: #404040;
+ --mono-gray-400: #737373;
+ --mono-gray-500: #a3a3a3;
}
-/* ============================================================
- Sidebar
- ============================================================ */
-.VPSidebar {
- background-color: var(--vp-c-bg-soft) !important;
- border-right: 1px solid var(--vp-c-border) !important;
+:root,
+.dark {
+ --vp-c-brand-1: var(--mono-black);
+ --vp-c-brand-2: var(--mono-gray-500);
+ --vp-c-brand-3: var(--mono-black);
+ --vp-c-brand-soft: var(--mono-gray-100);
+
+ --vp-c-text-1: var(--mono-black);
+ --vp-c-text-2: var(--mono-gray-500);
+ --vp-c-text-3: var(--mono-gray-400);
+
+ --vp-c-bg: var(--mono-white);
+ --vp-c-bg-soft: var(--mono-gray-100);
+ --vp-c-bg-alt: var(--mono-white);
+ --vp-c-bg-elv: var(--mono-white);
+
+ --vp-c-border: var(--mono-black);
+ --vp-c-divider: var(--mono-gray-200);
+ --vp-c-gutter: var(--mono-gray-200);
+
+ --vp-button-brand-bg: var(--mono-black);
+ --vp-button-brand-hover-bg: var(--mono-white);
+ --vp-button-brand-active-bg: var(--mono-white);
+ --vp-button-brand-border: var(--mono-black);
+ --vp-button-brand-hover-border: var(--mono-black);
+ --vp-button-brand-active-border: var(--mono-black);
+ --vp-button-brand-text: var(--mono-white);
+ --vp-button-brand-hover-text: var(--mono-black);
+ --vp-button-brand-active-text: var(--mono-black);
+
+ --vp-button-alt-bg: var(--mono-white);
+ --vp-button-alt-hover-bg: var(--mono-black);
+ --vp-button-alt-active-bg: var(--mono-black);
+ --vp-button-alt-border: var(--mono-black);
+ --vp-button-alt-hover-border: var(--mono-black);
+ --vp-button-alt-text: var(--mono-black);
+ --vp-button-alt-hover-text: var(--mono-white);
+ --vp-button-alt-active-text: var(--mono-white);
+
+ --vp-code-bg: var(--mono-gray-100);
+ --vp-code-color: var(--mono-black);
+ --vp-code-block-bg: var(--mono-gray-100);
+ --vp-code-line-highlight-color: var(--mono-gray-200);
+
+ --vp-custom-block-tip-bg: var(--mono-white);
+ --vp-custom-block-tip-border: var(--mono-black);
+ --vp-custom-block-tip-text: var(--mono-black);
+ --vp-custom-block-tip-code-bg: var(--mono-gray-100);
+ --vp-custom-block-info-bg: var(--mono-white);
+ --vp-custom-block-info-border: var(--mono-gray-400);
+ --vp-custom-block-info-text: var(--mono-black);
+ --vp-custom-block-info-code-bg: var(--mono-gray-100);
+ --vp-custom-block-warning-bg: var(--mono-white);
+ --vp-custom-block-warning-border: var(--mono-warn);
+ --vp-custom-block-warning-text: var(--mono-black);
+ --vp-custom-block-warning-code-bg: var(--mono-gray-100);
+ --vp-custom-block-danger-bg: var(--mono-white);
+ --vp-custom-block-danger-border: var(--mono-err);
+ --vp-custom-block-danger-text: var(--mono-black);
+ --vp-custom-block-danger-code-bg: var(--mono-gray-100);
+ --vp-custom-block-details-bg: var(--mono-gray-100);
+ --vp-custom-block-details-border: var(--mono-gray-300);
+ --vp-custom-block-details-text: var(--mono-black);
+
+ --vp-home-hero-name-color: var(--mono-black);
+ --vp-local-search-bg: var(--mono-white);
+ --vp-local-search-result-bg: var(--mono-white);
+ --vp-local-search-highlight-bg: var(--mono-black);
+ --vp-local-search-highlight-text: var(--mono-white);
+}
+
+/* 直角、无阴影 */
+*,
+*::before,
+*::after {
+ border-radius: 0 !important;
box-shadow: none !important;
}
-.VPSidebarItem.level-0 > .item > .text {
- font-weight: 600;
- color: var(--vp-c-text-1);
- font-size: 0.8rem;
- text-transform: uppercase;
- letter-spacing: 0.04em;
-}
-
-.VPSidebarItem.is-active > .item > .link > .text {
- color: var(--vp-c-brand-1);
- font-weight: 500;
-}
-
-/* ============================================================
- Content — GitHub Markdown rendering
- ============================================================ */
-
-/* H1 & H2 get bottom borders like GitHub */
+/* 标题用 Playfair Display */
.vp-doc h1,
-.vp-doc h2 {
- padding-bottom: 0.4em;
- border-bottom: 1px solid var(--vp-c-border);
- font-weight: 600;
+.vp-doc h2,
+.vp-doc h3,
+.vp-doc h4,
+.VPHero .name,
+.VPHero .text,
+.VPFeature .title,
+.VPNavBarTitle .title {
+ font-family: var(--mono-font-heading);
+ font-weight: 700;
+ letter-spacing: 0;
}
.vp-doc h1 {
- font-size: 2em;
- margin-top: 0;
+ font-size: 2.25rem;
+ line-height: 1.25;
}
-.vp-doc h3 {
- font-size: 1.1em;
- font-weight: 600;
+.vp-doc h2 {
+ border-top: none;
+ border-bottom: 2px solid var(--mono-black);
+ padding-top: 0;
+ padding-bottom: 0.3em;
+ margin-top: 2.5em;
}
-/* Links */
+/* 链接:黑字 + 灰色下划线,悬停变黑 */
.vp-doc a {
- color: var(--vp-c-brand-1);
- font-weight: 450;
+ color: var(--mono-black);
+ font-weight: 500;
text-decoration: none;
+ border-bottom: 1px solid var(--mono-gray-400);
+ transition: border-color 100ms ease;
}
.vp-doc a:hover {
- text-decoration: underline;
+ color: var(--mono-black);
+ border-bottom-color: var(--mono-black);
}
-/* Inline code */
-.vp-doc :not(pre, h1, h2, h3, h4, h5, h6) > code {
- background-color: var(--vp-c-bg-soft);
- border: 1px solid var(--vp-c-border);
- border-radius: 6px;
- padding: 0.2em 0.4em;
- font-size: 85%;
- color: var(--vp-c-text-1);
- font-family: var(--vp-font-family-mono);
+.vp-doc a.header-anchor {
+ border-bottom: none;
}
-/* Code blocks */
-.vp-doc div[class*='language-'] {
- border: 1px solid var(--vp-c-border) !important;
- border-radius: 6px !important;
- background-color: var(--vp-code-bg) !important;
+/* 导航栏与侧边栏 */
+.VPNavBar,
+.VPNavBar.has-sidebar .content-body,
+.VPNavBar:not(.home) .divider-line {
+ background-color: var(--mono-white) !important;
}
-.vp-doc div[class*='language-'] > button.copy {
- border-radius: 6px;
- border: 1px solid var(--vp-c-border);
- background: var(--vp-c-bg);
+.VPNavBar {
+ border-bottom: 2px solid var(--mono-black);
}
-/* Tables */
-.vp-doc table {
- border-collapse: collapse;
- width: 100%;
- font-size: 0.95em;
+.VPNavBar .divider {
+ display: none;
}
-.vp-doc thead th {
- background-color: var(--vp-c-bg-soft);
- font-weight: 600;
- text-align: left;
+.VPNavBarTitle .logo {
+ width: auto;
+ height: 28px;
}
-.vp-doc tr:nth-child(2n) {
- background-color: var(--vp-c-bg-soft);
+.VPSidebar {
+ border-right: 1px solid var(--mono-gray-200);
}
-.vp-doc th,
-.vp-doc td {
- border: 1px solid var(--vp-c-border);
- padding: 6px 13px;
+.VPSidebarItem.level-0 > .item > .text {
+ font-family: var(--vp-font-family-mono);
+ font-size: 0.75rem;
+ font-weight: 500;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--mono-gray-500);
}
-/* Blockquotes */
-.vp-doc blockquote {
- border-left: 4px solid var(--vp-c-border);
- color: var(--vp-c-text-2);
- background: transparent;
- padding: 0 1em;
- margin: 1em 0;
- border-radius: 0;
+.VPSidebarItem.is-active > .item > .link > .text {
+ color: var(--mono-black);
+ font-weight: 700;
}
-.vp-doc blockquote > p {
- color: var(--vp-c-text-2);
+.VPSidebarItem.is-active > .item .indicator {
+ background-color: var(--mono-black);
}
-/* HR */
-.vp-doc hr {
- border-color: var(--vp-c-border);
- margin: 24px 0;
+/* 行内代码与代码块 */
+.vp-doc :not(pre, h1, h2, h3, h4, h5, h6) > code {
+ color: var(--mono-black);
+ background-color: var(--mono-gray-100);
+ font-size: 0.875em;
}
-/* ============================================================
- Custom Blocks — GitHub alert style
- ============================================================ */
-.custom-block {
- border-radius: 6px;
- border: 1px solid;
- padding: 12px 16px;
- font-size: 0.95em;
+.vp-doc div[class*='language-'] {
+ border: 1px solid var(--mono-gray-300);
}
-.custom-block.tip {
- background-color: var(--vp-custom-block-tip-bg);
- border-color: var(--vp-custom-block-tip-border);
- color: var(--vp-custom-block-tip-text);
+/* 表格 */
+.vp-doc table {
+ display: table;
+ width: 100%;
+ border-collapse: collapse;
}
-.custom-block.info {
- background-color: var(--vp-custom-block-info-bg);
- border-color: var(--vp-custom-block-info-border);
- color: var(--vp-custom-block-info-text);
+.vp-doc tr {
+ background-color: transparent !important;
+ border-top: none;
}
-.custom-block.warning {
- background-color: var(--vp-custom-block-warning-bg);
- border-color: var(--vp-custom-block-warning-border);
- color: var(--vp-custom-block-warning-text);
+.vp-doc th {
+ background-color: var(--mono-black);
+ color: var(--mono-white);
+ font-weight: 600;
+ text-align: left;
}
-.custom-block.danger {
- background-color: var(--vp-custom-block-danger-bg);
- border-color: var(--vp-custom-block-danger-border);
- color: var(--vp-custom-block-danger-text);
+.vp-doc th,
+.vp-doc td {
+ border: 1px solid var(--mono-gray-300);
}
-.custom-block.details {
- background-color: var(--vp-custom-block-details-bg);
- border-color: var(--vp-custom-block-details-border);
- color: var(--vp-custom-block-details-text);
+.vp-doc th {
+ border-color: var(--mono-black);
}
-.custom-block-title {
- font-weight: 600;
- margin-bottom: 4px;
+.vp-doc tbody tr:hover {
+ background-color: var(--mono-gray-100) !important;
}
-/* ============================================================
- Home Page — Feature cards
- ============================================================ */
-.VPHome .VPFeatures .VPFeature {
- border: 1px solid var(--vp-c-border) !important;
- border-radius: 6px !important;
- background-color: var(--vp-c-bg) !important;
- transition: border-color 0.15s ease, box-shadow 0.15s ease !important;
+/* 提示块:白底 + 左边框,和官网的 alert-mono 一样 */
+.custom-block {
+ border-width: 0 0 0 4px;
+ border-style: solid;
+ padding: 12px 16px;
}
-.VPHome .VPFeatures .VPFeature:hover {
- border-color: var(--vp-c-brand-1) !important;
- box-shadow: 0 0 0 3px var(--vp-c-brand-soft) !important;
- text-decoration: none !important;
+.custom-block.details {
+ border-width: 1px;
}
-.VPHome .VPFeatures .VPFeature .title {
- font-size: 1rem;
- font-weight: 600;
- color: var(--vp-c-text-1);
+.custom-block .custom-block-title {
+ font-family: var(--vp-font-family-mono);
+ font-size: 0.8rem;
+ letter-spacing: 0.06em;
}
-.VPHome .VPFeatures .VPFeature .details {
- font-size: 0.9rem;
- color: var(--vp-c-text-2);
+/* kbd */
+kbd {
+ display: inline-block;
+ padding: 1px 6px;
+ font-family: var(--vp-font-family-mono);
+ font-size: 0.8em;
+ line-height: 1.5;
+ color: var(--mono-white);
+ background-color: var(--mono-black);
+ white-space: nowrap;
}
-/* Hero */
+/* 首页 */
.VPHero .name {
- background: none !important;
- -webkit-text-fill-color: var(--vp-c-text-1) !important;
- font-weight: 700;
+ font-size: 3.5rem;
+ line-height: 1.1;
}
.VPHero .text {
- color: var(--vp-c-text-2) !important;
- font-size: 1.6rem !important;
- font-weight: 400 !important;
+ color: var(--mono-black);
}
.VPHero .tagline {
- color: var(--vp-c-text-2) !important;
- font-size: 1.05rem !important;
+ color: var(--mono-gray-500);
}
-/* Round the hero image used on index.md (demo.png) */
-.VPHero img[src="/demo.png"],
-.VPHero .hero img {
- border-radius: 12px;
- overflow: hidden;
- display: block;
- max-width: 100%;
- object-fit: cover;
- border: 1px solid var(--vp-c-border);
-}
-
-/* ============================================================
- Badges (inline pill labels in content)
- ============================================================ */
-.gh-badge {
- display: inline-block;
- padding: 0.12em 0.55em;
- font-size: 0.75rem;
- font-weight: 500;
- line-height: 1.5;
- border-radius: 2em;
- border: 1px solid var(--vp-c-border);
- background-color: var(--vp-c-bg-soft);
- color: var(--vp-c-text-2);
- vertical-align: middle;
- font-family: var(--vp-font-family-base);
+.VPHero .image-container img,
+.VPHero .VPImage.image-src {
+ border: 2px solid var(--mono-black);
}
-.gh-badge.green {
- background-color: #dafbe1;
- border-color: rgba(26, 127, 55, 0.4);
- color: #116329;
+.VPHero .image-bg {
+ display: none;
}
-.gh-badge.blue {
- background-color: #ddf4ff;
- border-color: rgba(9, 105, 218, 0.4);
- color: #0550ae;
+.VPFeature {
+ border: 1px solid var(--mono-black) !important;
+ background-color: var(--mono-white) !important;
+ transition: background-color 100ms ease;
}
-.gh-badge.yellow {
- background-color: #fff8c5;
- border-color: rgba(154, 103, 0, 0.4);
- color: #6e4500;
+.VPFeature.link:hover {
+ background-color: var(--mono-gray-100) !important;
}
-.dark .gh-badge.green {
- background-color: rgba(46, 160, 67, 0.15);
- border-color: rgba(46, 160, 67, 0.4);
- color: #3fb950;
+.VPFeature .details {
+ color: var(--mono-gray-500);
}
-.dark .gh-badge.blue {
- background-color: rgba(31, 111, 235, 0.15);
- border-color: rgba(31, 111, 235, 0.4);
- color: #58a6ff;
+.VPFeature .link-text-value {
+ color: var(--mono-black);
+ font-family: var(--vp-font-family-mono);
+ font-size: 0.8rem;
}
-.dark .gh-badge.yellow {
- background-color: rgba(187, 128, 9, 0.15);
- border-color: rgba(187, 128, 9, 0.4);
- color: #e3b341;
+/* 按钮 */
+.VPButton {
+ font-family: var(--vp-font-family-mono);
+ font-weight: 500;
+ border-width: 2px;
+ transition: background-color 100ms ease, color 100ms ease;
}
-/* ============================================================
- Announcement bar / top banner
- ============================================================ */
-.VPLocalSearchBox {
- border-radius: 6px !important;
+/* 文档里的按钮链接(安装页用) */
+.vp-doc a.mono-btn {
+ display: inline-block;
+ padding: 8px 20px;
+ margin: 4px 12px 4px 0;
+ font-family: var(--vp-font-family-mono);
+ font-weight: 500;
+ border: 2px solid var(--mono-black);
+ background-color: var(--mono-black);
+ color: var(--mono-white);
+ transition: background-color 100ms ease, color 100ms ease;
}
-/* ============================================================
- Footer
- ============================================================ */
-.VPFooter {
- border-top: 1px solid var(--vp-c-border) !important;
- background-color: var(--vp-c-bg-soft) !important;
+.vp-doc a.mono-btn:hover {
+ background-color: var(--mono-white);
+ color: var(--mono-black);
}
-/* ============================================================
- Scrollbar (subtle, GitHub-like)
- ============================================================ */
-::-webkit-scrollbar {
- width: 8px;
- height: 8px;
+.vp-doc a.mono-btn.alt {
+ background-color: var(--mono-white);
+ color: var(--mono-black);
}
-::-webkit-scrollbar-track {
- background: transparent;
+.vp-doc a.mono-btn.alt:hover {
+ background-color: var(--mono-black);
+ color: var(--mono-white);
}
-::-webkit-scrollbar-thumb {
- background-color: var(--vp-c-border);
- border-radius: 4px;
+/* 评分颜色示例 */
+.rating {
+ font-weight: 700;
}
-::-webkit-scrollbar-thumb:hover {
- background-color: var(--vp-c-text-3);
-}
+.rating.red { color: #dc3545; }
+.rating.yellow { color: #b38600; }
+.rating.green { color: #198754; }
+.rating.blue { color: #0aa2c0; }
-/* ============================================================
- Keyboard shortcuts
- ============================================================ */
-kbd {
- display: inline-block;
- padding: 3px 6px;
- font-size: 0.8em;
- font-family: var(--vp-font-family-mono);
- line-height: 1.4;
- color: var(--vp-c-text-1);
- background-color: var(--vp-c-bg-soft);
- border: 1px solid var(--vp-c-border);
- border-bottom-color: var(--vp-c-text-3);
- border-radius: 6px;
- box-shadow: inset 0 -1px 0 var(--vp-c-text-3);
- white-space: nowrap;
-}
+.dark .rating.yellow { color: #ffc107; }
+.dark .rating.green { color: #75b798; }
+.dark .rating.blue { color: #6edff6; }
-/* ============================================================
- Outline / TOC
- ============================================================ */
-.VPDocOutlineItem a.outline-link {
- color: var(--vp-c-text-2);
- font-size: 0.85em;
+/* 页脚与大纲 */
+.VPFooter {
+ border-top: 2px solid var(--mono-black) !important;
+ background-color: var(--mono-white) !important;
}
.VPDocOutlineItem a.outline-link:hover,
.VPDocOutlineItem a.outline-link.active {
- color: var(--vp-c-brand-1);
-}
-
-/* ============================================================
- Edit link & last-updated
- ============================================================ */
-.edit-link-button {
- color: var(--vp-c-brand-1) !important;
+ color: var(--mono-black);
+ font-weight: 600;
}
-/* ============================================================
- Step list — numbered steps styled like GitHub docs
- ============================================================ */
-.vp-doc ol > li {
- margin-bottom: 0.5em;
+.VPDocAsideOutline .outline-marker {
+ background-color: var(--mono-black);
}
-.vp-doc ol > li::marker {
- color: var(--vp-c-text-2);
- font-weight: 600;
+.vp-doc img {
+ border: 1px solid var(--mono-gray-300);
}
diff --git a/apps/elxmoj.md b/apps/elxmoj.md
index fd96b3e..c1a5b4b 100644
--- a/apps/elxmoj.md
+++ b/apps/elxmoj.md
@@ -1,107 +1,49 @@
-# ELXMOJ — 桌面客户端
+# ELXMOJ 桌面客户端
-**ELXMOJ** 是基于 [Electron](https://www.electronjs.org/) 构建的小明的OJ桌面客户端。它在原生应用窗口中打开 `www.xmoj.tech`,并**自动注入 XMOJ-Script 用户脚本**,让您无需安装浏览器扩展即可享受脚本的全部增强功能。
+ELXMOJ 是一个桌面应用。它在自己的窗口里打开小明的OJ,并且已经内置了 XMOJ-Script,不用装浏览器扩展,也不用打开「允许用户脚本」。
-- 官网:[https://elxmoj.xmoj-script.uk](https://elxmoj.xmoj-script.uk)
-- GitHub:[XMOJ-Script-dev/ELXMOJ](https://github.com/XMOJ-Script-dev/ELXMOJ)
+- 官网:[elxmoj.xmoj-script.uk](https://elxmoj.xmoj-script.uk)
+- 源代码:[XMOJ-Script-dev/ELXMOJ](https://github.com/XMOJ-Script-dev/ELXMOJ)
-## 主要功能
+## 下载
-| 功能 | 说明 |
-|------|------|
-| 🖥️ 原生桌面体验 | 独立窗口,无需打开浏览器 |
-| 💉 自动注入脚本 | 启动时自动注入 `XMOJ.user.js`,无需 Tampermonkey |
-| 🔄 脚本更新检测 | 每次启动可自动检查脚本是否有新版本 |
-| ⚙️ 设置持久化 | 更新通道、启动行为等设置持久保存 |
-| 🔍 启动自检 | 内置自检功能,快速排查运行问题 |
-| 🌐 多平台支持 | 支持 Windows、macOS、Linux |
-
-## 下载安装
+到 [GitHub Releases](https://github.com/XMOJ-Script-dev/ELXMOJ/releases/latest) 下载对应系统的文件:
-前往 [GitHub Releases](https://github.com/XMOJ-Script-dev/ELXMOJ/releases/latest) 下载最新版本,或直接点击下方对应平台的链接:
+| 系统 | 文件 |
+|------|------|
+| Windows | `ELXMOJ-…-win-x64.exe` |
+| macOS(Apple 芯片) | `ELXMOJ-…-mac-arm64.dmg` |
+| Linux | `ELXMOJ-…-linux-x86_64.AppImage`,或 `.tar.gz` |
### Windows
-| 安装包类型 | 下载链接 |
-|-----------|---------|
-| 安装程序(推荐) | [GitHub Releases →](https://github.com/XMOJ-Script-dev/ELXMOJ/releases/latest) |
-
-下载后双击 `.exe` 文件,按照安装向导完成安装(支持自定义安装目录)。
-
-::: tip Windows 安全提示
-首次运行时,Windows SmartScreen 可能弹出警告"Windows 已保护你的电脑"。点击"**更多信息**" → "**仍要运行**"即可继续安装。这是因为应用尚未进行微软代码签名,不影响安全性。
-:::
+双击 `.exe` 安装。如果弹出「Windows 已保护你的电脑」,点「更多信息」→「仍要运行」。应用没有买微软的代码签名,所以会有这个提示。
### macOS
-| 安装包类型 | 适用架构 |
-|-----------|---------|
-| DMG 镜像 / ZIP 压缩包 | Apple Silicon (M1/M2/M3) |
-
-前往 [GitHub Releases](https://github.com/XMOJ-Script-dev/ELXMOJ/releases/latest) 下载对应文件。打开 `.dmg` 文件,将 `ELXMOJ.app` 拖入"应用程序"文件夹。
+打开 `.dmg`,把 ELXMOJ 拖进「应用程序」。第一次打开如果提示无法验证开发者,到「系统设置 → 隐私与安全性」里点「仍要打开」。
-::: tip macOS 安全提示
-首次打开时,macOS Gatekeeper 可能提示"无法验证开发者"。请前往**系统设置 → 隐私与安全性**,点击"**仍要打开**"授权运行。
-:::
+目前只有 Apple 芯片(M 系列)的版本。
### Linux
-| 安装包类型 | 说明 |
-|-----------|------|
-| AppImage(推荐) | 单文件,无需安装,赋予执行权限后直接运行 |
-| tar.gz 压缩包 | 手动解压后运行 |
-
-前往 [GitHub Releases](https://github.com/XMOJ-Script-dev/ELXMOJ/releases/latest) 下载对应文件。使用 AppImage 时需先赋予执行权限:
-
```bash
chmod +x ELXMOJ-*-linux-x86_64.AppImage
./ELXMOJ-*-linux-x86_64.AppImage
```
-## 应用设置
-
-打开设置窗口:菜单栏 **ELXMOJ → 设置**
-
-### 更新通道
-
-| 通道 | 脚本来源 | 适用场景 |
-|------|---------|---------|
-| **正式版**(默认) | `https://xmoj-script.uk/XMOJ.user.js` | 日常使用,稳定版本 |
-| **预览版** | `https://dev.xmoj-script.uk/XMOJ.user.js` | 体验新功能,可能不稳定 |
-
-### 启动行为
-
-- **启动时检查脚本更新**:每次启动 ELXMOJ 时自动联网检查脚本是否有新版本,发现新版本时弹窗提示
-- **自动注入 userscript**:启动后自动将 `XMOJ.user.js` 注入到页面,关闭此选项则以普通浏览器模式打开 XMOJ
-
-### 工具
-
-| 操作 | 说明 |
-|------|------|
-| 立即检查更新 | 手动触发脚本版本检查 |
-| 执行自检 | 检查应用运行环境,输出诊断信息 |
-| 下载最新 App | 获取 ELXMOJ 应用本身的最新版下载链接 |
-
-## 菜单栏功能
-
-ELXMOJ 在系统菜单栏中提供以下入口(位于 **ELXMOJ** 菜单):
-
-- **设置** — 打开设置窗口
-- **执行自检** — 运行启动自检
-- **检查脚本更新** — 手动检查脚本是否有新版本
-
-## 常见问题
-
-**Q:ELXMOJ 和直接在浏览器中使用脚本有什么区别?**
+## 设置
-ELXMOJ 是独立应用,无需安装 Tampermonkey,启动即用,适合不想在浏览器里安装扩展的用户。同时,ELXMOJ 作为专属客户端,未来可支持更多桌面端专属功能(如系统通知等)。
+菜单栏里选 **ELXMOJ → 设置**。
-**Q:ELXMOJ 中的脚本版本和 Tampermonkey 中的版本一致吗?**
+- **更新通道**:正式版,或者预览版(新功能先上,可能不稳定)。和浏览器里装的是同一个脚本。
+- **启动时检查脚本更新**:有新版本时提示你。
+- **自动注入脚本**:关掉的话,ELXMOJ 就是一个普通的浏览器窗口。
-是的,两者使用相同的 `XMOJ.user.js` 脚本文件,功能完全相同。ELXMOJ 从官网或预览版服务器获取更新。
+设置里还有「执行自检」,出问题时可以先跑一下看看诊断信息。
-**Q:启动后白屏或无法加载页面怎么办?**
+## 打不开或者白屏?
-1. 检查网络连接是否正常,确认可以访问 `www.xmoj.tech`
-2. 打开**设置 → 执行自检**,查看诊断输出
-3. 如问题持续,可在 [GitHub Issues](https://github.com/XMOJ-Script-dev/ELXMOJ/issues) 中反馈
+1. 确认网络能打开 `www.xmoj.tech`。
+2. 在设置里点「执行自检」,看看输出。
+3. 还是不行,到 [ELXMOJ 的 Issues](https://github.com/XMOJ-Script-dev/ELXMOJ/issues) 反馈。
diff --git a/apps/messages.md b/apps/messages.md
index 5b501e0..3c424e4 100644
--- a/apps/messages.md
+++ b/apps/messages.md
@@ -1,89 +1,48 @@
# 短消息在线看
-**短消息在线看**是 XMOJ-Script 提供的一个独立网页应用,让您无需安装用户脚本,即可在任意浏览器(包括 **iOS Safari** 和移动端浏览器)中收发 XMOJ 站内短消息。
+不装脚本,也能在任何浏览器里收发小明的OJ的短消息,手机上也行。
-👉 访问地址:[https://xmoj-script.uk/messages.html](https://xmoj-script.uk/messages.html)
+打开:[www.xmoj-script.uk/messages.html](https://www.xmoj-script.uk/messages.html)
-## 功能特点
+能做的事:看联系人和对话、回复、给任何人发新消息、粘贴图片、搜索联系人,支持暗色模式。
-| 功能 | 说明 |
-|------|------|
-| 📱 跨平台 | 支持所有主流浏览器,包括 iOS Safari、Android 浏览器 |
-| 🔐 无需安装脚本 | 纯网页应用,不依赖 Tampermonkey |
-| 🔍 联系人搜索 | 实时搜索过滤联系人列表 |
-| ✉️ 发送新消息 | 向任意用户发起新对话 |
-| 💬 查看对话 | 以线程方式展示和收发消息 |
-| 🖼️ 图片支持 | 在消息中粘贴图片自动上传发送 |
-| 🏷️ 用户徽章 | 自动展示联系人的 Badge/Tag |
-| 🌙 深色模式 | 支持浅色/深色/跟随系统三种主题 |
-| ↕️ 自动滚动 | 查看对话时自动滚动到最新消息 |
+## 登录
-## 登录方式
+它需要你在小明的OJ上的登录凭证 `PHPSESSID`。有两种方式拿到。
-短消息在线看提供两种登录方式,请根据您所在的设备选择:
-
-### 方式一:书签登录(仅限桌面浏览器)
-
-适用于 **Chrome / Firefox / Edge** 等桌面浏览器。
-
-1. 访问 [https://xmoj-script.uk/messages.html](https://xmoj-script.uk/messages.html)
-2. 将页面上的"🔖 登录到短消息在线看"链接拖拽到浏览器书签栏
-3. 在浏览器中打开 [www.xmoj.tech](https://www.xmoj.tech) 并确保已登录
-4. 点击书签栏中的"🔖 登录到短消息在线看"书签
-5. 浏览器将自动跳转并完成登录
-
-::: tip 最简单的方式
-对于桌面用户,书签登录是最快捷的方式,无需手动查找 Cookie。
+::: warning PHPSESSID 就相当于你的密码
+拿到它的人可以用你的账号登录小明的OJ。不要发给任何人,也不要贴到讨论区或 GitHub 上。
:::
-### 方式二:会话登录(通用,支持移动端)
-
-需要手动获取 `PHPSESSID` Cookie,适用于**所有设备**(包括手机)。
-
-**在桌面浏览器上获取 PHPSESSID:**
-
-1. 在浏览器中打开 [www.xmoj.tech](https://www.xmoj.tech) 并登录
-2. 按 F12 打开开发者工具 → 切换到"Application"(Chrome/Edge)或"存储"(Firefox)标签
-3. 展开左侧"Cookies" → 找到 `www.xmoj.tech`
-4. 复制 `PHPSESSID` 的值
-
-**在 iOS Safari 上获取(需配合 Mac):**
-
-1. 在 iPhone/iPad 的 Safari 上打开并登录 [www.xmoj.tech](https://www.xmoj.tech)
-2. 在 Mac 上打开 Safari → 菜单栏"开发(Develop)" → 选择您的 iOS 设备 → 选择 xmoj.tech 页面
-3. 在 Web 检查器中找到并复制 `PHPSESSID`
-
-**填写登录信息:**
-
-1. 在短消息在线看的登录页,选择"**会话登录**"标签
-2. 输入您的 XMOJ 用户名和 `PHPSESSID`
-3. 点击"登录"
-
-## 使用说明
-
-### 查看消息
+### 书签登录(电脑)
-登录后,左侧(或顶部)显示联系人列表,点击联系人即可查看与该用户的完整对话记录。
+最省事的方法。
-### 搜索联系人
+1. 打开短消息在线看,切到「书签登录」。
+2. 把「登录到短消息在线看」按钮拖到书签栏。
+3. 打开 [www.xmoj.tech](https://www.xmoj.tech),确认已经登录。
+4. 点一下刚才的书签,会自动跳回来并登录。
-在联系人列表上方的搜索框中输入用户名,即可实时过滤联系人。
+### 会话登录(手机和电脑都行)
-### 发送消息
+手动复制 `PHPSESSID`,填到「会话登录」里,连同你的用户名一起提交。
-- **在对话中回复**:在对话底部的输入框中输入内容,点击"发送"或按 Ctrl+Enter
-- **发起新对话**:点击"发新消息"按钮,填写收件人用户名和消息内容
+**电脑上**:登录 [www.xmoj.tech](https://www.xmoj.tech),按 F12 打开开发者工具。Chrome 和 Edge 切到「应用」(Application),Firefox 切到「存储」,在 Cookie → `www.xmoj.tech` 里找到 `PHPSESSID`,复制它的值。
-### 发送图片
+**iPhone / iPad**:需要一台 Mac。在 iPhone 的 Safari 里登录小明的OJ,然后在 Mac 的 Safari 里选「开发」→ 你的设备 → xmoj.tech 页面,在网页检查器的「储存空间」里找到 `PHPSESSID`。
-在消息输入框中,按 Ctrl+V 粘贴图片,系统会自动上传并插入图片链接。
+页面上也有每种浏览器的详细步骤。
-### 切换主题
+## 用法
-点击右上角的主题切换按钮,可以在**浅色**、**深色**、**自动(跟随系统)** 三种模式间切换。
+- **看对话**:点左边的联系人。
+- **回复**:在底部输入,点「发送」。
+- **发新消息**:点「发新消息」,填收件人和内容。
+- **发图片**:在输入框里按 Ctrl+V。图片的注意事项见[粘贴发图](../features/image-hosting)。
+- **换主题**:点右上角的主题按钮。
-## 注意事项
+## 注意
-- `PHPSESSID` 是您的登录凭据,**请勿泄露给他人**
-- 该页面数据保存在浏览器本地存储中,清除浏览器数据会导致需要重新登录
-- 消息发送依赖 XMOJ 后端 API,网络异常时可能发送失败,请重试
+- 登录信息保存在你的浏览器里。清除浏览器数据后要重新登录。
+- 在小明的OJ上退出登录,`PHPSESSID` 就失效了,这里也要重新登录。
+- 短消息存在 XMOJ-Script 的服务器上,加密保存。详见[隐私说明](https://www.xmoj-script.uk/privacy.html)。
diff --git a/community/badges.md b/community/badges.md
index 0f357d5..3b031e1 100644
--- a/community/badges.md
+++ b/community/badges.md
@@ -1,46 +1,31 @@
-# 徽章 / Tag
+# 徽章
-
+
-**徽章(Badge / Tag)** 是显示在用户名旁的特殊标识,用于标记对社区有特殊贡献或特殊身份的用户。徽章具有自定义背景色、文字色和内容,由管理员手动颁发。
+徽章是用户名旁边的小标签,由管理员发给对社区有帮助的人。
-## 徽章显示位置
+## 在哪里显示
-徽章会在以下页面随用户名一同显示:
+- 讨论区的帖子和回复
+- 短消息
+- 比赛排名
+- 个人主页
-- 讨论区的帖子和回复作者名旁
-- 短消息的发件人 / 收件人旁
-- 用户个人资料页面
+## 怎么获得
-## 如何获得徽章?
+- 向 [XMOJ-Script](https://github.com/XMOJ-Script-dev/XMOJ-Script) 贡献代码,并且 PR 被合并
+- 在 [Open Collective](https://opencollective.com/xmoj-script-dev) 上赞助
+- 邀请别人来用 XMOJ-Script
+- 其他贡献,比如报告重要的 bug,由管理员决定
-目前可通过以下方式获得徽章:
+觉得自己该有但还没有的话,在讨论区找管理员 @zhuchenrui2。
-| 途径 | 说明 |
-|------|------|
-| 🤝 邀请新用户 | 成功邀请他人安装并使用 XMOJ-Script |
-| 💰 赞助项目 | 通过 [Open Collective](https://opencollective.com/xmoj-script-dev) 赞助开发 |
-| 🛠️ 贡献代码 | 向 [XMOJ-Script 仓库](https://github.com/XMOJ-Script-dev/XMOJ-Script) 提交被合并的 PR |
-| 🏆 特殊贡献 | 由管理员酌情颁发(如发现重大 Bug、提供宝贵建议等)|
+## 修改徽章
-如果您认为自己符合获得徽章的条件但尚未收到,可以在讨论区联系管理员 @zhuchenrui2。
+有徽章之后,打开小明的OJ的[修改个人信息](https://www.xmoj.tech/modify_user_info.php)页面,下面会有「标签编辑」,可以改文字、背景颜色和文字颜色。
-## 管理徽章展示
-
-获得徽章后,可在以下页面自行管理展示方式:
-
-**[https://www.xmoj.tech/modifypage.php](https://www.xmoj.tech/modifypage.php)**
-
-在该页面中,您可以:
-- 选择要展示哪些徽章
-- 调整多个徽章的显示顺序
-- 选择不显示任何徽章(完全隐藏)
+改文字时,内容会先经过自动审核(Cloudflare Workers AI),不合适的会被拒绝。只改颜色不需要审核。每小时能改的次数有限。
## 支持项目
-如果 XMOJ-Script 对您有帮助,欢迎通过以下方式支持我们的持续开发:
-
-👉 [在 Open Collective 上赞助 XMOJ-Script-dev](https://opencollective.com/xmoj-script-dev)
-
-赞助者将获得专属徽章,并在项目中留名。所有赞助收入用于服务器运营和开发维护。
-
+XMOJ-Script 是免费的业余项目。觉得好用的话,欢迎在 [Open Collective](https://opencollective.com/xmoj-script-dev) 上赞助,赞助的人会得到徽章。
diff --git a/community/contributing.md b/community/contributing.md
index a76280b..54df94f 100644
--- a/community/contributing.md
+++ b/community/contributing.md
@@ -1,74 +1,56 @@
-# 贡献指南
+# 贡献代码
-欢迎为 XMOJ-Script 贡献代码!在开始之前,请仔细阅读本页内容。我们是一个小团队,非常欢迎来自社区的高质量 PR。
+欢迎提 PR。我们人少、时间也少,下面这些规矩能帮我们更快地合并你的代码。
-## 分支说明
+## 先开 Issue
-| 分支 | 用途 | PR 目标 |
-|------|------|---------|
-| `master` | 稳定发布版 | ❌ 不接受外部 PR |
-| `dev` | 日常开发 | ❌ 不接受外部 PR |
-| `extern-contrib` | **外部贡献专用** | ✅ 外部开发者请提交到此分支 |
+做新功能之前,先[开一个 Issue](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose) 说说你的想法,等我们回复了再动手。修 bug 可以直接提 PR。
-::: warning 外部贡献者注意
-请务必将 Pull Request 提交到 **`extern-contrib`** 分支,直接向 `master` 或 `dev` 提交的 PR 将被关闭。
-:::
+我们的原则是**稳定比功能重要**:新功能不能让原来能用的东西坏掉。
-## 贡献流程
+## 往哪个分支提
-```text
-1. Fork XMOJ-Script-dev/XMOJ-Script
-2. 从 extern-contrib 分支新建功能分支
- git checkout -b feature/your-feature extern-contrib
-3. 编写代码并在本地测试
-4. 将最新的 extern-contrib 合并到你的分支,解决冲突
- git fetch origin && git merge origin/extern-contrib
-5. 提交 Pull Request → extern-contrib 分支
+| 分支 | 用途 |
+|------|------|
+| `master` | 正式版,不接受 PR |
+| `dev` | 开发分支,只接受项目成员的 PR |
+| `extern-contrib` | **外部贡献者请提到这里** |
+
+```bash
+git checkout -b my-fix origin/extern-contrib
+# 改代码、在浏览器里测试……
+git fetch origin && git merge origin/extern-contrib # 提 PR 前先合并最新代码
```
-## 代码规范
+提到 `master` 或 `dev` 的外部 PR 会被关掉。
-### 命名约定
+## 代码风格
-| 类型 | 风格 | 示例 |
+| 类型 | 写法 | 例子 |
|------|------|------|
-| 变量 | `camelCase` | `userId`, `submitCount` |
-| 函数 | `PascalCase` | `GetUserRating`, `SubmitCode` |
-| 类 | `TitleCase` | `RatingSystem`, `ImageUploader` |
-
-> 旧代码中可能存在不符合规范的命名,但**新代码必须严格遵循**上述约定。
+| 变量 | camelCase | `submitCount` |
+| 函数 | PascalCase | `GetUserRating` |
+| 类 | TitleCase | `NavbarStyler` |
-### 其他规范
+- **不要**跑格式化工具(Prettier 之类),会产生一大堆无关改动。老代码风格不统一,也请保持原样。
+- 用 Bootstrap 的类,少写自定义 CSS。
+- 换行符用 LF。
+- 加新的外部库之前先问我们。
+- 版本号由 CI 自动更新,不要手动改。
-- ❌ **不要**运行代码格式化工具(Prettier / clang-format 等),避免引入大量格式噪声
-- ❌ **不要**在未经核心开发者同意的情况下引入新的外部依赖库
-- ✅ 使用 **Bootstrap 5** 样式类,尽量避免编写自定义 CSS
-- ✅ 使用 **Unix 换行符**(LF,`\n`),不要使用 Windows CRLF
-- ✅ 提交 PR 前务必先将 `extern-contrib` 合并到你的分支并解决所有冲突
+## 报 bug
-## 新功能开发
+到 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 反馈,写清楚:
-在动手写代码前,请先 [开一个 Issue](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose) 描述你的想法,等待核心开发者讨论并认可后再开始实现。
+- 发生了什么,你本来想要什么
+- 怎么复现
+- 浏览器和版本,比如 Chrome 140
+- 脚本管理器和版本
+- XMOJ-Script 版本(在 Tampermonkey 控制面板里能看到)
+- 按 F12 打开控制台,有报错的话截图
-**核心原则:稳定 > 功能。** 新功能不能引入回归,不能降低脚本在主流浏览器上的兼容性。
+GitHub Issues 是公开的,不要贴密码、Cookie 或 `PHPSESSID`。
## 行为准则
-- 请**尊重**每一位开发者和社区成员
-- 请**耐心**等待 PR 审核,我们是业余项目,响应时间不固定
-- 请**理解**我们的决定,PR 被拒绝并不代表贡献不被珍视
-- 请遵守 [Code of Conduct](https://github.com/XMOJ-Script-dev/XMOJ-Script/blob/master/CODE_OF_CONDUCT.md)
-
-## 提交 Bug 或建议
-
-发现 Bug 或有功能建议,欢迎在 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 中反馈。
-
-提交 Bug 时请提供:
-
-- [ ] 问题的详细描述(实际行为 vs 预期行为)
-- [ ] 可复现的最小步骤
-- [ ] 浏览器名称与版本(如 Chrome 124)
-- [ ] Tampermonkey 版本
-- [ ] XMOJ-Script 版本(控制面板中可查看)
-- [ ] 浏览器开发者工具 Console 截图(如有报错)
-
+互相尊重,耐心等 review。我们是业余项目,回复可能慢。PR 没被合并不代表你的贡献不重要。详见 [Code of Conduct](https://github.com/XMOJ-Script-dev/XMOJ-Script/blob/master/CODE_OF_CONDUCT.md)。
diff --git a/features/auto-handin.md b/features/auto-handin.md
index 855f776..f7d5098 100644
--- a/features/auto-handin.md
+++ b/features/auto-handin.md
@@ -1,52 +1,30 @@
# 自动提交当年代码
-## 功能介绍
+在比赛里,把你自己以前 AC 过的代码一次性提交到这场比赛。
-「自动提交当年代码」功能允许您在竞赛 / 作业中,一键将曾经 AC 过的题目代码**批量重新提交**。适用于每年需要重新提交当年代码的考核场景,省去逐题手动查找和提交的麻烦。
+::: danger 用之前先看这里
+- **一眼就能看出来。** 交上去的代码和你以前的提交一模一样,而且每道题只隔一秒左右。看提交记录或排名的人都能看出这是批量提交的。
+- **没有停止按钮。** 想停下只能离开这个页面,正在交的那道题还是会交上去。
+- **不保证通过。** 题目的数据、时限或内存限制可能改过,以前 AC 的代码现在不一定还能过。
-## 使用方法
-
-1. 登录后点击右上角**用户名** →「**插件设置**」
-2. 找到「**自动提交当年代码**」开关,将其**开启**并保存
-3. 前往「**竞赛 & 作业**」,进入目标比赛的题目列表页
-4. 页面上方将出现「**自动提交当年代码**」按钮
-5. 确认后点击按钮,脚本将自动遍历各题的历史提交,找到曾经 AC 的代码并重新提交
-
-::: danger 操作前请仔细阅读
-点击按钮后,操作将**立即开始执行**且**无法中途取消**(当前版本限制)。请在完全了解后果后再使用。
+XMOJ-Script 不对提交结果负责。
:::
-## 结果标记说明
+## 它做了什么
-由于批量重新提交具有明显特征,约有 **90%** 的概率被系统自动标记:
+对比赛里你还没 AC 的每一道题,脚本会找你自己在这道题上最近一次 AC 的代码,原样提交到这场比赛(C++,开 O2)。只会用你自己的代码;以前没 AC 过的题会跳过。
-| 标记类型 | 含义 |
-|---------|------|
-| 🟡 **疑似提交当年代码** | 系统检测到该提交的代码与往年 AC 代码高度相似 |
+每道题之间会等一秒。某一道交失败了(比如需要填验证码),就会停下,并在按钮上显示原因。
-带有此标记的提交在排行榜和提交记录中会有黄色警告显示。**请在清楚了解此后果的情况下再使用本功能。**
+## 怎么用
-## 注意事项
-
-- **不保证 AC**:题目数据、时间限制或内存限制可能已变更,重新提交不一定能通过(可能出现 WA、TLE、MLE 等结果)
-- **XMOJ-Script 不对重新提交的结果承担任何责任**
-- 提交完成后请手动逐题检查状态
-- 如当年某题没有历史 AC 记录,该题将被跳过
+1. 在「插件设置」里确认「自动提交当年代码」是开着的。
+2. 打开比赛的题目页。
+3. 点工具栏上的「自动提交当年代码」。
+4. 等它跑完,然后逐题看一下评测结果。
## 常见问题
-**Q:开启后进入比赛页面但没有看到按钮?**
-
-请确认:
-- 当前页面是**比赛详情页 → 题目列表**,而非比赛列表页面
-- 插件设置已保存(点击保存按钮后刷新页面)
-- 当前登录账号有该比赛的参赛权限
-
-**Q:提交过程中可以停止吗?**
-
-目前版本**不支持**中途取消。建议在点击前确认题目列表,并仅在充分了解后果后操作。
-
-**Q:会同时提交所有题目吗?**
-
-是的,脚本会遍历比赛中所有题目,对有历史 AC 记录的题目依次提交,整个过程为顺序执行。
+**没看到按钮?** 确认打开的是比赛的题目页,并且设置已经保存,然后刷新页面。
+**交到一半停了?** 看按钮上的提示。需要验证码的话,去提交页面手动交一次,再回来点按钮,已经 AC 的题会被跳过。
diff --git a/features/get-data.md b/features/get-data.md
index ecec5a4..99604a7 100644
--- a/features/get-data.md
+++ b/features/get-data.md
@@ -1,52 +1,26 @@
# 获取测试点数据
-::: warning 当前状态:存在已知 Bug
-该功能目前存在已知 Bug,在部分场景下可能无法正常获取数据,正在修复中(大概率修不好)。如遇问题请在 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 反馈。
-:::
-
-## 功能介绍
-
-当您的提交出现 **WA(Wrong Answer)**、**TLE(Time Limit Exceeded)** 或 **RE(Runtime Error)** 时,「获取测试点数据」功能可以让您直接查看该测试点的**输入数据**,在本地重现问题,大幅加速调试流程。
+提交没过的时候,可以拿到出错那个测试点的输入数据,在本地复现问题。
-**适用场景:**
-- 代码在本地测试通过,但提交后 WA — 可以获取让你 WA 的具体输入
-- 程序 TLE — 获取输入后可在本地用更大数据集测试复杂度
-- 程序 RE — 获取输入后可在本地精确复现崩溃情况
-
-## 使用方法
+::: warning 不一定每次都成功
+这个功能偶尔会拿不到数据,尤其是在部分比赛里。遇到了请到 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 反馈。
+:::
-1. 进入**状态页面**(提交记录列表),找到出现错误的那条提交
-2. 点击提交展开测试点详情
-3. 在出错的测试点行旁,点击「**获取数据**」按钮
-4. 稍等片刻,该测试点的输入数据将显示在弹出框中
-5. 复制输入数据到本地文件,在本地重现并调试
+## 怎么用
+1. 在「插件设置」里确认「获取数据功能」是开着的(默认开启)。
+2. 打开没通过的那次提交的详情页。
+3. 点「获取数据」。
+4. 等一会儿,输入数据会显示在页面上。复制到本地文件里调试。
-## 本地调试建议
+数据比较大时会慢一些,耐心等。
-获取到测试点数据后,推荐按以下流程调试:
+## 拿到数据之后
```bash
-# 1. 将输入数据保存为文件
-echo "(粘贴输入数据)" > input.txt
-
-# 2. 编译代码(以 C++ 为例)
+# 把数据存成 input.txt,然后:
g++ -O2 -o solution solution.cpp
-
-# 3. 用测试点数据运行
./solution < input.txt
-
-# 4. 如需调试,加 -g 编译后用 gdb
-g++ -g -o solution_debug solution.cpp
-gdb ./solution_debug
```
-::: tip 配合「复制测试样例」使用
-题面中的样例数据可通过 XMOJ-Script 的「复制测试样例」功能一键复制到剪贴板,快速填入本地测试文件。
-:::
-
-## 已知问题
-
-- 部分比赛的测试点数据获取按钮显示但点击无响应 — 正在修复(大概率修不好)
-- 数据量较大时加载时间较长属于正常现象,请耐心等待
-
+本地跑出来和预期不一样,就能对着这组数据找 bug 了。
diff --git a/features/image-hosting.md b/features/image-hosting.md
index 128697f..dc8c74b 100644
--- a/features/image-hosting.md
+++ b/features/image-hosting.md
@@ -1,47 +1,30 @@
-# 图床
+# 粘贴发图
-XMOJ-Script 为讨论区和短消息提供了内置**图片上传与托管**功能。图片上传后将存储在 XMOJ-Script 服务器,支持永久存储与 CDN 代理访问,无需使用任何第三方图床。
+在讨论区发帖、回复或者写短消息时,可以直接粘贴图片。
-## 使用方法
+## 怎么用
-1. 截图或复制任意图片到剪贴板(例如使用截图工具、或在网页上右键「复制图片」)
-2. 打开任意**讨论区发帖框**或**短消息输入框**
-3. 直接按 Ctrl+V(macOS:⌘+V)粘贴
-4. 等待上传完成(输入框中会自动插入图片链接 ``)
-5. 正常发送帖子 / 消息,其他用户即可查看图片
+1. 截图,或者在网页上右键「复制图片」。
+2. 在输入框里按 Ctrl+V(macOS 上是 ⌘+V)。
+3. 等上传完成,输入框里会出现一行 ``。
+4. 正常发送就行。
-::: tip 也可右键粘贴
-在输入框内**右键 → 粘贴**同样可以触发图片上传,不必使用快捷键。
-:::
-
-## 支持的图片格式
+PNG、JPG、GIF、WebP 都可以。粘贴的必须是图片本身,复制文件或文件路径是不行的。
-| 格式 | 支持情况 |
-|------|---------|
-| PNG | ✅ 完整支持 |
-| JPEG / JPG | ✅ 完整支持 |
-| GIF | ✅ 完整支持(包含动图) |
-| WebP | ✅ 完整支持 |
-| BMP | ⚠️ 部分支持(建议转换为 PNG) |
-| SVG | ❌ 不支持 |
+## 发图之前
-## 使用限制与规范
-
-::: warning 请遵守以下规定
-- **内容规范**:禁止上传违反[用户协议](../legal/eula)、公序良俗或另行通知禁止的内容(包括但不限于 NSFW 内容、侮辱性图片)
-- **管理权限**:管理组有权在无需通知的情况下删除违规图片
-- **封禁机制**:多次上传违规图片将导致该用户的图片上传功能被封禁
-- **速度说明**:由于服务器地理位置,图片上传和加载速度可能较慢,请耐心等待
+::: danger 任何拿到链接的人都能看到图片
+图片不需要登录就能打开,你自己也删不掉,要删除只能[联系我们](https://www.xmoj-script.uk/privacy.html)。所以不要上传带真实姓名、学校、联系方式或人脸的图片。
:::
-## 上传失败处理
-
-| 现象 | 可能原因 | 解决方法 |
-|------|---------|---------|
-| 粘贴后无反应 | 图片未正确复制到剪贴板 | 重新复制图片;确认复制的是图片而非文件路径 |
-| 上传进度一直转 | 网络连接慢或 VPN 干扰 | 检查网络;关闭代理后重试 |
-| 显示服务器错误 | 服务端临时异常 | 等待几分钟后重试;如持续出错请在讨论区反馈 |
-| 图片链接插入但显示损坏 | 上传中断或文件损坏 | 重新上传;检查原图是否完整 |
+- 不要发违规内容,见[使用条款](https://www.xmoj-script.uk/terms.html)。
+- 管理员可以不经通知删除违规图片,多次违规会被禁止上传。
+- 服务器在国外,上传和加载可能比较慢。
-如遇上述之外的错误,欢迎在[讨论区反馈版](https://www.xmoj-bbs.me)提问,说明错误信息截图和操作步骤。
+## 上传失败
+| 现象 | 处理 |
+|------|------|
+| 粘贴后没反应 | 重新复制图片本身,而不是文件。 |
+| 一直在上传 | 检查网络,关掉代理再试。 |
+| 提示服务器错误 | 等几分钟再试;一直不行就到 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 反馈。 |
diff --git a/features/index.md b/features/index.md
index edf64f2..4a0eb6d 100644
--- a/features/index.md
+++ b/features/index.md
@@ -1,70 +1,70 @@
# 功能总览
-XMOJ-Script 是一个功能丰富的浏览器用户脚本,覆盖**界面美化**、**竞赛辅助**、**数据获取**、**社区互动**等多个方面,目前共包含 **30+** 项独立功能。
+所有功能都在「插件设置」里开关:登录后点右上角的用户菜单,选「插件设置」。下面按设置页的顺序列出。
-> 所有功能均可在「插件设置」中按需开启或关闭,不影响 OJ 原有功能的使用。
-
-## 界面增强
-
-| 功能 | 说明 |
-|------|------|
-| Bootstrap 5 样式库 | 全面重构页面 CSS,使用 Bootstrap 5 组件,整体风格更现代 |
-| 暗色模式 | 内置暗色主题,支持自动跟随系统;使用早期应用技术避免页面闪白(FOUC)|
-| 界面动画 | 为导航、卡片、按钮等组件添加过渡动画,提升交互流畅感 |
-| 中文翻译 | 将页面中残留的英文内容统一翻译为中文 |
-| 重新排版 | 优化题目页、状态页、比赛页等核心页面的布局与可读性 |
-| 状态单位显示 | 内存(KB / MB)和耗时(ms)自动补充单位,不再需要换算 |
-| 对错符号替换 | 将题目前的 `AC` / `WA` 状态符号替换为直观的 ✓ / ✗ |
-| 关键词替换 | 将特定关键词替换为更易理解的表述 |
-| 去除多余提示 | 清除页面上重复出现的多余提示信息,减少干扰 |
-| 链接按钮化 | 将方括号包裹的链接 `[文字](url)` 替换为样式统一的按钮 |
-| 移除无用功能 | 隐藏平台上已下线或无法使用的功能入口,精简界面 |
-
-## 竞赛辅助
+## 讨论和社区
| 功能 | 说明 |
|------|------|
-| ACM 排名查看与下载 | 在比赛页面直接查看 ACM 模式榜单,支持导出为文件 |
-| 自动刷新比赛列表与排名 | 可设置刷新间隔,实时获取最新比赛与排名数据 |
-| 界面倒计时 | 在比赛列表页面显示各比赛的精确剩余时间倒计时 |
-| 一键打开所有题目 | 比赛题目列表页面一键在新标签页打开全部题目,节省逐个点击的时间 |
-| [自动提交当年代码](./auto-handin) | 一键将历史已 AC 的代码批量重新提交到当年比赛,约 90% 概率获得当年标记 |
-| 自动选择 O2 优化 | 代码提交界面自动勾选 O2 编译优化,无需每次手动选择 |
-| 回放视频下载 | 在视频回放页面添加下载按钮,方便离线保存回放 |
+| 恢复讨论与短消息 | 恢复小明的OJ上关掉的讨论区和短消息,由 XMOJ-Script 的服务器提供。 |
+| 讨论提醒、短消息提醒 | 有人回复、@你或者发短消息时弹出提醒。 |
+| [粘贴发图](./image-hosting) | 在讨论区和短消息里直接粘贴截图。 |
+| [用户评分](./rating) | 按 AC 率显示分数和彩色用户名。 |
+| [徽章](../community/badges) | 用户名旁边的小标签。 |
+| 设置云同步 | 把插件设置同步到云端,换电脑不用重新设置。 |
-## 代码与提交
+## 做题和提交
| 功能 | 说明 |
|------|------|
-| [获取测试点数据](./get-data) | 提交出错后一键获取该测试点的输入数据,在本地复现并调试 |
-| 代码比较 | 比较同一题目的不同提交版本,快速定位改动点 |
-| 代码检查 | 提交前自动检测是否使用文件 IO、是否存在编译错误 |
-| 自动刷新状态页 | 提交后状态页面结果自动实时刷新,无需手动刷新 |
-| 复制测试样例 | 一键复制题面中的样例输入 / 输出到剪贴板 |
-| 复制题目 / 题解内容 | 将题目或题解全文复制为纯文本或 Markdown 格式 |
+| 查看更多标程 | 能看到更多题目的标准程序。 |
+| [获取测试点数据](./get-data) | 提交没过时,拿到出错测试点的输入。 |
+| 提交前检查代码 | 检查是否用了文件输入输出、是否有编译错误。 |
+| 自动选择 O2 优化 | 提交时默认勾选 O2。 |
+| 自动识别验证码 | 在本地识别提交页的验证码,没把握时留空,让你自己填。 |
+| 复制测试样例 | 修复题目页样例有时复制不了的问题。 |
+| 复制题目或题解 | 把题目或题解复制成 Markdown。 |
+| 比较代码 | 对比两次提交的代码。 |
+| 导出 AC 代码 | 把自己 AC 过的代码导出,每道题一个文件。 |
+| 状态页自动刷新 | 提交后评测结果自动刷新。 |
-## 用户与账号
+## 比赛
| 功能 | 说明 |
|------|------|
-| [用户评分系统](./rating) | 基于 AC 提交率(0–1000 分)的彩色评分系统,在讨论区、排行榜等处显示 |
-| [徽章 / Tag 系统](../community/badges) | 特定用户可获得专属徽章(Badge),显示于用户名旁边 |
-| 自动跳转登录页 | 访问需要登录的页面时,自动重定向到登录界面 |
-| 自动保存用户名密码 | 记住上次输入的登录信息,下次自动填充 |
+| 自动刷新 | 比赛列表和排名自动刷新。 |
+| 倒计时 | 比赛列表等页面上的时间自动倒数。 |
+| 题目切换器 | 比赛题目页左侧的题目列表,方便切换。 |
+| 一键打开所有题目 | 在新标签页里打开比赛的全部题目。 |
+| [自动提交当年代码](./auto-handin) | 把自己以前 AC 过的代码提交到当前比赛。用之前务必看说明。 |
+| 提高 AC 率 | 自动重新提交已 AC 的题目,用来提高 AC 率。 |
+| 回放视频下载 | 回放页面多一个下载按钮。 |
-## 社区功能
+## 界面
| 功能 | 说明 |
|------|------|
-| 讨论区 | 独立搭建的社区讨论服务,支持发帖、回复、@提及、图片上传 |
-| 短消息 | 独立搭建的站内私信服务,支持用户间一对一私信 |
-| [图床](./image-hosting) | 在讨论区 / 短消息输入框直接粘贴图片即可上传,支持永久存储 |
+| 新的顶部导航栏 | |
+| 新版 Bootstrap 样式 | 建议保持开启。 |
+| 重新排版 | 建议保持开启。 |
+| 界面主题 | 亮色、暗色或跟随系统。 |
+| 极简黑白界面 | 黑白配色、衬线字体,也就是这份文档的样子。 |
+| 彩色文字、动画 | |
+| 状态图标 | 题目前的状态提示换成图标。 |
+| 内存和耗时加单位 | 状态页的内存和耗时显示单位。 |
+| 翻译 | 翻译部分英文,统一用语。建议保持开启。 |
+| 链接换成按钮 | 把方括号包着的链接换成按钮。 |
+| 去掉多余提示 | 去掉反复弹出的提示。 |
+| 删去无法使用的功能 | 建议保持开启。 |
+| 图片放大 | 点图片可以放大看。 |
-## 其他功能
+## 账号和其他
| 功能 | 说明 |
|------|------|
-| 下载页面增强 | 在下载页面提供更多资源链接与说明 |
-| 修复登录跳转 | 解决部分情况下登录后跳转失败的问题 |
-| 学术模式 | 特殊学习模式(部分功能仍在开发中)|
+| 自动跳转登录 | 打开需要登录的页面时,自动跳到登录页。 |
+| 保存用户名和密码 | 下次登录自动填好。 |
+| 修复登录后跳转失败 | 建议保持开启。 |
+| 下载页面增强 | 下载页多一些内容。 |
+设置页还有两个「仅供开发者使用」的调试选项,平时不要打开。
diff --git a/features/rating.md b/features/rating.md
index 53bca42..5afb78f 100644
--- a/features/rating.md
+++ b/features/rating.md
@@ -1,71 +1,38 @@
# 用户评分
-XMOJ-Script 内置了一套**用户评分系统**,用于直观展示用户在小明的OJ上的做题水平,并以彩色用户名的形式在社区中可见。
+开启「添加用户评分和用户名颜色」后,用户名会按评分显示颜色,个人主页上也会显示具体分数。
-## 评分计算方式
+## 怎么算
-> 注意:评分规则可能随版本迭代而调整。
+$$\text{评分} = \frac{\text{AC 的提交数}}{\text{全部提交数}} \times 1000$$
-用户评分基于**AC 提交率**(Accepted Rate)计算,公式如下:
+全部提交数包括 WA、TLE、CE 等所有结果。所以评分看的是命中率,不是做了多少题。
-$$\text{评分} = \frac{\text{AC 提交数}}{\text{总提交数}} \times 1000$$
+| 用户 | 全部提交 | AC | 评分 |
+|------|---------|----|------|
+| A | 100 | 80 | 800 |
+| B | 200 | 90 | 450 |
+| C | 150 | 50 | 333 |
+| D | 100 | 20 | 200 |
-- **AC 提交数**:评测结果为 Accepted 的提交数量
-- **总提交数**:所有历史提交数量,**包含** WA、TLE、MLE、RE、CE 等各种结果,以及等待中(Pending)、已忽略(Ignored)等状态
+评分在浏览器里缓存一天,所以今天的提交通常明天才会反映出来。
-**计算示例:**
+## 颜色
-| 用户 | 总提交 | AC 提交 | 评分计算 | 最终评分 |
-|------|--------|---------|---------|---------|
-| 用户 A | 100 | 80 | 80/100 × 1000 | **800** 🔴 |
-| 用户 B | 200 | 90 | 90/200 × 1000 | **450** 🟡 |
-| 用户 C | 150 | 50 | 50/150 × 1000 | **333** 🟢 |
-| 用户 D | 100 | 20 | 20/100 × 1000 | **200** 🔵 |
+| 颜色 | 评分 |
+|------|------|
+| 红 | 高于 500 |
+| 黄 | 400–500 |
+| 绿 | 300–399 |
+| 蓝 | 低于 300 |
-::: info 客户端缓存
-评分数据**在浏览器本地缓存一天**。因此当天新增的提交记录不会立即影响评分,通常在次日访问时更新。
-:::
+## 在哪里显示
-## 评分颜色对照
+- 讨论区的帖子和回复
+- 短消息
+- 比赛排名
+- 个人主页(显示具体分数)
-根据评分高低,用户名将以不同颜色显示在讨论区、排行榜等处:
-
-| 颜色 | 评分区间 | 对应 AC 率 | 含义 |
-|------|---------|-----------|------|
-| 🔴 **红色** | ≥ 500 | 50% 及以上 | 优秀 — 提交质量高,命中率过半 |
-| 🟡 **黄色** | 400 – 499 | 40%–49% | 良好 — 接近过半命中率 |
-| 🟢 **绿色** | 300 – 399 | 30%–39% | 一般 — 仍有较大提升空间 |
-| 🔵 **蓝色** | < 300 | 30% 以下 | 新手 — 建议多练习基础题目 |
-
-## 评分在哪里显示?
-
-彩色用户名会出现在以下位置:
-
-- **讨论区** — 帖子和回复的作者名旁
-- **排行榜** — 比赛排名列表中的用户名
-- **短消息** — 发件人 / 收件人的用户名
-
-## 如何提高评分?
-
-评分由 AC 率决定,因此提高评分有两种方式:
-
-1. **提高 AC 数量** — 解决更多题目,提交更高质量的代码,减少调试性提交
-2. **减少无效提交** — 避免在没有充分思考的情况下反复提交,每次提交前先在本地测试
-
-::: tip 小建议
-使用 XMOJ-Script 的[获取测试点数据](./get-data)功能,可以快速定位错误原因,减少「无意义 WA 提交」的次数,从而逐步提升评分。
-:::
-
-## 与洛谷「咕值」的比较
-
-| 对比维度 | XMOJ-Script 评分 | 洛谷咕值 |
-|---------|-----------------|---------|
-| 计算依据 | 纯 AC 提交率 | 活跃度 + 社区贡献 + 练习频次 |
-| 刷新频率 | 客户端每天缓存刷新 | 每日服务端计算 |
-| 社区贡献 | **不计入** | 计入加分项 |
-| 主观因素 | 极少 | 较多(活跃奖励等) |
-| 适用平台 | 仅 XMOJ | 仅洛谷 |
-| 主要价值 | 客观反映做题命中率 | 综合衡量平台参与程度 |
-
-XMOJ-Script 评分**相对纯粹**,不受社区活跃度和刷题频次影响,更能代表每次提交的平均质量。
+## 想提高评分?
+少交没把握的代码。提交前先在本地测好;没过的时候,用[获取测试点数据](./get-data)找到原因再改,别反复试。
diff --git a/guide/installation.md b/guide/installation.md
index 6ea6cd2..6664362 100644
--- a/guide/installation.md
+++ b/guide/installation.md
@@ -1,152 +1,99 @@
-# 安装指南
+# 安装
-本页面将引导您完成 XMOJ-Script 的完整安装流程。
+一共三步:装一个脚本管理器,允许它运行用户脚本,再装 XMOJ-Script。
-::: tip 快速安装
-1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展
-2. 在浏览器扩展管理页面开启**开发者模式** *
-3. 在 Tampermonkey 扩展管理页面开启**允许运行用户脚本** *
-4. 点击 [安装 XMOJ-Script](https://xmoj-script.uk/XMOJ.user.js) → 在弹出框中点击「安装」
-
-> * 表示对于 Chrome / Edge 138+ 的用户需要进行的操作
->
-> 由于 Google Chrome Manifest V3 政策,Tampermonkey 必须在**开发者模式**下或启用**允许用户脚本**扩展开关才能完整运行用户脚本。**跳过此步骤会导致脚本无法工作。**
->
-> 详见 [Tampermonkey 官方说明 → Q209](https://www.tampermonkey.net/faq.php#Q209)
-:::
-
-## 1 安装 Tampermonkey
-
-XMOJ-Script 是一个 **用户脚本(Userscript)**,需要借助 Tampermonkey 等用户脚本管理器来运行。
-
-请根据您使用的浏览器,点击对应链接安装 Tampermonkey:
-
-| 浏览器 | 安装链接 | 备注 |
-|--------|---------|------|
-| Google Chrome | [Chrome 应用商店](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo)([国内镜像](https://chrome.zzzmh.cn/info/dhdgffkkebhmkfjojejmpbldmpobfkfo)) | 推荐 |
-| Microsoft Edge | [Edge 加载项商店](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd) | 推荐 |
-| Mozilla Firefox | [Firefox 附加组件](https://addons.mozilla.org/firefox/addon/tampermonkey/) | 无需开发者模式 |
-| Safari | [App Store](https://apps.apple.com/app/tampermonkey/id1482490089) | 需额外配置 |
-| Opera | [Opera 插件商店](https://addons.opera.com/extensions/details/tampermonkey-beta/) | — |
-
-## 2 开启浏览器开发者模式 *
-
-::: warning Chrome / Edge 138+ 必须完成此步骤
+::: warning Chrome 和 Edge 用户注意
+第二步不能跳过。新版 Chrome 和 Edge 默认不让扩展运行用户脚本,不打开这个开关,脚本装好了也不会生效。这是最常见的「装了没反应」的原因。
:::
-### Google Chrome
-
-1. 地址栏输入 `chrome://extensions` 并按 Enter
-2. 找到页面**右上角**的「**开发者模式**」(Developer mode)开关将其**打开**
-
- 
-
-3. 刷新页面后生效
+## 1. 装脚本管理器
-### Microsoft Edge
+推荐 Tampermonkey。脚本猫(ScriptCat)也可以。
-1. 地址栏输入 `edge://extensions` 并按 Enter
-2. 找到页面**左下角**的「**开发人员模式**」开关将其**打开**
-
- 
-
-### Mozilla Firefox
-
-Firefox **无需**开启开发者模式,安装 Tampermonkey 后即可直接跳到第三步。
-
-### Safari(macOS)
+| 浏览器 | 下载 |
+|--------|------|
+| Chrome | [Chrome 应用商店](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) |
+| Edge | [Edge 加载项](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd) |
+| Firefox | [Firefox 附加组件](https://addons.mozilla.org/firefox/addon/tampermonkey/) |
+| Safari | [App Store](https://apps.apple.com/app/tampermonkey/id1482490089) |
-1. 打开 Safari →「偏好设置」→「高级」选项卡
-2. 勾选「**在菜单栏中显示"开发"菜单**」
-3. 菜单栏出现「开发」菜单后,点击「**允许未签名的扩展**」
-4. 在 Safari 扩展列表中**启用** Tampermonkey
+打不开 Chrome 应用商店的话,可以从 [Tampermonkey 官网](https://www.tampermonkey.net/) 找其他下载方式。
-## 3 允许扩展运行用户脚本 *
+## 2. 允许运行用户脚本
-::: warning Chrome / Edge 138+ 必须完成此步骤
-:::
+先在地址栏打开 `chrome://version` 或 `edge://version`,看看版本号。
-### Google Chrome
+### Chrome 138 及以上
-1. 地址栏输入 `chrome://extensions` 并按 Enter
-2. 进入 Tempermonkey 扩展「**详情**」页面
+1. 地址栏打开 `chrome://extensions`,在 Tampermonkey 下面点「详情」。

-3. 勾选「**允许运行用户脚本**」
+2. 打开「允许运行用户脚本」开关。
- 
+ 
-### Microsoft Edge
+### Edge 138 及以上
-1. 地址栏输入 `edge://extensions` 并按 Enter
-2. 进入 Tempermonkey 扩展「**详细信息**」页面
+1. 地址栏打开 `edge://extensions`,在 Tampermonkey 下面点「详细信息」。

-3. 勾选「**允许用户脚本**」
+2. 打开「允许用户脚本」开关。
- 
+ 
-::: details 如何确认配置是否生效?
-点击浏览器右上角扩展 → Tampermonkey 图标。若弹出页面正常打开且不显示「请启用开发者模式以允许用户脚本注入。点击这里了解如何操作。」等警告内容,说明至此配置已生效。
-:::
+### Chrome / Edge 137 及以下
+
+1. 地址栏打开 `chrome://extensions`(Edge 是 `edge://extensions`)。
+2. 打开「开发者模式」(Edge 叫「开发人员模式」)。Chrome 在右上角,Edge 在左侧。
-## 4 安装 XMOJ-Script
+ 
-最新稳定版(推荐)
-预览版
+### Firefox 和 Safari
-点击上方其中一个按钮后,Tampermonkey 将弹出脚本安装确认页面,确认信息无误后点击「**安装**」即可。
+不需要额外设置,直接下一步。Safari 要在「设置 → 扩展」里启用 Tampermonkey。
-::: info 备用最新版安装渠道
-- [ScriptCat 镜像站](https://scriptcat.org/zh-CN/script-show-page/1500/):国内访问更快
-- [GitHub Releases](https://github.com/XMOJ-Script-dev/XMOJ-Script/releases/latest):手动下载 `XMOJ.user.js` 后拖入 Tampermonkey 控制面板
+::: details 怎么确认设置好了?
+点工具栏上的 Tampermonkey 图标。弹出的窗口里没有「请启用开发者模式」之类的提示,就说明设置好了。官方说明见 [Tampermonkey FAQ Q209](https://www.tampermonkey.net/faq.php#Q209)。
:::
-## 5 验证安装
+## 3. 安装 XMOJ-Script
-1. 打开 [www.xmoj.tech](https://www.xmoj.tech)
-2. 若页面样式明显变化(导航栏更新、Bootstrap 风格按钮),说明脚本已运行
-3. 登录后点击右上角用户名,若菜单中出现「**插件设置**」,则安装完成 ✅
+点下面的按钮,管理器会打开安装页,点「安装」。
-## 更新脚本
+安装正式版
+安装预览版
-XMOJ-Script 支持**自动更新**。Tampermonkey 会定期检查最新版并静默更新。
+预览版会先用上新功能,但可能有 bug。不确定就装正式版。
-手动更新步骤:
+装不上的话,也可以从 [脚本猫](https://scriptcat.org/zh-CN/script-show-page/1500/) 安装,或者在 [GitHub Releases](https://github.com/XMOJ-Script-dev/XMOJ-Script/releases/latest) 下载 `XMOJ.user.js`,拖进管理器的控制面板。
-1. 点击 Tampermonkey 图标 →「**控制面板**」
-2. 找到 XMOJ-Script 条目,点击右侧「**更新**」按钮(或「检查更新」)
+## 4. 检查一下
-## 常见问题
+打开 [www.xmoj.tech](https://www.xmoj.tech) 并刷新。页面样式变了,就说明脚本在运行。
-### 安装后访问 xmoj.tech 没有变化?
+登录后,右上角的用户菜单里会多出「插件设置」,所有功能都在这里开关。
-按以下顺序逐项排查:
+## 更新
-| 检查项 | 说明 |
-|--------|------|
-| Tampermonkey 是否已启用 | 扩展图标不应显示灰色或带叉 |
-| XMOJ-Script 脚本是否已启用 | 控制面板中脚本开关应为打开状态 |
-| 开发者模式是否已开启 | Chrome / Edge 必须,见第二步 |
-| 是否访问了正确的域名 | 确认是 `xmoj.tech` 而非其他域名 |
-| 尝试硬刷新 | Ctrl+Shift+R(macOS:⌘+Shift+R)|
+脚本会自己检查更新。有新版本时,页面上会弹出提示,点一下就能更新。也可以在 Tampermonkey 控制面板里手动点「检查更新」。
+
+## 装了没反应?
-### 提示「此扩展程序未经 Chrome 网上应用店验证」?
+按顺序检查:
-这是 Chrome 在启用开发者模式后对所有通过非商店途径安装的扩展显示的**标准安全提示**,属于正常现象。Tampermonkey 本身已通过 Chrome 商店审核,`.user.js` 是用户脚本的标准格式,不影响安全性。
+1. 第 2 步的开关打开了吗?Chrome 和 Edge 十有八九是这个问题。
+2. Tampermonkey 和 XMOJ-Script 在控制面板里都是启用状态吗?
+3. 打开的是 `www.xmoj.tech` 吗?
+4. 强制刷新试试:Ctrl+Shift+R,macOS 上是 ⌘+Shift+R。
-### 安装页面显示乱码或加载失败?
+还是不行,看[常见问题](../qa/discussion),或者到 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 反馈。
-可能是网络问题导致 GitHub 资源访问缓慢。请:
-- 尝试通过 [ScriptCat 镜像](https://scriptcat.org/zh-CN/script-show-page/1500/) 安装
-- 或稍后重试主安装链接
+### 浏览器提示「此扩展程序未经验证」?
-### 如何完全卸载脚本?
+开启开发者模式后,Chrome 会对扩展显示这个提示。这是正常现象,不影响使用。
-1. 打开 Tampermonkey 控制面板
-2. 找到 XMOJ-Script 条目
-3. 点击右侧删除(垃圾桶)图标
-4. 确认删除即可,不影响浏览器本身
+## 卸载
+在 Tampermonkey 控制面板里找到 XMOJ-Script,点删除图标。
diff --git a/index.md b/index.md
index ea73f8a..23b7551 100644
--- a/index.md
+++ b/index.md
@@ -2,63 +2,47 @@
layout: home
hero:
- name: "XMOJ-Script"
- text: "小明的OJ 增强脚本"
- tagline: 功能强大的浏览器用户脚本,为小明的OJ带来全方位的界面优化与增强功能。支持 Chrome、Edge、Firefox、Safari。
+ name: XMOJ-Script
+ text: 小明的OJ,换个样子。
+ tagline: 一个免费、开源的用户脚本。让小明的OJ更好看,也更好用。支持 Chrome、Edge、Firefox 和 Safari。
image:
- src: /demo.png
- alt: XMOJ-Script 演示截图
+ light: /hero-light.png
+ dark: /hero-dark.png
+ alt: 装上脚本后的小明的OJ比赛题目页,黑白主题
actions:
- theme: brand
- text: ⚡ 立即安装
+ text: 安装
link: /guide/installation
- theme: alt
- text: 📖 功能介绍
+ text: 看看有哪些功能
link: /features/
- theme: alt
text: GitHub
link: https://github.com/XMOJ-Script-dev/XMOJ-Script
features:
- - icon: 🏆
- title: 用户评分系统
- details: 基于 AC 提交率实时计算评分(0–1000),配合红/黄/绿/蓝彩色用户名,在讨论区、排行榜直观展示用户实力。
+ - title: 用户评分
+ details: 按 AC 率算出 0–1000 分,用户名按分数显示红、黄、绿、蓝四种颜色。
link: /features/rating
- linkText: 了解评分机制
- - icon: 🖼️
- title: 图床 & 图片上传
- details: 在讨论区或短消息输入框直接 Ctrl+V 粘贴截图即可上传,支持永久存储与 CDN 代理,无需第三方图床。
+ linkText: 怎么算的
+ - title: 粘贴就能发图
+ details: 在讨论区或短消息里按 Ctrl+V,截图会自动上传并插入。
link: /features/image-hosting
- linkText: 查看使用方法
- - icon: 📊
- title: 获取测试点数据
- details: 提交出错时一键获取该测试点的输入数据,在本地复现错误,大幅加速调试流程,提升 AC 效率。
+ linkText: 使用方法
+ - title: 获取测试点数据
+ details: 提交没过时,可以拿到出错测试点的输入数据,在本地复现。
link: /features/get-data
- linkText: 查看使用方法
- - icon: 🔄
- title: 自动提交当年代码
- details: 在比赛中一键将历史已 AC 的代码批量重新提交,节省操作时间。适用于需要提交当年代码的考核场景。
+ linkText: 使用方法
+ - title: 自动提交当年代码
+ details: 在比赛里把自己以前 AC 过的代码一次性重新提交。用之前先看说明。
link: /features/auto-handin
- linkText: 查看使用方法
- - icon: 🌙
- title: 暗色模式
- details: 内置暗色主题,支持自动跟随系统设置。使用早期应用技术规避 FOUC,夜间使用眼睛更舒适。
- - icon: 🎨
- title: 界面全面美化
- details: 全面采用 Bootstrap 5 样式库,重新排版布局、添加动画效果、中英互译、统一按钮风格,提供更现代的 OJ 使用体验。
- - icon: 💬
- title: 短消息在线看
- details: 独立网页应用,无需安装脚本,在任意设备(含 iOS Safari)收发 XMOJ 站内短消息,支持图片、搜索、深色模式。
+ linkText: 使用前必读
+ - title: 短消息在线看
+ details: 不装脚本也能在手机上收发小明的OJ短消息。
link: /apps/messages
- linkText: 立即使用
- - icon: 🖥️
- title: ELXMOJ 桌面客户端
- details: 基于 Electron 的原生桌面应用,自动注入脚本,无需配置 Tampermonkey,支持 Windows / macOS / Linux。
+ linkText: 打开
+ - title: ELXMOJ 桌面客户端
+ details: 内置脚本的桌面应用,不用装浏览器扩展。支持 Windows、macOS 和 Linux。
link: /apps/elxmoj
- linkText: 下载客户端
- - icon: 🏅
- title: 比赛辅助工具集
- details: ACM 排名查看与导出、自动刷新比赛列表与排名、倒计时显示、一键打开所有题目、O2 优化自动勾选等。
- link: /features/
- linkText: 查看全部功能
+ linkText: 下载
---
diff --git a/legal/eula.md b/legal/eula.md
index 6aa7cf1..1e92bf0 100644
--- a/legal/eula.md
+++ b/legal/eula.md
@@ -1,83 +1,7 @@
-# 用户协议
+# 使用条款
-### 小明的OJ讨论区用户服务协议
+使用条款和隐私说明已经搬到官网,用更直白的话重写了:
-欢迎阅读《小明的OJ讨论区用户服务协议》(以下简称"本协议")。本协议阐述之条款和条件适用于您(以下简称"用户")使用小明的OJ讨论区的各种产品和服务。
-
-#### 1. 服务协议的确认
-
-1.1 小明的OJ增强脚本开发组同意按照本协议的规定及其不时发布的操作规则提供基于互联网移动网的小明的OJ讨论区、小明的OJ增强脚本开发组官方网站(web.xmoj-bbs.tech)等相关服务(以下简称"小明的OJ增强脚本开发组服务")。
-
-1.2 小明的OJ增强脚本开发组服务使用人(以下简称"用户")应当基于了解本协议全部内容、在独立思考的基础上认可、同意本协议的全部条款并按照页面上的提示完成全部的注册程序,用户的注册、登录、使用等行为将视为完全接受本协议及小明的OJ增强脚本开发组公示的各项规则、规范。
-
-1.3 小明的OJ增强脚本开发组享有对小明的OJ增强脚本开发组小明的OJ讨论区、小明的OJ增强脚本开发组官方网站上一切活动的监督、提示、检查、纠正等权利。
-
-#### 2. 服务内容
-
-2.1 小明的OJ增强脚本开发组服务的具体内容由小明的OJ增强脚本开发组根据实际情况提供,包括但不限于授权用户通过其帐号上传、搜索并向互相关联的用户推送相关信息、授权用户对其进行收录、分享等,小明的OJ增强脚本开发组有权对其提供的服务或产品形态进行升级或其他调整,均以小明的OJ讨论区网站内容更新的方式通知用户,不单独通知用户。
-
-2.2 小明的OJ增强脚本开发组提供的小明的OJ增强脚本开发组服务中可能包括广告,用户同意在使用过程中显示小明的OJ增强脚本开发组和第三方供应商、合作伙伴提供的广告。
-
-2.3 小明的OJ增强脚本开发组仅提供与小明的OJ增强脚本开发组服务相关的技术服务等,除此之外与相关网络服务有关的设备及所需费用均应由用户自行负担。
-
-#### 3. 服务变更、中断或终止
-
-3.1 鉴于网络服务的特殊性,用户同意,小明的OJ增强脚本开发组有权随时中断或终止部分或全部小明的OJ增强脚本开发组服务,小明的OJ增强脚本开发组将尽可能及时以合理方式通知用户,并尽可能在第一时间对此进行修复。但对因此导致用户不能发送和接受阅读信息、或接发错信息,小明的OJ增强脚本开发组不承担任何责任。
-
-3.2 用户理解,小明的OJ增强脚本开发组需要定期或不定期地对平台或相关设备进行检修和维护,如因此类情况而造成服务在合理期间内的中断,小明的OJ增强脚本开发组将尽可能事先通知,但无需为此承担任何责任。
-
-3.3 用户提供的个人资料不真实、用户违反法律法规国家政策或本协议规定的使用规则,小明的OJ增强脚本开发组有权随时中断或终止向用户提供本协议项下的服务,而无需对用户或任何第三方承担任何责任。
-
-#### 4. 使用规则
-
-4.1 用户在申请注册服务时,必须向小明的OJ提供准确的主体资料,如主体资料有任何变动,必须及时更新。
-
-4.2 用户注册成功后,将获得一个小明的OJ账号及密码,该用户帐号和密码由用户负责保管;用户应当对该用户帐号所有行为负相关法律责任。
-
-用户在使用小明的OJ增强脚本开发组服务过程中,必须遵循以下原则:
-
-- 遵守中国有关的法律和法规
-- 不得为任何非法目的而使用小明的OJ增强脚本开发组服务
-- 遵守所有与网络服务有关的网络协议、规定和程序
-- 不得利用小明的OJ和小明的OJ增强脚本开发组的服务系统进行任何可能对互联网的正常运转造成不利影响的行为
-- 不得利用小明的OJ增强脚本开发组网络服务系统进行任何不利于小明的OJ增强脚本开发组和小明的OJ系统的行为
-
-4.3 用户不得使用小明的OJ增强脚本开发组服务制作、上传、发送、传播敏感信息和违反国家法律制度的信息,包括但不限于:反对宪法所确定的基本原则的;危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;损害国家荣誉和利益的;煽动民族仇恨、民族歧视,破坏民族团结的;散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;侮辱或者诽谤他人,侵害他人合法权益的;含有法律、行政法规禁止的其他内容的。
-
-4.4 用户同意在任何情况下不使用其他用户的帐号或密码。
-
-4.5 用户有权更改、删除在小明的OJ增强脚本开发组服务中的个人资料、注册信息及传送内容等,但需承担相关风险。
-
-4.6 如因用户违反本协议中的任何条款,小明的OJ增强脚本开发组有权依据本协议终止对违约用户提供服务。
-
-4.7 如用户注册帐号后长期不登录,小明的OJ增强脚本开发组有权回收该帐号,以免造成资源浪费。
-
-#### 5. 知识产权
-
-5.1 小明的OJ增强脚本开发组提供服务中所包含的任何文本、图片、标识、音频、视频资料均受著作权、商标权、专利权及其他财产权法律的保护。
-
-5.2 未经相关权利人和小明的OJ增强脚本开发组的同意,上述资料均不得以任何方式被展示于其他任何第三方平台或被用于任何商业目的。
-
-#### 6. 隐私保护
-
-6.1 保护用户隐私和个人数据是小明的OJ增强脚本开发组的一项基本制度,小明的OJ增强脚本开发组将采取各种制度、安全技术和程序等措施来保护用户隐私和个人数据不被未经授权的访问、使用或泄漏,并保证不会将单个用户的注册资料向除合作单位以外的第三方公开或用于任何非法的用途,但法律要求、政府要求、维护公共利益或维护合法权益等情况除外。
-
-6.2 用户在使用服务的过程中,需要提供一些必要的信息(如邮箱等),小明的OJ增强脚本开发组承诺将采取措施保护用户的个人信息安全。
-
-#### 7. 免责声明
-
-7.1 用户在使用小明的OJ增强脚本开发组服务的过程中应遵守国家法律法规及政策规定,对其所制作、上传、发送、传播的信息和内容承担任何法律责任,与小明的OJ增强脚本开发组无关。
-
-7.2 小明的OJ增强脚本开发组提供服务中所包含的任何文本、图片、标识、音频、视频资料均为教学用途,不涉及任何实体物品的商业活动。
-
-7.3 用户违反本协议的规定,导致或产生的任何第三方主张的任何索赔、要求或损失,包括合理的律师费,用户同意赔偿小明的OJ增强脚本开发组,使之免受损害。
-
-#### 8. 其他条款
-
-8.1 小明的OJ增强脚本开发组有权随时修改本协议的任何条款,一旦本协议内容发生变动,将在平台上公布修改后的协议内容。用户不同意上述修改内容,有权选择停止使用服务,继续使用则视为接受修改。
-
-8.2 本协议所定的任何条款无论因何种原因部分或全部无效或不具有执行力,本协议的其余条款仍应有效并具备约束力。
-
-8.3 本协议的订立、执行和解释及纠纷的解决均应适用中华人民共和国法律并受中华人民共和国法院管辖。
-
-8.4 本协议的版权归小明的OJ增强脚本开发组所有,本协议各项条款内容的最终解释权及修改权归小明的OJ增强脚本开发组所有。
+- [使用条款](https://www.xmoj-script.uk/terms.html)
+- [隐私说明](https://www.xmoj-script.uk/privacy.html)
+- [未成年人保护](https://www.xmoj-script.uk/child-protection.html)
diff --git a/public/demo.png b/public/demo.png
deleted file mode 100644
index eaddc65..0000000
Binary files a/public/demo.png and /dev/null differ
diff --git a/public/hero-dark.png b/public/hero-dark.png
new file mode 100644
index 0000000..4d36b22
Binary files /dev/null and b/public/hero-dark.png differ
diff --git a/public/hero-light.png b/public/hero-light.png
new file mode 100644
index 0000000..8092f51
Binary files /dev/null and b/public/hero-light.png differ
diff --git a/qa/discussion.md b/qa/discussion.md
index d2d64b1..09e063c 100644
--- a/qa/discussion.md
+++ b/qa/discussion.md
@@ -1,96 +1,56 @@
# 常见问题
-## 脚本安装问题
+## 装了脚本没反应
-安装相关问题请优先查阅[安装指南 → 常见问题](../guide/installation#常见问题)章节,涵盖了安装后无效果、开发者模式等最常见情况。
+最常见的原因:Chrome 或 Edge 没有打开「允许用户脚本」。看[安装 → 装了没反应?](../guide/installation#装了没反应)。
----
+## 讨论区和短消息
-## 讨论区 / 短消息问题
+### 提示「JSON解析错误」
-### JSON 解析错误
-
-**错误提示:**
```
JSON解析错误:SyntaxError: Unexpected token '<', "F12 打开浏览器开发者工具,切换到「**Console**」选项卡
-2. 复制完整的错误信息(包括错误类型、文件名和行号)
-3. 在 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 中搜索是否有相同问题
-4. 如无已有 Issue,[新建 Issue](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose) 并提供:
- - 错误信息完整截图
- - 浏览器名称与版本
- - Tampermonkey 版本
- - XMOJ-Script 版本
- - 触发错误的操作步骤
+1. 按 F12 打开开发者工具,切到「控制台」(Console)。
+2. 把红色的报错截图。
+3. 先在 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) 里搜一下有没有人报过。
+4. 没有的话,[新建一个 Issue](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose),附上截图、浏览器和版本、XMOJ-Script 版本,以及你做了什么操作。
----
+GitHub Issues 是公开的,截图前确认里面没有 `PHPSESSID`、密码或其他个人信息。
-## 功能请求
+## 想要新功能
-有想要的新功能?请在 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose) 提交 Feature Request,描述你的使用场景和期望行为。
-
-> 在提交前请先搜索一下,避免重复。
-
----
+到 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues/new/choose) 提,说清楚你想在什么场景下做什么。先搜一下有没有人提过。
## 其他问题
-如遇文档中未提及的问题,欢迎在以下渠道寻求帮助:
-
-- 💬 [讨论区](https://www.xmoj-bbs.me) — 适合日常使用问题和经验交流
-- 🐛 [GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues) — 适合 Bug 报告和功能建议
-
+- 日常使用问题:在小明的OJ的讨论区里问。
+- bug 和建议:[GitHub Issues](https://github.com/XMOJ-Script-dev/XMOJ-Script/issues)。
+- 隐私和数据删除:见[隐私说明](https://www.xmoj-script.uk/privacy.html)。