مدیاویکی:Gadget-AfD.js: تفاوت میان نسخه‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
=== تقریباً همیشه بهتر است
هماهنگ‌سازی با عنوان (نامزدی دوم) ایجاد شده توسط توینکل، گزارش و رفع به کمک کاربر:Jeeputer
خط ۱۴۰: خط ۱۴۰:
var debatePage = mw.config.get('wgPageName');
var debatePage = mw.config.get('wgPageName');
var page_title = mw.config.get('wgPageName');
var page_title = mw.config.get('wgPageName');
page_title = page_title.replace("ویکی‌پدیا:نظرخواهی_برای_حذف/", "").replace(/_\(بار_.+\)$/, "");
page_title = page_title.replace("ویکی‌پدیا:نظرخواهی_برای_حذف/", "")
.replace(/_\(بار_[^\)]+?\)$/, "").replace(/_\([^\)]+?_نامزدی\)$/, "");
var talkPrefix = 'بحث:';
var talkPrefix = 'بحث:';
if (page_title.search(/کاربر:|الگو:|رده:|ویکی‌پدیا:|درگاه:|راهنما:/) > -1) {
if (page_title.search(/کاربر:|الگو:|رده:|ویکی‌پدیا:|درگاه:|راهنما:/) > -1) {

نسخهٔ ‏۷ مهٔ ۲۰۲۱، ساعت ۱۱:۱۸

/*global jQuery, mediaWiki */
(function($, mw) {
  'use strict';
  var windowManager;
  var archiveAfD;
  var archiveOptions = {
    install: function() {
      if (mw.config.get('wgAction') === 'view' &&
        ( (mw.config.get('wgPageName').search("ویکی‌پدیا:نظرخواهی_برای_حذف/") > -1) ||
        (mw.config.get('wgPageName').search("ویکی‌پدیا:نظرخواهی_برای_حذف_متفرقه/") > -1) )
      ) {
        $(mw.util.addPortletLink('p-views', '#ca-afd', 'جمع‌بندی', 'ca-afd', 'ابزار مدیریت نبح')).click(function(e) {
          mw.loader.using(['oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows']).done(archiveOptions.createWindow);
          e.preventDefault();
        }).insertBefore('#ca-view');
        // Late pre-loading
        mw.loader.load(['oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows']);
      }
    },
    reason: '',
    shortReason: '',
    createWindow: function() {
      function ArchiveAfD(config) {
        ArchiveAfD.super.call(this, config);
      }
      OO.inheritClass(ArchiveAfD, OO.ui.ProcessDialog);
      ArchiveAfD.static.name = 'AfD dialog';
      ArchiveAfD.static.title = 'مدیریت نظرخواهی حذف';
      ArchiveAfD.static.actions = [{
        action: 'archive',
        label: 'ثبت',
        flags: 'primary'
      }, {
        label: 'لغو',
        flags: 'safe'
      }];
      ArchiveAfD.prototype.initialize = function() {
        var fieldset = [];
        ArchiveAfD.super.prototype.initialize.apply(this, arguments);
        this.panel = new OO.ui.PanelLayout({
          padded: true,
          expanded: false
        });
        this.content = new OO.ui.FieldsetLayout();
        archiveOptions.radioDelete = new OO.ui.RadioOptionWidget({
          id: 'radioDelete',
          label: 'حذف شود',
        });
        archiveOptions.radioMerge = new OO.ui.RadioOptionWidget({
          id: 'radioMerge',
          label: 'ادغام شود',
        });
        archiveOptions.radioKeep = new OO.ui.RadioOptionWidget({
          id: 'radioKeep',
          label: 'بماند',
        });
        archiveOptions.radioExtend = new OO.ui.RadioOptionWidget({
          id: 'radioExtend',
          label: 'تمدید نظرخواهی',
        });
        archiveOptions.radioSelect = new OO.ui.RadioSelectWidget({
          items: [archiveOptions.radioDelete,
            archiveOptions.radioMerge,
            archiveOptions.radioKeep,
            archiveOptions.radioExtend
          ]
        });
        archiveOptions.radioSelect.selectItem(archiveOptions.radioKeep);
        archiveOptions.radioSelect.on('select', function(){
          if (archiveOptions.radioDelete.isSelected()) {
            archiveOptions.switchProtect.setDisabled(false);
          } else {
            archiveOptions.switchProtect.setDisabled(true);
          }
          if (archiveOptions.radioMerge.isSelected()) {
            archiveOptions.textMergeTarget.setDisabled(false);
          } else {
            archiveOptions.textMergeTarget.setDisabled(true);
            if (archiveOptions.radioExtend.isSelected()) {
              archiveOptions.comboCommonReason.setDisabled(true);
            } else {
              archiveOptions.comboCommonReason.setDisabled(false);
            }
          }
        });
        archiveOptions.comboCommonReason = new OO.ui.ComboBoxInputWidget({
          options: [{data:'[[وپ:حذف/نبح|اجماعی برای حذف حاصل نشد.]]'},
            {data:'[[وپ:سرشناسی|سرشناسی موضوع]] احراز نشد.'},
            {data:'حذف سریع شده‌است.'},
            {data:'[[وپ:حذف نرم|حذف نرم]] (در نبود مشارکت کافی)'},
            {data:'کاربران بر حذف صفحه اجماع دارند'},
            {data:'کاربران بر ماندن صفحه اجماع دارند'},
            {data:'[[ویکی‌پدیا:ماندن سریع|انصراف نامزدکننده]]'},
            {data:'بر پایه [[وپ:برف]] نظرخواهی جمع‌بندی شد.'},
          ]
        });
        archiveOptions.textReason = new OO.ui.TextInputWidget({
          placeholder: 'متن جمع‌بندی را وارد کنید',
        });
        archiveOptions.textMergeTarget = new OO.ui.TextInputWidget({
          id: 'textTargetMerge',
          placeholder: 'نام کامل صفحه',
          disabled: true
        });
        archiveOptions.switchProtect = new OO.ui.ToggleSwitchWidget({
          id: 'switchProtect',
          disabled: true
        });
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.radioSelect, {
          label: 'تصمیم شما:',
          align: 'top'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.comboCommonReason, {
          label: 'دلایل مرسوم:',
          align: 'inline'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.textReason, {
          label: 'توضیح (اختیاری):',
          align: 'top'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.textMergeTarget, {
          label: 'ادغام با:',
          align: 'top'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.switchProtect, {
          label: 'صفحه پس از حذف محافظت شود',
          align: top
        }));
        this.content.addItems(fieldset);
        this.panel.$element.append(this.content.$element);
        this.$body.append(this.panel.$element);
      };
      ArchiveAfD.prototype.getActionProcess = function(action) {
        var dialog = this;
        if (action === 'archive') {
          archiveOptions.reason = archiveOptions.textReason.getValue();
          if (archiveOptions.comboCommonReason.getValue()) {
                archiveOptions.reason = archiveOptions.comboCommonReason.getValue()+' '+archiveOptions.reason
          }
          var debatePage = mw.config.get('wgPageName');
          var page_title = mw.config.get('wgPageName');
          page_title = page_title.replace("ویکی‌پدیا:نظرخواهی_برای_حذف/", "")
              .replace(/_\(بار_[^\)]+?\)$/, "").replace(/_\([^\)]+?_نامزدی\)$/, "");
          var talkPrefix = 'بحث:';
          if (page_title.search(/کاربر:|الگو:|رده:|ویکی‌پدیا:|درگاه:|راهنما:/) > -1) {
            talkPrefix = 'بحث ';
          }
          if (page_title.search(/^بحث/) > -1) {
            talkPrefix = false;
          }
          return new OO.ui.Process(function() {
          	// Warn the user if they try to leave the page before we are done
      		$(window).bind('beforeunload', function(){
				return 'Archiving has not completed. Please do not leave the page yet.';
			});
			if (archiveOptions.radioExtend.isSelected()) {
			  // Update subject page
              summary = 'تمدید نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])';
              archiveOptions.loadSavePageRefresh(debatePage, archiveOptions.extendPage, summary);
			} else {
              var summary = '';
              archiveOptions.checkRedirect(page_title);
              // Remove page from WP:AfD
              summary =  'حذف [[' + debatePage.replace(/\_/g, ' ') + ']] از [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ';
              archiveOptions.loadSavePageRefresh('ویکی‌پدیا:نظرخواهی_برای_حذف', archiveOptions.removeLink, summary);
              if (archiveOptions.radioDelete.isSelected()) {
                archiveOptions.shortReason = 'حذف شود. ';
                archiveOptions.reason = 'حذف شود. ' + archiveOptions.reason;
                // Update AfD page
                summary = 'بستن نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])';
                archiveOptions.loadSavePageRefresh(debatePage, archiveOptions.closePage, summary);
                // Update AfD archives
                archiveOptions.creationDate(debatePage, function(archlink) {
                  archiveOptions.archiveMonth(archlink, function(month) {
                    summary =  'بایگانی نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ';
                    archiveOptions.loadSavePageRefresh('ویکی‌پدیا:نظرخواهی_برای_حذف/بایگانی/' + month, archiveOptions.archivePage, summary);
                  })
                });
                // Delete the page
                var summary = 'حذف صفحه بر اساس [[' + debatePage + '|نظرخواهی برای حذف]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])';
                archiveOptions.deletePageRefresh(page_title, summary, archiveOptions.switchProtect.getValue());
              } else {
                if (archiveOptions.radioMerge.isSelected()) {
                  var targetPage = archiveOptions.textMergeTarget.getValue();
                  archiveOptions.shortReason = 'ادغام شود با [[' + targetPage + ']]. ';
                  archiveOptions.reason = 'ادغام شود با [[' + targetPage + ']]. ' + archiveOptions.reason;
                  // Mention the old AfD on the talk page
                  summary =  'افزودن [[الگو:پیشینه حذف]] به بحث صفحه ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ';
                  if (talkPrefix) {
                    archiveOptions.loadSavePageRefresh(talkPrefix + page_title, archiveOptions.closeTalkPage, summary);
                  }
                  // Update AfD page
                  summary = 'بستن نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])';
                  archiveOptions.loadSavePageRefresh(debatePage, archiveOptions.closePage, summary);
                  // Update AfD archives
                  archiveOptions.creationDate(debatePage, function(archlink) {
                    archiveOptions.archiveMonth(archlink, function(month) {
                      summary = 'بایگانی نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ' ;
                      archiveOptions.loadSavePageRefresh('ویکی‌پدیا:نظرخواهی_برای_حذف/بایگانی/' + month, archiveOptions.archivePage, summary);
                    })
                  });
                  // Update subject page
                  summary =  'حذف [[الگو:پیشنهاد حذف]] از صفحه ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ' ;
                  archiveOptions.loadSavePageRefresh(page_title, function(text) {
                    text = archiveOptions.removeTemplate(text);
                    text = '{{اجماع ادغام|' + targetPage + '}}\n' + text;
                    return text
                  }, summary);
                } else {
                	archiveOptions.shortReason = 'بماند. ';
                  archiveOptions.reason = 'بماند. ' + archiveOptions.reason;
                  // Mention the old AfD on the talk page
                  if (talkPrefix) {
                    summary = 'افزودن [[الگو:پیشینه حذف]] به بحث صفحه ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ' ;
                    archiveOptions.loadSavePageRefresh(talkPrefix + page_title, archiveOptions.closeTalkPage, summary);
                  }
                  // Update AfD page
                  summary = 'بستن نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])';
                  archiveOptions.loadSavePageRefresh(debatePage, archiveOptions.closePage, summary);
                  // Update AfD archives
                  archiveOptions.creationDate(debatePage, function(archlink) {
                    archiveOptions.archiveMonth(archlink, function(month) {
                      summary = 'بایگانی نظرخواهی [[وپ:نبح]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ' ;
                      archiveOptions.loadSavePageRefresh('ویکی‌پدیا:نظرخواهی_برای_حذف/بایگانی/' + month, archiveOptions.archivePage, summary);
                    })
                  });
                  // Update subject page
                  summary = 'حذف [[الگو:پیشنهاد حذف]] از صفحه ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]]): ' ;
                  archiveOptions.loadSavePageRefresh(page_title, archiveOptions.removeTemplate, summary);
                }
              }
			}
            dialog.close({
              action: action
            }).done(function() {
              // TODO: Refresh the AfD page after all actions are complete
            });
          });
        }
        return ArchiveAfD.super.prototype.getActionProcess.call(this, action);
      };
      if (!windowManager) {
        windowManager = new OO.ui.WindowManager();
        $('body').append(windowManager.$element);
      }
      if (!archiveAfD) {
        archiveAfD = new ArchiveAfD({
          size: 'medium'
        });
        windowManager.addWindows([archiveAfD]);
      }
      windowManager.openWindow(archiveAfD);
    },
    convertYearToFarsi: function(year) {
      var i = 0;
      for (i = 0; i <= 9; i = i + 1) {
        year = year.replace(new RegExp('[' + '0123456789' [
          i
        ] + ']', 'g'), '۰۱۲۳۴۵۶۷۸۹' [i]);
      }
      return year
    },
    convertMonthToFarsi: function(month) {
      switch (month) {
        case 'January':
          return 'ژانویه';
          break;
        case 'February':
          return 'فوریه';
          break;
        case 'March':
          return 'مارس';
          break;
        case 'April':
          return 'آوریل';
          break;
        case 'May':
          return 'مه';
          break;
        case 'June':
          return 'ژوئن';
          break;
        case 'July':
          return 'ژوئیه';
          break;
        case 'August':
          return 'اوت';
          break;
        case 'September':
          return 'سپتامبر';
          break;
        case 'October':
          return 'اکتبر';
          break;
        case 'November':
          return 'نوامبر';
          break;
        case 'December':
          return 'دسامبر';
          break;
      }
    },
    checkRedirect: function(ar_title) {
      var params = {
        action: "query",
        prop: "info",
        titles: ar_title,
        format: "json"
      };
      mw.loader.using('mediawiki.api', function() {
        (new mw.Api()).get(params).done(function(data) {
          if ("redirect" in data["query"]
            ["pages"][Object.keys(data["query"]["pages"])]) {
            mw.notify("صفحهٔ موضوع نظرخواهی منتقل شده‌است. حواستان باشد که دستی درست کنید!", {
              type: 'error'
            });
          }
        });
      });
    },
    creationDate: function(title, callback) {
      mw.loader.using('mediawiki.api', function() {
        (new mw.Api()).get({
          action: 'query',
          prop: 'revisions',
          titles: title,
          rvprop: 'timestamp',
          rvdir: 'newer',
          format: 'json',
          rvlimit: '1',
        }).done(function(data) {
          var timestamp = data["query"]["pages"][Object.keys(data["query"]
              ["pages"])]["revisions"]
            [0]["timestamp"];
          callback(timestamp);
        });
      });
    },
    archiveMonth: function(timestamp, callback) {
      var crDate = new Date(timestamp);
      var archiveMonthLink = archiveOptions.convertMonthToFarsi(crDate.getUTCMonthName()) + ' ' + archiveOptions.convertYearToFarsi(String(crDate.getUTCFullYear()));
      callback(archiveMonthLink);
    },
    loadPage: function(title, callback) {
      (new mw.Api()).get({
        action: 'query',
        prop: 'revisions',
        titles: title,
        rvprop: 'content',
        format: 'json'
      }).done(function(data) {
        try {
          callback($.map(data.query.pages, function(value) {
            return value;
          })[0].revisions[0]['*']);
        } catch (exception) {
          callback('');
        }
      }).fail(function(data) {
        callback($.map(data.query.pages, function(value) {
          return value;
        })[0].revisions[0]);
      });
    },
    protectPageRefresh: function(page, summary) {
      archiveOptions.getProtectToken(function(token) {
        archiveOptions.protectPage(page, summary, token);
      });
    },
    getProtectToken: function(callback) {
      (new mw.Api()).post({
        action: 'tokens',
        type: 'protect'
      }).done(function(data) {
        if (data.error && data.error.info) {
          mw.notify(data.error.info, {
            type: 'error'
          });
        } else {
          callback(data.tokens.protecttoken);
        }
      }).fail(function(data) {
        mw.notify(data);
      });
    },
    protectPage: function(title, summary, token) {
      (new mw.Api()).post({
        action: 'protect',
        title: title,
        reason: summary,
        token: token,
        protections: 'create=sysop',
        expiry: '1 year',
      }).done(function(data) {
        if (data.error && data.error.info) {
          mw.notify(data.error.info, {
            type: 'error'
          });
        } else {
          mw.notify('مقاله محافظت شد!');
        }
      }).fail(function(data) {
        mw.notify(data);
      });
    },
    savePage: function(title, text, summary, callback) {
      (new mw.Api()).post({
        action: 'edit',
        title: title,
        text: text,
        summary: summary,
        minor: '',
        token: mw.user.tokens.get('csrfToken')
      }).done(function(data) {
        if (data.error && data.error.info) {
          if (data.error.info === 'missingtitle') {
            mw.notify('صفحه ' + title + ' موجود نیست!', {
              type: 'error'
            });
          } else {
            mw.notify(data.error.info, {
              type: 'error'
            });
          }
        } else {
          callback();
        }
      }).fail(function(data) {
        mw.notify(data);
      });
    },
    extendPage: function(text) {
      text = text + "\n{{جا:تمدید حذف" + "|" + archiveOptions.textReason.getValue() + "}}";
      $(window).off('beforeunload');
      return text;
    },
    closePage: function(text) {
      text = text.replace(new RegExp('<noinclude' + '>\\{\\{\(?:این الگو را زمان بستن نبح حذف کن\|REMOVE THIS TEMPLATE WHEN CLOSING THIS AfD\)\\|\.+?\\}\\}<\\/noinclude' +
        '>\\n?', 'g'), '');
      text = '{{آغاز بایگانی حذف}}\n\n' + archiveOptions.reason + '\n~~' + '~~\n' + text + '\n{{پایان بایگانی حذف}}';
      mw.notify('نظرخواهی بسته شد!');
      return text;
    },
    closeTalkPage: function(text) {
      var page_name = mw.config.get("wgPageName");
      text = '{{پیشینه حذف| تاریخ =~~' + '~~' + '~| نتیجه =' + archiveOptions.reason + ' | صفحه =' + page_name.replace(/\_/g, ' ') + ' |کوچک=}}\n\n' + text;
      text = text.replace("صفحه =ویکی‌پدیا:نظرخواهی برای حذف/", "صفحه =")
      mw.notify('الگو پیشینه حذف به بحث صفحه افزوده شد!');
      return text;
    },
    archivePage: function(text) {
      var pagelink = mw.config.get("wgPageName");
      text = text + '\n# [[' + pagelink.replace(/\_/g, ' ') + ']] -- ' + archiveOptions.shortReason + ' ~~' + '~~'
      mw.notify('بایگانی به‌روز شد.');
      // Let the user close the tab without a warning
      $(window).off('beforeunload');
      return text;
    },
    removeLink: function(text) {
      var pagelink = mw.config.get("wgPageName");
      var text2 = text;
      pagelink = pagelink.replace(/\_/g, ' ');
      text = text.replace('{{' + pagelink + '}}\n', '')
      if (text2 === text) {
        mw.notify('توجه:برداشتن نظرخواهی از وپ:نبح با خطا مواجه شد!', {
          type: 'error'
        })
      } else {
        mw.notify('نظرخواهی از وپ:نبح برداشته شد!')
      }
      return text;
    },
    removeTemplate: function(text) {
      var text2 = text;
      text = text.replace(/(\<!--(.+?)--\>\n*|)\{\{(نظرخواهی برای حذف|پیشنهاد حذف\s?۲)(.+?|)\}\}(\n*\<!--(.+?)--\>|)(\n*\<!--(.+?)--\>|)/g, '');
      text = text.replace(/\<!-- قبلاً پیشنهاد حذف داده شده‌است(.+?)--\>/g, '');
      text = text.replace(/\<noinclude\>\n\<\/noinclude\>/g, '');
      if (text2 === text) {
        mw.notify('توجه:برداشتن الگو از مقاله با مشکل مواجه شد!', {
          type: 'error'
        });
      } else {
        mw.notify('الگو پیشنهاد حذف از صفحه برداشته شد!');
      }
      text = text.trim()
      return text;
    },
    loadSavePageRefresh: function(page, replaceCallback, summary) {
      archiveOptions.loadPage(page, function(text) {
        archiveOptions.savePage(page, replaceCallback(text), summary, function() {
          setTimeout(function() {
          	location.reload();
          }, 2000);
        });
      });
    },
    deletePageRefresh: function(page, summary, protect) {
      archiveOptions.getDeleteToken(function(token) {
      	if (protect === true) {
          archiveOptions.deletePage(page, summary, token, archiveOptions.protectPageRefresh);
      	} else {
      	  archiveOptions.deletePage(page, summary, token, function(){});
      	}
      });
    },
    getDeleteToken: function(callback) {
      (new mw.Api()).post({
        action: 'tokens',
        type: 'delete'
      }).done(function(data) {
        if (data.error && data.error.info) {
          mw.notify(data.error.info, {
            type: 'error'
          });
        } else {
          callback(data.tokens.deletetoken);
        }
      }).fail(function(data) {
        mw.notify(data);
      });
    },
    deletePage: function(title, summary, token, callback) {
      (new mw.Api()).post({
        action: 'delete',
        title: title,
        reason: summary,
        token: token,
      }).done(function(data) {
        if (data.error && data.error.info) {
          if (data.error.info === 'missingtitle') {
          	mw.notify('صفحه ' + title + ' موجود نیست!', {
              type: 'error'
            });
          } else {
          	mw.notify(data.error.info, {
              type: 'error'
            });
          }
        } else {
          mw.notify('مقاله حذف شد!');
          callback(title, 'محافظت صفحه بر اساس [[ویکی‌پدیا:نظرخواهی_برای_حذف/' + title +
            '|نظرخواهی برای حذف]] ([[مدیاویکی:Gadget-AfD.js|ابزار جمع‌بندی]])');
        }
      }).fail(function(data) {
        mw.notify(data);
      });
      if (title.search(/کاربر:|الگو:|رده:|ویکی‌پدیا:|درگاه:|راهنما:/) > -1) {
        var TalkLink = 'بحث ' + title;
      } else {
        var TalkLink = 'بحث:' + title;
      }
      (new mw.Api()).post({
        action: 'delete',
        title: TalkLink,
        reason: summary,
        token: token,
      }).done(function(data) {
        if (data.error && data.error.info) {
          mw.notify(data.error.info, {
            type: 'error'
          });
        } else {
          mw.notify('بحث مقاله حذف شد!');
        }
      }).fail(function(data) {
        mw.notify(data);
      });
    },
  };
  if (mw.config.get('wgNamespaceNumber') >= 0) {
    $(archiveOptions.install);
  }
})(jQuery, mediaWiki);