移除LeetCode-CN付费题目 付费书籍
当前为
// ==UserScript==
// @name 移除LeetCode-CN付费(plus专享)题目与书籍
// @namespace http://tampermonkey.net/
// @version 0.2
// @description 移除LeetCode-CN付费题目 付费书籍
// @author SmileYik
// @match *://leetcode-cn.com/*
// @match *://leetcode.cn/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=leetcode-cn.com
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Your code here...
const PLUS_TAG_CLASS = "css-mn931f-PlusTag";
const ANT_TABLE_ROW_CLASS = "ant-table-row";
const ANT_TABLE_CONTENT = "ant-table-content";
const PAID_ONLY_ICON_CLASS = "paid-only-icon__hiYO";
const QUESTION_CLASS = "question__3lUu";
const REMOVE_TOGETHER_CLASS_1_1 = "ml-2";
const REMOVE_TOGETHER_CLASS_1_2 = "shrink-0";
const REMOVE_TOGETHER_CLASS = "odd:bg-layer-1";
const LEFT_PROBLEM_PANE = "question-picker-detail-menu__3NQq show__3hiR";
const PRICE_CONTAINER_CLASS = "css-1b13e60-PriceContainer";
const DISCOUNT_CONTAINER_CLASS = "css-2xg4ff-DiscountContainer";
const BOOK_CONTAINER_CLASS = "css-1v2lce9-BookContainer";
const TOP_LEFT_TAG_CLASS = "css-69f4mf-TopLeftTag";
const KEYWORD_OF_TOP_LEFT_TAG_SRC = "premium-only";
let removePlugProblemsTickId = 0;
let removePlugProblemsTickTimes = 60;
let removePriceBookTickId = 0;
let removePriceBookTickTimes = 60;
window.onload = function() {
removePlugProblemsTickTimes = 60;
removePlugProblemsTickId = setInterval(removePlugProblemsTick, 1000);
removePriceBookTickTimes = 60;
removePriceBookTickId = setInterval(removePriceBookTick, 1000);
setInterval(function() {
const element = document.getElementsByClassName(LEFT_PROBLEM_PANE);
if (element.length > 0) {
removePlugProblemsEvent(getPlusProblems());
}
}, 1000);
document.body.onmousewheel = function () {
const elements = getAllBook();
removePriceBookEvent(elements);
removePlugProblemsEvent(getPlusProblems());
}
};
function getPlusProblems() {
const elements = [];
let temp = document.getElementsByClassName(PLUS_TAG_CLASS);
for (let i in temp) {
elements.push(temp[i]);
}
temp = document.getElementsByClassName(PAID_ONLY_ICON_CLASS);
for (let i in temp) {
elements.push(temp[i]);
}
temp = document.getElementsByClassName(REMOVE_TOGETHER_CLASS_1_1);
for (let i in temp) {
if (containsClassName(temp[i], REMOVE_TOGETHER_CLASS_1_2)) {
elements.push(temp[i]);
}
}
return elements;
}
function removePlugProblemsTick() {
removePlugProblemsTickTimes -= 1;
const table = document.getElementsByClassName(ANT_TABLE_CONTENT);
if (table.length <= 0) {
if (removePlugProblemsTickTimes == 0) {
clearInterval(removePlugProblemsTickId);
}
return;
}
const elements = getPlusProblems();
if (elements.length <= 0) {
if (removePlugProblemsTickTimes == 0) {
clearInterval(removePlugProblemsTickId);
}
return;
}
removePlugProblemsEvent(elements);
clearInterval(removePlugProblemsTickId);
}
function removePlugProblemsEvent(elements) {
for (let index in elements) {
let element = elements[index];
while (element && element.tagName != "BODY") {
if (element && (containsClassName(element, ANT_TABLE_ROW_CLASS) || containsClassName(element, REMOVE_TOGETHER_CLASS) || containsClassName(element, QUESTION_CLASS))) {
element.hidden = "hidden";
break;
}
element = element.parentElement;
}
}
}
function getAllBook() {
const elements1 = document.getElementsByClassName(PRICE_CONTAINER_CLASS);
const elements2 = document.getElementsByClassName(DISCOUNT_CONTAINER_CLASS);
const elements3 = document.getElementsByClassName(TOP_LEFT_TAG_CLASS);
let elements = [];
for (let index in elements1) {
elements.push(elements1[index]);
}
for (let index in elements2) {
elements.push(elements2[index]);
}
for (let index in elements3) {
const element = elements3[index];
if (element && element.src && element.src.indexOf(KEYWORD_OF_TOP_LEFT_TAG_SRC) > 0) {
elements.push(element);
}
}
return elements;
}
function removePriceBookTick() {
removePriceBookTickTimes -= 1;
const elements = getAllBook();
if (elements.length <= 0) {
if (removePlugProblemsTickTimes == 0) {
clearInterval(removePriceBookTickId);
return;
}
}
removePriceBookEvent(elements);
clearInterval(removePriceBookTickId);
}
// give elements and to check which should be remove.
function removePriceBookEvent(elements) {
for (let index in elements) {
let element = elements[index];
if (element.tagName == "DIV" && element.childElementCount == 0) {
continue;
}
while (element && element.tagName != "BODY") {
let parent = element.parentElement;
if (parent && containsClassName(parent, BOOK_CONTAINER_CLASS)) {
element.hidden = "hidden";
break;
}
element = parent;
}
}
}
// check the element contants aim class name or not.
function containsClassName(element, className) {
const list = element.classList;
for (let index in list) {
if (list[index] == className) {
return true;
}
}
return false;
}
})();