ملاحظة: بعد النشر، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.

  • فايرفوكس / سافاري: أمسك Shift أثناء ضغط Reload، أو اضغط على إما Ctrl-F5 أو Ctrl-R (⌘-R على ماك)
  • جوجل كروم: اضغط Ctrl-Shift-R (⌘-Shift-R على ماك)
  • إنترنت إكسبلورر/إيدج: أمسك Ctrl أثناء ضغط Refresh، أو اضغط Ctrl-F5
  • أوبرا: اضغط Ctrl-F5.
/*global jQuery, mediaWiki*/
/* <nowiki> */
/*!
 * Developed by: [[User:Ebrahim]]
 */
(function ($, mw) {
	'use strict';

	if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgAction') !== 'view') {
		return;
	}

	function savePage(summary, content) {
		return new mw.Api().post({
			action: 'edit',
			title: mw.config.get('wgPageName'),
			summary: summary,
			text: content,
			format: 'json',
			token: mw.user.tokens.get('csrfToken')
		});
	}

	function loadPage() {
		return new mw.Api().get({
			action: 'query',
			prop: 'revisions',
			titles: mw.config.get('wgPageName'),
			rvprop: 'content',
			format: 'json'
		}).then(function (data) {
			return $.map(data.query.pages, function (value) { return value; })[0].revisions[0]['*'];
		});
	}

	/**
	 * This will help on better sorting on Persian string array
	 */
	function dePersian(input) { // solve persian problem on sorting by replace characters in strings
		return input.replace(/ی/g, "ي")
			.replace(/ک/g, "ك")
			.replace(/گ/g, "كی")
			.replace(/ژ/g, "زی")
			.replace(/چ/g, "جی")
			.replace(/پ/g, "بی");
	}

	/**
	 * String comparator for Persian
	 */
	function customComparator(a, b) {
		var keyA = dePersian(a),
			keyB = dePersian(b);

		if (keyA < keyB) {
			return -1;
		}
		if (keyA > keyB) {
			return 1;
		}
		return 0;
	}

	/**
	 * Is a recursive function to retrieve all stub templates consequently
	 */
	function getAllStubTemplates(array, eicontinue) {
		return new mw.Api().get({
			action: 'query',
			list: 'embeddedin',
			eititle: 'الگو:الگوی خرد',
			eilimit: 500,
			einamespace: 10,
			format: 'json',
			eicontinue: eicontinue,
			'continue': ''
		}).then(function (data) {
			if (!array) { array = []; }
			array = array.concat($.map(data.query.embeddedin, function (value) {
				return value.title;
			}));
			if (!data['continue']) {
				return array;
			}
			return getAllStubTemplates(array, data['continue'].eicontinue);
		});
	}
	
	/**
	 * check if is expired, currently expires in three days
	 */
	function isExpired(cacheTime) {
		return (new Date().getTime() - cacheTime) > (1000 * 60 * 60 * 24 * 3);
	}
	
	/**
	 * If browser support localStorage, this would use it
	 */
	function cachedGetAllStubTemplates() {
		if (window.localStorage !== undefined) {
			var object, defer;
			try {
				object = JSON.parse(localStorage.getItem('allStubTemplates'));
			} catch (ignore) {}
			if (object && !isExpired(parseInt(object.timestamp))) {
				defer = $.Deferred();
				return $.Deferred().resolve(object.value);
			}
		}
		return getAllStubTemplates().then(function (array) {
			if (array.length > 0 && window.localStorage !== undefined) {
				try {
					window.localStorage.setItem('allStubTemplates', JSON.stringify({
						value: array,
						timestamp: new Date().getTime()
					}));
				} catch(ignore) {}
			}
			return array;
		});
	}

	function getParsedTemplate(template) {
		return new mw.Api().post({
			action: 'parse',
			text: '{' + '{' + template + '}}',
			contentmodel: 'wikitext',
			prop: 'text'
		}).then(function (data) { return data.parse.text['*']; });
	}

	$.when($.ready, mw.loader.using('oojs-ui')).then(function () {
		$('#ca-stub-adder').remove();
		$(mw.util.addPortletLink('p-cactions', '#', 'خرد', 'ca-stub-adder', 'افزودن الگوی خرد')).click(function (e) {
			e.preventDefault();
			
			var stubSelect = $('<select>', {
				style: 'padding: 1px; vertical-align: baseline; font-family: inherit',
				html: '<option value="" selected="selected">در حال بارگیری فهرست الگوها، کمی درنگ کنید</option>'
			});
			var asboxPreviewPlaceholder = $('<div>', { style: 'padding-top: 1em; height: 3em' });
			
			var form = $('<div>', {
				style: 'position: relative;'
			}).append($('<div>', {
				style: 'margin-top: 0.4em;',
				html: 'انتخاب الگوی خرد: '
			}).append(stubSelect, asboxPreviewPlaceholder));
			
			// Hack
			mw.util.addCSS('.oo-ui-window-frame { width: 600px!important; }');
			
			OO.ui.confirm(form).then(function (confirmed) {
				if (!confirmed) return;
	
				var template = stubSelect.val();
				if (!template) { return; }
				
				mw.notify('افزودن الگوی خرد…');
	
				loadPage().then(function (content) {
					content = content.replace(
						new RegExp('{' + '{\\s*([^:}]*:)?(خرد|ناقص|' + mw.util.escapeRegExp(template) + ')\\s*}}\\n*', 'g'),
						''
					).replace(/\n+$/, '');
					if (!/خرد\}\}$/.test(content)) {
						content = content + '\n\n';
					}
					return savePage('افزودن الگوی خرد به کمک ابزار', content + '\n' + '{' + '{' + template + '}}');
				}).then(function (data) {
					if (data.edit.result === 'Success') {
						window.location.reload();
					} else {
						mw.notify('Unknown result from API.');
					}
				}, function () {
					mw.notify('Edit failed.');
				});
			});
	
			cachedGetAllStubTemplates().then(function (stubs) {
				stubs = stubs
					.filter(function (x) { return x !== 'الگو:خرد'; })
					.filter(function (x) {
						return !/^الگو:(\w|فرودگاه-)/.exec(x);
					});
				stubs.push('');
				stubs.sort(customComparator);
				stubSelect.empty().change(function () {
					var template = stubSelect.val();
					if (!template) {
						asboxPreviewPlaceholder.html('');
						return;
					}
					asboxPreviewPlaceholder.html('<center><img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" /></center>');
					getParsedTemplate(template).then(function (html) {
						asboxPreviewPlaceholder.html(html);
					});
				}).append($.map(stubs, function (value) {
					return $('<option>', {
						html: value.replace(/^[^:]*:/, ""),
						val: value.replace(/^[^:]*:/, "")
					});
				}));
			});
		});
	});
}(jQuery, mediaWiki));