MediaWiki:Gadget-proofread-history.js

Z Wikiźródeł, wolnej biblioteki

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
window.proofreadHistoryGadget = {
	version: 5,
	tabCaption: "Historia korekty",
	tabTooltip: "Kliknij, żeby zobaczyć historię (bez opuszczania strony).",
	errorMessage: "Nie udało się pobrać historii",
	hiddenUserMsg: "Ukryty użytkownik",
	noUserMsg: "Nieznany użytkownik",
	statuses: [
		'bez tekstu',
		'przepisana',
		'problemy',
		'skorygowana',
		'uwierzytelniona',
	],
	history: [],
	lastLevel: -1,
	state: 'hidden',

	init: function() {
		if (mw.config.get("wgNamespaceNumber") != 100)
			return;

		if (!mw.config.get('wgArticleId'))
			return;

		this.addTab();
	},

	addTab: function() {
		var name = this.tabCaption;
		var id = 'ca-proofread-history';

		var historyLink = document.getElementById("ca-history");
		if (!historyLink) {
			return;
		}

		// ( portletId, href, text, [id], [tooltip], [accesskey], [nextnode] ) : HTMLElement|null
		var link = mw.util.addPortletLink(
			'p-views', '#', name,
			id, this.tabTooltip,
			'', historyLink
		);
		link.href = '#';
		var that = this;
		link.onclick = function() {
			if (that.state == 'visible' && (that.history.length) ) {
				that.showHistory();
			} else if (that.state == 'hidden' || that.state == 'visible') {
				that.fetchHistory();
			}
		};
	},

	fetchHistory: function() {
		this.lastLevel = -1;
		this.history = [];
		this.state = 'fetching';
		this.sendRequest();
	},

	sendRequest: function(rvstartid) {
		var request = {
			action:	'query',
			titles:	mw.config.get( 'wgPageName' ),
			prop:	'revisions',
			rvprop:	'timestamp|user|content',
			rvdir:	'newer',
			format:	'json',
			rvlimit:	'max',
			requestid:	new Date().getTime()
		};
		if (rvstartid) {
			request['rvstartid'] = rvstartid;
		}

		var that = this;
		jQuery.getJSON( mw.util.wikiScript( 'api' ), request, function(result) {
			that.processResponse(result);
		});
	},

	processResponse: function(data) {
		if (! data.query)
			return;

		var page;
		for (var pageid in data.query.pages) {
			page = data.query.pages[pageid];
			break;
		}
		for (var revisionid in page.revisions) {
			var revision = page.revisions[revisionid];
			if (revision['*'] === null) {
				console.log("Missing revision text");
				console.log(revision);
				continue;
			}
			var matches = revision['*'].match(/^<noinclude><pagequality level="(\d+)"/);
			if (matches) {
				var level = matches[1];
				if (level != this.lastLevel) {
					this.lastLevel = level;
					var historyentry = {
						level: level,
						timestamp: revision.timestamp
					};
					if (revision.hasOwnProperty('user')) {
						historyentry.user = revision.user;
					}
					if (revision.hasOwnProperty('userhidden')) {
						historyentry.userhidden = revision.userhidden;
					}
					this.history.unshift(historyentry);
				}
			}
			else {
				console.log("Unable to parse page content");
			}
		}

		if (data['query-continue'] && data['query-continue']['revisions']) {
			this.sendRequest(data['query-continue']['revisions']['rvstartid'])
		}
		else {
			this.showHistory();
		}
	},

	formatDate: function(date) {
		function formatNumber(value, length) {
			var str = new String(value);

			while (str.length < length) {
				str = "0" + str;
			}
			return str;
		}

		var result = formatNumber(date.getFullYear(), 4) + '-' + formatNumber(date.getMonth() + 1, 2) + '-' + formatNumber(date.getDate(), 2);
		result += ' ' + formatNumber(date.getHours(), 2) + ':' + formatNumber(date.getMinutes(), 2) + ':' + formatNumber(date.getSeconds(), 2);

		return result;
	},

	showHistory: function() {
		this.state = 'visible';
		if (!this.history.length) {
			mw.notify( this.errorMessage, { tag: 'ph_gadget' } );
		} else {
			var message = document.createElement('div');
			message.className = 'plainlinks';

			for (var index in this.history) {
				var entry = this.history[index];
				var line = document.createElement('div');
				line.style.paddingLeft = '3px';
				line.className = "quality" + entry.level;

				var date = new Date(entry.timestamp);
				line.appendChild(document.createTextNode(this.formatDate(date) + ' '));

                var user;
                if (entry.user) {
				    user = document.createElement('a');
				    user.href = mw.util.getUrl("User:" + entry.user);
				    user.appendChild(document.createTextNode(entry.user));
                } else if (entry.hasOwnProperty('userhidden')) {
                    user = document.createTextNode(this.hiddenUserMsg);
                } else {
                	user = document.createTextNode(this.noUserMsg);
                }
				line.appendChild(user);

				line.appendChild(document.createTextNode(' zmienia status strony na '));

				var status = document.createElement('span');
				status.style.fontStyle = 'italic';
				status.appendChild(document.createTextNode(this.statuses[entry.level]));
				line.appendChild(status);

				message.appendChild(line);
			}
			mw.notify( message, { tag: 'ph_gadget' } );
		}
	}
};

jQuery(document).ready(function() {
	proofreadHistoryGadget.init();
});