跳至內容

MediaWiki討論:Gadget-Difflink.js

頁面內容不支援其他語言。
維基百科,自由的百科全書

提議增設一個「複製差異連結」的小工具

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

我最近發現許多人不會使用差異連結,在文中貼的大都是直接從瀏覽器地址欄獲得的一長串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)[回覆]

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

編輯請求 2024-06-17

建議再提供在站外使用的完整URL連結( 比如:https://zh.wikipedia.org/wiki/Special:Diff/差异版本的数字编号 https://zh.wikipedia.org/wiki/Special:PermaLink/修订版本的数字编号 )。--Txkk留言2024年6月17日 (一) 05:05 (UTC)[回覆]