User:SunAfterRain/js/externalPopup.js
外观
< User:SunAfterRain | js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
Promise.all([
$.ready,
mw.loader.using(['oojs-ui-windows', 'ext.gadget.HanAssist'])
]).then(([, require]) => {
if (mw.config.get('wgNamespaceNumber', -3) < 0) {
return;
}
const messages = require('ext.gadget.HanAssist').batchConv({
warningTemplate: {
hans: '警告:$1是否继续前往?',
hant: '警告:$1是否繼續前往?',
},
miscWarning: {
hans: '您所点击的连结指向网站 $1 并非维基媒体基金会旗下网站。',
hant: '您所點擊的連結指向網站 $1 並非維基媒體基金會旗下網站。',
},
wmcsWarning: {
hans: '维基媒体云端服务(WMCS)拥有自己的隐私权政策,不受维基媒体基金会的隐私权政策管辖。',
hant: '維基媒體雲端服務(WMCS)擁有自己的隱私權政策,不受維基媒體基金會的隱私權政策管轄。',
},
archiveTodayWarning: {
hans: 'Archive.today 近期被检查出有安全风险。',
hant: 'Archive.today 近期被檢查出有安全風險。',
},
});
const whitelistList = [
'wikipedia.org',
'wiktionary.org',
'wikibooks.org',
'wikinews.org',
'wikiquote.org',
'wikisource.org',
'wikiversity.org',
'wikivoyage.org',
'wikimedia.org',
'wikidata.org',
'wikifunctions.org',
'mediawiki.org',
'w.wiki',
// 'wmflabs.org',
// 'wmcloud.org',
// 'toolforge.org',
// 沒啥好警告的
'wikimediastatus.net',
// 常用短網址
'zhwp.org',
];
const whitelistRegex = new RegExp(whitelistList.map(host => '(^|\\.)' + mw.util.escapeRegExp(host) + '$').join('|'));
const wmcsHostRegex = /(^|\.)(wmflabs|wmcloud|toolforge)\.org$/;
const archiveTodayHostRegex = /(^|\.)archive\.(today|[a-z]{2})$/;
function selectMessage(url) {
let host;
try {
host = new URL(url).hostname;
} catch (error) {
host = (url.split('//')[1] || url).split('/')[0];
}
if (host === window.location.hostname || whitelistRegex.test(host)) {
return false;
} else if (wmcsHostRegex.test(host)) {
return messages.wmcsWarning;
} else if (archiveTodayHostRegex.test(host)) {
return messages.archiveTodayWarning;
} else {
return mw.format(messages.miscWarning, host);
}
}
const badHrefRegex = /^(\?|#|\/(?!\/))/;
const issued = new WeakMap();
$(document).on("click", "a[href]", (ev) => {
const ele = ev.target;
if (issued.has(ele)) {
return;
}
issued.delete(ele);
const $ele = $(ele);
const attrHref = $ele.attr("href");
if (!attrHref || badHrefRegex.test(attrHref)) {
// 內部連結 or js 加上的連結
return;
}
const msg = selectMessage($ele.prop("href"));
if (!msg) {
return;
}
ev.preventDefault();
ev.stopPropagation();
OO.ui.confirm(mw.format(messages.warningTemplate, msg)).then((ret) => {
if (ret) {
issued.set(ele, true); // 防止重覆觸發自身
ele.click();
}
});
});
});