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

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

/*global jQuery, mediaWiki */
(function($, mw) {
	'use strict';
	var archivePage;
	var OneClickArchiver = {
		install: function(){
			OneClickArchiver.getArchiveConfig(OneClickArchiver.enable);
		},
		getArchiveConfig: function(callback){
			OneClickArchiver.loadPage(mw.config.get('wgPageName'), function(pageText){
				var archiveConfig = {};
				var confTemplate = pageText.match(/\{\{(User|کاربر):Dexbot\/Archivebot\s*?\n(\|.+\n)+\}\}/i);
				if (confTemplate === null) {
					archiveConfig.counter = 1;
					archiveConfig.base = mw.config.get('wgPageName') + '/بایگانی';
				} else {
					confTemplate = confTemplate[0];
					if (confTemplate.search(/\| ?counter ?= ?(\d+|[۰-۹]+)/) > -1) {
						archiveConfig.counter = mw.language.convertNumber(confTemplate.match(/\| ?counter ?= ?(\d+|[۰-۹]+)/)[1], true);
					}
					if (confTemplate.search(/\| ?archive ?= ?(.+)%\(counter\)s/) > -1) {
						archiveConfig.base = confTemplate.match(/\| ?archive ?= ?(.+)%\(counter\)s/)[1].trim();
					}
				}
				if (archiveConfig.counter === undefined | archiveConfig.base === undefined ) {
					if (mw.config.get('wgPageName') === 'ویکی‌پدیا:تابلوی_اعلانات_مدیران') {
						var now = new Date();
						var month_en = now.toLocaleDateString('en', {month: 'long'}).toLowerCase();
						var month = mw.msg(month_en);
						var year = mw.language.convertNumber(now.getFullYear()).replace('٬', '');
						archivePage = mw.config.get('wgPageName') + '/' + month + ' ' + year;
					} else {
						console.log('Warning: OneClickArchiver cannot determine archive page!');
						return;
					}
				} else {
					archivePage = archiveConfig.base + ' ' + mw.language.convertNumber(archiveConfig.counter);
				}
				callback();
			});
		},
		enable: function() {
			$('h2 .mw-editsection').each(function(){
				var href = $(this).find('a').first().attr('href');
				var span = $('<span>',{
					class: 'mw-archivesection'
				}).insertAfter(this);
				span.append($('<span>', {
                    class: 'mw-editsection-bracket',
                    text: '['
                }));
                span.append($('<a>', {
                    href: '#',
                    title: 'انتقال این بخش به زیرصفحهٔ بایگانی',
                    style: 'font-size: smaller;',
                    text: 'بایگانی',
                }).click(function(e) {
                    e.preventDefault();
                    mw.loader.using(['oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows']).done(function() {
                        OneClickArchiver.processRequest(href);
                    });
                }));
                span.append($('<span>', {
                    class: 'mw-editsection-bracket',
                    text: ']'
                }));
			});
		},
		processRequest: function(href) {
			OneClickArchiver.pageExists(
				archivePage,
				function() {
					var m = href.match(/section=(\d+)/);
					if (m && m.length == 2) {
						var sectionId = m[1];
						OneClickArchiver.loadPageSection(
							mw.config.get('wgPageName'),
							sectionId,
							function(sectionText) {
								window.sectionText = sectionText;
								if (mw.config.get('wgNamespaceNumber') !== 4 ||
									sectionText.search(/==[^=]+==\n+\{\{(بسته|بالای بسته|بالای بایگانی)/) > -1
								) {
									OneClickArchiver.doArchive(sectionId, sectionText);
								} else {
									mw.notify('این بخش هنوز جمع‌بندی نشده‌است! برای بایگانی اول بخش را جمع‌بندی کنید.');
								}
							}
						);
					}
				},
				function() {
					mw.notify('صفحهٔ مقصد بایگانی وجود ندارد: ' + archivePage);
				}
			);
		},
		doArchive: function(sectionId, sectionText){
			if (confirm('آیا مطمئنید که می‌خواهید این بخش در ' + archivePage.replace('_', ' ') + ' بایگانی شود؟') === false ) {
				return;
			}
			mw.notify('بایگانی بخش در ' + archivePage + ' ...');
			OneClickArchiver.savePageSection(
				archivePage,
				'new',
				sectionText,
				null,
				function() {
					mw.notify('برداشتن بخش از ' + mw.config.get('wgPageName').replace(/\_/g, ' ') + ' ...');
					OneClickArchiver.savePageSection(
						mw.config.get('wgPageName'),
						sectionId,
						'',
						'بایگانی نیمه‌خودکار در [[' + archivePage + ']] (بایگانی نیمه‌خودکار)',
						function(){
							mw.notify('بایگانی کامل شد! بارگیری صفحه از نو ...');
							setTimeout(function(){
								location.href = mw.util.getUrl(mw.config.get('wgPageName'));
							}, 1000);
						}
					);
				}
			);
		},
		pageExists: function(title, callback, fallback) {
			(new mw.Api()).get({
				action: 'query',
				prop: 'info',
				titles: title,
				format: 'json'
			}).done(function(data) {
				if (Object.keys(data.query.pages)[0] == "-1") {
					fallback();
				} else {
					callback();
				}
			});
		},
		loadPage: function(title, callback) {
			(new mw.Api()).get({
				action: 'query',
				prop: 'revisions',
				titles: title,
				rvprop: 'content',
				format: 'json'
			}).done(function(data) {
				callback($.map(data.query.pages, function(value) {
					return value;
				})[0].revisions[0]['*']);
			}).fail(function(data) {
				mw.notify(data);
			});
		},
		loadPageSection: function(title, section, callback) {
			(new mw.Api()).get({
				action: 'query',
				prop: 'revisions',
				titles: title,
				rvsection: section,
				rvprop: 'content',
				format: 'json'
			}).done(function(data) {
				callback($.map(data.query.pages, function(value) {
					return value;
				})[0].revisions[0]['*']);
			}).fail(function(data) {
				mw.notify(data);
			});
		},
		savePageSection: function(title, sectionId, text, summary, callback) {
			(new mw.Api()).post({
				action: 'edit',
				title: title,
				section: sectionId,
				text: text,
				summary: summary,
				minor: '1',
				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);
			});
		}
	}

	if (mw.config.get('wgAction') === 'view' & $.inArray(mw.config.get('wgNamespaceNumber'), [3, 4, 11]) > -1 ) {
		if (mw.config.get('wgPageName') === 'ویکی‌پدیا:تابلوی_اعلانات_مدیران' && $.inArray('sysop', mw.config.get('wgUserGroups')) < 0) {
			return; // only sysops can archive WP:ANB
		}
		if (mw.config.get('wgPageName') === 'ویکی‌پدیا:درخواست_محافظت_صفحه') {
			return; // this page and its archive have incompatile structures
		}
		mw.loader.using(['mediawiki.api', 'mediawiki.language', 'mediawiki.jqueryMsg']).then(function(){
			return new mw.Api().loadMessagesIfMissing(['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']);	
		}).then(OneClickArchiver.install);
	}
})(jQuery, mediaWiki);