/*!
// ==UserScript==
// @name 跳转链接修复(外链直达)
// @namespace https://github.com/maomao1996/tampermonkey-scripts
// @version 1.2.0
// @description 修复跳转链接为站外直链(移除重定向),免去拦截页面点击步骤可直达站外;拦截页面自动跳转;已适配百度搜索、360 搜索、知乎、知乎专栏、掘金、码云、开源中国、简书、CSDN、力扣(Leetcode)、语雀、微信开放社区、微博、牛客网、豆瓣
// @author maomao1996
// @include *
// @grant none
// ==/UserScript==
*/
;
(function () {
'use strict';
var SITES = {
'baidu.com': {
transform: {
selector: '#content_left > div',
customTransform: function (node) {
var originUrl = node.getAttribute('mu');
originUrl && node.querySelectorAll('a').forEach(function (a) { return a.setAttribute('href', originUrl); });
}
}
},
'so.com': {
transform: {
selector: '.result li.res-list',
customTransform: function (node) {
var originUrl = node.querySelector('a[data-mdurl]').getAttribute('data-mdurl');
originUrl && node.querySelectorAll('a').forEach(function (a) { return a.setAttribute('href', originUrl); });
}
}
},
'zhihu.com': {
transform: { selector: '[href*="link.zhihu.com/?target="]' }
},
'zhuanlan.zhihu.com': {
transform: { selector: '[href*="link.zhihu.com/?target="]' }
},
'link.zhihu.com': {
autojump: {}
},
'juejin.cn': {
transform: { selector: '[href*="link.juejin.cn?target="]' }
},
'link.juejin.cn': {
autojump: {}
},
'gitee.com': {
transform: { selector: '[href*="gitee.com/link?target="]' },
autojump: { validator: function () { return pathname === '/link'; } }
},
'oschina.net': {
transform: {
selector: '[href*="oschina.net/action/GoToLink?url="]',
separator: 'GoToLink?url='
},
autojump: {
validator: function () { return pathname === '/action/GoToLink'; },
query: 'url'
}
},
'my.oschina.net': {
transform: {
selector: '[href*="oschina.net/action/GoToLink?url="]',
separator: 'GoToLink?url='
}
},
'jianshu.com': {
transform: {
selector: '[href*="links.jianshu.com/go?to="]',
separator: 'go?to='
},
autojump: { validator: function () { return pathname === '/go-wild'; }, query: 'url' }
},
'link.csdn.net': {
autojump: {}
},
'leetcode.cn': {
transform: { selector: '[href*="/link/?target="]' }
},
'yuque.com': {
autojump: { validator: function () { return pathname === '/r/goto'; }, query: 'url' }
},
'developers.weixin.qq.com': {
autojump: {
validator: function () { return pathname === '/community/middlepage/href'; },
query: 'href'
}
},
'weibo.cn': {
autojump: { validator: function () { return pathname === '/sinaurl'; }, query: 'u' }
},
'nowcoder.com': {
transform: {
selector: [
'[href*="gw-c.nowcoder.com/api/sparta/jump/link?link="]',
'[href*="hd.nowcoder.com/link.html?target="]'
].join(','),
separator: /\?target|link\=/
}
},
'hd.nowcoder.com': {
autojump: {}
},
'douban.com': {
autojump: { validator: function () { return pathname === '/link2/'; }, query: 'url' }
}
};
var hostname = location.hostname, pathname = location.pathname;
var _a = SITES[hostname.replace(/^www\./, '')] || {}, transform = _a.transform, autojump = _a.autojump;
if (transform) {
var selector_1 = transform.selector, _b = transform.separator, separator_1 = _b === void 0 ? '?target=' : _b, _c = transform.customTransform, customTransform_1 = _c === void 0 ? function (node) {
var _a = node.href.split(separator_1), originUrl = _a[1];
if (originUrl) {
node.href = decodeURIComponent(originUrl);
}
} : _c;
var observer = new MutationObserver(function () {
document.querySelectorAll(selector_1).forEach(customTransform_1);
});
observer.observe(document.body, { childList: true, subtree: true });
}
if (autojump) {
var validator = autojump.validator, _d = autojump.query, query = _d === void 0 ? 'target' : _d;
if (validator && !validator()) {
return;
}
var originUrl = new URLSearchParams(location.search).get(query);
originUrl && location.replace(originUrl);
}
})();