मिडियाविकि:Gadget-twinkleprod.js
टिप्पणी सङ्ग्रह गरेपछि, परिवर्तन हेर्नको लागि तपाईंले आफ्नो ब्राउजरको क्याच बाईपास गर्नु पर्ने हुनसक्छ।
- फायरफक्स / सफारीमा: Shift कुञ्जी थिची राखेर Reload क्लिक गर्नुपर्छ, वा Ctrl-F5 वा Ctrl-R दबाउनुहोस् (म्याकमा ⌘-R)
- गुगल क्रोम: Ctrl-Shift-R कुञ्जी दबाउनुहोस् (म्याकमा ⌘-R)
- ओपेरा: Tools → Preferences मा गएर क्याश हटाउनुहोस्
- इन्टरनेट एक्सप्लोरर: Ctrl लाई थिची राखेर Refresh क्लिक गर्नुहोस् वा Ctrl-F5 थिच्नुहोस्
// <nowiki>
(function($) {
/*
****************************************
*** twinkleprod.js: PROD module
****************************************
* Mode of invocation: Tab ("मेप्र")
* Active on: Existing articles, files, books which are not redirects,
* and user pages in [[:श्रेणी:विकिपिडिया पुस्तकहरू (प्रयोगकर्ता पुस्तकहरू)]]
*/
Twinkle.prod = function twinkleprod() {
if ((([0, 6, 108].indexOf(mw.config.get('wgNamespaceNumber')) === -1) && (mw.config.get('wgNamespaceNumber') !== 2 || mw.config.get('wgCategories').indexOf('विकिपिडिया पुस्तकहरू (प्रयोगकर्ता पुस्तकहरू)') === -1))
|| !mw.config.get('wgCurRevisionId') || Morebits.wiki.isPageRedirect()) {
return;
}
Twinkle.addPortletLink(Twinkle.prod.callback, 'मेप्र', 'tw-prod', 'वि:मेप्रनी मार्फत मेटाउन प्रस्ताव गर्नुहोस्');
};
// Used in edit summaries, for comparisons, etc.
var namespace;
Twinkle.prod.callback = function twinkleprodCallback() {
Twinkle.prod.defaultReason = Twinkle.getPref('prodReasonDefault');
switch (mw.config.get('wgNamespaceNumber')) {
case 0:
namespace = 'लेख';
break;
case 6:
namespace = 'फाइल';
break;
case 2:
case 108:
namespace = 'पुस्तक';
break;
// no default
}
var Window = new Morebits.simpleWindow(800, 410);
Window.setTitle('मेटाउन प्रस्तावित (मेप्र)');
Window.setScriptName('ट्विङ्कल');
var form = new Morebits.quickForm(Twinkle.prod.callback.evaluate);
if (namespace === 'लेख') {
Window.addFooterLink('मेटाउन प्रस्तावित नीति', 'वि:मेप्रनी');
Window.addFooterLink('जीमाजी मेप्र नीति', 'वि:जीमाजीमेप्र');
} else if (namespace === 'फाइल') {
Window.addFooterLink('मेटाउन प्रस्तावित नीति', 'वि:मेप्रनी');
} else { // if book
Window.addFooterLink('मेटाउन प्रस्तावित (पुस्तक) नीति', 'वि:पुस्तकमेप्र');
}
var field = form.append({
type: 'field',
label: 'मेप्र प्रकार',
id: 'prodtype_fieldset'
});
field.append({
type: 'radio',
name: 'prodtype',
event: Twinkle.prod.callback.prodtypechanged,
list: [
{
label: 'मेप्र (मेटाउन प्रस्तावित)',
value: 'prod',
checked: true,
tooltip: 'सामान्य मेटाउन प्रस्तावित, [[वि:मेप्र]] अनुसार'
},
{
label: 'जीमाजी मेप्र (स्रोतहीन जीमाजी मेटाउन प्रस्तावित)',
value: 'prodblp',
tooltip: 'नयाँ, पूर्ण स्रोतहीन/अविश्वसनीय जीमाजी मेटाउन प्रस्तावित, [[वि:जीमाजीमेप्र]] अनुसार'
}
]
});
// Placeholder fieldset to be replaced in Twinkle.prod.callback.prodtypechanged
form.append({
type: 'field',
name: 'parameters'
});
Window.addFooterLink('ट्विङ्कल मद्दत', 'वि:ट्विङ्कल/दस्तावेज#मेप्र');
form.append({ type: 'submit', label: 'मेटाउन प्रस्तावित' });
var result = form.render();
Window.setContent(result);
Window.display();
// Hide fieldset for File and Book PROD types since only normal PROD is allowed
if (namespace !== 'लेख') {
$(result).find('#prodtype_fieldset').hide();
}
// Fake a change event on the first prod type radio, to initialize the type-dependent controls
var evt = document.createEvent('Event');
evt.initEvent('change', true, true);
result.prodtype[0].dispatchEvent(evt);
};
Twinkle.prod.callback.prodtypechanged = function(event) {
// prepare frame for prod type dependant controls
var field = new Morebits.quickForm.element({
type: 'field',
label: 'मापदण्डहरू',
name: 'parameters'
});
// create prod type dependant controls
switch (event.target.values) {
case 'prod':
field.append({
type: 'checkbox',
list: [
{
label: 'यदि सम्भव भएमा पृष्ठ सृजनाकर्तालाई सूचित गर्नुहोस्',
value: 'notify',
name: 'notify',
tooltip: "यदि यो सत्य हो भने एक सूचना ढाँचा सृजनाकर्ताको वार्ता पृष्ठमा राखिनेछ।",
checked: true
}
]
});
field.append({
type: 'textarea',
name: 'reason',
label: 'मेटाउन प्रस्तावित कारण:',
value: Twinkle.prod.defaultReason
});
break;
case 'prodblp':
// पहिले, प्रयोगकर्ताहरूले पाठमा प्रविष्ट गरेको मेप्र मान सम्झनुहोस्, किनभने, यदि तिनीहरू पछाडि फर्कन चाहन्छन् भने, हामी यसको लागि कन्फिगरेसन फिल्ड दुरुपयोग गर्न सक्छौं।
if (event.target.form.reason) {
Twinkle.prod.defaultReason = event.target.form.reason.value;
}
field.append({
type: 'checkbox',
list: [
{
label: 'यदि सम्भव भएमा पृष्ठ सृजनाकर्तालाई सूचित गर्नुहोस्',
value: 'notify',
name: 'notify',
tooltip: 'लेखको सृजनाकर्तालाई सूचित गरिनुपर्दछ।',
checked: true,
disabled: true
}
]
});
// temp warning, can be removed down the line once BLPPROD is more established. Amalthea, May 2010.
var boldtext = document.createElement('b');
boldtext.appendChild(document.createTextNode('कृपया नोट गर्नुहोस् कि जीवित व्यक्तिहरूको केवल स्रोतहीन/अविश्वसनीय जीवनी मात्र यस चिनो योग्य छ, सङ्कुचित रूपमा।'));
field.append({
type: 'div',
label: boldtext
});
break;
default:
break;
}
event.target.form.replaceChild(field.render(), $(event.target.form).find('fieldset[name="parameters"]')[0]);
};
Twinkle.prod.callbacks = {
checkpriors: function(apiobj) {
var xmlDoc = apiobj.responseXML;
var statelem = apiobj.statelem;
var params = apiobj.params;
// Check talk page for templates indicating prior XfD or PROD
var numTemplates = $(xmlDoc).find('templates tl').length;
if (numTemplates) {
var template = $(xmlDoc).find('templates tl')[0].getAttribute('title');
if (numTemplates === 1 && template === 'Template:Old prod') {
if (params.blp) {
if (!confirm('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो। के तपाइँ अझै पनी जीमाजीमेप्र लागू गर्न चाहानुहुन्छ? ')) {
statelem.warn('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, प्रयोगकर्ताद्वारा रद्द');
return;
}
statelem.info('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, जारी राख्दै');
} else {
statelem.warn('अघिल्लो मेप्र नामाङ्कन वार्ता पृष्ठमा भेटियो, प्रक्रिया रद्द गर्दै');
return;
}
// if there are multiple templates, at least one of them would be a prior xfd template
} else {
statelem.warn('अघिल्लो लेमेछ ढाँचा वार्ता पृष्ठमा भेटियो, प्रक्रिया रद्द गर्दै');
return;
}
}
var ts = new Morebits.wiki.page(mw.config.get('wgPageName'));
ts.setFollowRedirect(true); // for NPP, and also because redirects are ineligible for PROD
ts.setCallbackParameters(params);
ts.setLookupNonRedirectCreator(true); // Look for author of first non-redirect revision
ts.lookupCreation(Twinkle.prod.callbacks.creationInfo);
},
creationInfo: function(pageobj) {
var params = pageobj.getCallbackParameters();
params.initialContrib = pageobj.getCreator();
params.creation = pageobj.getCreationTimestamp();
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'चिनो लगाउने कार्य सम्पन्न भयो';
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'पृष्ठ चिह्नित गर्दै');
wikipedia_page.setFollowRedirect(true); // for NPP, and also because redirects are ineligible for PROD
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.prod.callbacks.main);
},
main: function(pageobj) {
var statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error("यस्तो देखिन्छ कि पृष्ठ अवस्थित छैन। हुनसक्छ यो पहिले नै हटाईएको छ।");
return;
}
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
// Check for already existing deletion tags
var tag_re = /{{(?:db-?|delete|article for deletion\/dated|ffd\b)|#invoke:RfD/i;
if (tag_re.test(text)) {
statelem.warn('पृष्ठमा पहिले नै मेटाउने ढाँचा चिह्नित गरिएको छ, प्रक्रिया रद्द गर्दै');
return;
}
// Alert if article is at least three days old, not in Category:Living people, and BLPPROD is selected
if (params.blp) {
var isMoreThan3DaysOld = new Morebits.date(params.creation).add(3, 'days').isAfter(new Date(pageobj.getLoadTime()));
var blpcheck_re = /\[\[Category:जीवित मानिसहरू\]\]/i;
if (!blpcheck_re.test(text) && isMoreThan3DaysOld) {
if (!confirm('कृपया नोट गर्नुहोस् कि लेख श्रेणी:जीवित मानिसहरूमा छैन र त्यसैले जीमाजीमेप्रको लागि अयोग्य हुन सक्छ। के तपाईँ पक्का हुनुहुन्छ कि तपाईँ जारी राख्न चाहनुहुन्छ? \n\nयदि लेख हालै मृत एक व्यक्तिको बारेमा नभएसम्म तपाईँ श्रेणी जारी राख्न सक्नुहुन्छ।')) {
return;
}
}
}
// Remove tags that become superfluous with this action
text = text.replace(/{{\s*(userspace draft|mtc|(copy|move) to wikimedia commons|(copy |move )?to ?commons)\s*(\|(?:{{[^{}]*}}|[^{}])*)?}}\s*/gi, '');
var prod_re = /{{\s*(?:Prod blp|Proposed deletion|book-prod)\/dated(?: files)?\s*\|(?:{{[^{}]*}}|[^{}])*}}/i;
var summaryText;
if (!prod_re.test(text)) {
// Notification to first contributor
if (params.usertalk) {
// Disallow warning yourself
if (params.initialContrib === mw.config.get('wgUserName')) {
statelem.warn('तपाईँले नै यो (' + params.initialContrib + ') पृष्ठ सृजना गर्नुभयो; प्रयोगकर्ता सूचना रद्द गर्दै');
if (Twinkle.getPref('logProdPages')) {
Twinkle.prod.callbacks.addToLog(params);
}
} else {
// [[Template:Proposed deletion notify]] supports File namespace
var notifyTemplate;
if (params.blp) {
notifyTemplate = 'prodwarningBLP';
} else if (params.book) {
notifyTemplate = 'bprodwarning';
} else {
notifyTemplate = 'proposed deletion notify';
}
var notifytext = '\n{{subst:' + notifyTemplate + '|1=' + Morebits.pageNameNorm + '|concern=' + params.reason + '}} ~~~~';
var usertalkpage = new Morebits.wiki.page('User talk:' + params.initialContrib, 'प्रारम्भिक योगदानकर्तालाई सूचित गर्दै (' + params.initialContrib + ')');
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary('सूचना: [[:' + Morebits.pageNameNorm + ']] मेटाउन प्रस्तावित' + Twinkle.getPref('summaryAd'));
usertalkpage.setCreateOption('recreate');
usertalkpage.setFollowRedirect(true);
usertalkpage.setCallbackParameters(params);
usertalkpage.append(function onNotifySuccess() {
// add nomination to the userspace log, if the user has enabled it
if (Twinkle.getPref('logProdPages')) {
params.logInitialContrib = params.initialContrib;
Twinkle.prod.callbacks.addToLog(params);
}
}, function onNotifyError() {
// if user could not be notified, log nomination without mentioning that notification was sent
if (Twinkle.getPref('logProdPages')) {
Twinkle.prod.callbacks.addToLog(params);
}
});
}
} else if (Twinkle.getPref('logProdPages')) { // If not notifying, log this PROD
Twinkle.prod.callbacks.addToLog(params);
}
if (params.blp) {
summaryText = '[[वि:जीमाजीमेप्र]] मार्फत लेख मेटाउनका लागि प्रस्ताव गर्दै।';
text = '{{subst:prod blp' + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
} else if (params.book) {
summaryText = '[[वि:पुस्तकमेप्र]] मार्फत पुस्तक मेटाउनका लागि प्रस्ताव गर्दै।';
text = '{{subst:book-prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
} else {
summaryText = '[[वि:मेप्र]] मार्फत ' + namespace + ' मेटाउनका लागि प्रस्ताव गर्दै।';
text = '{{subst:prod|1=' + Morebits.string.formatReasonText(params.reason) + (params.usertalk ? '|help=off' : '') + '}}\n' + text;
}
// Add {{Old prod}} to the talk page
var oldprodfull = '{{Old prod|nom=' + mw.config.get('wgUserName') + '|nomdate={{subst:#time: Y-m-d}}}}\n';
var talktitle = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
var talkpage = new Morebits.wiki.page(talktitle, 'वार्तालाप पृष्ठमा {{Old prod}} राख्दै');
talkpage.setPrependText(oldprodfull);
talkpage.setEditSummary('ढाँचा {{Old prod}} थप्दै' + Twinkle.getPref('summaryAd'));
talkpage.setFollowRedirect(true); // match behavior for page tagging
talkpage.setCreateOption('recreate');
talkpage.prepend();
} else { // already tagged for PROD, so try endorsing it
var prod2_re = /{{(?:Proposed deletion endorsed|prod-?2).*?}}/;
if (prod2_re.test(text)) {
statelem.warn('पृष्ठलाई पहिले नै {{proposed deletion}} र {{proposed deletion endorsed}} ढाँचाहरू चिह्नित गरिएको छ, प्रक्रिया रद्द गर्दै');
return;
}
var confirmtext = 'यस पृष्ठमा एक {{proposed deletion}} चिनो पहिले नै राखिएको छ। \nके तपाईँ आफ्नो स्पष्टीकरण सहित {{proposed deletion endorsed}} चिनो थप्न चाहानुहुन्छ?';
if (params.blp) {
confirmtext = 'यस पृष्ठमा एक गैर-जीमाजी {{proposed deletion}} चिनो पहिले नै राखिएको छ। \nके तपाईँ आफ्नो स्पष्टीकरण "लेख कुनै स्रोतहरू बिनाको जीवित व्यक्तिको जीवनी हो" सहित {{proposed deletion endorsed}} चिनो थप्न चाहानुहुन्छ?';
// FIXME: this msg is shown even if it was a BLPPROD tag.
}
if (!confirm(confirmtext)) {
statelem.warn('प्रयोगकर्ताको अनुरोधमा रद्द गरियो');
return;
}
summaryText = 'प्रस्तावित [[वि:' + (params.blp ? 'जीमाजी' : params.book ? 'पुस्तक' : '') + 'मेप्र]] मेटाउन समर्थन गर्दै।';
text = text.replace(prod_re, text.match(prod_re) + '\n{{proposed deletion endorsed|1=' + (params.blp ?
'लेख एक [[वि:जीमाजीमेप्र|कुनै स्रोत नभएको जीवित व्यक्तिको जीवनी]] हो' :
Morebits.string.formatReasonText(params.reason)) + '}}\n');
if (Twinkle.getPref('logProdPages')) {
params.logEndorsing = true;
Twinkle.prod.callbacks.addToLog(params);
}
}
// curate/patrol the page
if (Twinkle.getPref('markProdPagesAsPatrolled')) {
pageobj.triage();
}
pageobj.setPageText(text);
pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getPref('watchProdPages'));
pageobj.setCreateOption('nocreate');
pageobj.save();
},
addToLog: function(params) {
var wikipedia_page = new Morebits.wiki.page('User:' + mw.config.get('wgUserName') + '/' + Twinkle.getPref('prodLogPageName'), 'प्रयोगकर्तास्थान लगमा प्रविष्टि थप्दै');
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.prod.callbacks.saveLog);
},
saveLog: function(pageobj) {
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
// add blurb if log page doesn't exist
if (!pageobj.exists()) {
text =
"यो [[वि:ट्विङ्कल|ट्विङ्कल]]को मेप्र मोड्युल प्रयोग गरि यस प्रयोगकर्ताद्वारा लागू वा समर्थन गरिएको सबै [[वि:मेप्र|मेटाउन प्रस्तावित]] चिनोहरूको लग हो।\n\n" +
'यदि तपाइँ अब यो लग राख्न चाहनुहुन्न भने, यसलाई [[विकिपिडिया:ट्विङ्कल/अभिरुचिहरू|अभिरुचि सूची]] प्रयोग गरेर बन्द गर्न सक्नुहुनेछ, र ' +
'यस पृष्ठलाई [[वि:शीमे#प्र१|शीमे प्र१]] अन्तर्गत शीघ्र मेटाउनको लागि नामाङ्कन गर्नुहोला।\n';
}
// create monthly header if it doesn't exist already
var date = new Morebits.date(pageobj.getLoadTime());
if (!date.monthHeaderRegex().test(text)) {
text += '\n\n' + date.monthHeader(3);
}
text += '\n# [[:' + Morebits.pageNameNorm + ']]';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
text += namespace === 'फाइल' ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} लग]): ' : ': ';
var summarytext;
if (params.logEndorsing) {
text += 'समर्थन ' + (params.blp ? 'जीमाजी ' : params.book ? 'पुस्तक' : '') + 'मेप्र। ~~~~~';
if (params.reason) {
text += "\n#* '''कारण''': " + params.reason + '\n';
}
summarytext = '[[:' + Morebits.pageNameNorm + ']]को मेप्र नामाङ्कनको अनुमोदन लग बनाउँदै।';
} else {
text += (params.blp ? 'जीमाजी ' : params.book ? 'पुस्तक' : '') + 'मेप्र';
if (params.logInitialContrib) {
text += '; सूचित गरियो {{user|' + params.logInitialContrib + '}}';
}
text += ' ~~~~~\n';
if (!params.blp) {
text += "#* '''कारण''': " + params.reason + '\n';
}
summarytext = '[[:' + Morebits.pageNameNorm + ']]को मेप्र नामाङ्कन लग बनाउँदै।';
}
pageobj.setPageText(text);
pageobj.setEditSummary(summarytext + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption('recreate');
pageobj.save();
}
};
Twinkle.prod.callback.evaluate = function twinkleprodCallbackEvaluate(e) {
var form = e.target;
var prodtype;
if (namespace === 'लेख') {
var prodtypes = form.prodtype;
for (var i = 0; i < prodtypes.length; i++) {
if (prodtypes[i].checked) {
prodtype = prodtypes[i].values;
break;
}
}
}
var params = {
usertalk: form.notify.checked,
blp: prodtype === 'prodblp',
book: namespace === 'book',
reason: prodtype === 'prodblp' ? '' : form.reason.value // using an empty string here as fallback will help with prod-2.
};
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
var talk_title = new mw.Title(mw.config.get('wgPageName')).getTalkPage().getPrefixedText();
// Talk page templates for PROD-able discussions
var blocking_templates = 'Template:Old XfD multi|Template:Old MfD|Template:Oldffdfull|' + // Common prior XfD talk page templates
'Template:Oldpuffull|' + // Legacy prior XfD template
'Template:Olddelrev|' + // Prior DRV template
'Template:Old prod';
var query = {
'action': 'query',
'titles': talk_title,
'prop': 'templates',
'tltemplates': blocking_templates
};
var wikipedia_api = new Morebits.wiki.api('पूर्व नामाङ्कनहरूको लागि वार्ता पृष्ठ जाँच गर्दै', query, Twinkle.prod.callbacks.checkpriors);
wikipedia_api.params = params;
wikipedia_api.post();
};
})(jQuery);
// </nowiki>