您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically detects the language used based on the information in the source code comments and selects it as the one to be submitted.
// ==UserScript== // @name AtCoder Submission Language Detector // @namespace https://twitter.com/KakurenboUni // @version 1.1.1 // @description Automatically detects the language used based on the information in the source code comments and selects it as the one to be submitted. // @author uni-kakurenbo // @match https://atcoder.jp/contests/*/tasks/* // @match https://atcoder.jp/contests/*/submit* // @match https://atcoder.jp/contests/*/custom_test* // @license MIT // @supportURL https://twitter.com/KakurenboUni // ==/UserScript== (async function () { "use strict"; const DETECTION_REG_EXP = /#.*lang(?:uage)?:?(?<args>\s+[^\n\r*/#]+)/; await rendered(); const $editor = ace.edit("editor"); const $plainTextarea = $("#plain-textarea"); const $selectLanguage = $("#select-lang select"); const $languageOptions = $selectLanguage[0].querySelectorAll("option"); const languageOptions = [].map.call($languageOptions, ({ value, label, dataset: { mime } = {} }) => { return { id: value, label: label.toLowerCase() ?? "", code: mime?.toLowerCase().replaceAll(/^.+\/x?|src$/g, "") ?? "", }; }); $editor.getSession().on("change", updateLanguageSettings); $plainTextarea.on("input", updateLanguageSettings); document.addEventListener("paste", updateLanguageSettings); $("#input-open-file").on("change", () => { setTimeout(updateLanguageSettings, 0); }); function getSourceCode() { if($editor.isFocused()) return $editor.getValue(); else return $plainTextarea[0].value; } function updateLanguageSettings() { const sourceCode = getSourceCode(); console.log(sourceCode); const languageInfomation = sourceCode.match(DETECTION_REG_EXP); if (!languageInfomation || !languageInfomation?.groups?.args) return; let languageSelectors = languageInfomation.groups.args?.trim().replace(/\s+/g, " ").split(" "); languageSelectors = languageSelectors.map((selector) => selector.toLowerCase()); const selectedOption = languageOptions.find((option) => { return ( languageSelectors.includes(option.id) || languageSelectors.every((selector) => option.label.includes(selector)) || languageSelectors.every((selector) => option.code.includes(selector)) ); }); if (!selectedOption) return; $selectLanguage.val(selectedOption.id).trigger("change"); } async function rendered() { let timer; await new Promise((resolve) => { observer(); function observer() { console.log(getLS) if (typeof getLS == "function") { resolve(); } timer = setTimeout(observer, 10); } }); clearTimeout(timer); } })();