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)
- 吐槽别的不清楚,我这儿Win8.1的IE10还是11来着是不支持ES6的。修订链接的部分咱抄走了--安忆Talk 2020年11月21日 (六) 10:07 (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)