// ==UserScript== // @name tsumanne exte // @version 20261008 // @description none // @author none // @match https://*.tsumanne.net/* // ==/UserScript== function maints(){ 'use strict'; //保存時のスレ文の最大長さ const maxthrebun = 8; let svname = location.pathname.split("/")[1]; let marks = ["\n","\t","\"","\\",'/',':','*','?','|',"<",">"]; if(svname == "si"){svname = "img";} else if(svname == "my"){svname = "may";} //URLの長さでindexページかスレのページか判別 if(location.pathname.split("/").length < 5){ //indexページ let fsttag = decodeURI(location.pathname.split("/")[2]); let nodes = document.querySelectorAll('[title="ZIPで取得"]'); for(let h = 0; h < nodes.length; h++){ let granode = nodes[h].parentNode.parentNode; let filename = "[" + fsttag + "]"; if(granode.tagName == "TD"){ granode = granode.parentNode; let tags = granode.getElementsByClassName("index")[0].getElementsByTagName("a"); let threno = granode.getElementsByClassName("url")[0].getElementsByTagName("a")[0].textContent.slice(0, -4); let eot = tags.length - 1; for(let i = 0; i < eot; i++){ filename += "[" + tags[i].textContent + "]"; } if(tags[eot].textContent != "+"){filename += "[" + tags[eot].textContent + "]";} filename = svname + threno + filename; }else{ let tags = granode.getElementsByClassName("category")[0].getElementsByTagName("a"); let threno = granode.getElementsByTagName("dt")[0].getElementsByTagName("a")[0].textContent.slice(0, -4); let threbun = granode.getElementsByClassName("text")[0].textContent.trim().slice(0, maxthrebun); let eot = tags.length - 1; for(let i = 0; i < eot; i++){ filename += "[" + tags[i].textContent + "]"; } if(tags[eot].textContent != "+"){filename += "[" + tags[eot].textContent + "]";} filename = svname + threno + filename + threbun; } for(let j in marks){ filename = filename.replace(marks[j], "_"); } nodes[h].setAttribute("download", filename + ".zip"); nodes[h].previousElementSibling.setAttribute("download", filename + ".html"); } }else{ //スレを開いたとき let tags = document.getElementsByTagName("header")[0].getElementsByTagName("p")[0].getElementsByTagName("a"); let threno = document.getElementsByClassName("cno")[0].textContent.slice(3); let threbun = document.getElementsByTagName("blockquote")[0].textContent.slice(0, maxthrebun); let filename = ""; for(let i = 4; i < tags.length - 2; i++){ filename += "[" + tags[i].textContent + "]"; } filename += threbun; for(let j in marks){ filename = filename.replace(marks[j], "_"); } tags[1].setAttribute("download", svname + threno + filename + ".html"); tags[2].setAttribute("download", svname + threno + filename + ".zip"); //削除レスまわり let extevd = document.createElement('script'); extevd.innerHTML = '\ function myexte_onddbut(){\ let dspdelb = document.getElementById("myexte_ddbut");\ let dspdelf = (dspdelb.textContent == "見る") ? 1 : 0;\ dspdelb.textContent = dspdelf ? "隠す" : "見る";\ let ddtags = document.getElementsByTagName("table");\ for(var i in ddtags){\ if(ddtags[i].className == "deleted"){\ ddtags[i].style.display = dspdelf ? "table" : "none";\ }\ }\ }'; document.body.appendChild(extevd); let newddel = document.createElement("span"); let newdbut = document.createElement("span"); let delress = document.querySelectorAll("table.deleted").length; newddel.textContent = "削除された記事が" + delress + "件あります. "; if(delress){ newdbut.textContent = "見る"; newdbut.id = "myexte_ddbut"; newdbut.style.textDecoration = "underline"; newdbut.setAttribute("onclick", "myexte_onddbut()"); newddel.append(newdbut); } let threcnt = document.getElementsByClassName("thre")[0]; let fsttabl = threcnt.getElementsByTagName("table")[0]; threcnt.insertBefore(newddel, fsttabl); } } window.onload = maints;