MediaWiki:Gadget-articleQuality.js

Från Wikipedia

OBS: Efter du har publicerat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.

  • Firefox / Safari: Håll ned Skift och klicka på Uppdatera sidan eller tryck Ctrl-F5 eller Ctrl-R (⌘-R på Mac)
  • Google Chrome: Tryck Ctrl-Skift-R (⌘-Skift-R på Mac)
  • Internet Explorer / Edge: Håll ned Ctrl och klicka på Uppdatera eller tryck Ctrl-F5
  • Opera: Tryck Ctrl-F5.
/**
 * This script shows a popup message when an article has been edited, giving the
 * editor an indication of how the edit changed the quality of the article.
 * 
 * ORES (https://www.mediawiki.org/wiki/ORES) is used to automatically assess
 * the quality of the article. The popup gives the editor the new quality and
 * the quality before the edit along with a symbol indicating how the quality
 * changed.
 * 
 * Localization strings can be found at the begining of the script along with
 * configuration parameters.
 * 
 * This script uses the Article Quality System developed by Aaron Halfaker
 * (https://meta.wikimedia.org/wiki/User:EpochFail).
 */

$(function() {
	var i18n = {
		close: "Stäng",
		more: "Mer...",
		previousVersionSuffix: "(föregående version)",
		whatIsThis: "Vad är det här?",
		apiResponse: "API-svar",
		currentVersion: "Nuvarande version",
		previousVersion: "Föregående version"
	};
	// I18n strings that need to be parsed from wikitext. If a string contains no
	// wikitext syntax, add it to `i18n` instead.
	var i18nWikitext = {
		helpText: "Värdena ovan är en automatisk bedömning av artikelns kvalitet, mellan 0 och 10. Bedömningen kan skilja sig från den kvalitet som tilldelats artikeln manuellt. Bedömningen har genererats med hjälp av [[:mw:ORES | ORES]].",
		predictionUp: "[[Fil:Green_Arrow_Up.svg|20px]]",
		predictionDown: "[[Fil:Red_Arrow_Down.svg|20px]]",
		predictionEqual: "[[Fil:Straight_Line_Steady.svg|20px]]"
	};
	var config = {
		ores_host: "https://ores.wikimedia.org",
		weights: {s: 0, r: 6, b: 8, u: 10},
		names: {
			u: "[[Bild:Utmarkt Guld.svg|20 px]] Utmärkt",
			b: "[[Bild:Bra_alt.svg|20 px]] Bra",
			r: "[[Bild:Rekommenderad.svg|20 px]] Rekommenderad",
			s: "[[Bild:Wiki letter w.svg|20 px]] Stub"
		},
		assessment_system: "Kvalitetsnivåer",
		dbname: mw.config.get("wgDBname")
	};

	var articleQuality;
	var hideTimeout;
	var $popup;
	var $newPrediction;
	var $oldPrediction;
	var $newRawData;
	var $oldRawDataContainer;
	var $oldRawData;
	var $predictionSymbol;

	function parseI18nString(key) {
		return articleQuality.parseText(i18nWikitext[key])
			.then(function(html) {
				i18n[key] = html;
			});
	}

	function prepareI18n() {
		var promises = [];
		Object.keys( i18nWikitext ).forEach( function( key ) {
			promises.push( parseI18nString( key ) );
		} );
		return $.when.apply($, promises);
	}

	function createPopup() {
		$popup = $("<div></div>").addClass("quality-assessment-popup");
		var $popupContent = $("<div></div>")
			.addClass("quality-assessment-content")
			.appendTo($popup);
		var $predictions = $("<div></div>")
			.addClass("quality-assessment-predictions")
			.appendTo($popupContent);
		var $predictionScores = $("<div></div>")
			.appendTo($predictions);
		$newPrediction = $("<div></div>")
			.addClass("quality-assessment-new-prediction")
			.appendTo($predictionScores);
		$oldPrediction = $("<div></div>")
			.addClass("quality-assessment-old-prediction")
			.appendTo($predictionScores);
		$predictionSymbol = $("<div></div>").appendTo($predictions);
		$("<span></span>")
			.html(i18n.previousVersionSuffix)
			.appendTo($oldPrediction);
		var $moreInformation = $("<div></div>")
			.hide()
			.appendTo($popupContent);
		$("<h2></h2>").html(i18n.whatIsThis).appendTo($moreInformation);
		$("<div></div>").html(i18n.helpText).appendTo($moreInformation);
		$("<h2></h2>").html(i18n.apiResponse).appendTo($moreInformation);
		var $rawData = $("<div></div>")
			.addClass("quality-assessment-raw-data")
			.appendTo($moreInformation);
		$oldRawDataContainer = $("<div></div>").appendTo($rawData);
		$("<h3></h3>")
			.html(i18n.previousVersion)
			.appendTo($oldRawDataContainer);
		$oldRawData = $("<pre></pre>").appendTo($oldRawDataContainer);
		var $newRawDataContainer = $("<div></div>").appendTo($rawData);
		$("<h3></h3>")
			.html(i18n.currentVersion)
			.appendTo($newRawDataContainer);
		$newRawData = $("<pre></pre>").appendTo($newRawDataContainer);
		$("<button></button>")
			.text(i18n.close)
			.click(function() {
				$popup.hide();
			})
			.appendTo($moreInformation);
		$("<button></button>")
			.text(i18n.more)
			.click(function(event) {
				$moreInformation.show();
				$(event.target).hide();
				clearTimeout(hideTimeout);
			})
			.appendTo($popupContent);
		$popup.hide();
		$("body").prepend($popup);
	}

	function getPreviousRevId(title){
		return articleQuality.mwApi.get({
			action: "query",
			prop: "revisions",
			titles: title,
			rvprop: "ids",
			formatversion: 2
		})
			.then(function(data) {
				return data.query.pages[0].revisions[0].parentid;
			});
	}

	function renderScore($element, score) {
		var prediction = articleQuality.extractPrediction(score);
		var weightedSum =
			Math.round(articleQuality.computeWeightedSum(score)*100)/100;
		var rawText = articleQuality.names[prediction] +
			" (" + weightedSum + ")";
		return articleQuality.parseText(rawText)
			.then(function(html) {
				$element.html(html + $element.html());
				return weightedSum;
			});
	}

	function addScore($prediction, $rawData, score) {
		$rawData.text(JSON.stringify(score, null, 2));
		return renderScore($prediction,	score);
	}

	function addScoresToPopup() {
		var title = mw.config.get("wgPageName");
		var revId = mw.config.get("wgCurRevisionId");
		return $.when(
			getPreviousRevId(title)
				.then(function(id) {
					if(id) {
						return articleQuality.oresScore(id);
					} else {
						return $.Deferred().resolve();
					}
				})
				.then(function(score) {
					if(score) {
						return addScore($oldPrediction, $oldRawData, score);
					} else {
						$oldPrediction.hide();
						$oldRawDataContainer.hide();
						return $.Deferred().resolve();
					}
				}),
			articleQuality.oresScore(revId)
				.then(function(score) {
					return addScore($newPrediction, $newRawData, score);
				})
		);
	}

	function addPredictionSymbol(oldScore, newScore) {
		var html;
		if(newScore > oldScore) {
			html = i18n.predictionUp;
		} else if(newScore < oldScore) {
			html = i18n.predictionDown;
		} else {
			html = i18n.predictionEqual;
		}
		$predictionSymbol.html(html);
	}

	mw.hook("postEdit").add(function(data) {
		if ( mw.config.get( 'wgPostEdit' ) !== 'restored' ) {
			if ( mw.config.get( 'wgNamespaceNumber' ) === 0 || ( mw.config.get( 'wgNamespaceNumber' ) === 2 && mw.config.get( 'wgPageName' ).indexOf( '/' ) !== -1 ) ) {
				if ( mw.config.get( 'wgPageContentModel' ) === 'wikitext' ) {
					$.getScript(
						"https://meta.wikimedia.org/w/index.php?title=User:EpochFail/ArticleQuality-system.js&action=raw&ctype=text/javascript",
						function() {
							articleQuality = new ArticleQuality(config);
							prepareI18n()
								.then(function() {
									createPopup();
									return addScoresToPopup();
								})
								.then(function(oldScore, newScore) {
									if(oldScore) {
										// Show symbol only if there is an old score to compare
										// with.
										addPredictionSymbol(oldScore, newScore);
									}
									$popup.show();
									hideTimeout = setTimeout(function() {
										$popup.hide();
									}, 5000);
								});
						}
					);
				}
			}
		}
	});
});