MediaWiki talk:Gadget-Difflink.js

最新留言:3年前由AnYiLin在话题提议增设一个“复制差异链接”的小工具内发布

提议增设一个“复制差异链接”的小工具

下列討論已經關閉,請勿修改。如有任何意見,請在合適的討論頁提出,而非再次編輯本討論。

我最近发现许多人不会使用差异链接,在文中贴的大都是直接从浏览器地址栏获得的一长串url,而不是[[Special:diff/xxxxxx/yyyyyy]]这种形式。这往往会造成阅读上的困难,甚至会造成错误。即使有些知道这点的用户也可能搞不懂diff和oldid这两串数字的区别,经常写反新旧版本。所以我今天顺手写了一个小工具来提供这个功能,并已经实装在我的站内。使用起来非常方便,只需“先对比选择版本->点击一键复制->粘贴到需要的地方”即可,相比从地址栏复制url后再自己拼贴而言,我想要方便得多。示例图片(为了方便就用外链了)。

以下是我在站内实装版本的简化并适配后的代码(因为在官方站内的话就不需要考虑其他东西了):

使用ES6且有bug的半残版
(() => {
	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)回复

@AnYiLin阁下可否考虑在您自己的用户空间建立一个「官方」版本的单独js,可供各位调用?--Wcam留言2020年11月21日 (六) 12:29 (UTC)回复
取得ID方式過於醜陋...請善用mw.config範例)。--Xiplus#Talk 2020年11月18日 (三) 15:29 (UTC)回复
啊…这是因为在镜像站这面,添加的脚本偶尔有加载顺序问题,可能会先于window.mw的注册。与其判断并等待,不如直接用原生的。这部分函数只是节选,我这面的上下文中也有具体的应对措施来保证脚本在jq、mw都被加载后再执行。不过还是习惯尽可能地用原生函数了,贴过来看到没影响使用,也就没有再改。--安忆Talk 2020年11月18日 (三) 15:42 (UTC)回复
为了避免这个问题,我这面如果要用到mw函数,一般都是自己照葫芦画瓢构造一个同功能的…比如常用的增改删查Cookie、wgUXS等,之前连addPortletLink也是如此…--安忆Talk 2020年11月18日 (三) 15:57 (UTC)回复
現在支援TLS1.2的的瀏覽器都支援ES6+的吧?[來源請求]開一個新的乾脆:(順道  吐槽load.php竟然不解析模板字符串直接報錯......)
Sunny00217的版本
$(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
			);
		});
	}
});
-- Sunny00217  2020年11月21日 (六) 10:00 (UTC)回复
  吐槽别的不清楚,我这儿Win8.1的IE10还是11来着是不支持ES6的。修订链接的部分咱抄走了--安忆Talk 2020年11月21日 (六) 10:07 (UTC)回复
对了,let貌似也是ES6的。--安忆Talk 2020年11月21日 (六) 10:44 (UTC)回复
还有一个问题,对于类似&diff=cur&oldid=prev的链接,该工具无法取得真实差异ID,是否有方法解决?--Wcam留言2020年11月21日 (六) 12:29 (UTC)回复
@Wcammw.loader.load('/wiki/User:AnYiLin/Difflink.js?action=raw&ctype=text/javascript');--安忆Talk 2020年11月21日 (六) 13:31 (UTC)回复
  • 用回了mwApi,不使用ES6的版本。如果用jQuery可能会更简洁一点,不过现在都提倡“你不需要jQuery”。[開玩笑的]“p-cactions”在移动端没有,所以判断了下。
用回了mwApi,不使用ES6的版本
//<nowiki>[[User:AnYiLin/Difflink.js]]</nowiki>
(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
	}
})();
--安忆Talk 2020年11月21日 (六) 14:15 (UTC)回复
  吐槽mw.config.get('wgServerName').match(/wikimirror\.org$/)-- Sunny00217  2020年11月21日 (六) 14:32 (UTC)回复
不想撞上罢了…我这面全站范围内在用。--安忆Talk 2020年11月21日 (六) 14:35 (UTC)回复
@AnYiLin  建议。缺点:脚本好像不能从浏览器控制台执行来调试。--YFdyh000留言2020年11月25日 (三) 20:30 (UTC)回复
@AnYiLin我的版本(兼容性欠佳),提供有和无链接两个版本。--YFdyh000留言2021年1月2日 (六) 11:21 (UTC)回复
看了一下,您是加了一个格式(无[[]]),并给有[[]]的文字预设了“|差异”别名。这看起来更实用了,但我最初的目的是想解决复制差异链接的困难(Special:Diff/62830445/62830489),不得不考虑预设别名的链接是否会造成额外的麻烦(如提供多个差异链接时差异差异差异可能会造成混淆,这种情况下还不如手打别名或保留数字),不带[[]]的格式又是否会有足够的使用率?--安忆Talk 2021年1月2日 (六) 11:47 (UTC)回复
@AnYiLin不带是因为我想加链接时会先打“[[”再去复制,结果还要删一遍。别名是因为裸链接太长了,阅读价值也很低。如果列举多个差异,粘贴时(可视化编辑)/粘贴后(源代码编辑)加序数和顿号或空格也很容易。版本作为建议,提供多个格式有利于不同需求,以及不同按钮id允许多次运行。--YFdyh000留言2021年1月2日 (六) 12:05 (UTC)回复
@YFdyh000组合了一下,把ES6的...换掉了。 --安忆Talk 2021年1月2日 (六) 13:07 (UTC)回复
@YFdyh000:小改了一下,按钮在minerva皮肤上会被添加到p-tb。您看看还有什么建议?--安忆Talk 2021年1月3日 (日) 03:59 (UTC)回复
挺好的。不同按钮ID能避免重复添加的菜单显示但点击没有效果,虽然正常来说不该重复添加。乱点看到移动版差异+minerva皮肤似乎不能支持,可能是正常的,没菜单。--YFdyh000留言2021年1月3日 (日) 04:16 (UTC)回复
嗯,是的,移动版没有那两个菜单,这也是有第一个判断的原因。--安忆Talk 2021年1月3日 (日) 04:22 (UTC)回复
如果只有一個版本的差異(透過class="diff-multi"判斷)可以使用較短版本的差異連結(無oldid)。--Xiplus#Talk 2021年1月3日 (日) 04:27 (UTC)回复
请问您觉得目前的版本还有其他的问题吗?可能在日后这个工具还会得到扩充,个人认为那时再修缮也好。--安忆Talk 2021年1月3日 (日) 04:39 (UTC)回复
問題就僅有這邊提出的單一差異使用短版本連結,其他的意見算是功能擴充,就暫時先不提出了。--Xiplus#Talk 2021年1月3日 (日) 05:13 (UTC)回复
组合了YFdyh000的修改后的版本
//<nowiki>[[User:AnYiLin/Difflink.js]]</nowiki>
(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 = $('<div>');
							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, '[[Special:Diff/' + multi + diff + '|' + wgUVS('差异', '差異') + ']]')
			} else if ($('#mw-revision-nav').length > 0) {
				ins(wgUVS('当前修订链接', '當前修訂連結'), wgUVS('复制链接到当前修订版本的维基语法', '複製連結到當前修訂版本的維基語法'), 'Special:PermaLink/' + oldid, '[[Special:PermaLink/' + oldid + '|版本]]')
			}
		}
	})
})(jQuery, mw);

公示

提出到现在已经过一个多月了其实是我刚想起来,有数位用户参与讨论并表达了支持意向,现开始公示七日,如无异议将实际部署。--安忆Talk 2021年1月2日 (六) 11:04 (UTC)回复

考虑到已有近十位用户在自己的common.js中引入了此脚本,故在部署时我将一并为其替换。 --安忆Talk 2021年1月3日 (日) 06:19 (UTC)回复

小意见,就我个人而言用短一截的Permalink比较多,PermanentLink有点长。—MintCandy♫ 台州专题2021年新年贺词 2021年1月7日 (四) 06:03 (UTC)回复

@MintCandyXiplus已更改。--安忆Talk 2021年1月7日 (四) 06:51 (UTC)回复

本討論已關閉,請勿修改。如有任何意見,請在合適的討論頁提出,而非再次編輯本討論。
返回到“Gadget-Difflink.js”页面。