MediaWiki:AFC-add-project-tags.js

Iz Wikipedije, proste enciklopedije

Opomba: Da bodo spremembe prišle do veljave, po objavi izpraznite predpomnilnik svojega brskalnika.

  • Firefox/Safari: Držite Shift in kliknite Znova naloži (Reload) ali pritisnite Ctrl + Shift + R ali Ctrl + R (⌘ + R v sistemu Mac)
  • Internet Explorer/Edge: Držite Ctrl + F5 in kliknite Osveži (Refresh) ali pritisnite Ctrl + F5
  • Google Chrome: Pritisnite Ctrl + Shift + R (⌘ + Shift + R v sistemu Mac)
  • Opera: Pritisnite Ctrl + F5.
/**
 * MediaWiki:AFC-add-project-tags.js
 * 
 * Add WikiProject tags to draft talk page. Script for 
 * [[Wikipedia:WikiProject Articles for creation/Add WikiProject tags]], 
 * loaded via [[mw:Snippets/Load JS and CSS by URL]]. 
 * 
 * Author: [[User:SD0001]]
 * Licence: MIT
 * 
 */

// <nowiki>

var api;

$.when(
	$.ready,
	mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.widgets'])
).then(function () {

	if (mw.config.get('wgPageName').indexOf('Wikipedija:Članki_za_ustvaritev/Dodaj_oznako_wikiprojekta') !== 0) {
		return;
	}

	api = new mw.Api();

	var titleInput = new mw.widgets.TitleInputWidget({
		// get prefill value from the URL query string
		value: (mw.util.getParamValue('title') || '')
			// decode XML entities in it if any
			.replace(/&#(\d+);/g, function (_, numStr) {
				return String.fromCharCode(parseInt(numStr, 10));
			})
			// replace underscores with spaces (just for tidiness)
			.replace(/_/g, ' ')
	});
	var tagInput = new OO.ui.MenuTagMultiselectWidget({
		placeholder: 'Začnite vnašati za iskanje oznak ...',
		tagLimit: 10,
		autocomplete: false,
		$overlay: $('<div>').addClass('projectTagOverlay').css({
			'position': 'absolute',
			'z-index': '110'
		}).appendTo('body')
	});

	$('.mw-parser-output .mw-ui-progressive').parent().replaceWith(
		$('<label>')
			.text('Vnesite naslov strani osnutka: '),
		titleInput.$element
			.css('margin-bottom', '8px'),
		$('<label>')
			.attr('for', 'draft-select')
			.text('Izberite WikiProjekte za oznako'),
		$('<div>')
			.append(tagInput.$element),
		$('<button>')
			.attr('id', 'draft-submit')
			.addClass('mw-ui-button mw-ui-progressive')
			.text('Dodaj oznake izbranih WikiProjektov')
			.css('margin-top', '10px')
			.on('click', evaluate),
		$('<div>')
			.attr('id', 'draft-status')
	);

	$.getJSON('https://sl.wikipedia.org/w/index.php?title=' +
		encodeURIComponent("Wikipedija:Članki_za_ustvaritev/WikiProject_templates.json") +
		'&action=raw&ctype=text/json'
	).then(function (data) {
		tagInput.addOptions(Object.keys(data).map(function (k) {
			return {
				data: data[k],
				label: k
			};
		}));
	});

	function evaluate() {
		$('#draft-status').text('Odpiranje pogovorne strani osnutka ...').css('color', 'blue');

		var draftTitle = titleInput.getValue();
		var draft = mw.Title.newFromText(draftTitle);
		if (!draft) {
			$('#draft-status').text('Prosimo, preverite naslov strani osnutka.').css('color', 'red');
			return;
		}
		if (draft.namespace !== 118 && draft.namespace !== 2) {
			$('#draft-status').text('Prosimo, preverite naslov strani osnutka. Ni videti, da bi bila v imenskem prostoru osnutkov').css('color', 'red');
			return;
		}

		api.get({
			"action": "query",
			"prop": "revisions",
			"titles": [draft.toString(), draft.getTalkPage().toString()],
			"formatversion": "2",
			"rvprop": "content",
			"rvslots": "main",
			"rvsection": "0"
		}).then(function(data) {

			// verify that the draft exists
			var subjectpage = data.query.pages.filter(function(pg) {
				return pg.ns === 118
			})[0];
			if (!subjectpage || subjectpage.missing) {
				$('#draft-status').text('Prosimo, preverite naslov strani osnutka. Taka stran ne obstaja.')
					.css('color', 'red');
				return;
			}

			// get list of tags already present on talk page
			var existingTags = [];
			var talkpage = data.query.pages.filter(function(pg) {
				return pg.ns === 119;
			})[0];
			if (talkpage && !talkpage.missing) {
				var talktext = talkpage.revisions[0].slots.main.content;

				// this is best-effort, no guaranteed accuracy
				var rgx = /\{\{(WikiProjekt [^|}]*)/g;
				var match;
				while (match = rgx.exec(talktext)) {
					existingTags.push(match[1]);
				}
			}

			var newTags = tagInput.getValue().filter(function(tag) {
				return existingTags.indexOf(tag) === -1;
			}).map(function (tag) {
				return '{{' + tag + '}}'
			}).join('\n');

			// api.edit() doens't work if page doesn't exist originally
			api.postWithEditToken({
				"action": "edit",
				"title": draft.getTalkPage().toString(),
				"prependtext": newTags + '\n',
				"formatversion": "2",
				"summary": 'Dodajanje oznak WikiProjektov ([[MediaWiki:AFC-add-project-tags.js|podprto]]))'
			}).then(function (data) {

				if (data.edit && data.edit.result === 'Success') {
					$('#draft-status').text('Oznake WikiProjektov so dodane. Preusmerjanje na pogovorno stran osnutka ...').css('color', 'green');
					setTimeout(function () {
						location.href = mw.util.getUrl(draft.getTalkPage().toString());
					}, 1000);
				} else {
					return $.Deferred().reject('unexpected-result');
				}
			}).catch(function (err) {
				$('#draft-status').text('Prišlo je do napake (' + err + ') Prosimo, poskusite znova.').css('color', 'red');
			});

		}).catch(function(err) {
			$('#draft-status').text('Prišlo je do napake (' + err + ') Prosimo, poskusite znova.').css('color', 'red');
		});

	}

}).catch(console.log);

 
// </nowiki>