User:Hamish/CIDRCalc.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// <nowiki>
// 右上角更多 => 計算IP區段
// 僅在貢獻(Special:Contributions/xxx)或編輯歷史頁面可用
// 初次打開窗口時可自動填入當前頁面上所有IP,按需移除或增加
(function () {
'use strict';
if (!(mw.config.get('wgAction') === 'history' ||
mw.config.get('wgCanonicalSpecialPageName') === 'Contributions')
) {
return;
}
var links = Array.from(document.querySelectorAll('a.mw-userlink'));
var ips = links.map(link => link.textContent.trim())
.filter(text => {
return /^(\d{1,3}\.){3}\d{1,3}$/.test(text) ||
/^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$/.test(text);
});
ips = [...new Set(ips)];
function buttonClick(e) {
e.preventDefault();
if ($('#previewbox').is(':hidden')) {
$('input[name="ips"]').parents('div').eq(-3).hide();
$('#mainbutton').val('返回');
$('#previewbox').show();
var newIps = [];
$('input[name="ips"]').each(function() {
var val = $(this).val().trim();
if (val) {
newIps.push(val);
}
});
ips = [...new Set(newIps)];
e.target.previewer.beginRender(buildTemplate(), 'WP:SB');
} else {
$('#previewbox').hide();
$('input[name="ips"]').parents('div').eq(-3).show();
$('#mainbutton').val('計算');
e.target.previewer.closePreview();
}
}
function buildTemplate() {
var template = '{{blockcalc|';
for (var i = 0; i < ips.length; i++) {
template += ips[i];
if (i < ips.length - 1) {
template += '|';
}
}
template += '}}';
return template;
}
function showCidrWindow() {
var windowCidr = new Morebits.simpleWindow(600, 400);
windowCidr.setTitle('CIDR Calculator');
var form = new Morebits.quickForm();
form.append({
type: 'button',
id: 'mainbutton',
label: '計算',
event: buttonClick
});
form.append({
type: 'dyninput',
name: 'ips',
label: 'IPs:',
sublabel: 'IP:',
tooltip: 'IPV4和IPV6,可以混合使用',
min: 2,
max: 100,
});
form.append({
type: 'div',
id: 'previewbox',
hidden: true
});
var result = form.render();
windowCidr.setContent(result);
windowCidr.display();
var inputs = $.find('input[name="ips"]');
if (ips.length > inputs.length) {
var moreButton = $('input[type="button"][value="更多"]')[0];
for (var j = inputs.length; j < ips.length; j++) {
moreButton.click();
setTimeout(function(index) {
var newInputs = $.find('input[name="ips"]');
if (index < newInputs.length) {
$(newInputs[index]).val(ips[index]);
}
}, 50, j);
}
}
for (var i = 0; i < inputs.length && i < ips.length; i++) {
$(inputs[i]).val(ips[i]);
}
result.previewer = new Morebits.wiki.preview($(result).find('#previewbox').last()[0]);
$('#mainbutton')[0].previewer = result.previewer;
}
mw.loader.using(['ext.gadget.morebits'], function () {
var $portletDiv = $('#p-cactions .vector-menu-content-list');
if ($portletDiv.length) {
var $mergeButton = $('<li>')
.addClass('mw-list-item')
.append(
$('<a>')
.attr('href', '#')
.text('計算IP區段')
.click(e => {
e.preventDefault();
showCidrWindow();
})
);
$portletDiv.append($mergeButton);
}
});
})();
// </nowiki>