您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
AtCoder の共有ボタンの埋め込みテキストにハッシュタグを追加して、コンテスト名または問題名を補完して、ハッシュタグを X で検索するボタンを追加します。
// ==UserScript== // @name atcoder-hashtag-setter2 // @namespace https://github.com/hotarupoyo // @version 3.0.0 // @author hotarupoyo // @description AtCoder の共有ボタンの埋め込みテキストにハッシュタグを追加して、コンテスト名または問題名を補完して、ハッシュタグを X で検索するボタンを追加します。 // @license MIT // @match https://atcoder.jp/contests/* // @exclude https://atcoder.jp/contests/ // ==/UserScript== (function () { 'use strict'; var _a; const contestId = location.pathname.split("/")[2]; const contestTitle = (_a = document.querySelector(".contest-title")) == null ? void 0 : _a.innerText; const problemId = (() => { if (location.pathname.match(/contests\/.+\/tasks\/.+/) != null) { return location.pathname.match(/contests\/.+\/tasks\/.+/) != null ? location.pathname.split("/")[4] : void 0; } if (location.pathname.match(/contests\/.+\/submissions\/\d+/) != null) { const trs = Array.from(document.querySelectorAll("tr")); const tr = trs.find( (element) => ["問題", "Tasks"].includes(element.firstElementChild.innerText ?? "") ); if (tr == null) { return void 0; } return tr.lastElementChild.firstElementChild.pathname.split( "/" )[4]; } return void 0; })(); const problemTitle = (() => { var _a2; if (location.pathname.match(/contests\/.+\/tasks\/.+/) != null) { return ((_a2 = document.querySelector("meta[property='og:title']")) == null ? void 0 : _a2.getAttribute("content")) ?? void 0; } if (location.pathname.match(/contests\/.+\/submissions\/\d+/) != null) { const trs = Array.from(document.querySelectorAll("tr")); const tr = trs.find( (element) => ["問題", "Tasks"].includes(element.firstElementChild.innerText ?? "") ); if (tr == null) { return void 0; } return tr.lastElementChild.innerText.trim(); } return void 0; })(); (() => { const aElements = document.querySelectorAll("ul > li > ul > li > a"); for (let i = 0; i < aElements.length; i++) { const element = aElements[i]; if (element != null && ["マイプロフィール", "My Profile"].includes(element.innerText.trim())) { return element.pathname.split("/")[2]; } } return void 0; })(); const userIdSubmittedBy = (() => { if (location.pathname.match(/contests\/.+\/submissions\/\d+/) != null) { const trs = Array.from(document.querySelectorAll("tr")); const tr = trs.find( (element) => ["ユーザ", "User"].includes(element.firstElementChild.innerText ?? "") ); if (tr == null) { return void 0; } return tr.lastElementChild.innerText.trim(); } return void 0; })(); const ConvertIso8601BasicToExtended = (iso8601basic) => { const d = iso8601basic; return `${d.substring(0, 4)}-${d.substring(4, 6)}-${d.substring(6, 11)}:${d.substring(11, 13)}`; }; const contestDuration = document.querySelectorAll(".contest-duration > a"); const contestStartTime = new Date( ConvertIso8601BasicToExtended(new URLSearchParams(contestDuration.item(0).search).get("iso") ?? "0") ); const contestEndTime = new Date( ConvertIso8601BasicToExtended(new URLSearchParams(contestDuration.item(1).search).get("iso") ?? "0") ); const hasContestEnded = /* @__PURE__ */ new Date() >= contestEndTime; const IsContestPermanent = contestEndTime.getTime() - contestStartTime.getTime() >= 365 * 24 * 60 * 60 * 1e3; (() => { var _a2, _b, _c, _d, _e; if (!(hasContestEnded || IsContestPermanent)) { return; } const contestHashtag = contestId ? `#AtCoder_${contestId}` : void 0; const problemHashtag = problemId ? `#AtCoder_${problemId}` : void 0; const userHashtag = userIdSubmittedBy ? `#AtCoder_${userIdSubmittedBy}` : void 0; const orgtext = (_a2 = document.querySelector("div.a2a_kit")) == null ? void 0 : _a2.getAttribute("data-a2a-title"); if (orgtext == null) { console.warn("AtCoder HashTag Setter2", "共有ボタンの取得に失敗しました。"); return; } const text = (() => { if (location.pathname.match(/contests\/.+\/tasks\/.+/) != null) { return `${orgtext} - ${contestTitle} ${contestHashtag} ${problemHashtag}`; } if (location.pathname.match(/contests\/.+\/submissions\/\d+/) != null) { return `${orgtext} - ${problemTitle} ${contestHashtag} ${problemHashtag} ${userHashtag}`; } return `${orgtext} ${contestHashtag}`; })(); (_b = document.querySelector("div.a2a_kit")) == null ? void 0 : _b.setAttribute("data-a2a-title", text); if (userHashtag != null) { const searchUserUrl = `https://twitter.com/search?q=${encodeURIComponent(userHashtag)}`; const searchUserHtml = `<a class="btn btn-danger btn-xs" href="${searchUserUrl}" role="button">${userHashtag}</a>`; (_c = document.querySelector("div.a2a_kit")) == null ? void 0 : _c.insertAdjacentHTML("afterbegin", searchUserHtml); } if (problemHashtag != null) { const searchProblemUrl = `https://twitter.com/search?q=${encodeURIComponent(problemHashtag)}`; const searchProblemHtml = `<a class="btn btn-primary btn-xs" href="${searchProblemUrl}" role="button">${problemHashtag}</a>`; (_d = document.querySelector("div.a2a_kit")) == null ? void 0 : _d.insertAdjacentHTML("afterbegin", searchProblemHtml); } if (contestHashtag != null) { const searchContestUrl = `https://twitter.com/search?q=${encodeURIComponent(contestHashtag)}`; const searchContestHtml = `<a class="btn btn-success btn-xs" href="${searchContestUrl}" role="button">${contestHashtag}</a>`; (_e = document.querySelector("div.a2a_kit")) == null ? void 0 : _e.insertAdjacentHTML("afterbegin", searchContestHtml); } })(); })();