AtCoder Show Me Score Table

コンテスト名を配点に置き換えちゃうスクリプト

Mint 2024.10.13.. Lásd a legutóbbi verzió

  1. // ==UserScript==
  2. // @name AtCoder Show Me Score Table
  3. // @namespace https://atcoder.jp/
  4. // @version 0.3
  5. // @description コンテスト名を配点に置き換えちゃうスクリプト
  6. // @author hayatroid
  7. // @license MIT
  8. // @match https://atcoder.jp/contests/*
  9. // @exclude https://atcoder.jp/contests/*/json
  10. // ==/UserScript==
  11.  
  12. (async () => {
  13. // キャッシュを読み込む
  14. const cache = localStorage.getItem(`score_table_${contestScreenName}`);
  15. if (cache) {
  16. document.querySelector(".contest-title").textContent = cache;
  17. return;
  18. }
  19.  
  20. // 配点 (e.g. "100 - 200 - 300 - 400 - 500 - 600") の取得
  21. const res = await fetch(`https://atcoder.jp/contests/${contestScreenName}`)
  22. .then((response) => {
  23. if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
  24. return response.text();
  25. })
  26. .then((text) => {
  27. const parser = new DOMParser();
  28. const doc = parser.parseFromString(text, "text/html");
  29. // 配点の書かれた table の取得
  30. const table = [...doc.querySelectorAll("#contest-statement > .lang > .lang-ja table")]
  31. .filter((element) => {
  32. const th = [...element.querySelectorAll("thead > tr > th")];
  33. return th.length === 2 && th[0].textContent === "問題" && th[1].textContent === "点数";
  34. });
  35. if (table.length !== 1) throw new Error("Scoreboard cannot be found.");
  36. return table[0];
  37. })
  38. .then((table) => {
  39. // table から配点を取り出し,ハイフンでつなぐ
  40. const res = [...table.querySelectorAll("tbody > tr > td")]
  41. .filter((element, index) => {
  42. return index % 2 === 1;
  43. })
  44. .map((element) => {
  45. return element.textContent;
  46. })
  47. .join(" - ");
  48. return res;
  49. });
  50.  
  51. // キャッシュする
  52. localStorage.setItem(`score_table_${contestScreenName}`, res);
  53.  
  54. // コンテスト名を配点に置き換える
  55. document.querySelector(".contest-title").textContent = res;
  56. })();