コンテスト名を配点に置き換えちゃうスクリプト
La data de
// ==UserScript==
// @name AtCoder Show Me Score Table
// @namespace https://atcoder.jp/
// @version 0.4
// @description コンテスト名を配点に置き換えちゃうスクリプト
// @author hayatroid
// @license MIT
// @match https://atcoder.jp/contests/*
// @exclude https://atcoder.jp/contests/*/json
// ==/UserScript==
(async () => {
// キャッシュを読み込む
const cache = localStorage.getItem(`score_table_${contestScreenName}`);
if (cache) {
document.querySelector(".contest-title").textContent = cache;
return;
}
// 配点 (e.g. "100 - 200 - 300 - 400 - 500 - 600") の取得
const res = await fetch(`https://atcoder.jp/contests/${contestScreenName}`)
.then((response) => {
if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
return response.text();
})
.then((text) => {
const parser = new DOMParser();
const doc = parser.parseFromString(text, "text/html");
// 配点の書かれた table の取得
const table = [...doc.querySelectorAll("#contest-statement > .lang > .lang-ja table")]
.filter((element) => {
const th = [...element.querySelectorAll("thead > tr > th")];
return th.length === 2 && th[0].textContent === "問題" && th[1].textContent === "点数";
});
if (table.length !== 1) throw new Error("Scoreboard cannot be found.");
return table[0];
})
.then((table) => {
// table から配点を取り出し,ハイフンでつなぐ
const res = [...table.querySelectorAll("tbody > tr > td")]
.filter((element, index) => {
return index % 2 === 1;
})
.map((element) => {
return element.textContent;
})
.join(" - ");
return res;
});
// キャッシュする
if (res[0] !== "?") {
localStorage.setItem(`score_table_${contestScreenName}`, res);
}
// コンテスト名を配点に置き換える
document.querySelector(".contest-title").textContent = res;
})();