Atcoder Title Copy

Atcoderの問題のページに問題タイトルをクリップボードにコピーするボタンを追加します

As of 2021-10-17. See the latest version.

  1. // ==UserScript==
  2. // @name Atcoder Title Copy
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description Atcoderの問題のページに問題タイトルをクリップボードにコピーするボタンを追加します
  6. // 拡張子を問題タイトルの最後につけることも可能です
  7. // @author sin471
  8. // @match https://atcoder.jp/contests/*/tasks/*
  9. // @grant none
  10. // @license MIT
  11. //
  12.  
  13. // ==/UserScript==
  14.  
  15. /* ユーザー設定項目 */
  16. /*
  17. A - AtCoder → A - AtCoder.js
  18. のように、デフォルトで拡張子をつける場合は、
  19. ダブルクオテーションの中に拡張子を入力
  20. */
  21. const extension = "";//ex: ".js"
  22.  
  23. /*
  24. Copied!を表示する時間を変更
  25. デフォルトでは1500ms(1.5秒)
  26. */
  27. const sleepTime = 1500
  28. /* 設定項目終わり */
  29.  
  30.  
  31. function copy() {
  32. var title = document.getElementsByClassName("h2")[0];
  33. //改行文字を削除
  34. var text = title.firstChild.textContent.trim();
  35. //ユーザーの設定した拡張子を追加
  36. text += extension;
  37. navigator.clipboard.writeText(text);
  38. };
  39.  
  40. // ミリ秒間待機する
  41. function sleep(ms) {
  42. return new Promise(resolve => setTimeout(resolve, ms));
  43. }
  44.  
  45. async function notifyCopied(a) {
  46. a = this.name;
  47. a.textContent = "Copied!";
  48. await sleep(1500);
  49. a.textContent = "Copy";
  50. };
  51.  
  52. function create_button() {
  53. var parent = document.getElementsByClassName("h2");
  54. var a = document.createElement("a");
  55. a.textContent = "Copy";
  56. //AtcoderのCopyボタンと同じCSSを適用
  57. a.setAttribute("class", "btn btn-default btn-sm");
  58. parent[0].appendChild(a);
  59. a.addEventListener('click', copy, false);
  60. //ボタン内のテキスト内容を一定時間"Copied!"に書き換え
  61. a.addEventListener('click', { name: a, handleEvent: notifyCopied });
  62. };
  63. create_button();