MediaWiki:Gadget-wikidialog.js
外观
注意:保存后,更改可能不会立即生效。点击此处了解如何绕过浏览器的缓存。
- Mozilla/Firefox/Safari:按住Shift键同时点击重新加载或按住Ctrl+Shift+R(苹果 Mac 上按 Cmd+Shift+R);
- Internet Explorer:按住Ctrl键同时点击刷新或按住Ctrl+F5;
- Konqueror:只需点击重新加载按钮或按F5;
- Opera用户可能需要在工具→首选项中完全清除其缓存。
/* This script provides a function to set up dialog fields and buttons based on markup generated by [[:Category:dialog formatting templates|dialog formatting templates]].
Any javascript page importing this page should also contain a commented link to it, for [[Special:WhatLinksHere/{{FULLPAGENAME}}]].
For instructions, see the [[{{TALKPAGENAME}}|talk page]]. [[Category:Dialog javascript pages]] */
$(function () {
if (! window.wikidialog) window.wikidialog = {};
if (! window.wikidialog.show) {
//
// version
//
window.wikidialog.gadgetVersion = function() { return '0.9 (2016-12-13)'; }
//
window.wikidialog.show = function () {
//
// [[Template:Dialog/text|text]]
//
var things = $('span.wikidialog-text');
var thingIds = things.map(function () { return $(this).attr('id'); });
things.replaceWith(function (idx) {
if ((idx > 0) && (thingIds[idx] == thingIds[idx - 1])) { return ''; }
var s = $(this).text(); // .substring(0,1024); // BOUND TEXT CONTENT SIZE
var d = '';
if ( s.search(/^size=(\d*)&/) == 0) {
d = s.match(/^size=(\d*)&(.*)/);
s = d[2];
d = d[1];
}
for (var j = idx + 1; j < thingIds.length; j++) {
if (thingIds[idx] == thingIds[j]) {
s += ' ' + $(things[j]).text();
} else break;
}
var e = $(document.createElement('input')).attr('type','text').addClass('wikidialog-text').attr('id',thingIds[idx]).val(s).attr('size',d);
if ($(this).is('.wikidialog-hidden')) e.css('display','none');
return e;
});
//
// [[Template:Dialog/textarea|textarea]]
//
things = $('span.wikidialog-textarea');
thingIds = things.map(function () { return $(this).attr('id'); });
things.replaceWith(function (idx) {
if ((idx > 0) && (thingIds[idx] == thingIds[idx - 1])) { return ' '; }
var s = $(this).text(); // .substring(0,131072); // BOUND TEXTAREA CONTENT SIZE
var c = '';
if ( s.search(/^cols=(\d*)&/) == 0) {
c = s.match(/^cols=(\d*)&(.*)/);
s = c[2];
c = c[1];
}
var r = '';
if ( s.search(/^rows=(\d*)&/) == 0) {
r = s.match(/^rows=(\d*)&(.*)/);
s = r[2];
r = r[1];
}
for (var j = idx + 1; j < thingIds.length; j++) {
if (thingIds[idx] == thingIds[j]) {
s += '\n' + $(things[j]).text();
} else break;
}
var e = $(document.createElement('textarea')).addClass('wikidialog-textarea').attr('id',thingIds[idx]).attr('cols',c).attr('rows',r).val(s);
if ($(this).is('.wikidialog-hidden')) e.css('display','none');
return e;
});
//
// [[Template:Dialog/checkbox|checkbox]]
//
$('span.wikidialog-checkbox').replaceWith(function () {
var i = $(this).attr('id');
var s = $(this).text(); // .substring(0,32); // BOUND CHECKBOX CONTENT SIZE
var result = $(document.createElement('input')).attr('type','checkbox').addClass('wikidialog-checkbox').attr('id',i);
if (s.length > 8) result.attr('checked','yes');
return result;
});
//
// [[Template:Dialog/select|select]]
//
$('span.wikidialog-select').replaceWith(function () {
var i = $(this).attr('id');
var s = $(this).text().split('&'); // .substring(0,8192).split('&'); // BOUND SELECT CONTENT SIZE
var e = document.createElement('select');
for (var k=1; (k < s.length); k += 2) if (s[k-1]) {
e.appendChild(new Option(s[k-1],s[k],false,false));
}
return $(e).addClass('wikidialog-select').attr('id',i);
});
//
// [[Template:Dialog/button|button]]
//
$('span.wikidialog-button').replaceWith(function () {
function getWikidialogID() {
var s = location.search.match(/[\?&]wikidialogid=(\d+)/);
return (s && s.length && (s.length > 1)) ? Number(s[1]) : 0;
}
function getRollbackUrl(url, id) {
var s = url.match(/[\?&]wikidialogid=(\d+)/);
if (s && s.length && (s.length > 0)) {
// url is stable
return url;
}
s = sessionStorage.wikidialogUnstableUrl;
if (s && (url == s)) {
// url is unstable and known dialog-active
// expect it to have had id one less than next-id
s = ('wikidialogid=' + (id - 1));
} else {
// url is unstable and might be dialog-active or not
s = 'wikidialogrolledback=x';
}
return (url + ((url.search(/\?/) > 0) ? '&' : '?') + s);
}
function makeButtonHandler(wikidialogButtonData) {
// in some browsers, event target may be a copy lacking the data
return function (event) {
var target = $(event.target);
var action = wikidialogButtonData.action;
if (action.substring(0,5).toLowerCase() == 'user:') {
var ug = mw.config.get('wgUserGroups');
if (!ug || ug.join(' ').indexOf("sysop") === -1) {
alert('action requires admin privs: ' + action);
return;
}
} else {
action = mw.config.get('wgSiteName') + ':Dialog/' + action;
}
// action must be fully protected
$('input.wikidialog-button, button.wikidialog-button').attr('disabled',true);
$.getJSON(
mw.util.wikiScript('api'),
{
format: 'json',
action: 'query',
prop: 'info',
inprop: 'protection',
titles: action
}
).done(
function(data) {
var s = '';
if (data.query && data.query.pages)
for (var p in data.query.pages) {
if ("missing" in data.query.pages[p]) s = 'page not found';
else if ('invalid' in data.query.pages[p]) s = 'page name invalid';
else if ('protection' in data.query.pages[p]) {
if (data.query.pages[p].protection[0] && data.query.pages[p].protection[1]) {
if (('level' in data.query.pages[p].protection[0]) &&
('level' in data.query.pages[p].protection[1])) {
if ((data.query.pages[p].protection[0].level == 'sysop') &&
(data.query.pages[p].protection[1].level == 'sysop')) {
} else s = 'page unsecured';
} else s = 'page query misfired';
} else s = 'page unsecured';
} else s = 'page query misfired';
}
else s = 'page query failed';
if (s) {
$('input.wikidialog-button, button.wikidialog-button').attr('disabled',false);
alert(s + ': ' + action);
return;
}
// action is now known to be fully protected
// sessionStorage.wikidialogNextID was assured before setting up the button
var id = sessionStorage.wikidialogNextID;
s = mw.util.getUrl(action) + '?wikidialogid=' + id;
sessionStorage.wikidialogNextID++;
sessionStorage['wikidialog:' + id + ':incoming'] = s;
if (! target.hasClass('wikidialog-norollback')) {
sessionStorage['wikidialog:' + id + ':prevurl'] = getRollbackUrl(location.href, Number(id));
}
if ('unauth' in wikidialogButtonData) sessionStorage['wikidialog:' + id + ':unauth'] = wikidialogButtonData.unauth;
else sessionStorage['wikidialog:' + id + ':unauth'] = mw.config.get('wgPageName');
if ('origin' in wikidialogButtonData) sessionStorage['wikidialog:' + id + ':origin'] = wikidialogButtonData.origin;
if ('proxy' in wikidialogButtonData) sessionStorage['wikidialog:' + id + ':proxy'] = wikidialogButtonData.proxy;
sessionStorage['wikidialog:' + id + ':params'] = '';
for (var j = 0; j < wikidialogButtonData.length; j++) {
var d = wikidialogButtonData[j].match(/[\w-]+/g);
d[1] = (d[1] ? d[1] : d[0]);
d[1] = $('input#wikidialog-' + d[1] + ', textarea#wikidialog-' + d[1] + ', select#wikidialog-' + d[1]);
if (d[1].length == 0) {
} else {
sessionStorage['wikidialog:' + id + ':params'] += d[0] + ',';
var elt = d[1].first();
d[1] = d[1].add(target);
for (var k = 0; k < d[1].length; k++) {
if ($(d[1][k]).hasClass('wikidialog-button')) {
k++;
if (k < d[1].length) elt = $(d[1][k]);
break;
}
}
switch (elt.attr('type')) {
case 'checkbox':
d[1] = (elt[0].checked ? 'yes' : '');
break;
default:
d[1] = elt.val();
break;
}
sessionStorage['wikidialog:' + id + ':in:' + d[0]] = d[1];
}
}
if (target.hasClass('wikidialog-rescript')) {
delete window.wikidialog;
}
sessionStorage.wikidialogSequenceBound = 10; // POINT TO ADJUST max action-sequence length
// also occurs in receive
location = s;
}
).fail(function() {
$('input.wikidialog-button, button.wikidialog-button').attr('disabled',false);
alert('action target check failed: ' + action);
});
}; // end return function () ...
} // end function makeButtonHandler
if (! (sessionStorage)) { // allows handler to assume sessionStorage
return "<font color=red><button requires sessionStorage (not found; perhaps your browser is out of date?)></font>";
}
if (sessionStorage.wikidialogNextID) {} else sessionStorage.wikidialogNextID = '1';
if (Number(sessionStorage.wikidialogNextID) <= getWikidialogID()) {
alert('Warning: session data may be inaccessible\n(dialog ID should be less than stored count:\n dialog ID is ' +
getWikidialogID() + '\n stored count is ' + sessionStorage.wikidialogNextID + ')');
sessionStorage.wikidialogNextID = getWikidialogID() + 1;
}
var s = $(this).text(); // .substring(0,1024); // BOUND BUTTON CONTENT SIZE
var a = '';
if ( s.search(/^action=([\w\s-\/:]+)&/) == 0) {
a = s.match(/^action=([\w\s-\/:]+)&(.*)/);
s = a[2];
a = a[1];
}
var b = '';
if ( s.search(/^label=([\w\s-\/\:\(\)\.\,\;']+)&/) == 0) { // STUFF ALLOWED IN BUTTON LABELS
b = s.match(/^label=([\w\s-\/\:\(\)\.\,\;']+)&(.*)/); // STUFF ALLOWED IN BUTTON LABELS
s = b[2];
b = b[1];
if ($(this).is('.wikidialog-italic-label')) { b = '<i>' + b + '</i>'; }
if ($(this).is('.wikidialog-bold-label' )) { b = '<b>' + b + '</b>'; }
}
var wikidialogButtonData = $(this).data();
if ('wikidialogButtonData' in wikidialogButtonData)
wikidialogButtonData = wikidialogButtonData.wikidialogButtonData;
else wikidialogButtondata = {};
wikidialogButtonData.action = a;
wikidialogButtonData.length = 0;
var s = s.match(/([\w-]+:?[\w-]*)&/g);
if (s != null) {
wikidialogButtonData.length = s.length;
for (var j = 0; j < s.length; j++) {
wikidialogButtonData[j] = s[j].substring(0,s[j].length - 1);
a += ((j == 0) ? ' < ' : ' , ') + s[j].substring(0,s[j].search(/[\:&]/));
}
}
return $(document.createElement('button')).attr('type','button').addClass(this.className).html(b).attr('title',a)
.data('wikidialogButtonData',wikidialogButtonData).click(makeButtonHandler(wikidialogButtonData));
});
//
// [[Template:Dialog/ifsupported|ifsupported]]
//
if (sessionStorage) {
$('.wikidialog-alternative').css('display','none');
$('.wikidialog-dependent').css('display','inline');
}
};
}
window.wikidialog.show();
});