跳转到内容

User:SunAfterRain/js/externalPopup.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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();
			}
		});
	});
});