// ==UserScript== // @name Tabbed AtCoder Editorial // @version 0.1 // @description display atcoder editorial in tabs // @match https://atcoder.jp/contests/*/editorial // @grant GM_addStyle // @license MIT // @namespace https://greasyfork.org/users/808669 // @downloadURL none // ==/UserScript== /* jshint esversion:8 */ (async function () { 'use strict'; async function addScript(src) { return new Promise((resolve) => { const script = document.createElement("script"); script.type = "text/javascript"; script.src = src; script.onload = resolve; document.getElementsByTagName("head")[0].appendChild(script); }); } async function addLink(href) { return new Promise((resolve) => { const link = document.createElement("link"); link.rel = "stylesheet"; link.href = href; link.onload = resolve; document.getElementsByTagName("head")[0].appendChild(link); }); } async function getEditorial(link) { return new Promise((resolve) => { const xhr = new XMLHttpRequest(); xhr.responseType = "document"; xhr.onload = (response) => { const editorial = response.target.responseXML.querySelector("#main-container > div.row > div:nth-child(2) > div:nth-child(3)"); if (editorial) link.parentNode.appendChild(editorial); resolve(); }; xhr.open("GET", link.href); xhr.send(); }); } async function getAllEditorials() { return Promise.all(Array.prototype.filter.call(document.getElementsByTagName('a'), e => e.href.match(/\/editorial\//)) .map(e => getEditorial(e))); } async function createTab() { const parser = new DOMParser(); const parse = s => parser.parseFromString(s, "text/html").body.firstChild; const nav = document.querySelector("#main-container > div.row > div:nth-child(2)"); const dummy = document.createElement("div"); const navul = parse(`
`); const navdiv = parse(``); let previd = "dummy"; let isactive = true; let prevhead = -1; let kaisetsu = -1; while (nav.children.length > 0) { const e = nav.firstChild; const summary = e.textContent.trimStart().split(/\s+/)[0]; if (e.tagName === "DIV" && summary === "解説") { kaisetsu = dummy.children.length; dummy.appendChild(e); } else if (e.tagName === "DIV" || e.tagName === "H3") { console.log(e); const cond = e.textContent === "コンテスト全体の解説"; const name = cond ? "全体" : e.textContent.trimStart().split(/\s+/)[0]; const id = cond ? "all" : e.textContent.trimStart().split(/\s+/)[0]; const li = parse(`