MediaWiki talk:Gadget-Difflink.js

message: 我最近发现许多人不会使用差异链接，在文中贴的大都是直接从浏览器地址栏获得的一长串url，而不是Special:diff/xxxxxx/yyyyyy这种形式。这往往会造成阅读上的困难，甚至会造成错误。即使有些知道这点的用户也可能搞不懂diff和oldid这两串数字的区别，经常写反新旧版本。所以我今天顺手写了一个小工具来提供这个功能，并已经实装在我的站内。使用起来非常方便，只需“先对比选择版本->点击一键复制->粘贴到需要的地方”即可，相比从地址栏复制url后再自己拼贴而言，我想要方便得多。示例图片（为了方便就用外链了）。
以下是我在站内实装版本的简化并适配后的代码（因为在官方站内的话就不需要考虑其他东西了）：
(() => {
	let query = value => {return decodeURIComponent(location.search.substr('1').match(new RegExp(`(^|&)${value}=([^&]*)(&|$)`, 'i'))['2'])};
	const diff = query('diff'), oldid = query('oldid');
	if (document.getElementById('p-cactions') && oldid) {
		let ins = (tex, dec, link) => {
					mw.util.addPortletLink('p-cactions', '#', tex, 't-difflink', dec);
					document.getElementById('t-difflink').addEventListener('click', () => {
						event.preventDefault();
						OO.ui.alert(new mw.widgets.CopyTextLayout({copyText: link}).$element)
					})
				};
		diff ? ins(wgUVS('当前差异链接', '當前差異連結'), wgUVS('复制链接到当前差异版本的维基语法', '複製連結到當前差異版本的維基語法'), `[[Special:Diff/${oldid}${isNaN(diff)?``:`/${diff}`}]]`) : ins(wgUVS('当前修订链接', '當前修訂連結'), wgUVS('复制链接到当前修订版本的维基语法', '複製連結到當前修訂版本的維基語法'), `[[Special:PermanentLink/${oldid}]]`)
	}
})();
--安忆Talk 2020年11月18日 (三) 06:57 (UTC)
* Scvoet Talk 2020年11月18日 (三) 07:25 (UTC)
*已复制此代码至单独js文件，亲测成功，感谢。--Wcam（留言） 2020年11月18日 (三) 14:10 (UTC)
**有一点需要留意的：早期浏览器不支持箭头函数()=>{}；value=>{}及模板字符串，如果在这种环境下，请将其修改为function(){}；function(value){}及普通字符串拼接。--安忆Talk 2020年11月18日 (三) 14:20 (UTC)
*:@Wcam：咱又照葫芦画瓢小改了一下，如果浏览器不是IE的话，用上面那个也一样。--安忆Talk 2020年11月21日 (六) 11:44 (UTC)
replies: text: :阁下可否考虑在您自己的用户空间建立一个「官方」版本的单独js，可供各位调用？--Wcam（留言） 2020年11月21日 (六) 12:29 (UTC)

text: 取得ID方式過於醜陋...請善用mw.config（範例）。--Xiplus#Talk 2020年11月18日 (三) 15:29 (UTC)
replies: text: :啊…这是因为在镜像站这面，添加的脚本偶尔有加载顺序问题，可能会先于window.mw的注册。与其判断并等待，不如直接用原生的。这部分函数只是节选，我这面的上下文中也有具体的应对措施来保证脚本在jq、mw都被加载后再执行。不过还是习惯尽可能地用原生函数了，贴过来看到没影响使用，也就没有再改。--安忆Talk 2020年11月18日 (三) 15:42 (UTC)
replies: text: ::--安忆Talk 2020年11月18日 (三) 15:57 (UTC)

text: 開一個新的乾脆：（順道load.php竟然不解析模板字符串直接報錯......）
$(function ($){
	var diff = mw.config.get("wgDiffNewId"),
		oldid = mw.config.get("wgDiffOldId") || mw.config.get("wgRevisionId");
	if ( mw.config.get('wgAction') == 'view' && diff ) {
		let link = mw.util.addPortletLink('p-cactions', '#', wgUVS('当前差异链接', '當前差異連結'), 't-difflink', wgUVS('复制链接到当前版本差异的维基语法', '複製連結到當前版本差異的維基語法'));
		$(link).on('click', function (e) {
			e.preventDefault();
			OO.ui.alert(
				new mw.widgets.CopyTextLayout({copyText: '[[Special:Diff' + $(".diff-multi").length > 0 ? '/' + oldid :  + '/' + diff + ']]'}).$element
			);
		});
	} else if ( mw.config.get('wgAction') == 'view' && oldid ) {
		let link = mw.util.addPortletLink('p-cactions', '#', wgUVS('当前修订链接', '當前修訂連結'), 't-difflink', wgUVS('复制链接到当前修订的维基语法', '複製連結到當前修訂的維基語法'));
		$(link).on('click', function (e) {
			e.preventDefault();
			OO.ui.alert(
				new mw.widgets.CopyTextLayout({copyText: 'Special:PermanentLink/' + oldid  +''}).$element
			);
		});
	}
});

text: -- Sunny00217  2020年11月21日 (六) 10:00 (UTC)
replies: text: :别的不清楚，我这儿Win8.1的IE10还是11来着是不支持ES6的。--安忆Talk 2020年11月21日 (六) 10:07 (UTC)
replies: text: ::对了，let貌似也是ES6的。--安忆Talk 2020年11月21日 (六) 10:44 (UTC)

text: 还有一个问题，对于类似&diff=cur&oldid=prev的链接，该工具无法取得真实差异ID，是否有方法解决？--Wcam（留言） 2020年11月21日 (六) 12:29 (UTC)
replies: text: :@Wcam：mw.loader.load('/wiki/User:AnYiLin/Difflink.js?action=raw&ctype=text/javascript');--安忆Talk 2020年11月21日 (六) 13:31 (UTC)
* 用回了mwApi，不使用ES6的版本。如果用jQuery可能会更简洁一点，“p-cactions”在移动端没有，所以判断了下。
//[[User:AnYiLin/Difflink.js]]
(function() {
	if (document.getElementById('p-cactions') && !mw.config.get('wgServerName').match(/wikimirror\.org$/)) {
		var diff = mw.config.get('wgDiffNewId'),
			oldid = mw.config.get('wgDiffOldId') || mw.config.get('wgRevisionId'),
			ins = function(tex, dec, link) {
					mw.util.addPortletLink('p-cactions', '#', tex, 't-difflink', dec);
					document.getElementById('t-difflink').addEventListener('click', function() {
						event.preventDefault();
						OO.ui.alert(new mw.widgets.CopyTextLayout({copyText: link}).$element)
					})
				};
		if (diff) {
			ins(wgUVS('当前差异链接', '當前差異連結'), wgUVS('复制链接到当前差异版本的维基语法', '複製連結到當前差異版本的維基語法'), 'Special:Diff/' + oldid + '/' + diff + '')
		} else if (document.getElementById('mw-revision-nav')) {
			ins(wgUVS('当前修订链接', '當前修訂連結'), wgUVS('复制链接到当前修订版本的维基语法', '複製連結到當前修訂版本的維基語法'), 'Special:PermanentLink/' + oldid + '')
		} else {
			return
		}
	} else {
		return
	}
})();

text: --安忆Talk 2020年11月21日 (六) 14:15 (UTC)
replies: text: :mw.config.get('wgServerName').match(/wikimirror\.org$/)-- Sunny00217  2020年11月21日 (六) 14:32 (UTC)
replies: text: ::不想撞上罢了…我这面全站范围内在用。--安忆Talk 2020年11月21日 (六) 14:35 (UTC)

text: 、建议。缺点：脚本好像不能从浏览器控制台执行来调试。--YFdyh000（留言） 2020年11月25日 (三) 20:30 (UTC)

text: 我的版本（兼容性欠佳），提供有和无链接两个版本。--YFdyh000（留言） 2021年1月2日 (六) 11:21 (UTC)
replies: text: :看了一下，您是加了一个格式（无），并给有的文字预设了“|差异”别名。这看起来更实用了，但我最初的目的是想解决复制差异链接的困难（Special:Diff/62830445/62830489），不得不考虑预设别名的链接是否会造成额外的麻烦（如提供多个差异链接时差异差异差异可能会造成混淆，这种情况下还不如手打别名或保留数字），不带的格式又是否会有足够的使用率？--安忆Talk 2021年1月2日 (六) 11:47 (UTC)
replies: text: ::不带是因为我想加链接时会先打“[[”再去复制，结果还要删一遍。别名是因为裸链接太长了，阅读价值也很低。如果列举多个差异，粘贴时（可视化编辑）/粘贴后（源代码编辑）加序数和顿号或空格也很容易。版本作为建议，提供多个格式有利于不同需求，以及不同按钮id允许多次运行。--YFdyh000（留言） 2021年1月2日 (六) 12:05 (UTC)
replies: text: :::组合了一下，把ES6的...换掉了。 --安忆Talk 2021年1月2日 (六) 13:07 (UTC)
replies: text: ::::@YFdyh000：小改了一下，按钮在minerva皮肤上会被添加到p-tb。您看看还有什么建议？--安忆Talk 2021年1月3日 (日) 03:59 (UTC)
replies: text: :::::挺好的。不同按钮ID能避免重复添加的菜单显示但点击没有效果，虽然正常来说不该重复添加。乱点看到移动版差异+minerva皮肤似乎不能支持，可能是正常的，没菜单。--YFdyh000（留言） 2021年1月3日 (日) 04:16 (UTC)
replies: text: ::::::嗯，是的，移动版没有那两个菜单，这也是有第一个判断的原因。--安忆Talk 2021年1月3日 (日) 04:22 (UTC)

text: 如果只有一個版本的差異（透過class="diff-multi"判斷）可以使用較短版本的差異連結（無oldid）。--Xiplus#Talk 2021年1月3日 (日) 04:27 (UTC)
replies: text: :请问您觉得目前的版本还有其他的问题吗？可能在日后这个工具还会得到扩充，个人认为那时再修缮也好。--安忆Talk 2021年1月3日 (日) 04:39 (UTC)
replies: text: ::問題就僅有這邊提出的單一差異使用短版本連結，其他的意見算是功能擴充，就暫時先不提出了。--Xiplus#Talk 2021年1月3日 (日) 05:13 (UTC)
//[[User:AnYiLin/Difflink.js]]
(function($, mw) {
	mw.loader.using(['ext.gadget.site-lib', 'mediawiki.util', 'mediawiki.widgets', 'oojs-ui']).done(function() {
		if ($('#p-cactions').length > 0 || $('#p-tb').length > 0) {
			var diff = mw.config.get('wgDiffNewId'),
				oldid = mw.config.get('wgDiffOldId') || mw.config.get('wgRevisionId'),
				pos = 'p-cactions',
				ins = function(tex, dec, t1, t2) {
						if (mw.config.get('skin') === 'minerva') pos = 'p-tb';
						mw.util.addPortletLink(pos, '#', tex, 't-difflink', dec);
						$('#t-difflink').click(function() {
							event.preventDefault();
							var $dom = $('');
							new Array(t1, t2).forEach(function(v) {
								$dom.append(new mw.widgets.CopyTextLayout({copyText: v}).$element)
							});
							if (/(Android|iPhone|Mobile)/i.test(navigator.userAgent)) {
								OO.ui.alert($dom)
							} else {
								OO.ui.alert($dom, {size: 'medium'})
							}
						})
					};
			if (diff) {
				var multi = ;
				if ($('td').is('.diff-multi')) multi = oldid + '/';
				ins(wgUVS('当前差异链接', '當前差異連結'), wgUVS('复制链接到当前差异版本的维基语法', '複製連結到當前差異版本的維基語法'), 'Special:Diff/' + multi + diff, '' + wgUVS('差异', '差異') + '')
			} else if ($('#mw-revision-nav').length > 0) {
				ins(wgUVS('当前修订链接', '當前修訂連結'), wgUVS('复制链接到当前修订版本的维基语法', '複製連結到當前修訂版本的維基語法'), 'Special:PermaLink/' + oldid, '版本')
			}
		}
	})
})(jQuery, mw);
----
=== 公示 ===
提出到现在已经过一个多月了其实是我刚想起来，有数位用户参与讨论并表达了支持意向，现开始公示七日，如无异议将实际部署。--安忆Talk 2021年1月2日 (六) 11:04 (UTC)

text: 考虑到已有近十位用户在自己的common.js中引入了此脚本，故在部署时我将一并为其替换。 --安忆Talk 2021年1月3日 (日) 06:19 (UTC)
小意见，就我个人而言用短一截的Permalink比较多，PermanentLink有点长。—MintCandy♫ 台州专题2021年新年贺词 2021年1月7日 (四) 06:03 (UTC)

text: 已更改。--安忆Talk 2021年1月7日 (四) 06:51 (UTC)
thread_title:  提议增设一个“复制差异链接”的小工具 

message: 提出到现在已经过一个多月了其实是我刚想起来，有数位用户参与讨论并表达了支持意向，现开始公示七日，如无异议将实际部署。--安忆Talk 2021年1月2日 (六) 11:04 (UTC)
replies: text: 考虑到已有近十位用户在自己的common.js中引入了此脚本，故在部署时我将一并为其替换。 --安忆Talk 2021年1月3日 (日) 06:19 (UTC)
小意见，就我个人而言用短一截的Permalink比较多，PermanentLink有点长。—MintCandy♫ 台州专题2021年新年贺词 2021年1月7日 (四) 06:03 (UTC)

text: 已更改。--安忆Talk 2021年1月7日 (四) 06:51 (UTC)
thread_title:  公示