Codeforces Better!🎈
Codeforces界面汉化、黑暗模式支持、题目翻译、markdown视图、一键复制题目、跳转到洛谷、评论区分页、ClistRating分显示、榜单重新着色
写在前面:反馈须知
如遇问题,请先阅读下方的 #常见问题 说明。如果没有得到解决,请前往 反馈页 或者 Github issues 反馈。
请提供关于问题的详细描述,比如:链接,截图,期望的结果、实际的结果,复现方式……
此外还欢迎友善的讨论以及功能建议,但维护脚本以及提供帮助并不是作者的义务,感谢你的理解。
功能
提示:脚本的部分功能提供了配置项,你可以点击 整个页面右上角 的CodeforcesBetter设置
按钮打开设置面板。
界面汉化
将网站的主要元素汉化为中文(可关闭)
题目翻译
在题目、blog、评论等的右上角添加翻译按钮,一键即可翻译为中文,同时确保不破坏Latex公式
在此基础上,脚本提供了三种翻译模式:
- 普通模式:会一次性翻译整个区域的内容
- 分段模式:会对区域内的每一个
<p/>
和 <i/>
标签依次进行翻译 - 选段模式:你可以自由点选页面上的任何
<p/>
和 <i/>
标签进行翻译
你可以在右上角的 CodeforcesBetter设置
面板中选择你想使用的翻译服务(默认为DeepL)以及切换脚本的工作模式。
注意:分段/选段模式会产生如下问题:
- 使得翻译接口无法知晓整个文本的上下文信息,会降低翻译质量。
- 会有部分内容不会被翻译/不能被选中,因为它们不是<p/>或<i/>元素
脚本提供了如下翻译接口可供选择:(默认为DeepL)
| KEY | 翻译质量 | 可靠性 | 字符数上限 | 耗时 |
---|
DeepL翻译(✨推荐) | 不需要 | ⭐️⭐️⭐️⭐️ | 部分地区可能无法访问或较慢 | 5000 | 快 |
讯飞听见翻译 | 不需要 | ⭐️⭐️⭐️ | 通常可靠 | 2000 | 快 |
有道翻译 | 不需要 | ⭐️⭐️ | 通常可靠 | 600 | 快 |
Google翻译 | 不需要 | ⭐️⭐️⭐️ | 需要当前网络能顺利访问Google | 5000 | 快 |
彩云翻译 | 不需要 | ⭐️⭐️ | 通常可靠 | 5000 | 快 |
使用ChatGPT翻译(✨推荐) | 需要API Key | ⭐️⭐️⭐️⭐️⭐️ | 取决于服务商质量以及 OpenAI 的拥挤程度 | 取决于模型 | 较慢 |
提示:右键翻译按钮,可以快速切换翻译服务哦
自动翻译
开启"自动翻译"后,对于.ttypography
, .comments
区域中的短文本,当其进入浏览器窗口的可视区域时,自动进行翻译
(可以在设置面板中指定多少字符以内为短文本)
此外,开启"评论区快速翻译"后,对于评论区中的短文本,自动翻译时会在候选的服务中随机选择一个,并行地进行快速翻译
历史翻译恢复
开启"自动恢复历史翻译"后,会将题目页面上的翻译信息自动保存到浏览器本地的 indexDB 的 CFBetterDB 数据库的 translateData 表中
刷新 / 下一次进入页面时会自动恢复翻译信息
ClistRating分
获取 clist.by 网站的 Rating 分数据,并展示
注意,不同页面工作所需要的凭证有所不同:
- 对于比赛问题集页(contest),需要浏览器中 clist.by 网站的登录(不可用) cookie 有效,或者在设置面板中填写api key
- 对于题目页(problem)和题单页(problemset),需要浏览器中 clist.by 的登录(不可用) cookie 有效
脚本不获取 clist.by 的具体 cookie ,cookie 信息由浏览器发送请求时自动携带,cookie 有效性通过尝试请求所返回的状态码判断
编辑器与LSP
题目页添加编辑器
在题目页的下方添加 monaco 代码编辑器(默认开启)
支持代码自动保存、代码快捷提交、在线测试运行、LSP、静态补全增强等功能
代码自动保存
代码会自动保存在浏览器本地的 IndexedDB 的 CFBetterDB 数据库的 editorCode 表中
在线测试运行
你可以一键测试运行题目中的样例,还可以自定义测试样例,样例数据会自动保存在 CFBetterDB 数据库的 editorCode 表中
脚本提供了多个在线代码运行服务:codeforces官方、wandbox(第三方)、rextester(第三方),它们所支持的参数选项有所不同。
注意:
显然,所有在线代码运行服务均无法测试交互式题目
第三方在线代码运行服务的运行环境与 codeforces 的可能有所不同,在第三方在线代码运行服务中能够运行或者结果正确的代码并不一定在 codeforces 中同样如此
无法保证你的代码不会被第三方在线代码运行服务以某种方式泄露
此外,为扩大适用范围,页面上的编译器选项与第三方在线代码运行服务实际的编译器选项也并不是严格对应的,因此很有可能得到意外的结果。
LSP
配置好 LSP 后,可以为编辑器提供如下功能(限C++、Python语言):
- 自动补全、方法签名提示、代码修复
- hover提示、inlay提示、文档链接
- 转到定义、转到引用、符号引用点击高亮
- 格式化、部分格式化、渐进式自动格式化、折叠范围分析、重命名
当然,其不支持本地编译,不支持断点调试,不支持多文件等……,性能上也是不及本地的专门的 IDE 的
总之,该功能的实际意义和用处并不大,如果你对此感兴趣,请查看后文的 常见问题 部分以了解更多
静态补全增强
你可以在 设置面板-Monaco-静态补全增强-自定义 中为 monaco 编辑器添加自定义的静态代码补全规则
补全规则为 JSON 格式,下面是一个示例(monaco格式):
{
"suggestions": [
{
"label": "hello world",
"kind": 15,
"documentation": "The is a hello world snippet",
"insertText": "hello world"
},
// other suggestions...
]
}
你可以使用 CompletionItem 中几乎所有的属性,(注意: 不要填写 range 属性,脚本会自动计算并添加该属性)
其他功能
- 在题目、blog、回复等的右上角添加
MrakDown视图
按钮以及 复制
按钮 - 让 Codeforces 支持黑暗模式,默认跟随系统
- 展开折叠块,自动展开所有的折叠块
- 洛谷跳转,一键跳转到该题在洛谷对应的页面
- 评论区分页,支持翻页、跳转、可选择每页显示的主楼数
- 渲染优化,为折叠块元素添加渲染限制(contain: layout style;)
- 榜单重新着色,对于采用 Codeforces 赛制的比赛的榜单,按照“得分/总分”所在的范围为分数重新渐变着色
兼容性
浏览器
| 支持 | 最低版本 |
---|
Chrome | 支持 | 96 |
Edge | 支持 | 96 |
国产Chromium套壳 | 基本兼容,但可能出现意外的错误 | Chromium 内核版本≥96 |
FireFox(包括移动端) | 支持 | 103 |
Safari | 不支持 | \ |
脚本管理器
仅在 Tampermonkey(篡改猴)脚本管理器中进行测试,不保证在 Greasemonkey,Violentmonkey,ScriptCat 等中的兼容性
其他插件
与主流CF相关插件不存在兼容性问题,如果你遇到了兼容性问题,欢迎反馈。
镜像站
支持官方轻量站 m1 / m2 / m3 、官方镜像站 https://mirror.codeforces.com/、非官方镜像站 https://codeforc.es
此外,理论上也兼容任意的其他镜像站,你只需要自行再添加一行注释 // @match 你的镜像站网址
即可
常见问题
Q. 更新错误?
A. 由于 Greasy Fork镜像 平台的原因,当新版本刚发布时,可能会出现实际更新/安装的却是上一个版本的情况,
通常你只需要稍等几分钟,然后再次前往更新/安装即可。
你也可以将鼠标移动到脚本的更新提示框中的红色问号上,然后点击弹出信息底部的 “暂不更新” 按钮。
Q. 一直显示加载中?
A. 请开启设置面板中的 ”兼容选项-不等待页面资源加载“ 选项
Q. 使用 DeepL 翻译报错 Too many requests ?
A. 这通常是因为你短时间内频繁翻译,或者一次性翻译了超过5000字符的文本导致的,DeepL对翻译字数和频率是有限制的,
这是暂时的,一段时间后就恢复正常了 Q. 使用 DeepL 翻译报错 undefind 或一直显示翻译中?
Q. 翻译结果中一些公式显示为 {xx} / [xx] / 【xx】?
A. 在使用普通翻译接口(DeepL/有道/google)进行翻译时,受脚本的实现方式所限,可能会出现{xx}/[xx]/【xx】
脚本对公式的处理方式
为了保护LaTeX公式在翻译时不被破坏,脚本会先取出所有的LaTeX公式,并使用替换符{xx}/[xx]/【xx】来占位,
由于这些替换符大概率不会在翻译的过程中遭到破坏,因此可以在翻译后再根据替换符还原回LaTeX公式。
这种实现方式能如期工作的前提是替换符不被破坏,这在绝大多数情况下都是没有问题的,
但有时翻译服务会破坏替换符 ,比如 【23】 变成了 【23 / 23】 / [23]/ 【23 】/ 23 】,这些情况下脚本会通过一定的正则规则进行还原,使其仍然可以如期工作
但如果翻译服务还破坏了更多的内容,产生了歧义,比如翻译服务将【2】 313 变成了 【2312,这时就无法还原了,
对于各个翻译服务,不同的替换符本身遭到破坏的概率有所不同,你可以在右上角的设置面板中选择不同的替换符,
经过测试,通常 {}
表现的效果更好,因此这也是脚本默认使用的替换符
提示:
在使用 ChatGPT 进行翻译时不会存在这个问题,因为可以通过提示词直接告诉 ChatGPT “保持其中的LaTeX公式不翻译”,
聪明的 ChatGPT 可以很好的遵守这一点,这也是脚本推荐的翻译方式。
Q. 如何使用 ChatGPT 翻译?
A. 如果你可以直接访问 OpenAI 的接口,并且拥有账号,那么非常棒,你只需要选中 “使用ChatGPT翻译(API)”,然后点击下方的 “添加” 按钮新建一个配置并填写即可。
此外,你也可以购买 api 代理服务来使用 ChatGPT,下表收集了一些 api 服务商,你可以选择使用
免责:
作者仅为收集分享,没有获得任何收益,亦不保证上述平台的稳定性,平台的任何行为均与作者无关。
建议小额充值,用完再充,这些服务商可能会跑路
如果你使用的是 api 代理服务商 提供的服务,配置中的 KEY 应该填写 api代理服务商提供的 key,
此外,你还需要在配置中额外填写 Proxy API,
Proxy API 需要填写完整的地址,这里以 CloseAI 为例,其提供了API
Base:https://api.closeai-proxy.xyz
那么 Proxy API 后面应该填写的就是 https://api.closeai-proxy.xyz/v1/chat/completions
,
注意:由于你指定了自定义的API,Tampermonkey会对你的跨域请求进行警告,请自行点击授权注意:如果你想使用Azure OpenAI,由于其与 OpenAI 官方的接口参数不一样,你可以选择自行部署azure-openai-proxy以进行转换 Q. 什么是LSP?
A.
LSP(Language Server Protocol)是由微软发起的一种编辑器与语言服务器之间通信的协议规范。
它将传统IDE需要实现的代码补全、诊断、建议、文档甚至项目管理等功能与编辑器相分离,使用独立的服务来完成这些功能,
而编辑器只需要按照协议规范与服务器进行通信即可,这样就大大减少了工作量,同时使编辑器可以轻松地支持各种编程语言
目前LSP的生态已经逐步完善,主流编辑器均已支持LSP或者有了对应的插件,如VSCode、Vim、Emacs等...
但是各大商业IDE厂商对此兴趣不大,基本现有的LSP Server都是开源社区在维护,因此其仍然不及专业IDE以及各种专业的插件
Q. 如何使用LSP?
A. 只需两步:
一:脚本提供了对 C++ 和 Python 语言以下两个 LSP Server 实现的支持,你需要按需安装它们:
语言 | LSP Server | 安装方式(Windows下) |
---|
C++ | clangd | 在 clangd release 中下载clangd,然后在系统环境变量的 path 中新增 clangd 的路径,例如 C:\clangd_16.0.2\bin\ |
Python | pylsp | 执行命令: pip install "python-lsp-server[all]" ,其会自动添加环境变量 |
二:你还需要在 GitHub release 或者 蓝奏云(密码:aaaa) 中下载并解压 OJBetter_Bridge,该软件是脚本与 LSP Server 通信的桥梁,
将解压后的文件夹放到C盘根目录 或者其他任何你喜欢的位置 (注意:如果你放在其他位置,你需要在设置面板中要修改"工作路径"为你的实际位置。)
然后你就可以运行 OJBetter_Bridge 了,其提供了GUI版本和终端版本,Windows下推荐使用GUI版本,直接运行 server_gui.exe
即可
OJBetter_Bridge 在启动时会自动检查命令 clangd 和 pylsp 是否有效,并给出提示。
提示:在 server_gui.exe
的界面中可以设置让其开机自启完成上述步骤后,你就可以开启设置面板中的 "使用LSP" 并使用了。
了解更多?
对于clangd,在 cpp_workspace 文件夹中存放了两个配置文件
.clangd
、
.clang-format
它们分别定义了 clangd 的 配置项 和 代码格式化风格,你可以自行编辑修改
Q. 为什么 clangd 格式化无效?
A. 这是因为你在设置面板中填写的 LSP 工作路径不正确
Q. 为什么 clangd 无法识别我的 <bits/stdc++.h>
头文件?
A. 这是因为 <bits/stdc++.h>
不是标准头文件,因此 clangd 默认不支持,你需要在 OJBetter_Bridge 的 cpp_workspace
中的 .clangd
文件中通过修改编译器参数来告诉 clang 去哪找到这个非标准的头文件(当然也不推荐使用万能头)
Q. 静态补全增强可不可以使用本地的 JSON 文件?
A. 由于浏览器的安全限制,你并不能直接使用形如
file:///xxx
的 URL 来在浏览器中访问你的本地 JSON 文件。
不过你可以借助 OJBetter_Bridge 来做到,很简单,你只需要将 JSON 文件 xxx.json
放置到 OJBetter_Bridge 的 /mycomplet 文件夹中
启动 OJBetter_Bridge,就可以在设置面板中新建配置,JSON URL为:http://127.0.0.1:2323/mycomplet/xxx.json
。
贡献代码
欢迎贡献代码,请前往 Github仓库 创建PR
其他OJ?
由于作者精力有限,并不会维护太多的类似脚本,如果你想为喜欢的 OJ 移植该脚本,非常欢迎,你只需要遵守 GPL-3.0 license 许可即可
感谢
感谢你们,0rz