您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add checkboxes to constraints of an AtCoder problem.
当前为
// ==UserScript== // @name Check Constraints // @name:ja 制約をチェックする // @description Add checkboxes to constraints of an AtCoder problem. // @description:ja AtCoderの問題ページの制約にチェックボックスを追加します。 // @version 1.0.0 // @icon https://www.google.com/s2/favicons?domain=atcoder.jp // @author w0mbat // @match https://atcoder.jp/contests/*/tasks/* // @grant GM_addStyle // @namespace https://greatest.deepsurf.us/users/754798 // ==/UserScript== (function () { 'use strict'; console.log('😼<「制約をチェックする」を実行します。'); async function addStyle(src) { return new Promise((resolve) => { const link = document.createElement("link"); link.rel = "stylesheet"; link.href = src; document.getElementsByTagName("head")[0].appendChild(link); }); } addStyle('https://cdn.jsdelivr.net/npm/[email protected]/dist/pretty-checkbox.min.css'); addStyle('https://cdn.jsdelivr.net/npm/@mdi/[email protected]/css/materialdesignicons.min.css'); GM_addStyle(` .pretty.p-icon .state .icon { top: calc(((100% - 1em) - 2px) / 3) !important } .pretty .state label:after,.pretty .state label:before { top: calc(((100% - 1em) - 2px) / 3) !important } `); function* getConstraintsSections() { // <h3>制約</h3>を子要素に持つsectionを取得 for (const section of document.getElementsByTagName('section')) { for (const child of section.children) { if (child.tagName.toLowerCase() !== 'h3') continue; const text = child.textContent; if (text === '制約' || text === 'Constraints') yield section; } } } function createCheckBox() { const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; return checkbox; } /** * @param {HTMLLIElement} li */ function insertCheckBox(li) { // https://lokesh-coder.github.io/pretty-checkbox/ const div = document.createElement('div'); div.className = 'pretty p-icon p-round p-pulse'; div.appendChild(createCheckBox()); const state = div.appendChild(document.createElement('div')); state.className = 'state p-success'; const icon = state.appendChild(document.createElement('i')); icon.className = 'icon mdi mdi-check'; const label = state.appendChild(document.createElement('label')); [...li.childNodes].forEach(e => label.appendChild(e)); li.appendChild(div); li.style.listStyleType = 'none'; } for (const section of getConstraintsSections()) { const ul = [...section.getElementsByTagName('ul')].shift(); if (ul) { ul.style.paddingLeft = '1em'; [...ul.querySelectorAll('li')].forEach(li => insertCheckBox(li)); } } console.log('😼<「制約をチェックする」を実行しました。'); })();