Atcoder Title Copy

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

2021-10-17 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

// ==UserScript==
// @name         Atcoder Title Copy
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Atcoderの問題のページに問題タイトルをクリップボードにコピーするボタンを追加します
//               拡張子を問題タイトルの最後につけることも可能です
// @author       sin471
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none

// ==/UserScript==

/* ユーザー設定項目 */
    /*
    A - AtCoder → A - AtCoder.js
    のように、デフォルトで拡張子をつける場合は、
    ダブルクオテーションの中に拡張子を入力
    */
const extension = "";//ex: ".js"

    /*
    Copied!を表示する時間を変更
    デフォルトでは1500ms(1.5秒)
    */
const sleepTime = 1500
/* 設定項目終わり */


function copy() {
    var title = document.getElementsByClassName("h2")[0];
    //改行文字を削除
    var text = title.firstChild.textContent.trim();
    //ユーザーの設定した拡張子を追加
    text += extension;
    navigator.clipboard.writeText(text);
};

// ミリ秒間待機する
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function notifyCopied(a) {
    a = this.name;
    a.textContent = "Copied!";
    await sleep(1500);
    a.textContent = "Copy";
};

function create_button() {
    var parent = document.getElementsByClassName("h2");
    var a = document.createElement("a");
    a.textContent = "Copy";
    //AtcoderのCopyボタンと同じCSSを適用
    a.setAttribute("class", "btn btn-default btn-sm");
    parent[0].appendChild(a);
    a.addEventListener('click', copy, false);
    //ボタン内のテキスト内容を一定時間"Copied!"に書き換え
    a.addEventListener('click', { name: a, handleEvent: notifyCopied });
};
create_button();