modを取る必要がありそうだったら教えてくれます!嬉しいね(うれしいので) ソースコード内で通知位置の設定が可能です!
// ==UserScript==
// @name mod noticer
// @namespace http://atcoder.jp/
// @version 2.2
// @description modを取る必要がありそうだったら教えてくれます!嬉しいね(うれしいので) ソースコード内で通知位置の設定が可能です!
// @author Ll_e_ki
// @license MIT
// @match https://atcoder.jp/contests/*/tasks/*
// @grant none
// ==/UserScript==
/*
LICENCE : MIT
Copyright © 2023 Ll_e_ki
https://opensource.org/license/mit/
*/
(function() {
'use strict';
// Your code here...
const NOTICE_POSITION = {
IN_SUBMIT : true, // 提出ボタン内
ABOVE_SUBMIT : false, // 提出ボタンの上
DIALOG : false // 提出時、提出コードでmodを取り忘れている場合ダイアログ表示
// 複数選択も可能です
}
const MODMARK = [ // ダイアログ表示を使用する場合、modを取っているかの確認用文言を予め入力してください
"%"
]
const MOD_LIST = ["割ったあまり", "割った余り", "答えは非常に大きく", "mod"]
function inWord(root_element, word_list) {
let elem_stack = [root_element]
while (elem_stack.length > 0) {
var element = elem_stack.pop()
for (var i = 0; i < word_list.length; i++) {
if (element.textContent.match(word_list[i])) {
return true
}
}
if (element.children.length > 0) {
var children = element.children
for (var i = 0; i < children.length; i++) {
elem_stack.push(children[i])
}
}
}
return false
}
let task_element = document.getElementById("task-statement")
let global_needmod = inWord(task_element, MOD_LIST)
if (global_needmod) {
if (NOTICE_POSITION.IN_SUBMIT) {
document.getElementById("submit").appendChild(document.createElement("br"))
document.getElementById("submit").appendChild(document.createTextNode("※ modは取りましたか?"))
}
if (NOTICE_POSITION.ABOVE_SUBMIT) {
var append_elem = document.createElement("b")
append_elem.textContent = "※ modは取りましたか?"
document.getElementById("sourceCode").appendChild(append_elem)
}
}
document.getElementById("submit").addEventListener("click", (event) => {
if (NOTICE_POSITION.DIALOG && global_needmod) {
let code_element = document.getElementById("sourceCode")
if (inWord(code_element, MODMARK) == false && confirm("modを取っていない可能性があります。提出しますか?") == false) {
event.preventDefault()
}
}
})
})()