// ==UserScript==
// @name Bangumi折叠评论与楼中楼
// @namespace 问号
// @version 1.0
// @description Bangumi折叠长评论与多回复楼中楼,此脚本不会减少流量消耗
// @author 问号
// @include /^https?://(bgm\.tv|chii\.in|bangumi\.tv)/(group|subject)/topic/
// @include /^https?://(bgm\.tv|chii\.in|bangumi\.tv)/(blog|ep)/
// @include /^https?://(bgm\.tv|chii\.in|bangumi\.tv)/settings
// @icon https://bgm.tv/img/favicon.ico
// @license GPL V2
// @downloadURL https://update.greasyfork.icu/scripts/487832/Bangumi%E6%8A%98%E5%8F%A0%E8%AF%84%E8%AE%BA%E4%B8%8E%E6%A5%BC%E4%B8%AD%E6%A5%BC.user.js
// @updateURL https://update.greasyfork.icu/scripts/487832/Bangumi%E6%8A%98%E5%8F%A0%E8%AF%84%E8%AE%BA%E4%B8%8E%E6%A5%BC%E4%B8%AD%E6%A5%BC.meta.js
// ==/UserScript==
const maxCommentHeightKey = "maxCommentHeight";
const maxReplyLengthKey = "maxReplyLength";
let maxCommentHeight = getIntSetting(maxCommentHeightKey, 300);
let maxReplyLength = getIntSetting(maxReplyLengthKey, 5);
function getIntSetting(key, defaultValue) {
let val = localStorage.getItem(key);
let parsedVal = parseInt(val);
if (val != null && parsedVal != NaN) {
return parsedVal;
}
localStorage.setItem(key, defaultValue);
return defaultValue;
}
//如果是设置页面
if (location.href.indexOf("settings") != -1) {
let settingTab = document.querySelector(".secTab.rr");
let maxCommentHeightSetting = document.createElement("li");
maxCommentHeightSetting.innerHTML = `修改评论最大长度`;
maxCommentHeightSetting.addEventListener("click", () => {
let height = parseInt(prompt("当评论的长度像素大于多少时,将会折叠评论?\n(默认300像素)"));
if (height == NaN) {
alert("输入的不为整数数字");
}
else if(height<0)
{
alert("输入的值应不小于0");
}
else {
localStorage.setItem(maxCommentHeightKey, height.toString());
alert("修改成功");
}
})
settingTab.appendChild(maxCommentHeightSetting);
let maxReplyLengthSetting = document.createElement("li");
maxReplyLengthSetting.innerHTML = `修改回复最大条数`;
maxReplyLengthSetting.addEventListener("click", () => {
let length = parseInt(prompt("当回复的长度条数大于多少时,将会折叠回复?\n(默认5条)"));
if (length == NaN) {
alert("输入的值不为整数数字");
}
else if(length<0)
{
alert("输入的应不小于0");
}
else {
localStorage.setItem(maxReplyLengthKey, length.toString());
alert("修改成功");
}
})
settingTab.appendChild(maxReplyLengthSetting);
return;
}
const style =
`
.expandToggle
{
color: #0084B4;
cursor: pointer;
}`;
//添加样式
document.head.insertAdjacentHTML('beforeend', ``);
//遍历所有评论
for (let cmt of document.querySelectorAll(".message, .cmt_sub_content")) {
//若评论长度大于最大像素
if (cmt.clientHeight >= maxCommentHeight) {
//截断评论
cmt.style.height = `${maxCommentHeight}px`;
cmt.style.overflow = "hidden";
cmt.style.position = "relative";
//展开按钮
let expandToggle = document.createElement("span");
expandToggle.className = "expandToggle";
expandToggle.innerText = "[展开]";
expandToggle.setAttribute("expanded", "false");
expandToggle.addEventListener("click", ExpandCommentsToggleClick);
cmt.parentElement.insertBefore(expandToggle, cmt.nextSibling);
}
}
for (let replys of document.querySelectorAll(".topic_sub_reply")) {
if (replys.children.length > maxReplyLength) {
for (let i = maxReplyLength; i < replys.children.length; i++) {
replys.children[i].style.display = "none";
}
let expandToggle = document.createElement("span");
expandToggle.className = "expandToggle";
expandToggle.innerText = `[展开,共${replys.children.length}条回复]`;
expandToggle.setAttribute("expanded", "false");
expandToggle.addEventListener("click", ExpandReplysToggleClick);
replys.parentElement.insertBefore(expandToggle, replys.nextSibling);
}
}
function ExpandCommentsToggleClick(e) {
let thisCmt = e.target.previousSibling;
if (e.target.getAttribute("expanded") == "true") { //展开状态
let scrollRelativeCmtY = window.scrollY - (thisCmt.offsetTop + thisCmt.clientHeight); // 获得滚动条相对于评论底部的位置
thisCmt.style.height = `${maxCommentHeight}px`;
window.scroll(scrollX, scrollRelativeCmtY + (thisCmt.offsetTop + maxCommentHeight)); // 修改滚动条的位置
e.target.innerText = "[展开]";
e.target.setAttribute("expanded", "false");
}
else { //收起状态
thisCmt.style.height = "";
e.target.innerText = "[收起]";
e.target.setAttribute("expanded", "true");
}
}
function ExpandReplysToggleClick(e) {
let thisReplys = e.target.previousSibling;
if (e.target.getAttribute("expanded") == "true") //展开状态
{
let scrollRelativeCmtY = window.scrollY - (thisReplys.offsetTop + thisReplys.clientHeight);// 获得滚动条相对于评论底部的位置
for (let i = maxReplyLength; i < thisReplys.children.length; i++) {
thisReplys.children[i].style.display = "none";
}
window.scroll(scrollX, scrollRelativeCmtY + (thisReplys.offsetTop + thisReplys.clientHeight));// 修改滚动条的位置
e.target.innerText = `[展开,共${thisReplys.children.length}条回复]`;
e.target.setAttribute("expanded", "false");
}
else { //收起状态
for (let i = maxReplyLength; i < thisReplys.children.length; i++) {
thisReplys.children[i].style.display = "";
}
e.target.innerText = `[收起,共${thisReplys.children.length}条回复]`;
e.target.setAttribute("expanded", "true");
}
}