Wikipedysta:Tufor/QuickReCat.js

/******************************************************
QuickReCat (QRC, Quick ReCategorization) - narzędzie dla administratorów do rekategoryzacji
Autor: [[User:tufor]]
Wersja: 0.3.0
******************************************************/

var QuickReCat = {

	defaultReasons: [ //domyślne powody
		{
			button: 'standard',
			reason: 'standaryzacja'
		},
		{
			button: 'typo',
			reason: 'poprawa typografii'
		},
		{
			button: 'poprawnie',
			reason: 'poprawna forma'
		}
	],
	
	controlNum: 0, //hack; zmienna globalna, potrzebna do wyslania tylko ostatnio podanych danych
	
	createFieldSet: function() {
		// Tworzy diva, ktory jest glownym kontenerem
		jQuery('<div/>', {
			id: 'qrc-container',
			style: 'max-width: 750px; border: 1px solid #CCC; text-align:center; border-radius: 10px; padding: 15px; margin: 0 auto;'
		}).appendTo('#mw-content-text');

		// Tworzy fieldset layout.
		var qrc_fieldset = new OO.ui.FieldsetLayout({
			label: 'Quick ReCat',
			classes: ['container']
		});

		var qrc_input_from = new OO.ui.TextInputWidget({
			placeholder: 'Obecny tytuł kategorii',
			"class": "qrc-input",
			id: 'qrc-from',
			required: true,
			validate: 'non-empty'
		});

		var qrc_input_to = new OO.ui.TextInputWidget({
			placeholder: 'Nowy tytuł kategorii',
			"class": "qrc-input",
			id: 'qrc-to',
			required: true,
			validate: 'non-empty'
		});

		var qrc_input_reason = new OO.ui.TextInputWidget({
			placeholder: 'Powód przenosin',
			"class": "qrc-input",
			id: 'qrc-reason',
			required: true,
			validate: 'non-empty',
		});

		//dołącza stworzone itemy do fieldsetu, przypisuje etykiety
		qrc_fieldset.addItems([
			new OO.ui.FieldLayout(qrc_input_from, {
				label: 'Obecny tytuł kategorii',
				align: 'right',
			}),

			new OO.ui.FieldLayout(qrc_input_to, {
				label: 'Nowy tytuł kategorii',
				align: 'right'
			}),

			new OO.ui.FieldLayout(qrc_input_reason, {
				label: 'Powód przenosin',
				align: 'right'
			}),
		]);

		//dołącza fieldset do kontenera
		$('#qrc-container').append(qrc_fieldset.$element);

		//div z domyslnymi powodami przenosin
		jQuery('<div/>', {
			id: 'qrc-default-reasons',
			style: 'width:100%; margin:5px; text-align: center;'
		}).appendTo('#qrc-container');

		for (var i = 0; i < QuickReCat.defaultReasons.length; i++) {
			jQuery('<span/>', {
				"class": 'qrc_reasonButton',
				style: 'border: 1px solid #6b8e23; background-color:#9acd32 ; font-size:75%; padding: 2px; margin: 2px;',
				title: QuickReCat.defaultReasons[i].reason,
				html: QuickReCat.defaultReasons[i].button
			}).appendTo('#qrc-default-reasons');
		}

		$(document).on('click', '.qrc_reasonButton', function() {
			console.log("QRC: Wybrano powód:" + $(this).attr('title'));
			qrc_input_reason.setValue($(this).attr('title'));
		});

		// Przycisk "Analizuj"
		var qrc_button_analyse = new OO.ui.ButtonInputWidget({
			type: 'submit',
			useInputTag: true,
			id: 'qrc-analyse-button',
			label: 'Analizuj',
			flags: [
				'primary',
				'progressive'
			]
		});

		$('#qrc-container').append(qrc_button_analyse.$element);

		//div na komunikaty otrzymywane pozniej
		jQuery('<div/>', {
			id: 'qrc-message-container',
			style: 'width:100%; margin:5px;'
		}).appendTo('#qrc-container');

		console.log("QRC: Utworzono formularz");
		// po kliknieciu na "Analizuj" -> idz do funkcji convertForm()
		var qrc_params ={};
		$(document).on('click', '#qrc-analyse-button', function() {
			QuickReCat.controlNum++;
			qrc_params = {
				from: qrc_input_from.getValue().trim(),
				to: qrc_input_to.getValue().trim(),
				reason: qrc_input_reason.getValue().trim(),
				worklist: []
			};
			QuickReCat.convertForm(qrc_params);
		});
	},

	convertForm: function(qrc_params) {
		//wyczyść dotychczasowe komunikaty (jeśli są)
		$('#qrc-message-container').empty();

		if (qrc_params.from.length !== 0 && qrc_params.to.length !== 0 && qrc_params.reason.length !== 0) {
			qrc_params.from = QuickReCat.niceCatName(qrc_params.from);
			qrc_params.to = QuickReCat.niceCatName(qrc_params.to);
			console.log("QRC: Formularz wypełniony poprawnie");
			QuickReCat.checkCats(qrc_params);
		}
	},

	checkCats: function(qrc_params) {
		var from_nr, from_tp, to_nr, to_tp;
		var params_from = {
			action: 'query',
			prop: 'info',
			inprop: 'talkid',
			titles: qrc_params.from,
			format: 'json'
		};
		var params_to = {
			action: 'query',
			prop: 'info',
			inprop: 'talkid',
			titles: qrc_params.to,
			format: 'json'
		};
		$.when(
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: params_from,
				success: function(data) {
					from_nr = Object.getOwnPropertyNames(data.query.pages)[0];
					if (data.query.pages[from_nr].talkid === undefined)
						from_tp = false;
					else
						from_tp = true;
				}
			}),
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: params_to,
				success: function(data) {
					to_nr = Object.getOwnPropertyNames(data.query.pages)[0];
					if (data.query.pages[to_nr].talkid === undefined)
						to_tp = false;
					else
						to_tp = true;
				}
			})).then(function checkCatsCallback(data1, data2) {
			if (from_nr > 0 && to_nr < 0 && to_tp === false && qrc_params.to != qrc_params.from) {
				QuickReCat.displayMsg("Można wykonać przenosiny z $1 do $2.", 'success', qrc_params.from, qrc_params.to);
				if (from_tp)
					QuickReCat.displayMsg("Wraz z $1 przeniesiona zostanie jej strona dyskusji.", 'info', qrc_params.from);

				QuickReCat.getCategoryMembers(qrc_params); //teraz pora zdobyć listę stron w kategorii
			} else {
				if (from_nr < 0)
					QuickReCat.displayMsg("$1 nie istnieje, a powinna.", 'error', qrc_params.from);
				if (to_nr > 0)
					QuickReCat.displayMsg("$1 istnieje, a nie powinna.", 'error', qrc_params.to);
				if (to_nr < 0 && to_tp === true)
					QuickReCat.displayMsg("Mimo że, $1 nie istnieje, to istnieje strona dyskusji. Zajmij się nią zanim dokonasz przenosin.", 'error', qrc_to);
				if (qrc_params.to == qrc_params.from)
					QuickReCat.displayMsg("Obie kategorie mają takie same nazwy. Nie mogę przenieść kategorii w to samo miejsce.", 'error');
			}
		});

	},

	editPage: function(qrc_params, qrc_iterator) {
		QuickReCat.displayMsg("Poprawianie kategorii na stronach ($1)...<br />$2", 'editinfo', (qrc_iterator + 1) + "/" + qrc_params.worklist.length, qrc_params.worklist[qrc_iterator]);
		console.log("QRC: Edytuję stronę "+qrc_params.worklist[qrc_iterator]);
		var params = {
			action: 'query',
			prop: 'revisions',
			titles: qrc_params.worklist[qrc_iterator],
			rvprop: 'content',
			rvlimit: 1,
			format: 'json'
		};
		$.ajax({
			url: mw.util.wikiScript('api'),
			data: params,
			success: function(data) {
				/*Pobieranie ostatniej wersji artykułu*/
				for (var pageid in data.query.pages)
					break;
				var temp = data.query.pages[pageid];

				var qrc_text = temp.revisions ? temp.revisions[0]['*'] : ''; //tekst ostatniej wersji artykułu
				var qrc_newtext = qrc_text;

				var qrc_modcat = qrc_params.from.replace(/Kategoria:/gi, '');
				qrc_modcat = QuickReCat.escapeRegExp(qrc_modcat);
				qrc_modcat = qrc_modcat.replace(/ /g, "\[\\s_\]*");

				// usuwanie unikodowych znaków sterujących - zaczerpnięte z [[MediaWiki:Gadget-sk.js]]
				qrc_newtext = qrc_newtext.replace(/[\u200B\uFEFF\u200E]/g, '');

				/*Dwa przypadki - w kategorii może być klucz sortowania lub nie */
				var qrc_fromregex = new RegExp("\\[\\[\\s*(Category|Kategoria)\\s*\\:\\s*" + qrc_modcat + "\\s*\\|", "gi");
				var qrc_fromregex2 = new RegExp("\\[\\[\\s*(Category|Kategoria)\\s*\\:\\s*" + qrc_modcat + "\\s*\\]\\]", "gi");

				qrc_newtext = qrc_newtext.replace(qrc_fromregex, "[[" + qrc_params.to + "|");
				qrc_newtext = qrc_newtext.replace(qrc_fromregex2, "[[" + qrc_params.to + "]]");

				/*Prosta obsługa błedów*/
				if ((qrc_text == qrc_newtext && qrc_text !== '') || qrc_newtext == qrc_text.replace(/[\u200B\uFEFF\u200E]/g, '')) {
					QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie [[$1]]. Możliwe, że kategoria dodawana jest za pomocą szablonów.", 'error', qrc_params.worklist[qrc_iterator]);
					console.warn("QRC: {1) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist[qrc_iterator]);
					
					if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
						QuickReCat.editPage(qrc_params, qrc_iterator + 1);
					}
				} else if (qrc_text === '') {
					QuickReCat.displayMsg("Nie mogłem wykonać zamiany kategorii na stronie [[$1]]. Możliwe, że strona nie istnieje.", 'error', qrc_params.worklist[qrc_iterator]);
					console.warn("QRC: (2) Nie mozna bylo wykonać zamiany na stronie " + qrc_params.worklist[qrc_iterator]);
					
					if ((qrc_iterator + 1) < qrc_params.worklist.length) {//mimo to, próbuj na następnej stronie
						QuickReCat.editPage(qrc_params, qrc_iterator + 1);
					}
				} else /*Jeśli dobrze - zapisz*/ {
					var editparams = {
						action: 'edit',
						title: qrc_params.worklist[qrc_iterator],
						text: qrc_newtext,
						token: mw.user.tokens.get('csrfToken'),
						tags: "QRC",
						summary: "Zmiana nazwy kategorii: " + qrc_params.from + " → [[" + qrc_params.to + "]]  (przy użyciu [[WP:QRC|QRC]])",
						minor: true,
						bot: true,
						format: 'json'
					};
					$.ajax({
						url: mw.util.wikiScript('api'),
						type: "POST",
						data: editparams,
						success: function(data) {
							if ((qrc_iterator + 1) < qrc_params.worklist.length) {
								QuickReCat.editPage(qrc_params, qrc_iterator + 1);
							}
							else {
								QuickReCat.displayMsg("Skrypt zakończył działanie. Odśwież, by zmienić kolejną kategorie.", "editinfo");
								var qrc_button_refresh = new OO.ui.ButtonInputWidget({
									type: 'submit',
									useInputTag: true,
									id: 'qrc-refresh-button',
									label: 'ODŚWIEŻ!',
									flags: [
										'primary',
										'progressive'
									]
								});
								$('#qrc-container').append(qrc_button_refresh.$element);
								$(document).on('click', '#qrc-refresh-button', function() {
									location.reload();
								});
							}

						},
						error: function(data) {
							QuickReCat.displayMsg("Błąd podczas zapisywania strony: $1", 'error', data.error.info);
							console.error("QRC: Błąd podczas zapisu edycji na stronie: " + qrc_params.worklist[qrc_iterator]);
						}
					});
				}
			},
			error: function(data) {
				QuickReCat.displayMsg("Błąd podczas pobierania zawartości strony: $1", 'error', data.error.info);
				console.error("QRC: Błąd podczas pobierania zawartości strony: " + qrc_params.worklist[qrc_iterator]);
			}
		});
	},


	getCategoryMembers: function(qrc_params)
	{
		var qrc_continue = "";
		var qrc_query_params = {
			action: 'query',
			list: 'categorymembers',
			cmtitle: qrc_params.from,
			cmprop: 'title',
			cmlimit: 1000,
			cmcontinue: qrc_continue,
			format: 'json'
		};

		var getCategoryMembersRead = function(data) {
			for (var i = 0; i < data.query.categorymembers.length; i++)
				qrc_params.worklist.push(data.query.categorymembers[i].title);
			if (data["continue"] === undefined) {
				QuickReCat.displayMsg("W $1 znajduje się $2 stron.", 'info', qrc_params.from, qrc_params.worklist.length);

				if (mw.config.get("wgUserGroups").indexOf("flood") == -1 && qrc_params.worklist.length > 10)
					QuickReCat.displayMsg("Zostaną wykonane zmiany na więcej niż 10 stronach ($1). Rozważ, czy nie warto włączyć <i>flood flagi</i>.", 'info', qrc_params.worklist.length);
				QuickReCat.displayMsg("Klikając przycisk „Potwierdzam!” jesteś odpowiedzialny za wszystkie merytoryczne zmiany, " +
					"które zostaną wykonane na stronach Wikipedii. Upewnij się, że wprowadzone parametry są prawidłowe.", 'warning');

				//przycisk potwierdzajacy
				var qrc_button_confirm = new OO.ui.ButtonInputWidget({
					type: 'submit',
					useInputTag: true,
					id: 'qrc-confirm-button'+QuickReCat.controlNum,
					label: 'POTWIERDZAM!',
					disabled: true,
					flags: [
						'primary',
						'progressive'
					]
				});

				$('#qrc-message-container').append(qrc_button_confirm.$element);

				setTimeout(function() {
					qrc_button_confirm.setDisabled(false);
				}, 1000);

				$(document).one('click', '#qrc-confirm-button'+QuickReCat.controlNum, function() {
					console.log("QRC: Kliknięto przycisk 'Potwierdzam'");
					$('#qrc-message-container').empty();
					$('#qrc-analyse-button').prop('disabled', true);
					QuickReCat.moveCats(qrc_params);
				});
			} else {
				qrc_continue = data["continue"];
				getCategoryMembersContinue();
			}
		};
		var getCategoryMembersContinue = function() {
			$.ajax({
				url: mw.util.wikiScript('api'),
				data: qrc_query_params,
				success: getCategoryMembersRead
			});
		};

		$.ajax({
			url: mw.util.wikiScript('api'),
			data: qrc_query_params,
			success: getCategoryMembersRead,
			error: function(data) {
				console.error("QRC: Nie można pobrać listy stron należącej do kategorii")
			}
		});
	},

	moveCats: function(qrc_params) {
		var qrc_corr;
		$.ajax({
			url: mw.util.wikiScript('api'),
			type: "POST",
			data: {
				action: 'move',
				from: qrc_params.from,
				to: qrc_params.to,
				tags: "QRC",
				reason: qrc_params.reason + " (przy użyciu [[WP:QRC|QRC]])",
				token: mw.user.tokens.get('csrfToken'),
				noredirect: true,
				movetalk: true,
				format: 'json'
			},
			success: function(data) {
				QuickReCat.displayMsg("Kategoria przeniesiona!", 'success');
				console.log("QRC: Kategoria przeniesiona pomyślnie, rozpoczynam poprawianie stron");
				QuickReCat.editPage(qrc_params, 0);
			},
			error: function(data) {
				QuickReCat.displayMsg("Błąd: $1", 'error', data.error.info);
				console.error("QRC: Błąd przenosin kategorii: " + data.error.info);
			}
		});
	},

	displayMsg: function(qrc_msg, qrc_msgtype, qrc_msgParam1, qrc_msgParam2) {
		$('#qrc-message-container').css({
			'border-top': '1px solid #EEE',
			'padding-top': '5px',
			'margin-top': '5px'
		});

		if (typeof qrc_msgParam1 !== undefined) {
			qrc_msg = qrc_msg.replace('$1', qrc_msgParam1);
			if (typeof qrc_msgParam2 !== undefined)
				qrc_msg = qrc_msg.replace('$2', qrc_msgParam2);
		}

		if ($('#qrc_editinfo').length !== 0 && qrc_msgtype == 'editinfo') {
			document.getElementById('qrc_editinfo').innerHTML = "<b>INFO:</b> " + qrc_msg;
			return;
		}

		var msgbox = document.createElement('div');
		msgbox.style.width = "90%";
		msgbox.style.margin = "0 auto";
		msgbox.style.marginBottom = "5px";
		msgbox.style.padding = "2px 5px 2px 20px";
		msgbox.style.borderRadius = "0.2em";
		msgbox.style.textAlign = "left";
		if (qrc_msgtype == 'error') {
			msgbox.style.backgroundColor = "#FF9494";
			msgbox.style.border = "2px solid #CB4154";
			msgbox.innerHTML = "<b>BŁĄD:</b> ";
		}
		if (qrc_msgtype == 'success') {
			msgbox.style.backgroundColor = "#93DB70";
			msgbox.style.border = "2px solid #659D32";
			msgbox.innerHTML = "<b>OK:</b> ";
		}
		if (qrc_msgtype == 'info') {
			msgbox.style.backgroundColor = "#78b1dd";
			msgbox.style.border = "2px solid #2b73ab";
			msgbox.innerHTML = "<b>INFO:</b> ";
		}
		if (qrc_msgtype == 'warning') {
			msgbox.style.backgroundColor = "#FFCC00";
			msgbox.style.border = "2px solid #FF6600";
			msgbox.innerHTML = "<b>UWAGA:</b> ";
		}
		if (qrc_msgtype == 'editinfo') {
			msgbox.style.backgroundColor = "#78b1dd";
			msgbox.style.border = "2px solid #2b73ab";
			msgbox.id = "qrc_editinfo";
			msgbox.innerHTML = "<b>INFO:</b> ";
		}
		msgbox.innerHTML += qrc_msg;
		$(msgbox).appendTo('#qrc-message-container');
	},

	niceCatName: function(qrc_catName) {
		//otrzymujemy ładne nazwy kategorii: Kategoria:Nazwa
		qrc_catName = qrc_catName.replace(/Kategoria:/gi, '');
		qrc_catName = qrc_catName.replace(/\s+/g, ' ');
		qrc_catName = qrc_catName.trim().charAt(0).toUpperCase() + qrc_catName.trim().slice(1);
		return "Kategoria:" + qrc_catName;
	},
	escapeRegExp: function(qrc_catName) {
		return qrc_catName.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
	}
};

$(document).ready(function()
{
	mw.loader.using(['oojs-ui', 'mediawiki.util']).done(function() {
	if(mw.config.get('wgPageName')=="Specjalna:Pusta_strona/QRC" && (mw.config.get("wgUserGroups").indexOf("sysop")>=0 || mw.config.get("wgUserGroups").indexOf("bot")>=0))
	{
		$( '#mw-content-text' ).empty();
		var qrc_p=document.createElement('p');
		qrc_p.innerHTML="Narzędzie QuickReCat (QRC) pozwala na szybką zmianę kategorii. <a href=\"/wiki/Wikipedysta:Tufor/Quick_ReCat\">Dokumentacja</a>.";
		$( '#mw-content-text' ).append( qrc_p );
		QuickReCat.createFieldSet();
	}
	});
});

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
Kembali kehalaman sebelumnya