Greasy Fork

来自缓存

Wanta

移除跳转外链提示

目前为 2023-03-27 提交的版本。查看 最新版本

// ==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();
})();