-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.js
85 lines (77 loc) · 3.47 KB
/
content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const HIDE_REASON_MAP = {
"KfeCollection-AnswerTopCard-Container": "付费内容",
"KfeCollection-FabledStatement": "虚构创作",
"LabelContainer": "虚构创作" // possible, need secondary check
} // key: badge name, value: reason
const blockAllKfeCollectionBadges = () => {
// TODO add throttling to optimize
let params = new URLSearchParams(window.location.search);
const currUrl = $(location).attr("href");
if (!currUrl.match(/zhihu.com/g)) {
//console.log("Not a zhihu domain, not running extension...");
return;
}
if (params.get("hideSpam") === "false") {
return;
}
const kfeCollectionBadgeClzName = "KfeCollection-AnswerTopCard-Container";
const kfeCollectionFabledAnsClzName = "KfeCollection-FabledStatement";
const possibleFabledAnsClzName = "LabelContainer";
const targetAnswerContainerClzName = "ContentItem AnswerItem";
const allKfeCollectionBadges = $(`.${kfeCollectionBadgeClzName}`);
const allKfeCollectionFabledAnsBadges = $(`.${kfeCollectionFabledAnsClzName}`);
const allPossibleFabledBadge = $(`.${possibleFabledAnsClzName}`);
const allSpamBadges = $.merge(allKfeCollectionFabledAnsBadges, $.merge(allKfeCollectionBadges, allPossibleFabledBadge));
const makeShowSpamBtn = (answerDom) => {
const answerUrl = extractSingleAnswerUrl(answerDom);
return !!answerUrl ? `<button style="color:#2196F3"><a href="${answerUrl}" target="_blank"><b>跳转到此答案</b></a></button>` : "";
}
const makePlaceholderText = (hideReason) => {
return !!hideReason ? `zhihu-spam-blocker为您拦截了此疑似垃圾答案 (原因:${hideReason})` : "zhihu-spam-blocker为您拦截了此疑似垃圾答案";
}
const extractSingleAnswerUrl = (answerDom) => {
const answerId = answerDom.attr("name");
const dataZaExtraModule = answerDom.attr("data-za-extra-module");
const questionId = JSON.parse(dataZaExtraModule)?.card?.content?.parent_token;
if (!!answerId && !!questionId) {
return `https://zhihu.com/question/${questionId}/answer/${answerId}?hideSpam=false`;
}
return null;
}
const findHideReason = (clzAttr) => {
const matchedKeys = Object.keys(HIDE_REASON_MAP).filter(h => clzAttr.includes(h));
if (!!matchedKeys?.length){
return HIDE_REASON_MAP[matchedKeys[0]];
}
return null;
}
allSpamBadges.each(function(k){
if ($(this).attr("class").includes(possibleFabledAnsClzName)) {
if (!$(this).text().match(/包含虚构创作/)){
return; // e.g. continue
}
}
const hideReason = findHideReason($(this).attr("class"));
const parents = $(this).parents(5);
let answerContainer = null;
parents.each(function(p){
const clzName = $(this).attr("class");
if (!!clzName && clzName === targetAnswerContainerClzName){
answerContainer = $(this);
return false; // e.g. break
}
});
if (!!answerContainer) {
answerContainer.hide();
answerContainer.replaceWith(`<h2>${makePlaceholderText(hideReason)} ${makeShowSpamBtn(answerContainer)}</h2>`);
}
});
}
const targetNode = document.body;
const config = {
attributes: false,
childList: true,
subtree: true
};
const observer = new MutationObserver(blockAllKfeCollectionBadges);
observer.observe(targetNode, config);