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)
- (+)支持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)
- 有一點需要留意的:早期瀏覽器不支持箭頭函數
- @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)
- 啊…這是因為在鏡像站這面,添加的腳本偶爾有加載順序問題,可能會先於window.mw的註冊。與其判斷並等待,不如直接用原生的。這部分函數只是節選,我這面的上下文中也有具體的應對措施來保證腳本在jq、mw都被加載後再執行。不過還是習慣儘可能地用原生函數了,貼過來看到沒影響使用,也就沒有再改。--安憶Talk 2020年11月18日 (三) 15:42 (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)
- @Wcam:
mw.loader.load('/wiki/User:AnYiLin/Difflink.js?action=raw&ctype=text/javascript');
--安憶Talk 2020年11月21日 (六) 13:31 (UTC)
- @Wcam:
- 用回了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)
- YFdyh000(留言) 2021年1月2日 (六) 12:05 (UTC)
- 安憶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)
- 挺好的。不同按鈕ID能避免重複添加的菜單顯示但點擊沒有效果,雖然正常來說不該重複添加。亂點看到移動版差異+minerva皮膚似乎不能支持,可能是正常的,沒菜單。--YFdyh000(留言) 2021年1月3日 (日) 04:16 (UTC)
組合了一下,把ES6的...換掉了。 -- - @YFdyh000:小改了一下,按鈕在minerva皮膚上會被添加到p-tb。您看看還有什麼建議?--安憶Talk 2021年1月3日 (日) 03:59 (UTC)
不帶是因為我想加連結時會先打「[[」再去複製,結果還要刪一遍。別名是因為裸連結太長了,閱讀價值也很低。如果列舉多個差異,粘貼時(可視化編輯)/粘貼後(原始碼編輯)加序數和頓號或空格也很容易。版本作為建議,提供多個格式有利於不同需求,以及不同按鈕id允許多次運行。-- - 安憶Talk 2021年1月2日 (六) 13:07 (UTC)
- YFdyh000(留言) 2021年1月2日 (六) 12:05 (UTC)
- 看了一下,您是加了一個格式(無[[]]),並給有[[]]的文字預設了「|差異」別名。這看起來更實用了,但我最初的目的是想解決複製差異連結的困難(Special:Diff/62830445/62830489),不得不考慮預設別名的連結是否會造成額外的麻煩(如提供多個差異連結時差異差異差異可能會造成混淆,這種情況下還不如手打別名或保留數字),不帶[[]]的格式又是否會有足夠的使用率?--安憶Talk 2021年1月2日 (六) 11:47 (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)
- 請問您覺得目前的版本還有其他的問題嗎?可能在日後這個工具還會得到擴充,個人認為那時再修繕也好。--安憶Talk 2021年1月3日 (日) 04:39 (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)
- 本討論已關閉,請勿修改。如有任何意見,請在合適的討論頁提出,而非再次編輯本討論。
編輯請求 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)
- 請提供相應代碼,並@AnYiLin--百無一用是書生 (☎) 2024年7月11日 (四) 08:56 (UTC)
- 建議還是fork出來自己改一下。 ——魔琴[身份聲明 留言 貢獻 新手2023] 2024年7月11日 (四) 14:49 (UTC)
- 自己在這個被遍歷的數組里加就可以。--安憶Talk 2024年7月12日 (五) 14:21 (UTC)
- ok,加上了差異版本的完整連結,但是修訂版本的數字編號是指哪個?@Txkk--百無一用是書生 (☎) 2024年7月12日 (五) 15:15 (UTC)
- 比如 https://zh.wikipedia.org/wiki/Special:PermaLink/77722652 的數字編號就是77722652。--Txkk(留言) 2024年7月13日 (六) 05:48 (UTC)
- ok,加上了差異版本的完整連結,但是修訂版本的數字編號是指哪個?@Txkk--百無一用是書生 (☎) 2024年7月12日 (五) 15:15 (UTC)
[1]通訊協議「https」去哪了?--Txkk(留言) 2024年7月13日 (六) 05:52 (UTC)