// ==UserScript==
// @name Wanta
// @namespace http://tampermonkey.net/
// @version 0.3.2
// @description 移除跳转外链提示
// @author PRO
// @match *://www.jianshu.com/p/*
// @match *://juejin.cn/post/*
// @match *://gitee.com/*
// @match *://zhuanlan.zhihu.com/*
// @match *://*.feishu.cn/*
// @match *://leetcode.cn/problems/*
// @match *://www.mcmod.cn/*
// @match *://www.mcbbs.net/*
// @icon https://greasyfork.org/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBMWhLQVE9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--2831c7f8ea43fc8b8e3eed3818b98e88bb689285/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-07-16%20105357.png?locale=zh-CN
// @grant none
// @license unlicense
// ==/UserScript==
(function() {
'use strict';
let debug = false;
// domain: [link_prefix query_parameter main_article_path dynamic_query decode_func always_listen]
// query_parameter = '': Get the last part of url
function same(orig) {
return orig;
}
function b64Decode(orig) {
return decodeURIComponent(atob(orig));
}
let fuck = {
'www.jianshu.com': ['https://links.jianshu.com/go', 'to', 'article', '', decodeURIComponent, false],
'juejin.cn': ['https://link.juejin.cn', 'target', '#juejin > div.view-container > main > div > div.main-area.article-area > article', ' > .article-content', decodeURIComponent, false],
'gitee.com': ['https://gitee.com/link', 'target', '.markdown-body', '', decodeURIComponent, false],
'zhuanlan.zhihu.com': ['https://link.zhihu.com/', 'target', 'div.Post-RichTextContainer', '', decodeURIComponent, false],
'.*\.feishu\.cn': ['https://security.feishu.cn/link/safety', 'target', 'div#mainBox', ' div.mindnote-paper', decodeURIComponent, false],
'leetcode.cn': ['https://leetcode.cn/link/', 'target', '#app', ' div#question-detail-main-tabs', same, true],
'www.mcmod.cn': ['https://link.mcmod.cn/target/', '', 'body > div.col-lg-12.common-frame > div > div.col-lg-12.center > div.col-lg-12.right', '', b64Decode, false],
'www.mcbbs.net': ['https://www.mcbbs.net/plugin.php', 'target', 'div#ct', '', decodeURIComponent, false]
};
let domain = document.domain;
if (!(domain in fuck)) {
for (let d in fuck) {
if (domain.match(d)) {
domain = d;
break;
}
}
}
let suffix = fuck[domain][0];
let query_name = fuck[domain][1];
let main_path = fuck[domain][2];
let dynamic = fuck[domain][3];
let decode_func = fuck[domain][4];
let always_listen = fuck[domain][5];
let name = 'Wanta';
function purify(link) {
let new_href;
if (query_name.length == 0) {
let l = link.href.split('/');
new_href = l[l.length - 1];
} else {
let params = new URL(link.href).searchParams;
new_href = params.get(query_name);
}
new_href = decode_func(new_href);
if (new_href) {
if (debug) console.log(`[${name} DEBUG] ${link.href} -> ${new_href}`);
link.href = new_href;
return true;
}
else {
console.log(`[${name}] Failed to purify below link element:`);
console.log(link);
return false;
}
}
function main() {
let target_node = document.querySelector(main_path + dynamic);
let links;
if (target_node) {
links = target_node.getElementsByTagName('a');
} else {
return;
}
if (debug) console.log(links);
let purified = 0;
for (let i = 0;i < links.length; i++) {
if (links[i].href.startsWith(suffix)) {
if (purify(links[i])) purified++;
} else if (debug) console.log(`[${name} DEBUG] Skipped "${links[i].href}".`);
}
console.log(`[${name}] Purified ${purified} links out of ${links.length} links.`);
}
if (dynamic) {
const node = document.querySelector(main_path);
const config = { attributes: false, childList: true, subtree: true };
const callback = function(mutations, observer) {
let article = node.querySelector(dynamic.slice(3));
if (article) {
main();
if (!always_listen)
observer.disconnect();
}
}
const observer = new MutationObserver(callback);
observer.observe(node, config);
}
else main();
})();