MediaWiki:Common.js/w/Wikibooks:Dialog/diagnostic panel
/* 针对 Wikibooks:Dialog/diagnostic panel。参见 Special:WhatLinksHere/w/Wikibooks:Dialog/diagnostic panel。 */
function panelVersion() { return '0.9 (2019-10-11)'; }
var modeSelectRegion = {
// setup // expertFlag // simpleOnly // expertOnly // handleComplicateButton // handleSimplifyButton };
var idSelectRegion = {
// setup // handleMenuChange // handleExamineButton };
var basicDataRegion = {
// setup // handleShowButton // handleWriteButton };
var detailedDataRegion = {
// collect };
function safeHtml(s) {
return s.replace(/\</g,'<').replace(/\>/g,'>');
};
detailedDataRegion.collect = function (buildEntry) {
// // assemble a string describing all the detailed data, // by calling buildEntry with info about each datum // var id = $('.wikidialog-panel-data-id').text(); var s = ; $('.wikidialog-panel-check-param').each(function () { var param = $(this); if (param[0].checked) { var n = param.attr('id').substring(9); var v = sessionStorage['wikidialog:' + id + ':in:' + n]; s += buildEntry('incoming', n, v); } }); $('.wikidialog-panel-check-field').each(function () { var save = $(this); if (save[0].checked) { var n = save.attr('id').substring(8); var v = sessionStorage['wikidialog:' + id + ':sv:wikidialog-' + n]; s += buildEntry('field', n, v); } }); $('.wikidialog-panel-rbparam').each(function () { var rollback = $(this); if (rollback[0].checked) { var n = rollback.attr('id').substring(12); var v = sessionStorage['wikidialog:' + id + ':rb-in:' + n]; s += buildEntry('rollback incoming', n, v); } }); $('.wikidialog-panel-check-rbfield').each(function () { var saverb = $(this); if (saverb[0].checked) { var n = saverb.attr('id').substring(11); var v = sessionStorage['wikidialog:' + id + ':sv-rb:wikidialog-' + n]; s += buildEntry('rollback field', n, v); } }); return s;
}
basicDataRegion.handleShowButton = function (event) {
$('.wikidialog-panel-region-detail').replaceWith(function () {
return '
detailedDataRegion.collect(function (c, n, v) { return '}) + '
' + c + ' ' + n + (v ? (': "' + safeHtml(v) + '
"') : ' null');
';
});
}
basicDataRegion.handleWriteButton = function (event) {
function stepFour(header, add, pageName, existing) {
//
// check for duplication
//
if (existing) {
if (existing.indexOf(add) >= 0) {
alert('The data to be written appears to be\nalready present on your user talk page');
return;
}
}
//
// confirm
//
if (! confirm('Save dialog data to user talk page?')) return;
//
// save to page
//
var apidata = { format: 'json',
action: 'edit',
text: (header + '\n' + add),
title: pageName,
section: 'new',
sectiontitle: 'Dialog data (saved via diagnostic panel)',
summary: '/* Dialog data (saved via diagnostic panel) */ new section',
};
apidata.token = mw.user.tokens.get('csrfToken'); // always the last field added
$.ajax({
type: 'POST',
url: mw.util.wikiScript('api'),
data: apidata,
datatype: 'json'
}).done(function(data) {
if (data && data.edit && data.edit.result && (data.edit.result == 'Success'))
alert('Dialog data saved');
else if (data && data.error)
alert('Dialog data save error ' + data.error.code);
else
alert('Dialog data save unknown error');
}).fail(function () {
alert('Dialog data save misfired');
});
}
function stepThree(header, add, pageName) {
//
// check status of talk page
//
$.getJSON(
mw.util.wikiScript('api'),
{
format: 'json',
action: 'query',
prop: 'revisions',
rvprop: 'content',
rvlimit: 1,
titles: pageName,
}
).done(function(data) {
var error = ;
var existing = ;
if (! (data.query && data.query.pages)) {
error = 'page query misfired';
}
else for (var p in data.query.pages) {
if ('invalid' in data.query.pages[p]){
error = 'page name invalid';
} else if ('missing' in data.query.pages[p]) {
stepFour(header, add, pageName);
return;
} else {
if (data.query.pages[p].revisions &&
data.query.pages[p].revisions[0] &&
data.query.pages[p].revisions[0]['*']
) {
stepFour(header, add, pageName, data.query.pages[p].revisions[0]['*']);
return;
}
else error = 'page query misfired';
}
}
alert('encountered an error while preparing to write data\n ' + error);
}).fail(function () {
alert('encountered an error while preparing to write data:\n page query misfired');
});
}
function stepTwo(header, add) {
//
// work out page to write to
//
var userName = mw.config.get('wgUserName');
if (! userName) { // should prevent the button from being created, but check here anyway
alert('You have to be logged in to write the data');
return;
}
var pageName = 'User talk:' + userName;
stepThree(header, add, pageName);
}
function stepOne() {
//
// what to write
//
var id = $('.wikidialog-panel-data-id').text();
var header = sessionStorage['wikidialog:' + id + ':incoming'];
if (header) {
header = 'page address ' + header + '
.';
} else {
header = 'no page address.';
}
header = 'ID ' + id + ', ' + header;
var add = detailedDataRegion.collect(function (c, n, v) {
return ('\n----\n----\n' + c + ' ' + n +
(v ? (':\n----\n' + v)
: ' null'));
});
if (! add) {
alert('There appears to be nothing to write.');
return;
}
stepTwo(header, add);
}
stepOne();
}
basicDataRegion.setup = function (id) {
$('.wikidialog-panel-region-basic').replaceWith(function () { var s = ; // // stuff for expert mode // var incoming = sessionStorage['wikidialog:' + id + ':incoming']; if (incoming) { s += 'Page address for this ID: ' + safeHtml(incoming); } else { s += 'Warning: No page address for this ID.'; } // s += '
Incoming request '; var origin = sessionStorage['wikidialog:' + id + ':origin']; if (origin) { s += 'authenticated from: ' + safeHtml(origin); var proxy = sessionStorage['wikidialog:' + id + ':proxy']; if (proxy) { s += '
' + ' ' + ' via proxy: ' + safeHtml(proxy); } } else { var unauth = sessionStorage['wikidialog:' + id + ':unauth']; if (unauth) { s += 'raw from: ' + safeHtml(sessionStorage['wikidialog:' + id + ':unauth']); } else { s += 'not found.'; } } // var prevurl = sessionStorage['wikidialog:' + id + ':prevurl']; var dravail = sessionStorage['wikidialog:' + id + ':rb-available']; if (prevurl) { s += '
Simple rollback available, to: ' + prevurl; } else if (dravail) { s += '
Delegating rollback available.'; var drincoming = sessionStorage['wikidialog:' + id + ':rb-incoming']; if (drincoming) { s += '
restore incoming: ' + drincoming; } else { s += "
no incoming to restore (something's wrong)."; } var drunauth = sessionStorage['wikidialog:' + id + ':rb-unauth']; if (drunauth) { s += '
restore unauthorized-origin: ' + drunauth; } else { s += '
null unauthorized-origin.'; } var drorigin = sessionStorage['wikidialog:' + id + ':rb-origin']; if (drorigin) { s += '
restore authorized-origin: ' + drorigin; } else { s += '
null authorized-origin.'; } var drproxy = sessionStorage['wikidialog:' + id + ':rb-proxy']; if (drproxy) { s += '
restpre authorized-proxy: ' + drproxy; } else { s += '
null authorized-proxy.'; } } else { s += '
Rollback unavailable.'; } // var notes = sessionStorage['wikidialog:' + id + ':notes']; if (notes) {
s += '
该 ID 的对话框备注
' + notes + '
';
} else { s += '
No dialog notes for this ID.
'; } // // all modes //
s = '
对话框 ID ' +
id + ':s += '
' + modeSelectRegion.expertOnly(s); // var params = sessionStorage['wikidialog:' + id + ':params']; if (params) { s += '传入到该 ID 的参数:
'; params = params.split(','); for (var k=0; (k < params.length); k += 1) if (params[k]) { s += ' ' + params[k]; } } else { s += '没有传入到该 ID 的参数。'; } // s += '
'; var saves = sessionStorage['wikidialog:' + id + ':saves']; if (saves) { s += '该 ID 的已保存字段:
'; saves = saves.split(','); for (var k=0; (k < saves.length); k += 1) if (saves[k]) { saves[k] = saves[k].substring(11); s += ' ' + saves[k]; } } else { s += '该 ID 没有已保存的字段。'; } // if ((! prevurl) && dravail) { s += '
'; var dradded = sessionStorage['wikidialog:' + id + ':rb-added']; if (dradded) { s += '该 ID 回滚时要移除的添加参数:
' + dradded; } else { s += '该 ID 回滚时没有要移除的添加参数。'; } s += '
'; var drchanged = sessionStorage['wikidialog:' + id + ':rb-changed']; if (drchanged) { s += '该 ID 回滚时要还原的更改参数:
'; drchanged = drchanged.split(','); for (var k=0; (k < drchanged.length); k += 1) if (drchanged[k]) { s += ' ' + drchanged[k]; } } else { s += '该 ID 回滚时没有要还原的更改参数。'; } s += '
'; var drsaves = sessionStorage['wikidialog:' + id + ':saves-rb']; if (drsaves) { s += '该 ID 回滚时要还原的已保存字段:
'; drsaves = drsaves.split(','); for (var k=0; (k < drsaves.length); k += 1) if (drsaves[k]) { drsaves[k] = drsaves[k].substring(11); s += ' ' + drsaves[k]; } } else { s += '该 ID 回滚时没有要还原的已保存字段。'; } } // s += '
'; if (mw.config.get('wgUserName')) { s += ' '; } s += ' '; //
';
return s; }); $('.wikidialog-panel-check-param').replaceWith(function () { var i = $(this).attr('id'); return $(document.createElement('input')).attr('type','checkbox').addClass('wikidialog-panel-check-param').attr('id',i); }); $('.wikidialog-panel-check-field').replaceWith(function () { var i = $(this).attr('id'); return $(document.createElement('input')).attr('type','checkbox').addClass('wikidialog-panel-check-field').attr('id',i).attr('checked','yes'); }); $('.wikidialog-panel-rbparam').replaceWith(function () { var i = $(this).attr('id'); return $(document.createElement('input')).attr('type','checkbox').addClass('wikidialog-panel-rbparam').attr('id',i); }); $('.wikidialog-panel-check-rbfield').replaceWith(function () { var i = $(this).attr('id'); return $(document.createElement('input')).attr('type','checkbox').addClass('wikidialog-panel-check-rbfield').attr('id',i); }); $('.wikidialog-panel-button-show').replaceWith(function () { return $(document.createElement('input')).attr('type','button').addClass('wikidialog-panel-button-show') .val('show').attr('title','show selected values for this ID').click(basicDataRegion.handleShowButton); }); $('.wikidialog-panel-button-write').replaceWith(function () { return $(document.createElement('input')).attr('type','button').addClass('wikidialog-panel-button-write') .val('write').attr('title','write selected values for this ID').click(basicDataRegion.handleWriteButton); });
}
idSelectRegion.handleExamineButton = function (event) {
var id = $.trim($('.wikidialog-panel-input-id').val()); if (id != id.match(/\d+/)) { alert('Not a valid ID (must be one or more digits): ' + safeHtml(id)); return; } basicDataRegion.setup(id);
}
idSelectRegion.handleMenuChange = function (event) {
var select = event.target; if (select.selectedIndex < 0) return; $('.wikidialog-panel-input-id').val(select.options[select.selectedIndex].value);
}
idSelectRegion.setup = function () { // 假设 sessionStorage 可用
// // prepare content for page // $('.wikidialog-panel-region-selectid').replaceWith(
'
modeSelectRegion.expertOnly( (sessionStorage.wikidialogSequenceBound ? ('Action-sequence in progress; bound = ' + sessionStorage.wikidialogSequenceBound + '.'
') : 'No action-sequence in progress.
')) + modeSelectRegion.expertOnly( (sessionStorage.wikidialogNextID ? ('Unused dialog ID available for next use: ' + (Number(sessionStorage.wikidialogNextID) - 1)) : 'No record of a dialog ID available for next use.') + '
') + (sessionStorage.wikidialogActiveList ? (modeSelectRegion.simpleOnly('Dialog states available for examination, listed by state ID from') + modeSelectRegion.expertOnly('Dialog IDs now listed as in use,') + ' most recent to least recent: ' + sessionStorage.wikidialogActiveList + modeSelectRegion.simpleOnly((function () { var active = sessionStorage.wikidialogActiveList; active = active.split(','); var stack = sessionStorage.wikidialogStack; stack = (stack ? stack.split('&') : []); var result = ; for (var j = (stack.length - 2); (j >= 0); j -= 2) { for (var k = (active.length - 1); (k >= 0); k--) if (stack[j] == active[k]) { stack[j] = ; break; } if (stack[j]) { result += ',' + stack[j]; } } return result; })()) + modeSelectRegion.expertOnly('; ' + (sessionStorage.wikidialogStack ? (function () { var stack = sessionStorage.wikidialogStack; stack = stack.split('&'); var result = ; for (var j = (stack.length - 2); (j >= 0); j -= 2) { result += (result ? (',' + stack[j]) : stack[j]); } return 'stack, top to bottom: ' + result; })() : 'no stack')) + '.
Select an active ID: ' + modeSelectRegion.expertOnly(' or')) : modeSelectRegion.simpleOnly(sessionStorage.wikidialogStack ? ("Dialog states available for examination, listed by state ID from most recent to least recent: " + (function () { var stack = sessionStorage.wikidialogStack; stack = stack.split('&'); var result = ; for (var j = (stack.length - 2); (j >= 0); j -= 2) { result += (result ? (',' + stack[j]) : stack[j]); } return result + '.'; })()) : "No dialog states available for examination.") + modeSelectRegion.expertOnly("No dialog IDs listed as in use; " + (sessionStorage.wikidialogStack ? (function () { var stack = sessionStorage.wikidialogStack; stack = stack.split('&'); var result = ; for (var j = (stack.length - 2); (j >= 0); j -= 2) { result += (result ? (',' + stack[j]) : stack[j]); } return 'stack, top to bottom: ' + result; })() : 'no stack') + ".
You may")) + modeSelectRegion.expertOnly( ' enter a dialog ID manually: ') + ((sessionStorage.wikidialogActiveList || sessionStorage.wikidialogStack) ? ' ' : modeSelectRegion.expertOnly(' ')) + ' ' +
面板版本 ' + panelVersion() + '
');
var first = ; $('.wikidialog-panel-menu-id').replaceWith(function () { var e = document.createElement('select'); var active = sessionStorage.wikidialogActiveList; active = (active ? active.split(',') : []); for (var k=0; (k < active.length); k += 1) if (active[k]) { if (! first) first = active[k]; e.appendChild(new Option(active[k],active[k],false,false)); } var stack = sessionStorage.wikidialogStack; stack = (stack ? stack.split('&') : []); for (var j = (stack.length - 2); (j >= 0); j -= 2) { for (var k = (active.length - 1); (k >= 0); k--) if (stack[j] == active[k]) { stack[j] = ; break; } if (stack[j]) { e.appendChild(new Option(stack[j],stack[j],false,false)); } } return $(e).addClass('wikidialog-panel-menu-id'); }); $('.wikidialog-panel-input-id').replaceWith(function () { return $(document.createElement('input')).attr('type','text').addClass('wikidialog-panel-input-id').val(first).attr('size',3); }); $('.wikidialog-panel-button-examine').replaceWith(function () { return $(document.createElement('input')).attr('type','button').addClass('wikidialog-panel-button-examine') .val('examine').attr('title','examine data for this ID').click(idSelectRegion.handleExamineButton); }); $('.wikidialog-panel-menu-id').change(idSelectRegion.handleMenuChange);
}
modeSelectRegion.expertFlag = false;
modeSelectRegion.simpleOnly = function (s) {
return '' + s + '';
}
modeSelectRegion.expertOnly = function (s) {
return '' + s + '';
}
modeSelectRegion.handleComplicateButton = function (event) {
$('.wikidialog-panel-mode-simple').css('display', 'none'); $('.wikidialog-panel-mode-expert').css('display', 'inline'); modeSelectRegion.expertFlag = true;
}
modeSelectRegion.handleSimplifyButton = function (event) {
$('.wikidialog-panel-mode-simple').css('display', 'inline'); $('.wikidialog-panel-mode-expert').css('display', 'none'); modeSelectRegion.expertFlag = false;
}
modeSelectRegion.setup = function () {
$('div.wikidialog-diagnostic-panel').replaceWith('
modeSelectRegion.simpleOnly( 'This is the simple version of the panel; there is also an expert version. ' + '' ') + modeSelectRegion.expertOnly( 'This is the expert version of the panel; there is also a simple version. ' + ' ') +
' +
' ' +
'');
$('.wikidialog-panel-button-complicate').replaceWith(function () { return $(document.createElement('input')).attr('type','button').addClass('wikidialog-panel-button-complicate') .val('toggle expert mode').attr('title','switch to expert panel mode').click(modeSelectRegion.handleComplicateButton); }); $('.wikidialog-panel-button-simplify').replaceWith(function () { return $(document.createElement('input')).attr('type','button').addClass('wikidialog-panel-button-simplify') .val('simplify').attr('title','switch to simple panel mode').click(modeSelectRegion.handleSimplifyButton); }); idSelectRegion.setup();
}
if (sessionStorage) {
modeSelectRegion.setup();
} else {
$('div.wikidialog-diagnostic-panel').replaceWith(
'
"No access to dialog storage from here. If you are viewing this page through the same browser session as a dialog whose data you're trying to recover, something strange is going on. The most likely reason for no dialog storage is a very old browser, and if that were so, it shouldn't have been possible to run a dialog in it at all." +'
'
);
}