کاربر:Jeeputer/moveToDraft.js: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
صفحهای تازه حاوی «/*************************************************************************************************** MoveToDraft Originally written by [[...» ایجاد کرد برچسب: افزودن تگهای خالی |
(بدون تفاوت)
|
نسخهٔ ۴ مارس ۲۰۲۱، ساعت ۰۱:۲۷
/***************************************************************************************************
MoveToDraft
Originally written by [[:en:User:Evad37]] at [[:en:User:Evad37/MoveToDraft.js]]
Translated and localized to work on fawiki by [[User:Jeeputer]]
-------------
Version 2.5.0
-------------
A script to move unsourced articles to draft space, including cleanup and author notification.
- Moves page to draftspace
- Checks if any files used are non-free
- Checks if any redirects pointed to the page
- Comments out non-free files, turn categories into links, add afc draft template, add redirects
- Adds notification message on author talk page
- Updates talk page banners
- Logs draftification in user subpage
***************************************************************************************************/
/* jshint laxbreak: true, undef: true, maxerr:999 */
/* globals console, window, document, $, mw, OO, extraJs */
// <nowiki>
$.when(
// Resource loader modules
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.Title', 'ext.gadget.libExtraUtil']),
// Page ready
$.ready
).then(function() {
/* ========== تنظیمان ============================================================================ */
var config = {
// اطلاعات ابزار
script: {
advert: ' ([[کاربر:Jeeputer/moveToDraft.js|با کمک ابزار]])', // برای خلاصه ویرایش
version: '۲.۵.۱'
},
// مقدارهای تنظیمات مدیاویکی
mw: mw.config.get( [
'wgArticleId',
'wgCurRevisionId',
'wgPageName',
'wgUserGroups',
'wgUserName',
'wgMonthNames',
'wgNamespaceNumber',
'wgTitle'
] )
};
/* ========== API =============================================================================== */
var API = new mw.Api( {
ajax: {
headers: {
'Api-User-Agent': 'MoveToDraft/' + config.script.version +
' ( https://en.wikipedia.org/wiki/User:Evad37/MoveToDraft )'
}
}
} );
var moveToDraft = function moveToDraft() {
/* ========== تنظیمات بیشتر ================================================================= */
// رشتههای ویکیمتن
config.wikitext = {
'rationale': window.m2d_rationale || 'برای فضای نام اصلی [[وپ:پیشنویسی|آماده نیست]]، در فضای نام پیشنویس تکمیل شود',
'editsummary': window.m2d_editsummary || window.m2d_rationale || 'پیشنویس [[:en:WP:AFC|AFC]]',
'notification_heading': '[[پیشنویس:$1|$1]] به فضای نام پیشنویس منتقل شد',
'notification': window.m2d_notification || "مقالهای که اخیراً ایجاد کردهای، [[پیش نویس:$1|$1]]، بهشکلی که اکنون نوشتهشده، برای منتشر شدن مناسب نیست. این مقاله نیازمند ارجاع به [[وپ:معتبر|منابع معتبر]] و [[وپ:مستقل|مستقل]] است. <small>([[:en:WP:42|؟]])</small> اطلاعاتی که قابل ارجاعدادن نیستند، باید حذف شوند ([[وپ:تأییدپذیری|تأییدپذیری]] در ویکیپدیا از [[وپ:۵|اهمیت ویژهای]] برخوردار است). من پیشنویس شما را به [[ویکیپدیا:پیشنویسها|فضای پیشنویس]] منتقل کردم (با پیشوند \"<code>پیشنویس:</code>\" قبل از عنوان مقاله) تا بتوانید بدون مواجهه با مشکل، آن را تکمیل کنید. هرگاه احساس کردید که مقاله [[وپ:معس|رهنمود اصلی سرشناسی]] ویکیپدیا را احراز میکند، و در نتیجه برای انتقال به فضای نام اصلی آماده است، لطفاً روی دکمهٔ \"ثبت پیشنویس برای بازبینی!\"د بالای صفحه کلیک کنید. ~~~~",
'logMsg': '#[[$1]] در تاریخ ~~~~~ به [[$2]] انتقال یافت'
};
config.doNotLog = window.m2d_doNotLog ? true : false;
// دادههای صفحه -- برای دریافت متعاقب از api
config.pagedata = {};
// عملگرهای کمککننده
// - زیباسازی عنوان صفحه (یا دست کم جایگزینی خطها با فاصله)
var getPageText = function(p) {
var t = mw.Title.newFromText( decodeURIComponent(p) );
if (t) {
return t.getPrefixedText();
} else {
return p.replace(/_/g, " ");
}
};
/* ========== وظایف ============================================================================= */
// Grab page data - initial author, current wikitext, any redirects, if Draft: page already exists
var grabPageData = function() {
var patt_isRedirect = /^\s*#تغییرمسیر/i;
var checkedPageTriageStatus = false;
// Function to check if all done
var checkPageData = function() {
if (
config.pagedata.author != null &&
config.pagedata.oldwikitext != null &&
config.pagedata.redirects != null &&
checkedPageTriageStatus
) {
//all done - go to next screen
screen1();
}
};
/* ---------- Initial author ---------------------------------------------------------------- */
/* Try making an api call for just the first revision - but if that is a redirect, then get 'max'
number of revisions, and look for first non-redirect revision - use this as the initial author,
not the creator of the redirect.
*/
var processMaxRvAuthorQuery = function (result) {
var revisions = result.query.pages[config.mw.wgArticleId].revisions;
for ( var i=1; i<revisions.length; i++ ) {
if ( !patt_isRedirect.test(revisions[i]['*']) ) {
config.pagedata.author = revisions[i].user;
break;
}
}
//Check that we actually found an author (i.e. not all revisions were redirects
if ( config.pagedata.author == null ) {
API.abort();
var retry = confirm("ناتوان در بازیابی نگارندهٔ صفحه:\n"+extraJs.makeErrorMsg(c, r)+"\n\تلاش مجدد؟");
if ( retry ) {
screen0();
} else {
$("#M2D-modal").remove();
}
}
checkPageData();
};
var processAuthorQuery = function (result) {
// Check if page is currently a redirect
if ( result.query.pages[config.mw.wgArticleId].redirect ) {
API.abort();
alert("خطا: " + config.mw.wgPageName + " تغییرمسیر است");
return;
}
// Check if first revision is a redirect
rvwikitext = result.query.pages[config.mw.wgArticleId].revisions[0]['*'];
if ( patt_isRedirect.test(rvwikitext) ) {
// query to look for first non-redirect revision
API.get( {
action: 'query',
pageids: config.mw.wgArticleId,
prop: 'revisions',
rvprop: ['user', 'content'],
rvlimit: 'max',
rvdir: 'newer'
} )
.done( processMaxRvAuthorQuery )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
API.abort();
var retry = confirm("ناتوان در بازیابی نگارندهٔ صفحه:\n"+extraJs.makeErrorMsg(c, r)+"\n\nتلاش مجدد؟");
if ( retry ) {
screen0();
} else {
$("#M2D-modal").remove();
}
} );
return;
}
config.pagedata.author = result.query.pages[config.mw.wgArticleId].revisions[0].user;
checkPageData();
};
//Get author
API.get( {
action: 'query',
pageids: config.mw.wgArticleId,
prop: ['revisions', 'info'],
rvprop: ['user', 'content'],
rvlimit: 1,
rvdir: 'newer'
} )
.done( processAuthorQuery )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
API.abort();
var retry = confirm("ناتوان در بازیابی نگارندهٔ صفحه:\n"+extraJs.makeErrorMsg(c, r)+"\n\nتلاش مجدد؟");
if ( retry ) {
screen0();
} else {
$("#M2D-modal").remove();
}
} );
/* ---------- Current wikitext -------------------------------------------------------------- */
API.get( {
action: 'query',
pageids: config.mw.wgArticleId,
prop: 'revisions',
rvprop: 'content'
} )
.done( function(result) {
config.pagedata.oldwikitext = result.query.pages[config.mw.wgArticleId].revisions[0]['*'];
checkPageData();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
API.abort();
var retry = confirm("ناتوان در بازیابی ویکیمتن صفحه:\n"+ extraJs.makeErrorMsg(c, r)+"\n\nتلاش مجدد؟");
if ( retry ) {
screen0();
} else {
$("#M2D-modal").remove();
}
} );
//TODO(?): also get proposed Draft: page (to check if it is empty or not)
/* ---------- Redirects --------------------------------------------------------------------- */
var redirectTitles = [];
var processRedirectsQuery = function(result) {
if ( !result.query || !result.query.pages ) {
// No results
config.pagedata.redirects = false;
checkPageData();
return;
}
// Gather redirect titles into array
$.each(result.query.pages, function(_id, info) {
redirectTitles.push(info.title);
});
// Continue query if needed
if ( result.continue ) {
doRedirectsQuery($.extend(redirectsQuery, result.continue));
return;
}
// Check if redirects were found
if ( redirectTitles.length === 0 ) {
config.pagedata.redirects = false;
checkPageData();
return;
}
// Set redirects
config.pagedata.redirects = ( redirectTitles.length === 0 ) ? false : redirectTitles;
checkPageData();
};
var redirectsQuery = {
action: 'query',
pageids: config.mw.wgArticleId,
generator: 'redirects',
grdlimit: 500
};
var doRedirectsQuery = function(q) {
API.get( q )
.done( processRedirectsQuery )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
API.abort();
var retry = confirm("ناتوان در بازیابی تغییرمسیرها:\n" + extraJs.makeErrorMsg(c, r) +
"\n\nتلاش مجدد؟ (یا cancel برای چشمپوشی)");
if ( retry ) {
screen0();
} else {
config.pagedata.redirects = false;
checkPageData();
}
} );
};
doRedirectsQuery(redirectsQuery);
/* ---------- Review (Page Triage) status ----------------------------------------------------------------- */
API.get( {
action: 'pagetriagelist',
page_id: config.mw.wgArticleId
} )
.done( function(result) {
if ( !result.pagetriagelist.pages.length ) {
var keepGoing = confirm('هشدار: این صفحه هماکنون توسط یک گشتزن صفحههای تازه بازبینی شدهاست. از تبدیل این صفحه به پیشنویس مطمئن هستید؟');
if ( !keepGoing ) {
API.abort();
$("#M2D-modal").remove();
return;
}
}
checkedPageTriageStatus = true;
checkPageData();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
API.abort();
var retry = confirm("ناتوان در بازیابی وضعیت اولویتبندی صفحه:\n"+ extraJs.makeErrorMsg(c, r)+"\n\nتلاش مجدد؟");
if ( retry ) {
screen0();
} else {
$("#M2D-modal").remove();
}
} );
};
//Move page
var movePage = function() {
$("#M2D-task0").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status0").html("...");
// First check the page hasn't been draftified in the meantime
API.get({
action: "query",
pageids: config.mw.wgArticleId,
format: "json",
formatversion: "2"
}).then(function(response) {
var page = response && response.query && response.query.pages && response.query.pages[0];
if (!page) {
return $.Deferred().reject();
} else if (page.missing) {
return $.Deferred().reject("moveToDraft-pagemissing");
} else if (page.ns === 118 /* Draft NS */) {
return $.Deferred().reject("moveToDraft-alreadydraft");
} else if (page.ns !== config.mw.wgNamespaceNumber) {
return $.Deferred().reject("moveToDraft-movednamespace");
}
return API.postWithToken( 'csrf', {
action: 'move',
fromid: config.mw.wgArticleId,
to: config.inputdata.newTitle,
movetalk: 1,
noredirect: 1,
reason: config.inputdata.rationale + config.script.advert
} );
})
.done( function() {
if (
-1 === $.inArray('sysop', config.mw.wgUserGroups) &&
-1 === $.inArray('extendedmover', config.mw.wgUserGroups)
) {
// Newly created redirect to be tagged for speedy deletion
tagRedrect();
return;
}
$("#M2D-task0").css({"color":"#000", "font-weight":""});
$("#M2D-status0").html("انجام شد!");
getImageInfo();
} )
.fail( function(c,r) {
if ( r && r.textStatus === 'abort' ) {
return;
} else if (c === "moveToDraft-pagemissing") {
alert("بهنظر میرسد که صفحه دیگر موجود نیست. ممکن است که این صفحه حذف شدهباشد.");
$("#M2D-modal").remove();
window.location.reload();
return;
} else if (c === "moveToDraft-alreadydraft") {
alert("رها شد: این صفحه در حال حاضر به فضای نام پیشنویس منتقل شدهاست.");
$("#M2D-modal").remove();
window.location.reload();
return;
} else if (c === "moveToDraft-alreadydraft") {
alert("رها شد: این صفحه هماکنون از فضای نام اصلی به جای دیگری منتقل شدهاست.");
$("#M2D-modal").remove();
window.location.reload();
return;
}
var retry = confirm("ناتوان در انتقال صفحه:\n"+ extraJs.makeErrorMsg(c, r)+"\n\nتلاش مجدد؟");
if ( retry ) {
movePage();
} else {
screen1(true);
}
} );
};
var tagRedrect = function() {
$("#M2D-status0").html("انجام شد.<br/>در حال برچسبزدن تغییرمسیر برای حذف سریع...");
API.postWithToken( 'csrf', {
action: 'edit',
title: config.mw.wgPageName,
prependtext: '{{Db-r2}}\n',
summary: 'درخواست حذف سریع با معیار [[وپ:ت۲|ت۲]] (مقاله به فضای نام پیشنویس منتقل شد)' + config.script.advert
} )
.done( function() {
$("#M2D-task0").css({"color":"#000", "font-weight":""});
$("#M2D-status0").append(" انجام شد!");
getImageInfo();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در ارسال درخواست حذف سریع برای تغییرمسیر:\n"+
extraJs.makeErrorMsg(c, r) + "\n\nتلاش مجدد؟");
if ( retry ) {
tagRedrect();
} else {
$("#M2D-task0").css({"color":"#F00", "font-weight":""});
$("#M2D-status0").append(" چشمپوشی شد");
getImageInfo();
}
} );
};
//Find which images are non-free
var getImageInfo = function() {
$("#M2D-task1").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status1").html("...");
processImageInfo = function(result) {
var nonfreefiles = [];
if ( result && result.query ) {
$.each(result.query.pages, function(id, page) {
if ( id > 0 && page.categories ) {
nonfreefiles.push(page.title);
}
});
}
editWikitext(nonfreefiles);
};
API.get( {
action: 'query',
pageids: config.mw.wgArticleId,
generator: 'images',
gimlimit: 'max',
prop: 'categories',
cllimit: 'max',
clcategories: 'رده:محتویات غیر آزاد',
} )
.done( function(result){
$("#M2D-task1").css({"color":"#000", "font-weight":""});
$("#M2D-status1").html("انجام شد!");
processImageInfo(result);
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در بررسی محتوای غیرآزاد:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
getImageInfo();
} else {
$("#M2D-task1").css({"color":"#F00", "font-weight":""});
$("#M2D-status1").html("چشمپوشی شد");
editWikitext([]);
}
} );
};
//Comment out non-free files, turn categories into links, add afc draft template, list any redirects
var editWikitext = function(nonfreefiles) {
$("#M2D-task2").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status2").html("...");
var redirectsList = ( !config.pagedata.redirects ) ? '' : '\n'+
'<!-- نکته: صفحههای زیر پیش از انتقال به پیشنویس، به [[' + config.mw.wgPageName +
']] تغییرمسیر داشتند:\n' +
'*[[' + config.pagedata.redirects.join(']]\n*[[') + ']]\n-->\n';
var wikitext = "{{subst:AfC draft|" + config.inputdata.authorName + "}}\n" +
redirectsList +
config.pagedata.oldwikitext.replace(/\[\[\s*رده\s*:/g, "[[:رده:") +
"\n{{جا:پیشنویسهای منتقلشده از فضای نام اصلی}}";
// non-free files
// (derived from [[WP:XFDC]] - https://en.wikipedia.org/wiki/User:Evad37/XFDcloser.js )
if ( nonfreefiles.length > 0 ) {
// Start building regex strings
normal_regex_str = "(";
gallery_regex_str = "(";
free_regex_str = "(";
for ( var i=0; i<nonfreefiles.length; i++ ) {
// Take off namespace prefix
filename = nonfreefiles[i].replace(/^.*?:/, "");
// For regex matching: first character can be either upper or lower case, special
// characters need to be escaped, spaces can be either spaces or underscores
filename_regex_str = "[" + mw.util.escapeRegExp(filename.slice(0, 1).toUpperCase()) +
mw.util.escapeRegExp(filename.slice(0, 1).toLowerCase()) + "]" +
mw.util.escapeRegExp(filename.slice(1)).replace(/ /g, "[ _]");
// Add to regex strings
normal_regex_str += "\\[\\[\\s*(?:[Ii]mage|[Ff]ile|تصویر|پرونده)\\s*:\\s*" + filename_regex_str +
"\\s*\\|?.*?(?:(?:\\[\\[.*?\\]\\]).*?)*\\]\\]";
gallery_regex_str += "^\\s*(?:[Ii]mage|[Ff]ile|تصویر|پرونده):\\s*" + filename_regex_str + ".*?$";
free_regex_str += "\\|\\s*(?:[\\w\\s]+\\=)?\\s*(?:(?:[Ii]mage|[Ff]ile|تصویر|پرونده):\\s*)?" +
filename_regex_str;
if ( i+1 === nonfreefiles.length ) {
normal_regex_str += ")(?![^<]*?-->)";
gallery_regex_str += ")(?![^<]*?-->)";
free_regex_str += ")(?![^<]*?-->)";
} else {
normal_regex_str += "|";
gallery_regex_str += "|";
free_regex_str += "|";
}
}
// Check for normal file usage, i.e. [[File:Foobar.png|...]]
var normal_regex = new RegExp( normal_regex_str, "g");
wikitext = wikitext.replace(normal_regex, "<!-- مخفی شد: $1 -->");
// Check for gallery usage, i.e. instances that must start on a new line, eventually
// preceded with some space, and must include File: or Image: prefix
var gallery_regex = new RegExp( gallery_regex_str, "mg" );
wikitext = wikitext.replace(gallery_regex, "<!-- مخفی شد: $1 -->");
// Check for free usages, for example as template argument, might have the File: or Image:
// prefix excluded, but must be preceeded by an |
var free_regex = new RegExp( free_regex_str, "mg" );
wikitext = wikitext.replace(free_regex, "<!-- مخفی شد: $1 -->");
}
API.postWithToken( 'csrf', {
action: 'edit',
pageid: config.mw.wgArticleId,
text: wikitext,
summary: config.wikitext.editsummary + config.script.advert
} )
.done( function(){
$("#M2D-task2").css({"color":"#000", "font-weight":""});
$("#M2D-status2").html("انجام شد!");
notifyAuthor();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در ویرایش پیشنویس مقاله:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
editWikitext(nonfreefiles);
} else {
$("#M2D-task2").css({"color":"#F00", "font-weight":""});
$("#M2D-status2").html("چشمپوشی شد");
notifyAuthor();
}
} );
};
var notifyAuthor = function() {
if ( !config.inputdata.notifyEnable ) {
updateTalk();
return;
}
$("#M2D-task3").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status3").html("...");
API.postWithToken( 'csrf', {
action: 'edit',
title: 'بحث کاربر:' + config.inputdata.authorName,
section: 'new',
sectiontitle: config.inputdata.notifyMsgHead,
text: config.inputdata.notifyMsg,
} )
.done( function(){
$("#M2D-task3").css({"color":"#000", "font-weight":""});
$("#M2D-status3").html("انجام شد!");
updateTalk();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در ویرایش صفحهٔ بحث نگارنده:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
notifyAuthor();
} else {
$("#M2D-task3").css({"color":"#F00", "font-weight":""});
$("#M2D-status3").html("چشمپوشی شد");
updateTalk();
}
} );
};
var updateTalk = function() {
$("#M2D-task4").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status4").html("...");
//if page exists, do a regex search/repace for class/importances parameters
var processTalkWikitext = function(result) {
var talk_id = result.query.pageids[0];
if ( talk_id < 0 ) {
$("#M2D-task4").css({"color":"#000", "font-weight":""});
$("#M2D-status4").html("انجام شد (صفحهٔ بحث موجود نیست)");
draftifyLog();
return;
}
var old_talk_wikitext = result.query.pages[talk_id].revisions[0]['*'];
var new_talk_wikitext = old_talk_wikitext.replace(/(\|\s*(?:class|importance|کلاس|اهمیت)\s*=\s*)[^\|}]*(?=[^}]*}})/g, "$1");
if ( new_talk_wikitext === old_talk_wikitext ) {
$("#M2D-task4").css({"color":"#000", "font-weight":""});
$("#M2D-status4").html("انجام شد (نیاز به تغییر نیست)");
draftifyLog();
return;
}
API.postWithToken( 'csrf', {
action: 'edit',
pageid: talk_id,
section: '0',
text: new_talk_wikitext,
summary: 'حذف کلاس/اهمیت از برچسبهای ویکیپروژه' + config.script.advert
} )
.done( function(){
$("#M2D-task4").css({"color":"#000", "font-weight":""});
$("#M2D-status4").html("انجام شد!");
draftifyLog();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در ویرایش صفحهٔ بحث پیشنویس:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
updateTalk();
} else {
$("#M2D-task4").css({"color":"#F00", "font-weight":""});
$("#M2D-status4").html("چشمپوشی شد");
draftifyLog();
}
} );
};
//get talk page wikitext (section 0)
API.get( {
action: 'query',
titles: config.inputdata.newTitle.replace("پیشنویس:", "بحث پیشنویس:"),
prop: 'revisions',
rvprop: 'content',
rvsection: '0',
indexpageids: 1
} )
.done( processTalkWikitext )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در یافتن صفحهٔ بحث پیشنویس:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
updateTalk();
} else {
$("#M2D-task4").css({"color":"#F00", "font-weight":""});
$("#M2D-status4").html("چشمپوشی شد");
draftifyLog();
}
} );
};
var draftifyLog = function() {
if (config.doNotLog) {
$("#M2D-finished, #M2D-abort").toggle();
return;
}
$("#M2D-task5").css({"color":"#00F", "font-weight":"bold"});
$("#M2D-status5").html("...");
var wgMonthNames = ["", "ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"];
var logpage = 'کاربر:' + config.mw.wgUserName + '/سیاهه_انتقال_پیشنویس';
var monthNames = wgMonthNames.slice(1);
var now = new Date();
var heading = '== ' + monthNames[now.getUTCMonth()] + ' ' + now.getUTCFullYear().toLocaleString('fa', {useGrouping: false}) + ' ==';
var headingPatt = RegExp(heading);
var processLogWikitext = function(result) {
var logpage_wikitext = '';
var id = result.query.pageids[0];
if ( id < 0 ) {
var createlog = confirm('ثبت سیاهه انتقال به پیشنویس (در ' + logpage + ')؟');
if ( !createlog ) {
$("#M2D-task5").css({"color":"#F00", "font-weight":""});
$("#M2D-status5").empty().append("چشمپوشی شد");
$("#M2D-finished, #M2D-abort").toggle();
return;
}
logpage_wikitext = 'این صفحه سیاههای است از صفحههای منتقلشده به فضای پیشنویس با استفاده از اسکریپت [[کاربر:Jeeputer/moveToDraft|انتقال به پیشنویس]].';
} else {
logpage_wikitext = result.query.pages[id].revisions[0]['*'].trim();
}
if ( !headingPatt.test(logpage_wikitext) ) {
logpage_wikitext += '\n\n' + heading;
}
logpage_wikitext += '\n' + config.inputdata.logMsg;
API.postWithToken( 'csrf', {
action: 'edit',
title: logpage,
text: logpage_wikitext,
summary: 'ثبت [['+config.inputdata.newTitle+']]' + config.script.advert
} )
.done( function(){
$("#M2D-task5").css({"color":"#000", "font-weight":""});
$("#M2D-status5").html("انجام شد!");
$("#M2D-finished, #M2D-abort").toggle();
} )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در ویرایش صفحهٔ سیاهه:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
draftifyLog();
} else {
$("#M2D-task5").css({"color":"#F00", "font-weight":""});
$("#M2D-status5").html("چشمپوشی شد");
$("#M2D-finished, #M2D-abort").toggle();
}
} );
};
//get log page wikitext
API.get( {
action: 'query',
titles: logpage,
prop: 'revisions',
rvprop: 'content',
indexpageids: 1
} )
.done( processLogWikitext )
.fail( function(c,r) {
if ( r.textStatus === 'abort' ) { return; }
var retry = confirm("ناتوان در یافتن صفحهٔ سیاهه:\n"+ extraJs.makeErrorMsg(c, r)+"\n\n[Okay] برای تلاش مجدد، یا [Cancel] برای چشمپوشی");
if ( retry ) {
draftifyLog();
} else {
$("#M2D-task5").css({"color":"#F00", "font-weight":""});
$("#M2D-status5").html("چشمپوشی شد");
$("#M2D-finished, #M2D-abort").toggle();
}
} );
};
// --- Interface screens ---
//0) Initial screen
var screen0 = function() {
$("#M2D-interface-header, #M2D-interface-content, #M2D-interface-footer").empty();
$("#M2D-interface-header").text("انتقال به پیشنویس...");
$("#M2D-interface-content").text("در حال بارگذاری...");
grabPageData();
};
//1) User inputs
/**
*
* @param {boolean} restoreValues Restore previously set values
*/
var screen1 = function(restoreValues) {
$("#M2D-interface-header, #M2D-interface-content, #M2D-interface-footer").empty();
$("#M2D-interface-header").text("انتقال به پیشنویس: گزینهها");
$("#M2D-interface-content").append(
$('<div>').css('margin-bottom','0.5em').append(
$('<strong>')
.css({
display: 'block',
color: 'darkred'
}).append(
'لطفاً مطمئن شودی که انتقال به پیشنویس صحیح است مطابق است با ',
extraJs.makeLink("وپ:پیشنویسی")
),
$('<label>').attr('for','M2D-option-newtitle').append(
'انتقال به ',
$('<b>').text('پیشنویس:')
),
$('<input>').attr({'type':'text', 'name':'M2D-option-newtitle', 'id':'M2D-option-newtitle'})
),
$('<div>').css('margin-bottom','0.5em').append(
$('<label>').attr({'for':'M2D-option-movelog', 'id':'M2D-option-movelog-label'})
.css('display','block').text('دلیل انتقال (خلاصهٔ سیاهه):'),
$('<textarea>').attr({'rows':'1', 'name':'M2D-option-movelog', 'id':'M2D-option-movelog'})
.css('width','99%')
),
$('<div>').css('margin-bottom','0.5em').append(
$('<label>').attr({'for':'M2D-option-author', 'id':'M2D-option-author-label'}).text('نگارنده:'),
$('<input>').attr({'type':'text', 'name':'M2D-option-author', 'id':'M2D-option-author'})
),
$('<label>').attr({'for':'M2D-option-message-enable'}).append(
$('<input>').attr({'type':'checkbox', 'id':'M2D-option-message-enable'})
.prop('checked', true),
'آگاهسازی نگارنده'
),
$('<label>').attr({'for':'M2D-option-message-head', 'id':'M2D-option-message-head-label'})
.css({'display':'block', 'margin-top':'0.5em'}).text('عنوان پیام آگاهسازی'),
$('<textarea>').attr({'id':'M2D-option-message-head', 'rows':'1'})
.css({'width':'99%', 'margin-bottom':'0.5em'}),
$('<label>').attr({'for':'M2D-option-message', 'id':'M2D-option-message-label'})
.css('display','block').text('پیام آگاهسازی:'),
$('<textarea>').attr({'id':'M2D-option-message', 'rows':'6'})
.css('width','99%'),
$('<span>').attr({'display': 'block'}).css({'font-style': 'italic', 'color':'darkred'})
.text("لطفاً متن پیشفرض آگاهسازی را تکمیل یا جایگزین کنید تا نگارنده بهخوبی متوجه دلایل اختصاصی شما برای انتقال مقالهاش به پیشنویس بشود!")
);
$('#M2D-option-movelog').val(config.wikitext.rationale);
$('#M2D-option-newtitle').val(getPageText(config.mw.wgPageName)).change(function() {
$('#M2D-option-message-head').val(
$('#M2D-option-message-head').val().trim()
.replace(/\[\[پیشنویس\:.*?\|/, "[[پیشنویس:" + $('#M2D-option-newtitle').val().trim() + "|")
);
$('#M2D-option-message').val(
$('#M2D-option-message').val().trim()
.replace(/\[\[پیشنویس\:.*?\|/, "[[پیشنویس:" + $('#M2D-option-newtitle').val().trim() + "|")
);
});
$('#M2D-option-author').val(config.pagedata.author);
$('#M2D-option-message-enable').change(function() {
$('#M2D-option-message-head').prop('disabled', !this.checked);
$('#M2D-option-message').prop('disabled', !this.checked);
});
$('#M2D-option-message-head').val(config.wikitext.notification_heading.replace(/\$1/g, getPageText(config.mw.wgPageName)));
$('#M2D-option-message').val(config.wikitext.notification.replace(/\$1/g, getPageText(config.mw.wgPageName)));
$("#M2D-interface-footer").append(
$('<button>').attr('id', 'M2D-next').text('ادامه'),
$('<button>').attr('id', 'M2D-cancel').css('margin-right','3em').text('لغو')
);
$("#M2D-cancel").click(function(){
$("#M2D-modal").remove();
});
if (restoreValues) {
$('#M2D-option-movelog').val(config.inputdata.rationale);
$('#M2D-option-newtitle').val(config.inputdata.newTitle);
$('#M2D-option-author').val(config.inputdata.authorName);
$('#M2D-option-message-enable').prop('checked', config.inputdata.notifyEnable);
$('#M2D-option-message-head').val(config.inputdata.notifyMsgHead);
$('#M2D-option-message').val(config.inputdata.notifyMsg);
}
$("#M2D-next").click(function(){
//Gather inputs
config.inputdata = {
rationale: $('#M2D-option-movelog').val().trim(),
newTitle: "Draft:" + $('#M2D-option-newtitle').val().trim(),
authorName: $('#M2D-option-author').val().trim(),
notifyEnable: $('#M2D-option-message-enable').prop('checked'),
notifyMsgHead: $('#M2D-option-message-head').val().trim(),
notifyMsg: $('#M2D-option-message').val().trim()
};
config.inputdata.logMsg = config.wikitext.logMsg
.replace(/\$1/g, getPageText(config.mw.wgPageName))
.replace(/\$2/g, config.inputdata.newTitle);
//Verify inputs
var errors=[];
if ( config.inputdata.newTitle.length === 0 ) {
errors.push("عنوان پیشنویس نامعتبر است");
}
if ( config.inputdata.authorName.length === 0 ) {
errors.push("نام کاربر نامعتبر است");
}
if ( config.inputdata.rationale.length === 0 ) {
errors.push("دلیل انتقال ارائه نشدهاست");
}
if ( config.inputdata.notifyEnable ) {
if ( config.inputdata.notifyMsgHead.length === 0 ) {
errors.push("عنوان پیام آگاهسازی ارائه نشدهاست");
}
if ( config.inputdata.notifyMsg.length === 0 ) {
errors.push("پیام آگاهسازی ارائه نشدهاست");
}
}
if ( errors.length >= 1 ) {
alert("خطا:\n\n" + errors.join("؛\n"));
return;
}
//start process off
screen2();
});
};
//2) Progress indicators
var screen2 = function() {
$("#M2D-interface-header, #M2D-interface-content, #M2D-interface-footer").empty();
$("#M2D-interface-header").text("انتقال به پیشنویس: در حال انجام...");
$("#M2D-interface-content").append(
$('<ul>').attr('id', 'M2D-tasks').css("color", "#888").append(
$('<li>').attr('id', 'M2D-task0').append(
'انتقال صفحه... ',
$('<span>').attr('id','M2D-status0').text('در انتظار')
),
$('<li>').attr('id', 'M2D-task1').append(
'بررسی تصاویر... ',
$('<span>').attr('id','M2D-status1').text('در انتظار')
),
$('<li>').attr('id', 'M2D-task2').append(
'ویرایش ویکیمتن صفحه... ',
$('<span>').attr('id','M2D-status2').text('در انتظار')
),
config.inputdata.notifyEnable ?
$('<li>').attr('id', 'M2D-task3').append(
'آگاهسازی نگارنده... ',
$('<span>').attr('id','M2D-status3').text('در انتظار')
)
: '',
$('<li>').attr('id', 'M2D-task4').append(
'بروزرسانی برچسبهای صفحهٔ بحث... ',
$('<span>').attr('id','M2D-status4').text('در انتظار')
),
$('<li>').attr('id', 'M2D-task5').append(
'ثبت سیاهه... ',
config.doNotLog
? $('<span>').attr('font-size', '90%' ).text('غیرفعال')
: $('<span>').attr('id','M2D-status5').text('در انتظار')
)
)
);
$("#M2D-interface-footer").append(
$('<button>').attr('id', 'M2D-abort').text('لغو کارهای ناتمام'),
$('<span>').attr('id', 'M2D-finished').hide().append(
'تمام شد!',
$('<button>').attr('id', 'M2D-close').text('بستن')
)
);
$("#M2D-close").click( function(){
$("#M2D-modal").remove();
window.location.reload();
} );
$("M2D-abort").click( function(){
API.abort();
$("#M2D-modal").remove();
window.location.reload();
} );
//Start task 0. The rest are done sequentially as each task is completed (or skipped).
movePage();
};
// --- Add link to 'More' menu (or user-specified portlet) which starts everything ---
mw.util.addPortletLink( (window.m2d_portlet||'p-cactions'), '#', 'انتقال به پیشنویس', 'ca-m2d', null, null, "#ca-move");
$('#ca-m2d').on('click', function(e) {
e.preventDefault();
// Add interface shell
$('body').prepend('<div id="M2D-modal">'+
'<div id="M2D-interface">'+
'<h4 id="M2D-interface-header"></h4>'+
'<hr>'+
'<div id="M2D-interface-content"></div>'+
'<hr>'+
'<div id="M2D-interface-footer"></div>'+
'</div>'+
'</div>');
// Interface styling
$("#M2D-modal").css({
"position": "fixed",
"z-index": "1",
"right": "0",
"top": "0",
"width": "100%",
"height": "100%",
"overflow": "auto",
"background-color": "rgba(0,0,0,0.4)"
});
$("#M2D-interface").css({
"background-color": "#f0f0f0",
"margin": "15% auto",
"padding": "2px 20px",
"border": "1px solid #888",
"width": "80%",
"max-width": "60em",
"font-size": "90%"
});
$("#M2D-interface-content").css("min-height", "7em");
$("#M2D-interface-footor").css("min-height", "3em");
// Initial interface content
screen0();
});
// End of function moveToDraft
};
/* ========== Log draftifications for a user ==================================================== */
function logDraftifications(username, fromDate) {
var targetUser = username;
if (!targetUser && targetUser!=="") {
var pageNameParts = config.mw.wgPageName.split('/');
targetUser = (pageNameParts.length > 1) ? pageNameParts[1] : '';
}
$('#mw-content-text').empty();
// TODO: Form for setting user
var today = new Date().toISOString().slice(0,10);
var MoveToDraftEpoch = "2017-05-29";
$('#mw-content-text').append(
$(`<form id='draftifyLogForm' style='border: 1px solid #ccc; margin: 1em 0; padding: 0 0.5em;'>
<div style="display:inline-block;padding:0.5em">
<label for="draftifyUsername">کاربر:</label>
<input type="text" name="username" id="draftifyUsername" />
</div>
<div style="display:inline-block;padding:0.5em">
<label for="draftifyFromDate">از تاریخ (و زودتر)</label>
<input type="date" id="draftifyFromDate" name="fromDate" value="${fromDate || today}" />
</div>
<div style="display:inline-block;padding:0.5em">
<input type="submit" value="نمایش" />
</div>
</form>
`)
);
$('#draftifyUsername').val(targetUser);
$('#draftifyLogForm').on('submit', function(e) {
e.preventDefault();
$('#draftifyLog, #draftifyLogWikitext').show();
logDraftifications($('#draftifyUsername').val(), $('#draftifyFromDate').val());
});
$('#mw-content-text').append(
$(`<table id='draftifyLog' class='wikitable sortable' style='width:100%'>
<thead><tr>
<th scope='col'>از</th>
<th scope='col'>تا</th>
<th scope='col'>زمان</th>
<th scope='col'>کاربر</th>
<th scope='col'>دلیل</th>
</tr></thead>
<tbody></tbody>
<tfoot><tr>
<td colspan=5 id="draftifyStatus">بارگذاری...</td>
</tr></tfoot>
</table>
<textarea id="draftifyLogWikitext" disabled="disabled" rows="10">
`)
);
$('#draftifyLogWikitext').val(`{|class="wikitable"
|-
!scope='col'|از
!scope='col'|تا
!scope='col'|زمان
!scope='col'|کاربر
!scope='col'|دلیل
|}`);
var query = {
action: "query",
format: "json",
list: "logevents",
leprop: "title|timestamp|comment|details|user",
letype: "move",
lenamespace: "0",
lelimit: "500",
lestart: (fromDate || today) + "T23:59:59Z"
};
if (targetUser) {
query.leuser = targetUser;
}
var continueInfo = {};
function onLoadMoreClick(e) {
e.preventDefault();
$('#draftifyStatus').empty().text("بارگذاری...");
searchAndShowResults();
}
function parseLogTable(wikitext) {
API.post({
"action": "parse",
"format": "json",
"text": wikitext,
"prop": "text",
"contentmodel": "wikitext"
}).then(function(response) {
$parsedLogTable = $(response.parse.text['*']);
$('#draftifyLog tbody').empty().append(
$parsedLogTable.find('tr').slice(1)
);
});
}
function searchAndShowResults() {
API.get( $.extend({}, query, continueInfo) )
.then(function(response) {
// Store continuing info, if any
continueInfo = response.continue || {};
// Reset status, add a "Load more" if there are more results
$('#draftifyStatus').empty().append(
response.continue
? $('<a>').css("cursor", "pointer").text('بارگیری بیشتر').click(onLoadMoreClick)
: null
);
// Filter to only MoveToDraft script moves
var draftifyEvents = response.query && response.query.logevents && response.query.logevents.filter(function(logevent) {
return logevent.params.target_ns === 118; // Moved to Draft namespace
});
var noDraftifyEvents = !draftifyEvents || !draftifyEvents.length;
switch(true) {
case noDraftifyEvents && !response.continue:
$('#draftifyStatus').empty().text(
$('#draftifyLog tbody tr').length == 0 ? "بدون نتیجه" : "پایان نتایج"
);
break;
case noDraftifyEvents:
// Continue with next batch of results, otherwise table will initially have no results but a load more link,
// or clicking "Load more" will appear to show "Loading..." but not actually add any results
searchAndShowResults();
break;
case !response.continue:
$('#draftifyStatus').empty().text("پایان نتایج");
/* falls through */
default:
draftifyEvents.forEach(function(logevent) {
var fromTitle = logevent.title;
var toTitle = logevent.params.target_title;
var timeOfMove = new Date(logevent.timestamp).toLocaleString('fa-IR-u-ca-iso8601', {
year: 'numeric', month: 'long', day: 'numeric',
hour: '2-digit', minute: '2-digit',
timeZone: 'UTC', timeZoneName: 'short'
});
var user = logevent.user;
var comment = logevent.comment;
var wikitext = $('#draftifyLogWikitext').val().replace("|}", `|-
|[[${fromTitle}]]
|[[${toTitle}]]
|${timeOfMove}
|[[کاربر:${user}|${user}]]
|${comment}
|}`);
$('#draftifyLogWikitext').val(wikitext);
parseLogTable(wikitext);
});
}
});
}
// Run by default, unless page loaded without a /username suffix
if (username || username==="") {
searchAndShowResults();
} else {
$('#draftifyLog, #draftifyLogWikitext').hide();
}
// End of function logDraftifications
}
/* ========== Setup ============================================================================= */
// Access draftifications using Special:Draftify_log/USER_NAME
var isDraftifyLogPage = config.mw.wgPageName.indexOf("ویژه:Draftify_log") === 0;
var isUserPage = config.mw.wgNamespaceNumber === 2 || config.mw.wgNamespaceNumber === 3;
if (isDraftifyLogPage) {
document.title = "سیاهه انتقال به پیشنویس - ویکیپدیا";
$('h1').text("سیاهه انتقال به پیشنویس");
$('#mw-content-text').empty()
.text("بارگذاری...")
.before(
$('<span>').append(
'نکته: این صفحه تنها در صورتی که ابزار ',
$('<a>').attr('href','/wiki/کاربر:Jeeputer/moveToDraft').text('انتقال به پیشنویس'),
' را نصب کردهباشید، کار خواهد کرد.'
),
$('<hr>')
);
logDraftifications();
} else if (isUserPage) {
var user = config.mw.wgTitle.split('/')[0];
var url = mw.util.getUrl("ویژه:Draftify_log/" + user);
mw.util.addPortletLink( (window.m2d_portlet||'p-cactions'), url, 'سیاهه پیشنویسی', 'ca-m2dlog', null, null, "#ca-move");
}
// Only operate in article namespace
if( config.mw.wgNamespaceNumber !== 0 ) {
return;
}
// Only operate for existing pages
if ( config.mw.wgCurRevisionId === 0 ) {
return;
}
moveToDraft();
});
// </nowiki>