Wikiskryba:Saper/Gadget-proofread-history.js: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
kopia
(Brak różnic)

Wersja z 17:01, 27 maj 2015

window.proofreadHistoryGadget = {
	version: 4,
	tabCaption: "Historia korekty",
	errorMessage: "Nie udało się pobrać historii",
	statuses: [
		'bez tekstu',
		'nieskorygowana',
		'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 link = document.createElement("a");
		link.appendChild(document.createTextNode(this.tabCaption));

		var span = document.createElement("span");
		span.appendChild(link);

		var li = document.createElement("li");
		li.appendChild(span);
		li.setAttribute('id', 'ca-proofread-history');

		var historyLink = document.getElementById("ca-history");
		historyLink.parentNode.insertBefore(li, historyLink);

		link.href = '#';
		var that = this;
		link.onclick = function() {
			// FIXME
			if (that.state == 'hidden' || that.state == 'visible') {
				that.fetchHistory();
			} /* else if (that.state == 'visible') {
				that.hideHistory();
			} */
		};
	},

	fetchHistory: function() {
		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;
					this.history.unshift({
						level: level,
						user: revision.user,
						timestamp: revision.timestamp
					});
				}
			}
			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) {
			jsMsg(this.errorMessage);
		} 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 = document.createElement('a');
				user.href = mw.util.wikiGetlink("User:" + entry.user);
				user.appendChild(document.createTextNode(entry.user));
				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);
			}
			jsMsg(message);
		}
	},

	hideHistory: function() {
		this.state = 'hidden';
		jsMsg('');
	}
};

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