// ==UserScript== // @name Atcoder Better! // @namespace https://greasyfork.org/users/747162 // @version 1.12 // @description Atcoder界面汉化、题目翻译、markdown视图、一键复制题目、跳转到洛谷 // @author 北极小狐 // @match https://atcoder.jp/* // @run-at document-start // @connect www2.deepl.com // @connect www.iflyrec.com // @connect m.youdao.com // @connect api.interpreter.caiyunai.com // @connect translate.google.com // @connect openai.api2d.net // @connect api.openai.com // @connect www.luogu.com.cn // @connect greasyfork.org // @connect * // @grant GM_xmlhttpRequest // @grant GM_info // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_addStyle // @grant GM_setClipboard // @icon https://aowuucdn.oss-cn-beijing.aliyuncs.com/atcoder.png // @require https://cdn.staticfile.org/turndown/7.1.2/turndown.min.js // @require https://cdn.staticfile.org/markdown-it/13.0.1/markdown-it.min.js // @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js // @license MIT // @compatible Chrome // @compatible Firefox // @compatible Edge // @downloadURL none // ==/UserScript== // 状态与初始化 const getGMValue = (key, defaultValue) => { const value = GM_getValue(key); if (value === undefined || value === "") { GM_setValue(key, defaultValue); return defaultValue; } return value; }; var darkMode = getGMValue("darkMode", "follow"); var is_problem, is_homepage; var bottomZh_CN, showLoading, hoverTargetAreaDisplay, expandFoldingblocks, enableSegmentedTranslation, translation; var openai_model, openai_key, openai_proxy, openai_header, openai_data, opneaiConfig; var replaceSymbol, commentPaging, showJumpToLuogu, loaded; var isEnglishLanguage; function init() { const { hostname, href } = window.location; is_problem = href.includes('/tasks/'); is_homepage = (href === 'https://atcoder.jp/' || href === 'https://atcoder.jp/?lang=ja'); bottomZh_CN = getGMValue("bottomZh_CN", true); showLoading = getGMValue("showLoading", true); hoverTargetAreaDisplay = getGMValue("hoverTargetAreaDisplay", false); expandFoldingblocks = getGMValue("expandFoldingblocks", true); commentPaging = getGMValue("commentPaging", true); enableSegmentedTranslation = getGMValue("enableSegmentedTranslation", false); showJumpToLuogu = getGMValue("showJumpToLuogu", true); loaded = getGMValue("loaded", false); translation = getGMValue("translation", "deepl"); replaceSymbol = getGMValue("replaceSymbol", "2"); //openai opneaiConfig = getGMValue("chatgpt-config", { "choice": -1, "configurations": [] }); if (opneaiConfig.choice !== -1 && opneaiConfig.configurations.length !== 0) { const configAtIndex = opneaiConfig.configurations[opneaiConfig.choice]; if (configAtIndex == undefined) { let existingConfig = GM_getValue('chatgpt-config'); existingConfig.choice = 0; GM_setValue('chatgpt-config', existingConfig); location.reload(); } openai_model = configAtIndex.model; openai_key = configAtIndex.key; openai_proxy = configAtIndex.proxy; openai_header = configAtIndex._header ? configAtIndex._header.split("\n").map(header => { const [key, value] = header.split(":"); return { [key.trim()]: value.trim() }; }) : []; openai_data = configAtIndex._data ? configAtIndex._data.split("\n").map(header => { const [key, value] = header.split(":"); return { [key.trim()]: value.trim() }; }) : []; } } // 常量 const helpCircleHTML = '
'; const unfoldIcon = ``; const putawayIcon = ``; const copyIcon = ``; const darkenPageStyle = `body::before { content: ""; display: block; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.4); z-index: 1100; }`; const darkenPageStyle2 = `body::before { content: ""; display: block; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.4); z-index: 1300; }`; // 切换系统黑暗监听 const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)'); const changeEventListeners = []; function handleColorSchemeChange(event) { const newColorScheme = event.matches ? $('html').attr('data-theme', 'dark') : $('html').attr('data-theme', 'light'); if (!event.matches) { var originalColor = $(this).data("original-color"); $(this).css("background-color", originalColor); } } // 黑暗模式 (function setDark() { // 初始化 function setDarkTheme() { const htmlElement = document.querySelector('html'); if (htmlElement) { htmlElement.setAttribute('data-theme', 'dark'); } else { setTimeout(setDarkTheme, 100); } } if (darkMode == "dark") { setDarkTheme(); } else if (darkMode == "follow") { // 添加事件监听器 changeEventListeners.push(handleColorSchemeChange); mediaQueryList.addEventListener('change', handleColorSchemeChange); if (window.matchMedia('(prefers-color-scheme: dark)').matches) setDarkTheme(); } GM_addStyle(` /* 黑暗支持 */ html[data-theme=dark]:root { color-scheme: light dark; } /* 文字颜色1 */ html[data-theme=dark] .float-container>#main-container, html[data-theme=dark] .alert-success, html[data-theme=dark] .alert-info, html[data-theme=dark] .alert-danger, html[data-theme=dark] .alert-warning, html[data-theme=dark] .panel-default>.panel-heading, html[data-theme=dark] #header a, html[data-theme=dark] .pagination>li>a, html[data-theme=dark] .pagination>li>span, html[data-theme=dark] .dropdown-menu, html[data-theme=dark] .select2-container--bootstrap .select2-selection--single .select2-selection__rendered, html[data-theme=dark] .ace-tm .ace_gutter, html[data-theme=dark] .translate-problem-statement-panel, html[data-theme=dark] .translate-problem-statement, html[data-theme=dark] .select2-container--bootstrap .select2-results__option--highlighted[aria-selected], html[data-theme=dark] .nav-pills>li.active>a, html[data-theme=dark] .user-unrated, html[data-theme=dark] #header .header-page li.is-active a, html[data-theme=dark] .m-box_inner, html[data-theme=dark] .m-list-job_item, html[data-theme=dark] .a-btn_arrow, html[data-theme=dark] #header, html[data-theme=dark] #header .header-sub_page li a{ color: #a0adb9 !important; } /* 文字颜色2 */ html[data-theme=dark] pre, html[data-theme=dark] .html2mdButton, html[data-theme=dark] .btn-default, html[data-theme=dark] .btn-pre, html[data-theme=dark] small.contest-duration, html[data-theme=dark] .select2-container--bootstrap .select2-results__option, html[data-theme=dark] #ace_settingsmenu, #kbshortcutmenu, html[data-theme=dark] code{ color: #9099a3; } /* 文字颜色3 */ html[data-theme=dark] input, html[data-theme=dark] #header .header-page li a:hover{ color: #6385a6 !important; } /* 文字颜色4 */ html[data-theme=dark] .katex{ color: #cbd6e2 !important; } /* 链接颜色 */ html[data-theme=dark] a:link { color: #a0adb9; } html[data-theme=dark] a:visited { color: #8590a6; } /* 按钮 */ html[data-theme=dark] input:hover, html[data-theme=dark] .btn-default:hover{ background-color: #22272e !important; } /* 背景层次1 */ html[data-theme=dark] body, html[data-theme=dark] #main-div.float-container, html[data-theme=dark] pre, html[data-theme=dark] .html2mdButton:hover, html[data-theme=dark] .pagination>.active>a, html[data-theme=dark] .ace-tm, html[data-theme=dark] .dropdown-menu>li>a:hover, html[data-theme=dark] .dropdown-menu>li>a:focus, html[data-theme=dark] .dropdown-menu .divider, html[data-theme=dark] .select2-container--bootstrap .select2-selection, html[data-theme=dark] .ace-tm .ace_gutter-active-line, html[data-theme=dark] .select2-dropdown, html[data-theme=dark] input, html[data-theme=dark] button, html[data-theme=dark] select, html[data-theme=dark] textarea, html[data-theme=dark] code, html[data-theme=dark] .AtBetter_setting_menu, html[data-theme=dark] .AtBetter_setting_sidebar li a.active, html[data-theme=dark] .AtBetter_setting_sidebar li, html[data-theme=dark] .AtBetter_setting_menu::-webkit-scrollbar-track, html[data-theme=dark] .AtBetter_setting_content::-webkit-scrollbar-track, html[data-theme=dark] .AtBetter_modal, html[data-theme=dark] .AtBetter_modal button:hover, html[data-theme=dark] #config_bar_list, html[data-theme=dark] .translate-problem-statement-panel, html[data-theme=dark] .translate-problem-statement, html[data-theme=dark] #keyvisual .keyvisual-inner:before, html[data-theme=dark] .m-box_inner, html[data-theme=dark] .m-list-job_item{ background-color: #22272e !important; } /* 背景层次2 */ html[data-theme=dark] .float-container>#main-container, html[data-theme=dark] #contest-nav-tabs, html[data-theme=dark] .btn-default, html[data-theme=dark] .html2mdButton, html[data-theme=dark] .nav-tabs>li.active>a, html[data-theme=dark] .nav-tabs>li.active>a:hover, html[data-theme=dark] .nav-tabs>li.active>a:focus, html[data-theme=dark] .nav>li>a:hover, html[data-theme=dark] .nav>li>a:focus, html[data-theme=dark] .panel, html[data-theme=dark] .table-striped>tbody>tr:nth-of-type(odd), html[data-theme=dark] .insert-participant-box, html[data-theme=dark] .btn-pre, html[data-theme=dark] .alert-success, html[data-theme=dark] .alert-info, html[data-theme=dark] .alert-danger, html[data-theme=dark] .alert-warning, html[data-theme=dark] .panel-default>.panel-heading, html[data-theme=dark] .pagination>li>a, html[data-theme=dark] .pagination>li>span, html[data-theme=dark] .dropdown-menu, html[data-theme=dark] .ace-tm .ace_gutter, html[data-theme=dark] .select2-container--bootstrap .select2-results__option[aria-selected=true], html[data-theme=dark] #ace_settingsmenu, #kbshortcutmenu, html[data-theme=dark] .AtBetter_setting_sidebar li, html[data-theme=dark] .AtBetter_setting_list, html[data-theme=dark] #header .header-inner, html[data-theme=dark] .AtBetter_setting_menu hr, html[data-theme=dark] .AtBetter_setting_sidebar li a, html[data-theme=dark] .AtBetter_setting_menu::-webkit-scrollbar-thumb, html[data-theme=dark] .AtBetter_setting_content::-webkit-scrollbar-thumb, html[data-theme=dark] .AtBetter_modal button, html[data-theme=dark] ul#config_bar_ul::-webkit-scrollbar-thumb, html[data-theme=dark] .panel-info>.panel-heading, html[data-theme=dark] .post-footer, html[data-theme=dark] .a-btn_arrow:before, html[data-theme=dark] .table-hover>tbody>tr:hover, html[data-theme=dark] .AtBetter_contextmenu{ background-color: #2d333b !important; } /* 实线边框颜色-圆角 */ html[data-theme=dark] input{ border: 1px solid #424b56 !important; border-radius: 2px; } /* 实线边框颜色-无圆角 */ html[data-theme=dark] .btn-default, html[data-theme=dark] .html2mdButton, html[data-theme=dark] .nav-tabs>li>a:hover, html[data-theme=dark] .nav-tabs>li.active>a, html[data-theme=dark] .nav-tabs>li.active>a:hover, html[data-theme=dark] .nav-tabs>li.active>a:focus, html[data-theme=dark] .btn-pre, html[data-theme=dark] .btn-pre:hover, html[data-theme=dark] pre, html[data-theme=dark] .pagination>li>a, html[data-theme=dark] .pagination>li>span, html[data-theme=dark] .table-bordered>thead>tr>th, html[data-theme=dark] .table-bordered>tbody>tr>th, html[data-theme=dark] .table-bordered>tfoot>tr>th, html[data-theme=dark] .table-bordered>thead>tr>td, html[data-theme=dark] .table-bordered>tbody>tr>td, html[data-theme=dark] .table-bordered>tfoot>tr>td, html[data-theme=dark] .panel, html[data-theme=dark] #editor, html[data-theme=dark] .AtBetter_setting_list, html[data-theme=dark] .AtBetter_setting_sidebar li, html[data-theme=dark] .AtBetter_setting_menu select, html[data-theme=dark] .AtBetter_modal button, html[data-theme=dark] div#config_bar_list, html[data-theme=dark] label.config_bar_ul_li_text, html[data-theme=dark] .translate-problem-statement-panel, html[data-theme=dark] .translate-problem-statement, html[data-theme=dark] .select2-container--bootstrap .select2-selection{ border: 1px solid #424b56 !important; } html[data-theme=dark] hr, html[data-theme=dark] .panel-footer, html[data-theme=dark] .table>thead>tr>th, html[data-theme=dark] .table>tbody>tr>th, html[data-theme=dark] .table>tfoot>tr>th, html[data-theme=dark] .table>thead>tr>td, html[data-theme=dark] .table>tbody>tr>td, html[data-theme=dark] .table>tfoot>tr>td{ border-top: 1px solid #424b56 !important; } html[data-theme=dark] .nav-tabs, html[data-theme=dark] .panel-info>.panel-heading, html[data-theme=dark] .panel-default>.panel-heading, html[data-theme=dark] .a-btn_arrow{ border-bottom: 1px solid #424b56 !important; } html[data-theme=dark] .table>thead>tr>th{ border-bottom: 2px solid #424b56 !important; } html[data-theme=dark] .AtBetter_setting_sidebar { border-right: 1px solid #424b56 !important; } /* 双实线边框颜色 */ html[data-theme=dark] #header .header-inner{ border-bottom: 5px double #22272e !important; } /* 阴影 */ html[data-theme=dark] .float-container>#main-container{ box-shadow: 0px 0px 10px 5px #fff0; } /* 虚线边框颜色 */ html[data-theme=dark] .AtBetter_setting_menu_label_text, html[data-theme=dark] li#add_button{ border: 1px dashed #424b56 !important; } /* focus-visible html[data-theme=dark] { border-width: 1.5px !important; outline: none; }*/ /* 图片-亮度 */ html[data-theme=dark] img{ opacity: .75; } /* 反转 */ html[data-theme=dark] .ace_content, html[data-theme=dark] #header .header-logo img{ filter: invert(1) hue-rotate(.5turn); } /* 区域遮罩 */ html[data-theme=dark] .overlay { background: repeating-linear-gradient(135deg, #49525f6e, #49525f6e 30px, #49525f29 0px, #49525f29 55px); color: #9099a3; text-shadow: 0px 0px 2px #000000; } /* 其他样式 */ html[data-theme=dark] .nav-tabs>li.active>a, html[data-theme=dark] .nav-tabs>li.active>a:hover, html[data-theme=dark] .nav-tabs>li.active>a:focus{ border-bottom-color: transparent !important; } html[data-theme=dark] .AtBetter_setting_menu, html[data-theme=dark] .AtBetter_modal{ box-shadow: 0px 0px 0px 4px #2d333b; border: 1px solid #2d333b; } html[data-theme=dark] .collapsible-topic.collapsed .content .collapsible-topic-options:before{ background-image: linear-gradient(#22272e00, #22272e); } html[data-theme=dark] .alert{ text-shadow: none; } html[data-theme=dark] input[type="radio"]:checked+.AtBetter_setting_menu_label_text { color: #a0adb9 !important; border: 1px solid #326154 !important; } html[data-theme=dark] .AtBetter_setting_menu .btn-close{ background-color: #ef5350a1 !important; } html[data-theme=dark] .m-box-news_post:before{ background: linear-gradient(0deg, #22272e 50%, rgba(255,255,255,0) 100%); } html[data-theme=dark] #header .header-sub_page li a:before, html[data-theme=dark] #header .header-page li a:before{ background-color: #9e9e9e !important; } `); })() // 样式 GM_addStyle(` html { scroll-behavior: smooth; } :root { --vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } span.mdViewContent { white-space: pre-wrap; } /*翻译区域提示*/ .overlay { pointer-events: none; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient(135deg, #97e7cacc, #97e7cacc 30px, #e9fbf1cc 0px, #e9fbf1cc 55px); border-radius: 5px; display: flex; align-items: center; justify-content: center; color: #00695C; font-size: 16px; font-weight: bold; text-shadow: 0px 0px 2px #edfcf4; } /*翻译div*/ .translate-problem-statement { justify-items: start; letter-spacing: 1.8px; color: #059669; background-color: #f9f9fa; border: 1px solid #10b981; border-radius: 0.3rem; padding: 5px; margin: -1px 0px 10px 0px; width: 100%; box-sizing: border-box; font-size: 13px; } .translate-problem-statement.error_translate { color: red; border-color: red; } .translate-problem-statement h2, .translate-problem-statement h3 { font-size: 16px; } .translate-problem-statement ul { line-height: 100%; } .translate-problem-statement a, .translate-problem-statement a:link { color: #10b981; font-weight: 600; background: 0 0; text-decoration: none; } .translate-problem-statement p { font-size: 14px !important; } .translate-problem-statement img { max-width: 100.0%; max-height: 100.0%; } .translate-problem-statement .katex { font-size: 14px; } .translate-problem-statement a:hover { text-decoration: revert; } .translate-problem-statement-panel{ display: flex; justify-content: space-between; background-color: #f9f9fa; border: 1px solid #c5ebdf; border-radius: 0.3rem; margin: 4px 0px; } .html2md-panel { display: flex; justify-content: flex-end; align-items: center; } .html2md-panel a { text-decoration: none; } .html2mdButton { display: flex; align-items: center; cursor: pointer; background-color: #ffffff; color: #606266; height: 22px; width: auto; font-size: 13px; border-radius: 0.3rem; padding: 1px 5px; margin: 5px !important; border: 1px solid #dcdfe6; } .html2mdButton:hover { color: #409eff; border-color: #409eff; } button.html2mdButton.copied { background-color: #f0f9eb; color: #67c23e; border: 1px solid #b3e19d; } button.html2mdButton.mdViewed { background-color: #fdf6ec; color: #e6a23c; border: 1px solid #f3d19e; } button.html2mdButton.error { background-color: #fef0f0; color: #f56c6c; border: 1px solid #fab6b6; } button.translated { cursor: not-allowed; background-color: #f0f9eb; color: #67c23e; border: 1px solid #b3e19d; } button.html2mdButton.reTranslation { background-color: #f4f4f5; color: #909399; border: 1px solid #c8c9cc; } .borderlessButton{ display: flex; align-items: center; margin: 2.5px 7px; fill: #9E9E9E; } .borderlessButton:hover{ cursor: pointer; fill: #059669; } .translate-problem-statement table { border: 1px #ccc solid !important; margin: 1.5em 0 !important; color: #059669 !important; } .translate-problem-statement table thead th { border: 1px #ccc solid !important; color: #059669 !important; } .translate-problem-statement table td { border-right: 1px solid #ccc; border-top: 1px solid #ccc; padding: 0.7143em 0.5em; } .translate-problem-statement table th { padding: 0.7143em 0.5em; } .translate-problem-statement p:not(:first-child) { margin: 1.5em 0 0; } /*设置面板*/ header .enter-or-register-box, header .languages { position: absolute; right: 170px; } button.html2mdButton.AtBetter_setting { float: right; height: 30px; background: #3c5a7f; color: white; margin: 10px !important; border: 0px; } button.html2mdButton.AtBetter_setting.open { background-color: #e6e6e61f; color: #727378; cursor: not-allowed; } .AtBetter_setting_menu { z-index: 1200; box-shadow: 0px 0px 0px 4px #ffffff; display: grid; position: fixed; top: 50%; left: 50%; width: 485px; height: 600px; transform: translate(-50%, -50%); border-radius: 6px; background-color: #f0f4f9; border-collapse: collapse; border: 1px solid #ffffff; color: #697e91; font-family: var(--vp-font-family-base); padding: 10px 20px 20px 10px; box-sizing: content-box; } .AtBetter_setting_menu h4,.AtBetter_setting_menu h5 { font-weight: 600; margin: 15px 0px 10px 0px; } .AtBetter_setting_menu h3 { margin-top: 10px; } .AtBetter_setting_menu hr { border: none; height: 1px; background-color: #ccc; margin: 10px 0; } .AtBetter_setting_menu .badge { border-radius: 4px; border: 1px solid #009688; color: #009688; font-size: 12px; padding: 0.5px 4px; margin-left: 5px; margin-right: auto; } /* 页面切换 */ .settings-page { display: none; } .settings-page.active { display: block; } .AtBetter_setting_container { display: flex; } .AtBetter_setting_sidebar { width: 120px; padding: 6px 10px 6px 6px; margin: 20px 0px; border-right: 1px solid #d4d8e9; } .AtBetter_setting_content { flex-grow: 1; width: 350px; margin: 20px 0px 0px 20px; padding-right: 10px; max-height: 580px; overflow-y: auto; box-sizing: border-box; } .AtBetter_setting_sidebar h3 { margin-top: 0; } .AtBetter_setting_sidebar hr { margin-top: 10px; margin-bottom: 10px; border: none; border-top: 1px solid #DADCE0; } .AtBetter_setting_sidebar ul { list-style-type: none; margin: 0; padding: 0; } .AtBetter_setting_sidebar li { margin: 5px 0px; background-color: #ffffff; border: 1px solid #d4d8e9; border-radius: 4px; font-size: 16px; } .AtBetter_setting_sidebar li a { text-decoration: none; display: flex; width: 100%; color: gray; letter-spacing: 2px; padding: 7px; border-radius: 4px; align-items: center; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .AtBetter_setting_sidebar li a.active { background-color: #eceff1c7; } /* 下拉选择框 */ .AtBetter_setting_menu select { margin-left: 6px; border-style: solid; border-color: #26A69A; color: #009688; font-size: 15px; } .AtBetter_setting_menu select:focus-visible { outline: none; } /*设置面板-滚动条*/ .AtBetter_setting_menu::-webkit-scrollbar, .AtBetter_setting_content::-webkit-scrollbar { width: 5px; height: 7px; background-color: #aaa; } .AtBetter_setting_menu::-webkit-scrollbar-thumb, .AtBetter_setting_content::-webkit-scrollbar-thumb { background-clip: padding-box; background-color: #d7d9e4; } .AtBetter_setting_menu::-webkit-scrollbar-track, .AtBetter_setting_content::-webkit-scrollbar-track { background-color: #f1f1f1; } /*设置面板-关闭按钮*/ .AtBetter_setting_menu .tool-box { position: absolute; align-items: center; justify-content: center; width: 20px; height: 20px; overflow: hidden; border-radius: 10px; top: 3px; right: 3px; } .AtBetter_setting_menu .btn-close { display: flex; text-align: center; width: 20px; height: 20px; color: transparent; font-size: 0; cursor: pointer; background-color: #ff000080; border: none; margin: 0px; padding: 0px; overflow: hidden; transition: .15s ease all; align-items: center; justify-content: center; box-sizing: border-box; } .AtBetter_setting_menu .btn-close:hover { width: 20px; height: 20px !important; font-size: 17px; color: #ffffff; background-color: #ff0000cc; box-shadow: 0 5px 5px 0 #00000026; } .AtBetter_setting_menu .btn-close:active { width: 20px; height: 20px; font-size: 1px; color: #ffffffde; --shadow-btn-close: 0 3px 3px 0 #00000026; box-shadow: var(--shadow-btn-close); } /*设置面板-checkbox*/ .AtBetter_setting_menu input[type=checkbox]:focus { outline: 0px; } .AtBetter_setting_menu input[type="checkbox"] { margin: 0px; appearance: none; -webkit-appearance: none; width: 40px; height: 20px !important; border: 1.5px solid #D7CCC8; padding: 0px !important; border-radius: 20px; background: #efebe978; position: relative; box-sizing: border-box; } .AtBetter_setting_menu input[type="checkbox"]::before { content: ""; width: 14px; height: 14px; background: #D7CCC8; border: 1.5px solid #BCAAA4; border-radius: 50%; position: absolute; top: 0; left: 0; transform: translate(2%, 2%); transition: all 0.3s ease-in-out; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .AtBetter_setting_menu input[type="checkbox"]::after { content: url("data:image/svg+xml,%3Csvg xmlns='://www.w3.org/2000/svg' width='23' height='23' viewBox='0 0 23 23' fill='none'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.55021 5.84315L17.1568 16.4498L16.4497 17.1569L5.84311 6.55026L6.55021 5.84315Z' fill='%23EA0707' fill-opacity='0.89'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.1567 6.55021L6.55012 17.1568L5.84302 16.4497L16.4496 5.84311L17.1567 6.55021Z' fill='%23EA0707' fill-opacity='0.89'/%3E%3C/svg%3E"); position: absolute; top: 0; left: 24px; } .AtBetter_setting_menu input[type="checkbox"]:checked { border: 1.5px solid #C5CAE9; background: #E8EAF6; } .AtBetter_setting_menu input[type="checkbox"]:checked::before { background: #C5CAE9; border: 1.5px solid #7986CB; transform: translate(122%, 2%); transition: all 0.3s ease-in-out; } .AtBetter_setting_menu input[type="checkbox"]:checked::after { content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 15 13' fill='none'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M14.8185 0.114533C15.0314 0.290403 15.0614 0.605559 14.8855 0.818454L5.00187 12.5L0.113036 6.81663C-0.0618274 6.60291 -0.0303263 6.2879 0.183396 6.11304C0.397119 5.93817 0.71213 5.96967 0.886994 6.18339L5.00187 11L14.1145 0.181573C14.2904 -0.0313222 14.6056 -0.0613371 14.8185 0.114533Z' fill='%2303A9F4' fill-opacity='0.9'/%3E%3C/svg%3E"); position: absolute; top: 1.5px; left: 4.5px; } .AtBetter_setting_menu label, #darkMode_span, #loaded_span { font-size: 16px; font-weight: initial; } .AtBetter_setting_list { display: flex; align-items: center; padding: 10px; margin: 5px 0px; background-color: #ffffff; border-bottom: 1px solid #c9c6c696; border-radius: 8px; justify-content: space-between; } /*设置面板-radio*/ .AtBetter_setting_menu #translation-settings label { display: grid; list-style-type: none; padding-inline-start: 0px; overflow-x: auto; max-width: 100%; margin: 0px; align-items: center; margin: 3px 0px; } .AtBetter_setting_menu_label_text { display: flex; border: 1px dashed #00aeeccc; height: 35px; width: 100%; color: gray; font-weight: 300; font-size: 14px; letter-spacing: 2px; padding: 7px; align-items: center; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"]:checked+.AtBetter_setting_menu_label_text { background: #41e49930; border: 1px solid green; color: green; font-weight: 500; } .AtBetter_setting_menu label input[type="radio"], .AtBetter_contextmenu label input[type="radio"]{ appearance: none; list-style: none; padding: 0px !important; margin: 0px; clip: rect(0 0 0 0); -webkit-clip-path: inset(100%); clip-path: inset(100%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } .AtBetter_setting_menu input[type="text"] { display: block; height: 25px !important; width: 100%; background-color: #ffffff; color: #727378; font-size: 12px; border-radius: 0.3rem; padding: 1px 5px !important; box-sizing: border-box; margin: 5px 0px 5px 0px; border: 1px solid #00aeeccc; box-shadow: 0 0 1px #0000004d; } .AtBetter_setting_menu .AtBetter_setting_list input[type="text"] { margin-left: 5px; } .AtBetter_setting_menu input[type="text"]:focus-visible{ border-style: solid; border-color: #3f51b5; outline: none; } .AtBetter_setting_menu_input { width: 100%; display: grid; margin-top: 5px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .AtBetter_setting_menu input::placeholder { color: #727378; } .AtBetter_setting_menu input.no_default::placeholder{ color: #BDBDBD; } .AtBetter_setting_menu input.is_null::placeholder{ color: red; border-width: 1.5px; } .AtBetter_setting_menu input.is_null{ border-color: red; } .AtBetter_setting_menu textarea { display: block; width: 100%; height: 60px; background-color: #ffffff; color: #727378; font-size: 12px; padding: 1px 5px !important; box-sizing: border-box; margin: 5px 0px 5px 0px; border: 1px solid #00aeeccc; box-shadow: 0 0 1px #0000004d; } .AtBetter_setting_menu textarea:focus-visible{ border-style: solid; border-color: #3f51b5; outline: none; } .AtBetter_setting_menu textarea::placeholder{ color: #BDBDBD; font-size: 14px; } .AtBetter_setting_menu #save { cursor: pointer; display: inline-flex; padding: 5px; background-color: #1aa06d; color: #ffffff; font-size: 14px; line-height: 1.5rem; font-weight: 500; justify-content: center; width: 100%; border-radius: 0.375rem; border: none; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); margin-top: 20px } .AtBetter_setting_menu button#debug_button.debug_button { width: 18%; } .AtBetter_setting_menu span.tip { color: #999; font-size: 12px; font-weight: 500; padding: 5px 0px; } /*设置面板-tip*/ .help_tip { margin-right: auto; } span.input_label { font-size: 14px; } .help_tip .tip_text { display: none; position: absolute; color: #697e91; font-weight: 400; font-size: 14px; letter-spacing: 0px; background-color: #ffffff; padding: 10px; margin: 5px 0px; border-radius: 4px; border: 1px solid #e4e7ed; box-shadow: 0px 0px 12px rgba(0, 0, 0, .12); z-index: 1100; } .help_tip .tip_text p { margin-bottom: 5px; } .help_tip .tip_text:before { content: ""; position: absolute; top: -20px; right: -10px; bottom: -10px; left: -10px; z-index: -1; } .help-icon { cursor: help; width: 15px; color: #b4b9d4; margin-left: 5px; margin-top: 3px; } .AtBetter_setting_menu .AtBetter_setting_menu_label_text .help_tip .help-icon { color: #7fbeb2; } .help_tip .help-icon:hover + .tip_text, .help_tip .tip_text:hover { display: block; cursor: help; width: 250px; } /*确认弹窗*/ .AtBetter_modal { z-index: 1600; display: grid; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 12px; font-family: var(--vp-font-family-base); padding: 10px 20px; box-shadow: 0px 0px 0px 4px #ffffff; border-radius: 6px; background-color: #f0f4f9; border-collapse: collapse; border: 1px solid #ffffff; color: #697e91; } .AtBetter_modal h2 { font-size: 1.6em; margin: 0px; } .AtBetter_modal .buttons{ display: flex; padding-top: 15px; } .AtBetter_modal button { display: inline-flex; justify-content: center; align-items: center; line-height: 1; white-space: nowrap; cursor: pointer; text-align: center; box-sizing: border-box; outline: none; transition: .1s; user-select: none; vertical-align: middle; -webkit-appearance: none; height: 24px; padding: 5px 11px; margin-right: 15px; font-size: 12px; border-radius: 4px; color: #ffffff; background: #009688; border-color: #009688; border: none; } .AtBetter_modal button#cancelButton{ background-color:#4DB6AC; } .AtBetter_modal button:hover{ background-color:#4DB6AC; } .AtBetter_modal button#cancelButton:hover { background-color: #80CBC4; } .AtBetter_modal .help-icon { margin: 0px 8px 0px 0px; height: 1em; width: 1em; line-height: 1em; display: inline-flex; justify-content: center; align-items: center; position: relative; fill: currentColor; font-size: inherit; } .AtBetter_modal p { margin: 5px 0px; } /*更新检查*/ div#update_panel { z-index: 1200; position: fixed; top: 50%; left: 50%; width: 240px; transform: translate(-50%, -50%); box-shadow: 0px 0px 4px 0px #0000004d; padding: 10px 20px 20px 20px; color: #444242; background-color: #f5f5f5; border: 1px solid #848484; border-radius: 8px; } div#update_panel #updating { cursor: pointer; display: inline-flex; padding: 0px; background-color: #1aa06d; color: #ffffff; font-size: 14px; line-height: 1.5rem; font-weight: 500; justify-content: center; width: 100%; border-radius: 0.375rem; border: none; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); } div#update_panel #updating a { text-decoration: none; color: white; display: flex; position: inherit; top: 0; left: 0; width: 100%; height: 22px; font-size: 14px; justify-content: center; align-items: center; } #skip_menu { display: flex; margin-top: 10px; justify-content: flex-end; align-items: center; } #skip_menu .help_tip { margin-right: 5px; margin-left: -5px; } #skip_menu .help-icon { color: #f44336; } /* 配置管理 */ .embed-responsive { height: max-content; padding-bottom: 0px; } .config_bar { height: 70px; width: 100%; display: flex; justify-content: space-between; } li#add_button { cursor: pointer; height: 40px; border: 1px dashed #BDBDBD; border-radius: 8px; background-color: #fcfbfb36; color: #bdbdbd; font-size: 14px; align-items: center; justify-content: center; } li#add_button:hover { border: 1px dashed #03A9F4; background-color: #d7f0fb8c; color: #03A9F4; } div#config_bar_list { display: flex; width: 340px; border: 1px solid #c5cae9; border-radius: 8px; background-color: #f0f8ff; box-sizing: border-box; } div#config_bar_list input[type="radio"] { appearance: none; width: 0; height: 0; overflow: hidden; } div#config_bar_list input[type="radio"] { margin: 0px; } div#config_bar_list input[type=radio]:focus { outline: 0px; } label.config_bar_ul_li_text { display: flex; align-items: center; justify-content: center; max-width: 100%; height: 40px; overflow-x: auto; font-size: 14px; font-weight: 400; margin: 0px 4px; padding: 3px; border: 1px solid #dedede; border-radius: 10px; box-shadow: 0px 2px 4px 0px rgba(0,0,0,.05); box-sizing: border-box; } ul#config_bar_ul li button { background-color: #e6e6e6; color: #727378; height: 23px; font-size: 14px; border-radius: 0.3rem; padding: 1px 5px; margin: 5px; border: none; box-shadow: 0 0 1px #0000004d; } ul#config_bar_ul { display: flex; align-items: center; list-style-type: none; padding-inline-start: 0px; overflow-x: auto; max-width: 100%; margin: 0px; } ul#config_bar_ul li { width: 80px; display: grid; margin: 4px 4px; min-width: 100px; box-sizing: border-box; } label.config_bar_ul_li_text:hover { background-color: #eae4dc24; } input[type="radio"]:checked + .config_bar_ul_li_text { background: #41b3e430; border: 1px solid #5e7ce0; color: #5e7ce0; } ul#config_bar_ul::-webkit-scrollbar { width: 5px; height: 5px; } ul#config_bar_ul::-webkit-scrollbar-thumb { background-clip: padding-box; background-color: #d7d9e4; border-radius: 8px; } ul#config_bar_ul::-webkit-scrollbar-button:start:decrement { width: 4px; background-color: transparent; } ul#config_bar_ul::-webkit-scrollbar-button:end:increment { width: 4px; background-color: transparent; } ul#config_bar_ul::-webkit-scrollbar-track { border-radius: 5px; } label.config_bar_ul_li_text::-webkit-scrollbar { width: 5px; height: 7px; background-color: #aaa; } label.config_bar_ul_li_text::-webkit-scrollbar-thumb { background-clip: padding-box; background-color: #d7d9e4; } label.config_bar_ul_li_text::-webkit-scrollbar-track { background-color: #f1f1f1; } .config_bar_list_add_div { display: flex; height: 40px; margin: 4px 2px; } /* 修改菜单 */ div#config_bar_menu { z-index: 1300; position: absolute; width: 60px; background: #ffffff; box-shadow: 1px 1px 4px 0px #0000004d; border: 0px solid rgba(0,0,0,0.04); border-radius: 4px; padding: 8px 0; } div.config_bar_menu_item { cursor: pointer; padding: 2px 6px; display: flex; justify-content: center; align-items: center; height: 32px; color: rgba(0,0,0,0.75); font-size: 14px; font-weight: 500; box-shadow: inset 0px 0px 0px 0px #8bb2d9; } div#config_bar_menu_edit:hover { background-color: #00aeec; color: white; } div#config_bar_menu_delete:hover { background-color: #FF5722; color: white; } /* 配置页面 */ #config_edit_menu { z-index: 1300; width: 450px; } /* 黑暗模式选项 */ .dark-mode-selection { display: flex; justify-content: center; align-items: center; max-width: 350px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .dark-mode-selection > * { margin: 6px; } .dark-mode-selection .AtBetter_setting_menu_label_text { border-radius: 8px; } /* 右键菜单 */ .AtBetter_contextmenu { z-index: 1500; display: grid; position: absolute; background-color: #f0f4f9; border-collapse: collapse; color: #697e91; font-family: var(--vp-font-family-base); overflow: hidden; box-sizing: content-box; box-shadow: 0px 0px 0px 2px #eddbdb4d; } input[type="radio"]:checked+.AtBetter_contextmenu_label_text { background: #41e49930; border: 1px solid green; color: green; font-weight: 500; } .AtBetter_contextmenu label{ margin: 0px; font-weight: initial; } .AtBetter_contextmenu_label_text { display: flex; border: 1px dashed #80cbc4; height: 26px; width: 100%; color: gray; font-size: 13px; padding: 4px; align-items: center; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .AtBetter_contextmenu_label_text:hover { color: #F44336; border: 1px dashed #009688; background-color: #ffebcd; } /* alert提示 */ .AtBetter_alert{ margin: 1em; text-align: center; font-weight: 600; position: relative; margin-left: -15px; margin-right: -15px; } `); // 获取cookie function getCookie(name) { const cookies = document.cookie.split(";"); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); const [cookieName, cookieValue] = cookie.split("="); if (cookieName === name) { return decodeURIComponent(cookieValue); } } return ""; } // 防抖函数 function debounce(callback) { let timer; let immediateExecuted = false; const delay = 500; return function () { clearTimeout(timer); if (!immediateExecuted) { callback.call(this); immediateExecuted = true; } timer = setTimeout(() => { immediateExecuted = false; }, delay); }; } // 为元素添加鼠标拖动 function addDraggable(element) { let isDragging = false; let initialX, initialY; // 元素的初始位置 let startX, startY, offsetX, offsetY; // 鼠标起始位置,移动偏移量 let isSpecialMouseDown = false; // 选取某些元素时不拖动 element.on('mousedown', function (e) { var elem = $(this); var elemOffset = elem.offset(); var centerX = elemOffset.left + elem.outerWidth() / 2; var centerY = elemOffset.top + elem.outerHeight() / 2; initialX = centerX - window.pageXOffset; initialY = centerY - window.pageYOffset; isDragging = true; startX = e.clientX; startY = e.clientY; isSpecialMouseDown = $(e.target).is('label, p, input, textarea, span, select'); $('body').css('cursor', 'all-scroll'); }); $(document).on('mousemove', function (e) { if (!isDragging) return; // 不执行拖动操作 if ($(e.target).is('label, p, input, textarea, span') || isSpecialMouseDown && !$(e.target).is('input, textarea')) return; e.preventDefault(); offsetX = e.clientX - startX; offsetY = e.clientY - startY; element.css({ top: initialY + offsetY + 'px', left: initialX + offsetX + 'px' }); }); $(document).on('mouseup', function () { isDragging = false; isSpecialMouseDown = false; $('body').css('cursor', 'default'); }); } // 更新检查 function checkScriptVersion() { function compareVersions(version1 = "0", version2 = "0") { const v1Array = String(version1).split("."); const v2Array = String(version2).split("."); const minLength = Math.min(v1Array.length, v2Array.length); let result = 0; for (let i = 0; i < minLength; i++) { const curV1 = Number(v1Array[i]); const curV2 = Number(v2Array[i]); if (curV1 > curV2) { result = 1; break; } else if (curV1 < curV2) { result = -1; break; } } if (result === 0 && v1Array.length !== v2Array.length) { const v1IsBigger = v1Array.length > v2Array.length; const maxLenArray = v1IsBigger ? v1Array : v2Array; for (let i = minLength; i < maxLenArray.length; i++) { const curVersion = Number(maxLenArray[i]); if (curVersion > 0) { v1IsBigger ? result = 1 : result = -1; break; } } } return result; } GM_xmlhttpRequest({ method: "GET", url: "https://greasyfork.org/zh-CN/scripts/471106.json", timeout: 10 * 1e3, onload: function (response) { const scriptData = JSON.parse(response.responseText); const skipUpdate = getCookie("skipUpdate"); if ( scriptData.name === GM_info.script.name && compareVersions(scriptData.version, GM_info.script.version) === 1 && skipUpdate !== "true" ) { const styleElement = GM_addStyle(darkenPageStyle); $("body").append(`