MediaWiki:Gadget-articleQuality.js
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);
});
}
);
}
}
}
});
});