مدیاویکی:Gadget-AfD.js

از ایران پدیا
پرش به ناوبری پرش به جستجو

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
/*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.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: '',
    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.radioSelect = new OO.ui.RadioSelectWidget({
          items: [archiveOptions.radioDelete,
            archiveOptions.radioMerge,
            archiveOptions.radioKeep
          ]
        });
        archiveOptions.radioSelect.selectItem(archiveOptions.radioDelete);
        archiveOptions.textReason = new OO.ui.TextInputWidget({
          placeholder: 'متن جمع‌بندی را وارد کنید',
        });
        //archiveOptions.textReason.setRTL(true);
        archiveOptions.textMergeTarget = new OO.ui.TextInputWidget({
          id: 'textTargetMerge',
          placeholder: 'نام کامل صفحه',
        });
        //archiveOptions.textReason.setRTL(true);
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.radioSelect, {
          label: 'تصمیم',
          align: 'top'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.textReason, {
          label: 'جمع‌بندی:',
          align: 'top'
        }));
        fieldset.push(new OO.ui.FieldLayout(archiveOptions.textMergeTarget, {
          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();
          var debatePage = mw.config.get('wgPageName');
          var page_title = mw.config.get('wgPageName');
          page_title = page_title.replace("ویکی‌پدیا:نظرخواهی_برای_حذف/", "").replace(/_\(بار_.+\)$/, "");
          var talkPrefix = 'بحث:';
          if (page_title.search(/کاربر:|الگو:|رده:|ویکی‌پدیا:|درگاه:|راهنما:/) > -1) {
            talkPrefix = 'بحث ';
          }
          if (page_title.search(/^بحث/) > -1) {
            talkPrefix = false;
          }
          return new OO.ui.Process(function() {
            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.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);
            } else {
              if (archiveOptions.radioMerge.isSelected()) {
                var targetPage = archiveOptions.textMergeTarget.getValue();
                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.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('editToken')
      }).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);
      });
    },
    closePage: function(text) {
      text = text.replace('/<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.reason + ' ~~' + '~~'
      mw.notify('بایگانی به‌روز شد.');
      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() {
          //window.location = mw.util.getUrl(page) + '?action=purge';
        });
      });
    },
    deletePageRefresh: function(page, summary) {
      archiveOptions.getDeleteToken(function(token) {
        archiveOptions.deletePage(page, summary, token, archiveOptions.protectPageRefresh);
      });
    },
    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) {
          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);