// ==UserScript==
// @name Bilibili 翻页评论区
// @namespace MotooriKashin
// @version 2.1.0
// @description 恢复评论区翻页功能。
// @author MotooriKashin
// @homepage https://github.com/MotooriKashin/Bilibili-Old
// @supportURL https://github.com/MotooriKashin/Bilibili-Old/issues
// @icon https://www.bilibili.com/favicon.ico
// @match *://*.bilibili.com/*
// @grant none
// @run-at document-start
// @license MIT
// @downloadURL none
// ==/UserScript==
(function () {
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
// src/utils/abv.ts
var Abv = class {
base58Table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
digitMap = [11, 10, 3, 8, 4, 6];
xor = 177451812;
add = 8728348608;
bvidTemplate = ["B", "V", 1, "", "", 4, "", 1, "", 7, "", ""];
table = {};
constructor() {
for (let i = 0; i < 58; i++)
this.table[this.base58Table[i]] = i;
}
/**
* av/BV互转
* @param input av或BV,可带av/BV前缀
* @returns 转化结果
*/
check(input) {
if (/^[aA][vV][0-9]+$/.test(String(input)) || /^\d+$/.test(String(input)))
return this.avToBv(Number(/[0-9]+/.exec(String(input))[0]));
if (/^1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}$/.test(String(input)))
return this.bvToAv("BV" + input);
if (/^[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}$/.test(String(input)))
return this.bvToAv(String(input));
throw input;
}
bvToAv(BV) {
let r = 0;
for (let i = 0; i < 6; i++)
r += this.table[BV[this.digitMap[i]]] * 58 ** i;
return r - this.add ^ this.xor;
}
avToBv(av) {
let bv = Array.from(this.bvidTemplate);
av = (av ^ this.xor) + this.add;
for (let i = 0; i < 6; i++)
bv[this.digitMap[i]] = this.base58Table[parseInt(String(av / 58 ** i)) % 58];
return bv.join("");
}
};
function abv(input) {
return new Abv().check(input);
}
function BV2avAll(str) {
return str.replace(/[bB][vV]1[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}/g, (s) => "av" + abv(s));
}
// src/utils/poll.ts
function poll(check, callback, delay = 100, stop = 180) {
let timer = setInterval(() => {
const d = check();
if (d) {
clearInterval(timer);
callback(d);
}
}, delay);
stop && setTimeout(() => clearInterval(timer), stop * 1e3);
}
// src/utils/element.ts
function addElement(tag, attribute, parrent, innerHTML, top, replaced) {
let element = document.createElement(tag);
attribute && Object.entries(attribute).forEach((d) => element.setAttribute(d[0], d[1]));
parrent = parrent || document.body;
innerHTML && (element.innerHTML = innerHTML);
replaced ? replaced.replaceWith(element) : top ? parrent.insertBefore(element, parrent.firstChild) : parrent.appendChild(element);
return element;
}
async function addCss(txt, id, parrent) {
if (!parrent && !document.head) {
await new Promise((r) => poll(() => document.body, r));
}
parrent = parrent || document.head;
const style = document.createElement("style");
style.setAttribute("type", "text/css");
id && !parrent.querySelector(`#${id}`) && style.setAttribute("id", id);
style.appendChild(document.createTextNode(txt));
parrent.appendChild(style);
return style;
}
function loadScript(src, onload) {
return new Promise((r, j) => {
const script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
script.addEventListener("load", () => {
script.remove();
onload && onload();
r(true);
});
script.addEventListener("error", () => {
script.remove();
j();
});
(document.body || document.head || document.documentElement || document).appendChild(script);
});
}
// src/utils/format/integer.ts
function integerFormat(num, byte = 2) {
return num < 10 ** byte ? (Array(byte).join("0") + num).slice(-1 * byte) : num;
}
// src/utils/format/time.ts
function timeFormat(time = (/* @__PURE__ */ new Date()).getTime(), type) {
const date = new Date(time);
const arr = date.toLocaleString().split(" ");
const day = arr[0].split("/");
day[1] = integerFormat(day[1], 2);
day[2] = integerFormat(day[2], 2);
return type ? day.join("-") + " " + arr[1] : arr[1];
}
// src/utils/debug.ts
var group = {
/** 分组层次 */
i: 0,
/** 分组栈 */
call: []
};
function debug(...data) {
group.call.push(console.log.bind(console, `%c[${timeFormat()}]`, "color: blue;", ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
}
debug.assert = function(condition, ...data) {
group.call.push(console.assert.bind(console, `[${timeFormat()}]`, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.clear = function() {
group.i = 0;
group.call = [];
setTimeout(console.clear.bind(console));
return debug;
};
debug.debug = function(...data) {
group.call.push(console.debug.bind(console, `[${timeFormat()}]`, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.error = function(...data) {
group.call.push(console.error.bind(console, `[${timeFormat()}]`, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.group = function(...data) {
group.i++;
group.call.push(console.group.bind(console, `[${timeFormat()}]`, ...arguments));
return debug;
};
debug.groupCollapsed = function(...data) {
group.i++;
group.call.push(console.groupCollapsed.bind(console, `[${timeFormat()}]`, ...arguments));
return debug;
};
debug.groupEnd = function() {
if (group.i) {
group.i--;
group.call.push(console.groupEnd.bind(console));
!group.i && (group.call.push(() => group.call = []), group.call.forEach((d) => setTimeout(d)));
}
return debug;
};
debug.info = function(...data) {
group.call.push(console.info.bind(console, `%c[${timeFormat()}]`, "color: blue;", ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.log = function(...data) {
group.call.push(console.log.bind(console, `%c[${timeFormat()}]`, "color: blue;", ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.table = function(tabularData, properties) {
group.call.push(console.table.bind(console, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.time = function(label) {
console.time(label);
return debug;
};
debug.timeEnd = function(label) {
console.timeEnd(label);
return debug;
};
debug.timeLog = function(label, ...data) {
console.timeLog(label, `[${timeFormat()}]`, ...data);
return debug;
};
debug.trace = function(...data) {
group.call.push(console.trace.bind(console, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
debug.warn = function(...data) {
group.call.push(console.warn.bind(console, `[${timeFormat()}]`, ...arguments));
!group.i && setTimeout(group.call.shift());
return debug;
};
// src/utils/typeof.ts
var isArray = Array.isArray;
var isNumber = (val) => !isNaN(parseFloat(val)) && isFinite(val);
// src/utils/format/url.ts
var URL = class {
/** 锚 */
hash;
/** 基链 */
base;
/** 参数对象。结果会格式化`undefined``null``NaN`等特殊值,但不会处理数字,以免丢失精度。 */
params = {};
/** 参数链(不含`?`) */
get param() {
return Object.entries(this.params).reduce((s, d) => {
return s += `${s ? "&" : ""}${d[0]}=${d[1]}`;
}, "");
}
/** 提取URL参数 */
constructor(url) {
const arr1 = url.split("#");
let str = arr1.shift();
this.hash = arr1.join("#");
(this.hash || url.includes("#")) && (this.hash = `#${this.hash}`);
const arr2 = str.split("?");
this.base = arr2.shift();
str = arr2.join("?");
if (str) {
str.split("&").forEach((d) => {
const arr3 = d.split("=");
const key = arr3.shift();
if (key) {
let value = arr3.join("=") || "";
try {
if (!isNumber(value)) {
value = JSON.parse(value);
}
} catch {
value === "undefined" && (value = void 0);
value === "NaN" && (value = NaN);
}
this.params[key] = value;
}
});
}
}
sort() {
this.params = Object.keys(this.params).sort().reduce((s, d) => {
s[d] = this.params[d];
return s;
}, {});
}
/** 还原url链接 */
toJSON() {
return `${this.base ? this.param ? this.base + "?" : this.base : ""}${this.param}${this.hash || ""}`;
}
};
function urlObj(url) {
const res = new URL(url);
return res.params;
}
// src/utils/hook/node.ts
var appendChild = Element.prototype.appendChild;
var insertBefore = Element.prototype.insertBefore;
var jsonp = [];
Element.prototype.appendChild = function(newChild) {
this.parentElement === document.documentElement && newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => {
d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild);
});
return appendChild.call(this, newChild);
};
Element.prototype.insertBefore = function(newChild, refChild) {
this.parentElement === document.documentElement && newChild.nodeName == "SCRIPT" && newChild.src && jsonp.forEach((d) => {
d[0].every((d2) => newChild.src.includes(d2)) && d[1].call(newChild);
});
return insertBefore.call(this, newChild, refChild);
};
function jsonpHook(url, redirect, modifyResponse, once = true) {
let id;
const one = Array.isArray(url) ? url : [url];
const two = function() {
once && id && delete jsonp[id - 1];
if (redirect)
try {
this.src = redirect(this.src) || this.src;
} catch (e) {
debug.error("redirect of jsonphook", one, e);
}
if (modifyResponse) {
const obj = urlObj(this.src);
if (obj) {
const callback = obj.callback;
const call = window[callback];
const url2 = this.src;
if (call) {
window[callback] = function(v) {
try {
v = modifyResponse(v, url2, call) || v;
} catch (e) {
debug.error("modifyResponse of jsonphook", one, e);
}
return v !== true && call(v);
};
}
}
}
};
const iid = jsonp.push([one, two]);
return () => {
removeJsonphook(iid);
};
}
jsonpHook.async = (url, condition, modifyResponse, once = true) => {
let id;
const one = Array.isArray(url) ? url : [url];
const two = function() {
try {
once && id && delete jsonp[id - 1];
if (!condition || condition(this.src)) {
const obj = urlObj(this.src);
if (obj) {
const callback = obj.callback;
const call = window[callback];
if (call) {
modifyResponse && modifyResponse(this.src).then((d) => {
window[callback](d);
this.dispatchEvent(new ProgressEvent("load"));
}).catch((e) => {
this.dispatchEvent(new ProgressEvent("error"));
debug.error("modifyResponse of xhrhookasync", one, e);
});
}
this.removeAttribute("src");
}
}
} catch (e) {
debug.error("jsonphook", one, e);
}
};
const iid = jsonp.push([one, two]);
return () => {
removeJsonphook(iid);
};
};
jsonpHook.scriptBlock = (url) => {
const one = Array.isArray(url) ? url : [url];
const two = function() {
try {
this.removeAttribute("src");
setTimeout(() => {
this.dispatchEvent(new ProgressEvent("load"));
try {
this.remove();
} catch (e) {
}
}, 100);
} catch (e) {
debug.error("脚本拦截失败!", one, e);
}
};
jsonp.push([one, two]);
};
jsonpHook.scriptIntercept = (url, redirect, text) => {
const one = Array.isArray(url) ? url : [url];
const two = function() {
try {
if (text) {
this.text = text(this.src);
this.removeAttribute("src");
setTimeout(() => {
this.dispatchEvent(new ProgressEvent("load"));
this?.remove();
}, 100);
} else if (redirect) {
this.src = redirect(this.src);
}
} catch (e) {
debug.error("scriptIntercept", one, e);
}
};
const iid = jsonp.push([one, two]);
return () => {
removeJsonphook(iid);
};
};
function removeJsonphook(id) {
id >= 0 && delete jsonp[id - 1];
}
// src/html/preview-image.html
var preview_image_default = '
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n';
// src/svg/fork.svg
var fork_default = '';
// src/svg/gear.svg
var gear_default = '';
// src/svg/wrench.svg
var wrench_default = '';
// src/svg/note.svg
var note_default = '';
// src/svg/dmset.svg
var dmset_default = '';
// src/svg/stethoscope.svg
var stethoscope_default = '';
// src/svg/play.svg
var play_default = '';
// src/svg/palette.svg
var palette_default = '';
// src/svg/download.svg
var download_default = '';
// src/svg/warn.svg
var warn_default = '';
// src/svg/linechart.svg
var linechart_default = '';
// src/svg/blind.svg
var blind_default = '';
// src/svg/like.svg
var like_default = '';
// src/svg/dislike.svg
var dislike_default = '';
// src/svg/left.svg
var left_default = '';
// src/svg/right.svg
var right_default = '';
// src/svg/net.svg
var net_default = '';
// src/utils/svg.ts
var svg = {
fork: fork_default,
gear: gear_default,
wrench: wrench_default,
note: note_default,
dmset: dmset_default,
stethoscope: stethoscope_default,
play: play_default,
palette: palette_default,
download: download_default,
warn: warn_default,
linechart: linechart_default,
blind: blind_default,
like: like_default,
dislike: dislike_default,
left: left_default,
right: right_default,
net: net_default
};
// src/core/ui/preview-image.ts
var PreviewImage = class extends HTMLElement {
_image;
_list;
constructor() {
super();
const root = this.attachShadow({ mode: "closed" });
root.innerHTML = preview_image_default;
const close = root.querySelector(".svg-icon.close.use-color");
const left = root.querySelector(".svg-icon.left-arrow.use-color");
const right = root.querySelector(".svg-icon.right-arrow.use-color");
close.innerHTML = svg.fork;
left.innerHTML = svg.left;
right.innerHTML = svg.right;
this._image = root.querySelector(".show-image-wrap");
this._list = root.querySelector(".preview-list");
close.parentElement.addEventListener("click", (e) => {
this.remove();
document.body.style.overflow = "";
e.stopPropagation();
});
left.parentElement.addEventListener("click", (e) => {
this.togger(e, false);
e.stopPropagation();
});
right.parentElement.addEventListener("click", (e) => {
this.togger(e);
e.stopPropagation();
});
}
togger(e, right = true) {
const list = this._list.querySelectorAll(".preview-item-box");
if (list.length) {
let i = 0;
list.forEach((d, j) => {
if (d.classList.contains("active")) {
d.classList.remove("active");
if (right) {
i = j + 1;
i < list.length || (i = 0);
} else {
i = j - 1;
i < 0 && (i = list.length - 1);
}
}
});
list[i].classList.add("active");
const img = list[i].querySelector("img");
if (img) {
this._image.innerHTML = `
`;
}
}
e.stopPropagation();
}
/**
* 初始化
* @param imgs 图片链接(组)
* @param vertical 是否垂直
* @param active 显示第几张图片
*/
value(imgs, vertical = false, active = 0) {
imgs = isArray(imgs) ? imgs : [imgs];
active < imgs.length || (active = 0);
this._image.innerHTML = `
`;
vertical ? this.classList.add("vertical") : this.classList.remove("vertical");
this._list.innerHTML = "";
imgs.forEach((d, i) => {
const item = addElement("div", {
class: `preview-item-box${i === active ? " active" : ""}`,
style: "min-width: 54px; max-width: 54px; height: 54px;"
}, this._list, ``);
item.addEventListener("click", (e) => {
this._list.querySelector(".preview-item-box.active")?.classList.remove("active");
item.classList.add("active");
this._image.innerHTML = `
`;
e.stopPropagation();
});
});
document.body.contains(this) || document.body.appendChild(this);
document.body.style.overflow = "hidden";
}
};
customElements.get(`preview-image-${"fysuk576mg"}`) || customElements.define(`preview-image-${"fysuk576mg"}`, PreviewImage);
// src/core/comment.ts
var Feedback;
var loading = false;
var load = false;
var events = {};
var _Comment = class {
constructor() {
if (!_Comment.loaded) {
_Comment.loaded = true;
Feedback = void 0;
loading = false;
load = false;
events = {};
this.bbComment();
this.initComment();
this.pageCount();
}
}
/** 捕获评论组件 */
bbComment() {
Reflect.defineProperty(window, "bbComment", {
configurable: true,
set: (v) => {
if (!v.prototype._createNickNameDom) {
return loadScript("//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js").then(() => {
Array.from(document.styleSheets).forEach((d) => {
d.href && d.href.includes("comment") && (d.disabled = true);
});
});
}
Feedback = v;
this.bbCommentModify();
Reflect.defineProperty(window, "bbComment", { configurable: true, value: Feedback });
},
get: () => {
return Feedback ? Feedback : class {
constructor() {
if (!loading) {
loadScript("//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js").then(() => {
Array.from(document.styleSheets).forEach((d) => {
d.href && d.href.includes("comment") && (d.disabled = true);
});
});
loading = true;
}
setTimeout(() => {
let bbcomment = new window.bbComment(...arguments);
bbcomment.events && (bbcomment.events = Object.assign(bbcomment.events, events));
});
}
on(eventName, cb) {
if (!events[eventName]) {
events[eventName] = [];
}
events[eventName].push(cb);
}
};
}
});
}
initComment() {
Reflect.defineProperty(window, "initComment", {
configurable: true,
set: (v) => true,
get: () => {
if (load) {
let initComment2 = function(tar, init) {
new Feedback(tar, init.oid, init.pageType, init.userStatus);
};
var initComment = initComment2;
Reflect.defineProperty(window, "initComment", { configurable: true, value: initComment2 });
return initComment2;
}
return function() {
if (!loading) {
loadScript(`//s1.hdslb.com/bfs/seed/jinkela/commentpc/comment.min.js`).then(() => {
load = true;
});
}
loading = true;
setTimeout(() => window.initComment(...arguments), 100);
};
}
});
}
/** 修复按时间排序评论翻页数 */
pageCount() {
let page;
jsonpHook(["api.bilibili.com/x/v2/reply?", "sort=2"], void 0, (res) => {
if (0 === res.code && res.data?.page) {
page = res.data.page;
}
return res;
}, false);
jsonpHook(["api.bilibili.com/x/v2/reply?", "sort=0"], void 0, (res) => {
if (page && 0 === res.code && res.data?.page) {
page.count && (res.data.page.count = page.count);
page.acount && (res.data.page.acount = page.acount);
}
return res;
}, false);
}
/** 修补评论组件 */
bbCommentModify() {
this.styleFix();
this.initAbtest();
this._renderBottomPagination();
this._createListCon();
this._createSubReplyItem();
this._registerEvent();
this._resolvePictures();
_Comment.commentJumpUrlTitle && this._resolveJump();
}
/** 样式修补 */
styleFix() {
addCss(`.bb-comment .comment-list .list-item .info .btn-hover, .comment-bilibili-fold .comment-list .list-item .info .btn-hover {
line-height: 24px;
}`, "comment-btn-24pxH");
addCss(`.operation.btn-hide-re .opera-list {visibility: visible}`, "keep-operalist-visible");
addCss(".image-exhibition {margin-top: 8px;user-select: none;} .image-exhibition .image-item-wrap {max-width: 240px;display: flex;justify-content: center;position: relative;border-radius: 4px;overflow: hidden;cursor: zoom-in;} .image-exhibition .image-item-wrap.vertical {flex-direction: column} .image-exhibition .image-item-wrap.extra-long {justify-content: start;} .image-exhibition .image-item-wrap img {width: 100%;}", "image-exhibition");
}
/** 退出abtest,获取翻页评论区 */
initAbtest() {
Feedback.prototype.initAbtest = function() {
this.abtest = {};
this.abtest.optimize = false;
if (this.jumpId || this.noPage) {
this.abtest.optimize = false;
}
if (this.appMode === "comic") {
this.abtest.optimize = false;
}
this._registerEvent();
this.init();
};
}
/** 添加回小页码区 */
_renderBottomPagination() {
Feedback.prototype._renderBottomPagination = function(pageInfo) {
if (this.noPage) {
var isLastPage = pageInfo.count <= this.pageSize;
var html = "";
if (isLastPage) {
html = "没有更多了~";
} else {
html = '查看更多评论';
}
this.$root.find(".bottom-page").addClass("center").html(html);
return;
}
const count = Math.ceil(pageInfo.count / pageInfo.size);
if (count > 1) {
this.$root.find(".header-interaction").addClass("paging-box").paging({
pageCount: count,
current: pageInfo.num,
backFn: (p) => {
this.$root.trigger("replyPageChange", {
p,
isBottom: true
});
this.trigger("replyPageChange", {
p,
isBottom: true
});
this.currentPage = p;
}
});
this.$root.find(".bottom-page").paging({
pageCount: count,
current: pageInfo.num,
jump: true,
smallSize: this.smallPager,
backFn: (p) => {
this.$root.trigger("replyPageChange", {
p,
isBottom: true
});
this.trigger("replyPageChange", {
p,
isBottom: true
});
this.currentPage = p;
}
});
} else {
this.$root.find(".header-page").html("");
this.$root.find(".bottom-page").html("");
}
};
}
/** 顶层评论ip属地 */
_createListCon() {
Feedback.prototype._createListCon = function(item, i, pos) {
const blCon = this._parentBlacklistDom(item, i, pos);
const con = [
'',
'
' + this._createNickNameDom(item),
this._createLevelLink(item),
this._identity(item.mid, item.assist, item.member.fans_detail),
this._createNameplate(item.member.nameplate) + this._createUserSailing(item) + "
",
this._createMsgContent(item),
this._resolvePictures(item.content),
this._createPerfectReply(item),
'
',
item.floor ? '
#' + item.floor + "" : "",
this._createPlatformDom(item.content.plat),
'
',
''.concat(this._formateTime(item.ctime), ""),
item?.reply_control?.location ? `${item?.reply_control?.location || ""}` : "",
"",
item.lottery_id ? "" : '
' + (item.like ? item.like : "") + "",
item.lottery_id ? "" : '
',
item.lottery_id ? "" : this._createReplyBtn(item.rcount),
item.lottery_id && item.mid !== this.userStatus.mid ? "" : '
' + (this._canSetTop(item) ? '- ' + (item.isUpTop ? "取消置顶" : "设为置顶") + "
" : "") + (this._canBlackList(item.mid) ? '- 加入黑名单
' : "") + (this._canReport(item.mid) ? '- 举报
' : "") + (this._canDel(item.mid) && !item.isTop ? '- 删除
' : "") + "
",
this._createLotteryContent(item.content),
this._createVoteContent(item.content),
this._createTags(item),
"
",
'
',
this._createSubReplyList(item.replies, item.rcount, false, item.rpid, item.folder && item.folder.has_folded, item.reply_control),
"
",
'
',
"
",
"
"
].join("");
return item.state === this.blacklistCode ? blCon : con;
};
}
/** 楼中楼评论ip属地 */
_createSubReplyItem() {
Feedback.prototype._createSubReplyItem = function(item, i) {
if (item.invisible) {
return "";
}
return [
'',
this._createSubReplyUserFace(item),
'
',
'
',
this._createNickNameDom(item),
this._createLevelLink(item),
this._identity(item.mid, item.assist, item.member.fans_detail),
this._createSubMsgContent(item),
"
",
"
",
'
',
item.floor ? '
#' + item.floor + "" : "",
this._createPlatformDom(item.content.plat),
'
',
''.concat(this._formateTime(item.ctime), ""),
item?.reply_control?.location ? `${item?.reply_control?.location || ""}` : "",
"",
'
' + (item.like ? item.like : "") + "",
'
',
'
回复',
item.dialog != item.rpid ? '
查看对话' : "",
'
' + (this._canBlackList(item.mid) ? '- 加入黑名单
' : "") + (this._canReport(item.mid) ? '- 举报
' : "") + (this._canDel(item.mid) ? '- 删除
' : "") + "
",
"
",
"
"
].join("");
};
}
/** 楼中楼“查看对话按钮” & 让评论菜单可以通过再次点击按钮来关闭 */
_registerEvent() {
const _registerEvent = Feedback.prototype._registerEvent;
let previewImage;
Feedback.prototype._registerEvent = function(e) {
_registerEvent.call(this, e);
let n = this.$root;
let $ = window.$;
if (e)
n = $(e);
let l = this;
n.on("click.dialog", ".dialog", function() {
let clickTarget = this;
clickTarget.innerHTML = "正在载入……";
let rootid = clickTarget.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("data-id");
let dialogid = clickTarget.getAttribute("dialog-id");
let selfRpid = clickTarget.getAttribute("data-id");
addCss(`
.comment-dialog .dialog{display:none!important}
.comment-dialog > .comment-list{transform:translateY(-13px)}
.comment-dialog{min-height:200px;max-height:70vh;overflow-y:auto}
.comment-dialog-container{width:600px;z-index:100000;position:fixed;background:#fff;left:50%;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 20px 3px #0000005c;border-radius:10px;padding:0 18px;opacity:1;transition:opacity 0.1s}
.comment-dialog-container.hidden{opacity:0}`, "comment-dialog");
let container = document.createElement("div");
container.className = "comment-dialog-container hidden";
container.innerHTML = `
`;
document.body.appendChild(container);
let replyBox = container.getElementsByClassName("reply-box")[0];
setTimeout(() => {
let closeWindow = (e2) => {
if (!container.contains(e2.target) && e2.target != container) {
container.className = "comment-dialog-container hidden";
setTimeout(() => container.remove(), 100);
clickTarget.innerHTML = "查看对话";
window.removeEventListener("click", closeWindow, false);
}
};
window.addEventListener("click", closeWindow);
}, 0);
function fetchDialog(minFloor) {
return $.ajax({
url: "//api.bilibili.com/x/v2/reply/dialog/cursor",
type: "GET",
data: {
type: l.pageType,
oid: l.oid,
root: rootid,
dialog: dialogid,
size: 20,
min_floor: minFloor
},
xhrFields: { withCredentials: true }
});
}
function fixEmojiPosition(node) {
node = $(node);
node.find(".reply-item").each(function(_, n2) {
var t = $(n2).find(".reply-face"), r = $(n2).find(".user"), n2 = $(n2).find(".name");
t && r && n2 && (10 < n2.offset().top - r.offset().top ? t.css("top", "32px") : t.css("top", "0"));
});
}
fetchDialog(0).done((resp) => {
if (resp.code == 0 && resp.data.replies && resp.data.replies.length > 0) {
let nextPage2 = function(minFloor) {
if (minFloor < resp.data.dialog.max_floor) {
fetchDialog(minFloor + 1).done((resp2) => {
if (resp2.code == 0 && resp2.data.replies && resp2.data.replies.length > 0) {
replyBox.insertAdjacentHTML("beforeend", l._createSubReplyList(resp2.data.replies, resp2.data.replies.length, true, rootid, null, false));
nextPage2(resp2.data.cursor.max_floor);
}
});
} else {
fixEmojiPosition(replyBox);
replyBox.querySelector(`div[data-id="${selfRpid}"]`).style.cssText = `
background: linear-gradient(45deg, rgba(115,108,231,0.13) 0%, rgba(0,161,214,0.13) 67%, rgba(0,212,255,0.13) 100%);
border-radius: 15px;
margin-right: 15px;`;
}
};
var nextPage = nextPage2;
replyBox.innerHTML = l._createSubReplyList(resp.data.replies, resp.data.replies.length, true, rootid, null, false);
l._registerEvent(container);
container.className = "comment-dialog-container";
fixEmojiPosition(replyBox);
nextPage2(resp.data.cursor.max_floor);
}
});
});
n.off("click.operation", ".spot");
n.on("click.operation", ".spot", function(e2) {
let operalist = this.parentNode.getElementsByClassName("opera-list")[0];
if (l.lastClickOperation != this || operalist && operalist.style.display == "none") {
$(".opera-list").hide(), $(this).siblings(".opera-list").show(), e2.stopPropagation(), $(this).hasClass("more-operation") && (e2 = +$(this).parents(".reply-wrap:eq(0)").attr("data-id"));
l.lastClickOperation = this;
} else
operalist && (operalist.style.display = "none");
});
n.on("click.image-exhibition", ".image-item-img", function(e2) {
const src = this.src;
const srcs = [];
this.parentElement?.parentElement?.querySelectorAll("img").forEach((d) => {
srcs.push(d.src);
});
srcs.length || srcs.push(src);
previewImage || (previewImage = new PreviewImage());
previewImage.value(srcs, this.parentElement?.classList.contains("vertical"), srcs.indexOf(src));
});
};
}
_resolveJump() {
Feedback.prototype._resolveJump = function(str, jumpUrl) {
var jumpUrlSortKeyList = [];
for (var item in jumpUrl) {
if (item.startsWith("http")) {
jumpUrlSortKeyList.unshift(item);
} else {
jumpUrlSortKeyList.push(item);
}
}
for (var _i = 0, _jumpUrlSortKeyList = jumpUrlSortKeyList; _i < _jumpUrlSortKeyList.length; _i++) {
var jumpKey = _jumpUrlSortKeyList[_i];
if (str.includes(jumpKey)) {
var _jumpInfo$extra;
var jumpInfo = jumpUrl[jumpKey];
var img = jumpInfo.prefix_icon ? '
' : "";
var content = jumpKey;
if ((_jumpInfo$extra = jumpInfo.extra) !== null && _jumpInfo$extra !== void 0 && _jumpInfo$extra.is_word_search) {
continue;
} else {
var url = jumpInfo.pc_url ? jumpInfo.pc_url : jumpKey.indexOf("http") === 0 ? jumpKey : this._createLinkById(jumpKey);
var res = img + (jumpInfo.state === 0 ? '" : content);
var reg = new RegExp(jumpKey.replace(/\?/, "\\?"), "ig");
try {
var regStr = jumpKey.replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/\?/, "\\?");
var reg = new RegExp(regStr, "ig");
str = str.replace(reg, res);
} catch (e) {
}
}
this.jumpReport[this.jumpReportIndex] = jumpInfo.click_report;
this.jumpReportIndex++;
}
}
return BV2avAll(str);
};
}
/** 评论图片 */
_resolvePictures() {
Feedback.prototype._resolvePictures = function(content) {
const pictureList = [];
if (content) {
if (content.rich_text?.note?.images) {
content.pictures || (content.pictures = []);
content.rich_text.note.images.forEach((d) => {
content.pictures.push({
img_src: d,
click_url: content.rich_text.note.click_url
});
});
}
if (content.pictures && content.pictures.length) {
pictureList.push(``);
content.pictures.forEach((d) => {
const type = d.img_width >= d.img_height ? "horizontal" : "vertical";
const extraLong = d.img_width / d.img_height >= 3 || d.img_height / d.img_width >= 3;
pictureList.push(
'`
);
});
pictureList.push(`
`);
}
}
return pictureList.join("");
};
}
};
var Comment = _Comment;
__publicField(Comment, "commentJumpUrlTitle", false);
__publicField(Comment, "loaded", false);
// src/comment.ts
new Comment();
// @license MIT
})();