MediaWiki:Gadget-Autoref.js/core.js

Fonte: Wikinotícias

Nota: Depois de publicar, deve limpar o cachê do seu navegador para ver as alterações.

  • Firefox e Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Internet Explorer e Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5
  • Opera: Pressione Ctrl-F5.
// @source: User:BrandonXLF/Citoid
// @author: User:BrandonXLF

window.getCitoidRef = function(URL) {
	try { URL = decodeURIComponent(URL); } catch (e) {}
	URL = encodeURIComponent(URL);

	var dfd = $.Deferred(),
		cfg = mw.config.get('wgCitoidConfig'),
		vecfg = mw.config.get('wgVisualEditorConfig'),
		rest =  cfg.fullRestbaseUrl || cfg.wbFullRestbaseUrl ? (cfg.fullRestbaseUrl || cfg.wbFullRestbaseUrl) + 'v1/data/citation/mediawiki/'
			: vecfg && vecfg.fullRestbaseUrl ? vecfg.fullRestbaseUrl + 'v1/data/citation/mediawiki/'
			: cfg.citoidServiceUrl ? cfg.citoidServiceUrl + '?format=mediawik&search='
			: cfg ? '/api?format=mediawik&search='
			: 'https://pt.wikinews.org/api/rest_v1/data/citation/mediawiki/';
			
	function arrToStr(arr) {
		for (var i = 0; i < arr.length; i++) {
			arr[i] = arr[i].filter(function(str) {
				return !!str;
			}).join(', ');
		}
		
		return arr.join('; ');
	}
			
	function encodeTemplatePart(str) {
		if (Array.isArray(str)) {
			str = arrToStr(str);
		}
		
		return str.replace(/\|/g, '&#124;').replace(/\[/g, '&#91;').replace(/\]/g, '&#93;').replace(/\=/g, '&#61;');
	}
	
	function doMap(out, data, mapData) {
		for (var name in data) {
			if (name == 'url') {
				data[name] = encodeURI(data[name]);
			}

			if (typeof mapData[name] == 'string') {
				out[mapData[name]] = data[name];
			} else if (Array.isArray(mapData[name])) {
				out = doMap(out, data[name], mapData[name]);
			}
		}
		
		return out;
	}

	dfd.notify('Carregando dados da fonte.');

	$.get(rest + URL, {
		action: 'query',
		format : 'json'
	}).then(function(res) {
		var data = res[0];

		dfd.notify('Carregando dados de configuração.');
		dfd.notify('Carregando dados na predefinição.');

		var mapPromise = window.internalGetCitoidRefMap
			? $.Deferred().resolve(window.internalGetCitoidRefMap)
			: $.get(mw.config.get('wgScript'), {
				title: 'MediaWiki:Citoid-template-type-map.json',
				action: 'raw',
				ctype: 'application/json'
			}).then(function(map) {
				window.internalGetCitoidRefMap = map;
				return map;
			});

		mapPromise.then(function(map) {
			var template = map[data.itemType];

			dfd.notify('Carregando dados de configuração.');
			dfd.notify('Carregando dados na predefinição.');
			
			if (!window.internalGetCitoidRefTemplateData) {
				window.internalGetCitoidRefTemplateData = {};
			}

			var templatePromise = window.internalGetCitoidRefTemplateData[template]
				? $.Deferred().resolve(window.internalGetCitoidRefTemplateData[template])
				: $.get(mw.config.get('wgScriptPath') + '/api.php', {
					action: 'templatedata',
					format: 'json',
					formatversion: 2,
					titles: 'Template:' + template,
					redirects: 1
				}).then(function(tdata) {
					for (var id in tdata.pages) {
						window.internalGetCitoidRefTemplateData[template] = tdata.pages[id];
					}

					return tdata.pages[id];
				});

			templatePromise.then(function(tdata) {
				var str = '{{' + template;
				
				dfd.notify('Carregando dados da predefinição.');

				if (!tdata) {
					dfd.reject('Não foi possível localizar os campos da predefinição:' + template + '.');
					return;
				}

				if (!tdata.maps || !tdata.maps.citoid) {
					dfd.reject('Não foi possível carregar os dados na predefinição:' + template + '.');
					return;
				}

				out = doMap({}, data, tdata.maps.citoid);

				for (var k = 0; k < tdata.paramOrder.length; k++) {
					var param = tdata.paramOrder[k];
					
					if (out[param]) {
						str += '|' + param + '=' + encodeTemplatePart(out[param]);
					}
				}

				str += '}}';

				dfd.resolve(str, data.source);
			}, function() {
				dfd.reject('Não foi possível acessar os dados da predefinição:' + template + '.');
			});
		}, function() {
			dfd.reject('Não foi possível obter dados da configuração.');
		});
	}, function() {
		dfd.reject('Não foi possível obter os dados. Verifique se a fonte é válida ou se está conectado com a internet.');
	});

	return dfd.promise();
};