Greasy Fork is available in English.

Plurk no redirector

try to take over the world!

// ==UserScript==
// @name         Plurk no redirector
// @namespace    http://mmis1000.me/
// @version      0.1.10
// @description  try to take over the world!
// @author       You
// @match        https://www.plurk.com/*
// @grant        none
// ==/UserScript==

/* global jQuery, getBody, Media */
jQuery(function() {
    // window.Media = null;

    function shouldBeExclude(el) {
        function checkStop(el) {
            return jQuery(el).is('a.ex_link') &&
                !jQuery(el).is('.pictureservices') &&
                !jQuery(el).is('.iframeembed') &&
                !jQuery(el).is('.plink') &&
                !(/^https?:\/\/[^\.]+\.plurk\.com\//).test(el.attr('href') + '');
        }

        let currentEl = jQuery(el);
        let shouldStop = checkStop(currentEl)

        while (currentEl.get(0) && !shouldStop) {
            currentEl = currentEl.parent();
            shouldStop = shouldStop || checkStop(currentEl);
        }

        console.log('check', shouldStop, shouldStop ? currentEl : el);

        if (shouldStop) {
            currentEl.attr('rel', 'noreferrer noopener')
        }

        return shouldStop;
    }

    var $body = jQuery('#layout_body');
    $body.on('click', '#layout_content a.ex_link', function(el){el.target && el.target.setAttribute('rel', 'noreferrer noopener')})

    jQuery._data(jQuery('#layout_body').get(0), 'events').click
        .map((o)=>[o.handler.toString(), o])
        // .filter((arr)=>(/hasClass\("ex_link"\)/).test(arr[0]) || (/_hideLink/).test(arr[0]))
        .forEach(function ([code, layoutBodyClickData]) {
        jQuery('#layout_body').off('click', layoutBodyClickData.handler);
        const handler = function (ev) {
            if (shouldBeExclude(ev.target)) {
                console.log('stop go plurk')
                return;
            } else {
                return layoutBodyClickData.handler.call(this, ev);
            }
        }

        if (layoutBodyClickData.selector) {
            jQuery('#layout_body').on('click', layoutBodyClickData.selector, handler)
        } else {
            jQuery('#layout_body').on('click', handler)
        }
    })

    try {
        const verticalTimelineClickData = jQuery._data(jQuery('#vert_timeline').get(0), 'events').click
        .map((o)=>[o.handler.toString(), o])
        .filter((arr)=>(/window\.open\(this\.href\)/).test(arr[0]))[0][1]

        jQuery('#vert_timeline').off('click', verticalTimelineClickData.handler)

        jQuery._data(jQuery('#vert_timeline').get(0), 'events').click
            .map((o)=>[o.handler.toString(), o])
            // .filter((arr)=>(/_hideLink/).test(arr[0]))
            .forEach(function ([code, layoutBodyClickData]) {
            jQuery('#vert_timeline').off('click', layoutBodyClickData.handler);
            const handler = function (ev) {
                if (shouldBeExclude(ev.target)) {
                    console.log('stop go plurk', ev.target)
                    return;
                } else {
                    return layoutBodyClickData.handler.call(this, ev);
                }
            }

            if (layoutBodyClickData.selector) {
                jQuery('#vert_timeline').on('click', layoutBodyClickData.selector, handler)
            } else {
                jQuery('#vert_timeline').on('click', handler)
            }
        })
    } catch (e) {
        // '#vert_timeline' does not exist
    }
    console.log('loaded')
});