ميډياويکي:Gadget-AGprefs.js

د ويکيسيند لخوا

يادښت: د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.

  • فايرفاکس/ سفري: په دې کتنمل کې د Reload د ټکوهلو په وخت د Shift تڼۍ نيولې وساتی، او يا هم Ctrl-F5 يا Ctrl-Rتڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ⌘-R کېښکاږۍ)
  • گووگل کروم: په دې کتنمل کې د Ctrl-Shift-R تڼۍ کېښکاږۍ (د مک لپاره ⌘-Shift-R)
  • انټرنټ اېکسپلورر: په دې کتنمل کې د Refresh د ټکوهلو په وخت کې د Ctrl تڼۍ کېښکاږلې ونيسۍ، او يا هم د Ctrl-F5 تڼۍ کېښکاږۍ
  • اوپرا: په دې کتنمل کې د خپل براوزر ساتل شوې حافظه پدې توگه سپينولی شی Tools→Preferences
'use strict'; /** per-browser preferences page **/
/*jshint undef:true, boss:true, latedef:true, shadow:true */
/*global mw, jQuery */
var gadgetList = { '': {} };
var prefs;
try {
	prefs = window.localStorage.getItem('AGprefs');
} catch (e) {
	prefs = jQuery.cookie('AGprefs');
}
prefs = prefs ? JSON.parse(prefs) : { gadgets: {}, modules: {}, sheets: {}, scripts: {} };

var uiContent = document.getElementById('mw-content-text');

var api = new mw.Api();
api.get({
	action: 'query',
	titles: 'MediaWiki:Gadgets-definition',
	prop: 'revisions',
	rvprop: 'content',
	rvlimit: 1
}).then(function (result) {
	var m, mm, wikitext;
	for (var pageid in result.query.pages) {
		wikitext = result.query.pages[pageid].revisions[0]['*'];
	}
	var lines = wikitext.split('\n'), msgQueue = {}, curGroup = '';
	for (var i = 0; i < lines.length; ++i) {
		if (m = /^==\s*(.*?)\s*==$/.exec(lines[i])) {
			msgQueue['Gadget-section-' + m[1]] = true;
			gadgetList[curGroup = m[1]] = {};
		} else if (m = /^\*\s*([A-Za-z][A-Za-z0-9_\-]*)\s*(?:\[(.*?)\])?\|(.*)\s*$/.exec(lines[i])) {
			msgQueue['Gadget-' + m[1]] = true;
			var gadget = gadgetList[curGroup][m[1]] = {
				options: {},
				css: [],
				js: []
			};

			if (m[2]) {
				var opts = m[2].split('|');
				for (var j = 0; j < opts.length; ++j) {
					if (mm = /^(.*)=(.*)$/.exec(opts[j]))
						gadget.options[mm[1]] = mm[2];
					else
						gadget.options[opts[j]] = true;
				}
			}
			
			var files = m[3].split('|');
			for (var j = 0; j < files.length; ++j) {
				if (/\.css$/.test(files[j]))
					gadget.css.push(files[j]);
				else
					gadget.js.push(files[j]);
			}
		}
	}

	var validGadgets = {}, validModules = {}, validJS = {}, validCSS = {};
	for (var group in gadgetList) {
		for (var name in gadgetList[group]) {
			var gadget = gadgetList[group][name];
			validGadgets[name] = true;
			if (gadget.options.ResourceLoader || (gadget.js.length === 0)) {
				validModules['ext.gadget.' + name] = true;
			} else {
				for (var i = 0; i < gadget.css.length; ++i)
					validJS[gadget.css[i]] = true;
				for (var i = 0; i < gadget.js.length; ++i)
					validCSS[gadget.js[i]] = true;
			}
		}
	}
	
	for (var key in prefs.gadgets)
		if (!(key in validGadgets))
			delete prefs.gadgets[key];
	for (var key in prefs.modules)
		if (!(key in validModules))
			delete prefs.modules[key];
	for (var key in prefs.sheets)
		if (!(key in validCSS))
			delete prefs.sheets[key];
	for (var key in prefs.scripts)
		if (!(key in validJS))
			delete prefs.scripts[key];

	var msgs = {};
	jQuery.Deferred(function (self) {
		/*jshint loopfunc:true */
		var promises = [], queue = Object.keys(msgQueue);
		for (var i = 0; i < queue.length; i += 50) {
			promises.push(api.get({
				action: 'query',
				meta: 'allmessages',
				amenableparser: '1',
				ammessages: queue.slice(i, i + 50).join("|")
			}).then(function (result) {
				for (var i = 0; i < result.query.allmessages.length; ++i) {
					var mesg = result.query.allmessages[i];
					if ('missing' in mesg)
						msgs[mesg.name] = '&lt;' + mesg.name + '>';
					else
						msgs[mesg.name] = mesg['*'];
				}
			}));
		}

		jQuery.when.apply(jQuery, promises).then(function () {
			self.resolveWith(msgQueue);
		}, function (data) {
			self.rejectWith(data);
		});
	}).then(function (msgQueue) {
		function makeListItem(name, gadget) {
			var uiItem = document.createElement('li');
			var uiInput = document.createElement('input');
			var uiLabel = document.createElement('label');
			uiInput.type = 'checkbox';
			uiInput.checked = name in prefs.gadgets ? prefs.gadgets[name] : !!gadget.options['default'];
			
			uiInput.addEventListener('change', function () {
				prefs.gadgets[name] = this.checked;
				if (gadget.options.ResourceLoader || (gadget.js.length === 0)) {
					prefs.modules['ext.gadget.' + name] = this.checked;
				} else {
					for (var i = 0; i < gadget.css.length; ++i)
						prefs.sheets[gadget.css[i]] = this.checked;
					for (var i = 0; i < gadget.js.length; ++i)
						prefs.scripts[gadget.js[i]] = this.checked;
				}
			}, false);
			
			// XXX: messy
			var html = (msgs['Gadget-' + name] || ("&lt;Gadget-" + name + "&gt;")).replace(/\[\[(?:(.*?)\|)?(.*?)\]\]/g, function (whole, page, label) {
				return '<a href="' + mw.util.getUrl(page || label).replace(/[<"&>]/g, function (c) {
					return '&#' + c.charCodeAt(0) + ';';
				}) + '">' + label + '</a>';
			});
			uiLabel.innerHTML = html;
			uiLabel.insertBefore(uiInput, uiLabel.firstChild);
			
			uiItem.appendChild(uiLabel);
			return uiItem;
		}
		
		var uiPrefs = document.createElement('div');

		for (var group in gadgetList) {
			var uiHeader = document.createElement('h2');
			var uiList = document.createElement('ul');
			uiHeader.textContent = msgs['Gadget-section-' + group];
			for (var name in gadgetList[group]) {
				var gadget = gadgetList[group][name];

				if ('rights' in gadget.options)
					continue; // XXX: we just assume we do not have the necessary rights

				if ('skins' in gadget.options)
					if (gadget.options.skins.split(',').indexOf(mw.config.get('skin')) === -1)
						continue;

				var uiItem = makeListItem(name, gadget);
				uiList.appendChild(uiItem);
			}
			if (uiList.hasChildNodes()) {
				if (group !== '')
					uiPrefs.appendChild(uiHeader);
				uiPrefs.appendChild(uiList);
			}
		}
		var uiSave = document.createElement('input');
		var uiReset = document.createElement('input');
		uiSave.type  = 'button'; uiSave.value  = 'Apply and reload';
		uiReset.type = 'button'; uiReset.value = 'Reset to defaults';
		
		uiSave.addEventListener('click', function () {
			var value = JSON.stringify(prefs);
			try {
				window.localStorage.setItem('AGprefs', value);
			} catch (e) {
				jQuery.cookie('AGprefs', value, { expire: 90 });
			}
			location.reload();
		}, false);
		
		uiReset.addEventListener('click', function () {
			try {
				window.localStorage.removeItem('AGprefs');
			} catch (e) {
				/* ignore */
			}
			jQuery.cookie('AGprefs', null);
			location.reload();
		}, false);

		uiPrefs.appendChild(uiSave);
		uiPrefs.appendChild(document.createTextNode(" "));
		uiPrefs.appendChild(uiReset);

		uiContent.appendChild(uiPrefs);
	}, function () {
		console.error('getting gadget names failed', arguments);
	});
}, function () {
	console.error('getting Gadgets-definition failed', arguments);
});