MediaWiki:Gadget-twinkleprotect.js: Perbedaan antara revisi
Konten dihapus Konten ditambahkan
Repo at a491314: tracking branch 'upstream/master'; re-enable check for flaggedrevs/pending changes being enabled; Don't fail if flaggedrevs/pending changes aren't enabled" |
Repo at 5c1e7e3: Add missing 'protection' to ECP message; Don't ask to remove tags if you've chosen to remove them; Remove erroneous selected: true for pp-dispute; Fix bug affecting untagging on PC-ineligible namespaces; Add error message for occasional PC-application failure; Add section link at rpp; use API text output to check if page is redirect; Remove PC option entirely on inappropriate namespaces (#738); overhaul action complete status messages; Hide on mediawiki pages (#640) |
||
Baris 1:
// <nowiki>
(function($) {
Baris 10:
****************************************
* Mode of invocation: Tab ("PP"/"RPP")
* Active on: Non-special, non-MediaWiki pages
*/
Baris 17 ⟶ 16:
Twinkle.protect = function twinkleprotect() {
if (
return;
}
Twinkle.addPortletLink(Twinkle.protect.callback, Morebits.
Morebits.
};
Twinkle.protect.callback = function twinkleprotectCallback() {
var Window = new Morebits.simpleWindow(
Window.setTitle(
Window.setScriptName(
Window.addFooterLink(
Window.addFooterLink(
Window.addFooterLink(
var form = new Morebits.quickForm(
var actionfield = form.append(
if (
actionfield.append(
type: 'radio',
name: 'actiontype',
Baris 59 ⟶ 44:
list: [
{
label: '
value: '
tooltip: 'Terapkan perlindungan ke halaman ini.',
checked:
}
]
}
}
actionfield.append({
type: 'radio',
name: 'actiontype',
event: Twinkle.protect.callback.changeAction,
list: [
{
label: 'Meminta perlindungan halaman',
value: 'request',
tooltip: 'Jika Anda ingin meminta perlindungan halaman melalui WP:RPP' + (Morebits.userIsSysop ? ' alih-alih melindunginya sendiri.' : '.'),
checked: !Morebits.userIsSysop
},
{
label: 'Tandai halaman dengan templat perlindungan',
value: 'tag',
tooltip: 'Jika pengurus yang melakukan perlindungan lupa memberi templat, atau Anda sudah melindunginya tanpa menandai, Anda dapat menggunakan ini untuk menandai tag yang cocok.',
disabled: mw.config.get('wgArticleId') === 0 || mw.config.get('wgPageContentModel') === 'Scribunto'
}
]
});
form.append({ type: 'field', label: 'Jenis pengaturan', name: 'field_preset' });
Baris 77 ⟶ 76:
form.append({ type: 'field', label: '2', name: 'field2' });
form.append(
var result = form.render();
Window.setContent(
Window.display();
// We must init the controls
var evt = document.createEvent(
evt.initEvent(
result.actiontype[0].dispatchEvent(
// get current protection level asynchronously
Baris 110 ⟶ 107:
letitle: pageName,
letype: protType
}).then(function(
// don't check log entries that have already been checked (e.g. don't go into an infinite loop!)
var event = data.query ? $.grep(data.query.logevents, function(le) {
return $.inArray(le.logid, logIds); })[0] : null; if (!event) {
// fail gracefully
return null;
} else if (event.action ===
return twinkleprotectFetchProtectingAdmin(
}
return event.user;
});
};
Baris 138 ⟶ 136:
letype: 'protect',
letitle: mw.config.get('wgPageName'),
prop:
inprop: 'protection',
titles: mw.config.get('wgPageName')
Baris 155 ⟶ 153:
}
$.when.apply($, earlyDecision).done(function(protectData, stableData) {
// $.when.apply is supposed to take an unknown number of promises
// via an array, which it does, but the type of data returned varies.
Baris 167 ⟶ 165:
var current = {}, adminEditDeferred;
$.each(page.protection, function(
if (protection.type !==
current[protection.type] = {
level: protection.level,
Baris 215 ⟶ 213:
if (Twinkle.protect.hasProtectLog || Twinkle.protect.hasStableLog) {
var $linkMarkup = $(
if (Twinkle.protect.hasProtectLog) {
$linkMarkup.append(
$(
Twinkle.protect.hasStableLog ? $(
);
}
if (Twinkle.protect.hasStableLog) {
$linkMarkup.append($(
}
Baris 241 ⟶ 239:
$.each(Twinkle.protect.currentProtectionLevels, function(type, settings) {
var label = type === 'stabilize' ? 'Perubahan tertunda' : Morebits.string.toUpperCaseFirstChar(type);
protectionNode.push($(
if (settings.expiry === 'infinity') {
protectionNode.push(
} else {
protectionNode.push(
}
if (settings.cascade) {
protectionNode.push(
}
if (settings.admin) {
var adminLink = '<a target="_blank" href="' + mw.util.getUrl('User talk:' + settings.admin) + '">' +
protectionNode.push($(
}
protectionNode.push($(
});
protectionNode = protectionNode.slice(0, -1); // remove the trailing bullet
statusLevel = 'warn';
} else {
protectionNode.push($(
}
Morebits.status[statusLevel](
};
Baris 269 ⟶ 267:
var field1;
var field2;
var isTemplate = mw.config.get(
switch (e.target.values) {
Baris 275 ⟶ 273:
field_preset = new Morebits.quickForm.element({ type: 'field', label: 'Pilihan aturan', name: 'field_preset' });
field_preset.append({
field2 = new Morebits.quickForm.element({ type: 'field', label: 'Opsi perlindungan', name: 'field2' });
Baris 292 ⟶ 290:
if (mw.config.get('wgArticleId')) {
field2.append({
var editlevel = field2.append({
editlevel.append({
editlevel.append({
/
editlevel.append({ */
if (isTemplate) {
editlevel.append({
}
editlevel.append({
type: 'option',
label: 'Pengurus',
value: 'sysop',
selected: true
});
field2.append({
type: 'select',
name: 'editexpiry',
label: 'Jangka waktu perlindungan:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
// default expiry selection is conditionally set in Twinkle.protect.callback.changePreset
list: [
{ label: '1 jam', value: '1 hour' },
{ label: '2 jam', value: '2 hours' },
{ label: '3 jam', value: '3 hours' },
{ label: '6 jam', value: '6 hours' },
{ label: '12 jam', value: '12 hours' },
{ label: '1 hari', value: '1 day' },
{ label: '2 hari', value: '2 days' },
{ label: '3 hari', value: '3 days' },
{ label: '4 hari', value: '4 days' },
{ label: '1 minggu', value: '1 week' },
{ label: '2 minggu', value: '2 weeks' },
{ label: '1 bulan', value: '1 month' },
{ label: '2 bulan', value: '2 months' },
{ label: '3 bulan', value: '3 months' },
{ label: '1 tahun', value: '1 year' },
{ label: 'tak terbatas', value: 'indefinite' },
{ label: 'Lain-lain...', value: 'custom' }
]
});
field2.append({
type: 'checkbox',
name: 'movemodify',
event: Twinkle.protect.formevents.movemodify,
list: [
{
llabel: 'Ubah perlindungan pemindahan',
value: 'movemodify',
tooltip: 'Jika opsi ini dimatikan, tingkat perlindungan pemindahan halaman dan jangka waktu kedaluwarsa akan ditinggalkan sebagaimana adanya.',
checked: true
}
]
});
var movelevel = field2.append({
type: 'select',
name: 'movelevel',
label: 'Perlindungan pemindahan:',
event: Twinkle.protect.formevents.movelevel
});
movelevel.append({
type: 'option',
label: 'Semua',
value: 'all'
});
/*
movelevel.append({
type: 'option',
label: 'Extended confirmed',
value: 'extendedconfirmed'
});
*/
if (isTemplate) {
movelevel.append({
type: 'option',
label: '
value: '
});
}
movelevel.append({
type: 'option',
label: 'Pengurus',
value: 'sysop',
selected: true
});
field2.append({
type: 'select',
name: 'moveexpiry',
label: 'Jangka waktu perlindungan:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
// default expiry selection is conditionally set in Twinkle.protect.callback.changePreset
list: [
{ label: '1 jam', value: '1 hour' },
{ label: '2 jam', value: '2 hours' },
{ label: '3 jam', value: '3 hours' },
{ label: '6 jam', value: '6 hours' },
{ label: '12 jam', value: '12 hours' },
{ label: '1 hari', value: '1 day' },
{ label: '2 hari', selected: true, value: '2 days' },
{ label: '3 hari', value: '3 days' },
{ label: '4 hari', value: '4 days' },
{ label: '1 minggu', value: '1 week' },
{ label: '2 minggu', value: '2 weeks' },
{ label: '1 bulan', value: '1 month' },
{ label: '2 bulan', value: '2 months' },
{ label: '3 bulan', value: '3 months' },
{ label: '1 tahun', value: '1 year' },
{ label: 'tak terbatas', value: 'indefinite' },
{ label: 'Lain-lain...', value: 'custom' }
]
});
// Namespaces hardcoded until [[phab:T218479]]
if (mw.loader.getState('ext.flaggedRevs.review') && (mw.config.get('wgNamespaceNumber') === 0 || mw.config.get('wgNamespaceNumber') === 4)) {
field2.append({
type: 'checkbox',
name: '
event: Twinkle.protect.formevents.
list: [
{
label: '
value: '
tooltip: '
checked: true
}
]
});
var
type: 'select',
name: '
label: '
event: Twinkle.protect.formevents.
});
type: 'option',
label: '
value: '
});
type: 'option',
label: '
value: 'autoconfirmed',
selected: true
});
field2.append({
type: 'select',
name: '
label: 'Jangka waktu perlindungan:',
event: function(e) {
Baris 419 ⟶ 483:
}
},
list: [
{ label: '1 jam', value: '1 hour' },
{ label: '2 jam', value: '2 hours' },
Baris 427 ⟶ 491:
{ label: '12 jam', value: '12 hours' },
{ label: '1 hari', value: '1 day' },
{ label: '2 hari'
{ label: '3 hari', value: '3 days' },
{ label: '4 hari', value: '4 days' },
{ label: '1 minggu', value: '1 week' },
{ label: '2 minggu', value: '2 weeks' },
{ label: '1 bulan', selected: true, value: '1 month' },
{ label: '2 bulan', value: '2 months' },
{ label: '3 bulan', value: '3 months' },
{ label: '1 tahun', value: '1 year' },
{ label: 'tak terbatas', value: 'indefinite' },
{ label: 'Lain-lain...', value: 'custom' }
]
});
}
} else { // for non-existing pages
var createlevel = field2.append({
createlevel.append({
type: 'option',
label: 'Semua',
value: 'all'
});
if (mw.config.get('wgNamespaceNumber') !== 0) {
createlevel.append({
type: 'option',
label: '
value: '
});
}
if (isTemplate) {
createlevel.append({
type: 'option',
label: '
value: '
});
}
/*
createlevel.append({
});
*/
createlevel.append({
type: 'option',
label: 'Pengurus',
value: 'sysop'
});
field2.append({
}
field2.append({
if (!mw.config.get('wgArticleId') || mw.config.get('wgPageContentModel') === 'Scribunto') { // tagging isn't relevant for non-existing or module pages
break;
Baris 582 ⟶ 587:
field1.append({ type: 'div', name: 'currentprot', label: ' ' }); // holds the current protection level, as filled out by the async callback
field1.append({ type: 'div', name: 'hasprotectlog', label: ' ' });
field1.append(
field1.append(
break;
Baris 611 ⟶ 616:
field_preset = new Morebits.quickForm.element({ type: 'field', label: 'Jenis perlindungan', name: 'field_preset' });
field_preset.append({
field1 = new Morebits.quickForm.element({ type: 'field', label: 'Opsi', name: 'field1' });
field1.append({ type: 'div', name: 'currentprot', label: ' ' }); // holds the current protection level, as filled out by the async callback
field1.append({ type: 'div', name: 'hasprotectlog', label: ' ' });
field1.append({
{ label: 'Sementara', value: 'temporary' },
{ label: 'Selamanya', value: 'indefinite' },
{ label: '', selected: true, value: '' }
]
});
field1.append({
type: 'textarea',
name: 'reason',
label: 'Alasan: '
});
break;
default:
alert(
break;
}
Baris 665 ⟶ 670:
if (e.target.values === 'protect') {
// fake a change event on the preset dropdown
var evt = document.createEvent(
evt.initEvent(
e.target.form.category.dispatchEvent(
// reduce vertical height of dialog
Baris 681 ⟶ 686:
e.target.form.editlevel.disabled = !e.target.checked;
e.target.form.editexpiry.disabled = !e.target.checked || (e.target.form.editlevel.value === 'all');
e.target.form.editlevel.style.color = e.target.form.editexpiry.style.color =
},
editlevel: function twinkleprotectFormEditlevelEvent(e) {
e.target.form.editexpiry.disabled =
},
movemodify: function twinkleprotectFormMovemodifyEvent(e) {
Baris 697 ⟶ 702:
e.target.form.movelevel.disabled = !e.target.checked;
e.target.form.moveexpiry.disabled = !e.target.checked || (e.target.form.movelevel.value === 'all');
e.target.form.movelevel.style.color = e.target.form.moveexpiry.style.color =
},
movelevel: function twinkleprotectFormMovelevelEvent(e) {
e.target.form.moveexpiry.disabled =
},
pcmodify: function twinkleprotectFormPcmodifyEvent(e) {
e.target.form.pclevel.disabled = !e.target.checked;
e.target.form.pcexpiry.disabled = !e.target.checked || (e.target.form.pclevel.value === 'none');
e.target.form.pclevel.style.color = e.target.form.pcexpiry.style.color =
},
pclevel: function twinkleprotectFormPclevelEvent(e) {
e.target.form.pcexpiry.disabled =
},
createlevel: function twinkleprotectFormCreatelevelEvent(e) {
e.target.form.createexpiry.disabled =
},
tagtype: function twinkleprotectFormTagtypeEvent(e) {
Baris 749 ⟶ 754:
},
// idwiki doesn't have extendedconfirmed!
/
{
label: 'Extended confirmed protection',
list: [
{ label: 'Sockpuppetry (ECP)', value: 'pp-30-500-sock' }
]
},
*/
{
label: 'Perlindungan sebagian',
Baris 845 ⟶ 852:
reason: 'Templat yang sering digunakan'
},
/*
'pp-30-500-arb': {
reason: '[[WP:30/500|Arbitration enforcement]]', */
'pp-semi-vandalism': {
edit: 'autoconfirmed',
Baris 997 ⟶ 1.006:
list: [
{ label: '{{pp-vandalism}}: vandalisme', value: 'pp-vandalism' },
{ label: '{{pp-dispute}}: perang suntingan', value: 'pp-dispute'
{ label: '{{pp-blp}}: melanggar kebijakan BLP', value: 'pp-blp' },
{ label: '{{pp-sock}}: penyalahgunaan akun boneka', value: 'pp-sock' },
Baris 1.003 ⟶ 1.012:
{ label: '{{pp-usertalk}}: halaman pembicaraan pengguna yang diblokir', value: 'pp-usertalk' },
{ label: '{{pp-protected}}: perlindungan umum', value: 'pp-protected' },
{ label: '{{pp-semi-indef}}: perlindungan sebagian dalam jangka waktu lama umum', value: 'pp-semi-indef' }
// { label: '{{pp-30-500}}: extended confirmed protection', value: 'pp-30-500' }
]
Baris 1.029 ⟶ 1.038:
var actiontypes = form.actiontype;
var actiontype;
for
if (!actiontypes[i].checked) {
continue;
}
Baris 1.064 ⟶ 1.072:
}
if (
if (item.stabilize) {
form.pcmodify.checked = true;
Twinkle.protect.formevents.pcmodify({ target: form.pcmodify }); form.pclevel.value = item.stabilize;
Twinkle.protect.formevents.pclevel({ target: form.pclevel });
} else
form.pcmodify.checked = false;
Twinkle.protect.formevents.pcmodify({ target: form.pcmodify });
}
}
} else {
Baris 1.080 ⟶ 1.090:
}
var reasonField =
if (item.reason) {
reasonField.value = item.reason;
Baris 1.089 ⟶ 1.099:
// sort out tagging options, disabled if nonexistent or lua
if (mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') !== 'Scribunto') {
if (
form.tagtype.value = 'none';
} else {
form.tagtype.value =
}
Twinkle.protect.formevents.tagtype({ target: form.tagtype });
if (
form.noinclude.checked = true;
form.editexpiry.value = form.moveexpiry.value = form.pcexpiry.value =
} else if
form.noinclude.checked = false;
}
Baris 1.105 ⟶ 1.115:
} else { // RPP request
if (
form.expiry.value = '';
form.expiry.disabled = true;
Baris 1.120 ⟶ 1.130:
var actiontypes = form.actiontype;
var actiontype;
for
if (!actiontypes[i].checked) {
continue;
}
Baris 1.130 ⟶ 1.139:
var tagparams;
if
tagparams = {
tag: form.tagtype.value,
reason:
small: form.small.checked,
noinclude: form.noinclude.checked
Baris 1.143 ⟶ 1.152:
// protect the page
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice =
var statusInited = false;
Baris 1.150 ⟶ 1.159:
var allDone = function twinkleprotectCallbackAllDone() {
if (thispage) {
thispage.getStatusElement().info(
}
if (tagparams) {
Baris 1.167 ⟶ 1.176:
var protectIt = function twinkleprotectCallbackProtectIt(next) {
thispage = new Morebits.wiki.page(mw.config.get('wgPageName'),
if (mw.config.get('wgArticleId')) {
if (form.editmodify.checked) {
Baris 1.183 ⟶ 1.192:
thispage.setEditSummary(form.protectReason.value);
} else {
alert(
return;
}
if (!statusInited) {
Morebits.simpleWindow.setButtonsEnabled(
Morebits.status.init(
statusInited = true;
}
Baris 1.198 ⟶ 1.207:
var stabilizeIt = function twinkleprotectCallbackStabilizeIt() {
if (thispage) {
thispage.getStatusElement().info(
}
thispage = new Morebits.wiki.page(mw.config.get('wgPageName'),
thispage.setFlaggedRevs(stabilizeValues.pclevel, stabilizeValues.pcexpiry);
Baris 1.207 ⟶ 1.216:
thispage.setEditSummary(stabilizeValues.protectReason);
} else {
alert(
return;
}
Baris 1.217 ⟶ 1.226:
}
thispage.stabilize(allDone, function(error)
if (error.errorCode === 'stabilize_denied') { // [[phab:T234743]]
thispage.getStatusElement().error('Failed trying to modify pending changes settings, likely due to a mediawiki bug. Other actions (tagging or regular protection) may have taken place. Please reload the page and try again.');
}
});
};
Baris 1.230 ⟶ 1.243:
stabilizeIt();
} else {
alert(
}
Baris 1.238 ⟶ 1.251:
// apply a protection template
Morebits.simpleWindow.setButtonsEnabled(
Morebits.status.init(
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.followRedirect = false;
Morebits.wiki.actionCompleted.notice =
Twinkle.protect.callbacks.taggingPageInitial(tagparams);
Baris 1.251 ⟶ 1.264:
// file request at RFPP
var typename, typereason;
switch (
case 'pp-dispute':
case 'pp-vandalism':
Baris 1.261 ⟶ 1.274:
typename = 'template protection';
break;
case 'pp-semi-vandalism':
case 'pp-semi-disruptive':
Baris 1.297 ⟶ 1.310:
break;
case 'unprotect':
var admins = $.map(Twinkle.protect.currentProtectionLevels, function(pl) {
return pl.admin ? 'User:' + pl.admin : null });
if (admins.length && !confirm('Have you attempted to contact the protecting admins (' + $.unique(admins).join(', ') + ') first?')) {
return false;
}
Baris 1.328 ⟶ 1.343:
typereason = 'Templat yang banyak digunakan';
break;
case 'pp-usertalk':
case 'pp-semi-usertalk':
Baris 1.368 ⟶ 1.383:
var reason = typereason;
if
if (
reason +=
}
reason += form.reason.value;
}
if
reason += '.';
}
Baris 1.385 ⟶ 1.400:
};
Morebits.simpleWindow.setButtonsEnabled(
Morebits.status.init(
var rppName = 'Wikipedia:Permintaan perhatian pengurus/Perlindungan';
Baris 1.392 ⟶ 1.407:
// Updating data for the action completed event
Morebits.wiki.actionCompleted.redirect = rppName;
Morebits.wiki.actionCompleted.notice =
var rppPage = new Morebits.wiki.page(
rppPage.setFollowRedirect(
rppPage.setCallbackParameters(
rppPage.load(
break;
default:
alert(
break;
}
Baris 1.406 ⟶ 1.421:
Twinkle.protect.callbacks = {
taggingPageInitial: function(
if (tagparams.tag === 'noop') {
Morebits.status.info(
return;
}
var protectedPage = new Morebits.wiki.page(
protectedPage.setCallbackParameters(
protectedPage.load(
},
taggingPage: function(
var params = protectedPage.getCallbackParameters();
var text = protectedPage.getPageText();
Baris 1.424 ⟶ 1.439:
var re_result = oldtag_re.exec(text);
if (re_result) {
if (params.tag === 'none' || confirm(
text = text.replace(
}
}
if (
summary = 'Removing protection template' + Twinkle.getPref('summaryAd');
} else {
tag = params.tag;
if (
tag += '|reason=' + params.reason;
}
if (
tag += '|small=yes';
}
if (/^\s*#redirect/i.test(text)) { // redirect page
// Only tag if no {{rcat shell}} is found
if (!text.match(/{{(?:redr|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
text = text.replace(/#REDIRECT ?(\[\[.*?\]\])(.*)/i,
} else {
Morebits.status.info(
return;
}
} else if (
text =
} else {
text =
}
summary =
}
protectedPage.setEditSummary(
protectedPage.setPageText(
protectedPage.setCreateOption(
protectedPage.suppressProtectWarning(); // no need to let admins know they are editing through protection
protectedPage.save();
},
fileRequest: function(
var params = rppPage.getCallbackParameters();
Baris 1.471 ⟶ 1.484:
var statusElement = rppPage.getStatusElement();
var rppRe = new RegExp(
var tag = rppRe.exec(
var rppLink = document.createElement('a');
rppLink.setAttribute('href', mw.util.getUrl(rppPage.getPageName())
rppLink.appendChild(document.createTextNode(rppPage.getPageName()));
if (
statusElement.error(
return;
}
var newtag = '=== [[:' + Morebits.pageNameNorm + ']] ===\n';
if
statusElement.error(
return;
}
Baris 1.491 ⟶ 1.504:
var words;
switch (
case 'temporary':
words =
break;
case 'indefinite':
words =
break;
default:
words =
break;
}
words += params.typename;
newtag += "'''" + Morebits.string.toUpperCaseFirstChar(words) + (
Morebits.string.formatReasonText(params.reason
// If either protection type results in a increased status, then post it under increase
Baris 1.518 ⟶ 1.531:
if (stabilizeLevel) {
if (result) {
if (stabilizeLevel.level ===
result += 2;
}
} else {
result = Twinkle.protect.protectionWeight[
}
}
Baris 1.531 ⟶ 1.544:
var editWeight = computeWeight(Twinkle.protect.currentProtectionLevels.edit &&
Twinkle.protect.currentProtectionLevels.edit.level,
Twinkle.protect.currentProtectionLevels.stabilize.level);
if (computeWeight(protInfo.edit, protInfo.stabilize) > editWeight ||
Baris 1.542 ⟶ 1.555:
var reg;
if (
reg = /(\n==\s*Current requests for reduction in protection level\s*==)/;
} else {
Baris 1.549 ⟶ 1.562:
var originalTextLength = text.length;
text = text.replace(
if (text.length === originalTextLength) {
var linknode = document.createElement('a');
linknode.setAttribute(
linknode.appendChild(document.createTextNode('Bagaimana memperbaiki PPH'));
statusElement.error(
return;
}
statusElement.status(
rppPage.setEditSummary('/* ' + Morebits.pageNameNorm + ' */
Morebits.pageNameNorm + ']].' + Twinkle.getPref('summaryAd')
rppPage.setPageText(
rppPage.setCreateOption(
rppPage.save();
}
Baris 1.569 ⟶ 1.581:
// </nowiki>
|