MediaWiki:Gadget-pageview.js
Merk: Etter publisering vil det kanskje være nødvendig å slette mellomlageret i nettleseren din for å se endringene.
- Firefox / Safari: Hold Shift mens du klikker på Oppdater, eller trykk enten Ctrl+F5 eller Ctrl+R (⌘+R på Mac)
- Google Chrome: Trykk Ctrl+Shift+R (⌘+Shift+R på Mac)
- Internet Explorer / Edge: Hold Ctrl mens du trykker på Oppdater eller trykk Ctrl+F5
- Opera: Ttrykk Ctrl+F5.
// Code to make a footer message about pageviews
// © John Erling Blad, Creative Commons by Attribution 3.0
$(function( $content ) {
"use strict";
var days = 7;
var conf = mw.config.get( [
'wgUserLanguage',
'wgNamespaceNumber',
'wgServerName',
'wgPageName'
] );
if ( conf.wgNamespaceNumber !== 0) {
mw.log( "So wise so young, they say do never live long." );
return;
}
var ajax = {
'protocol': mw.Uri.protocol,
'host': 'wikimedia.org',
'path': '/api/rest_v1/metrics/pageviews/per-article'
};
var buildURI = function(ajax, opts) {
var args = jQuery.extend({}, ajax, opts);
var path = ajax.path.split('/');
if (args.project === undefined) {
args.project = conf.wgServerName;
}
if (/^[\w\.]*$/.test(args.project)) path.push(args.project);
if (args.access === undefined) {
args.access = 'all-access';
}
if (/^[-\w]*$/.test(args.access)) path.push(args.access);
if (args.agents === undefined) {
args.agents = 'all-agents';
}
if (/^[-\w]*$/.test(args.agents)) path.push(args.agents);
if (args.pageName === undefined) {
args.pageName = conf.wgPageName;
path.push(args.pageName);
}
else {
if (/^[-+_\w\s%]*$/i.test(args.pageName)) path.push(args.pageName);
}
if (args.granularity === undefined) {
args.granularity = 'daily';
}
if (/^[\w]*$/.test(args.granularity)) path.push(args.granularity);
var end = new Date();
var start = new Date(end.valueOf()-days*24*60*60*1000);
if (args.start === undefined) {
args.start = ''
+start.getUTCFullYear()
+(start.getUTCMonth()<10 ? '0' : '')+(start.getUTCMonth()+1)
+(start.getUTCDate()<10 ? '0' : '')+start.getUTCDate();
}
if (/^[\d]*$/i.test(args.start)) path.push(args.start);
if (args.end === undefined) {
args.end = ''
+end.getUTCFullYear()
+(end.getUTCMonth()<10 ? '0' : '')+(end.getUTCMonth()+1)
+(end.getUTCDate()<10 ? '0' : '')+end.getUTCDate();
}
if (/^[\d]*$/i.test(args.end)) path.push(args.end);
try {
return new mw.Uri( jQuery.extend({}, args, { 'path': path.join('/')}) );
} catch (e) {
// Uncaught TypeError: Cannot read property 'protocol' of undefined
// e.g. https://no.wikipedia.org/w/index.php?oldid=prev&diff=20924375&title=Stord%20Folkeh%F8gskule
return null;
}
};
var replied = null;
var stats = {
count: 0,
mean: 0,
items: null
};
var api = new mw.Api();
function loadGraph() {
if (replied !== null) return;
replied = false;
api
.ajax({
action: 'parse',
prop: 'text',
title: conf.wgPageName,
text: "{{Graph:PageViews|"+days+"|"+conf.wgPageName+"}}"
})
.fail(function(){
replied = null;
})
.done(function(data){
replied = true;
var $collapsible = $('#statbox').children('.mw-collapsible-content');
$.each( data.parse.text, function ( index, text ) {
$collapsible.append($('<div>').html(text));
});
});
}
function render() {
if ($('#statbox').length > 0) {
return;
}
var text = '';
if (stats.count>0) {
var nowMsg = 'pageview-now-single';
if (stats.count>1) {
nowMsg = 'pageview-now-multiple';
}
text += mw.message( nowMsg, stats.items[0].views, stats.items[0].ago ).text();
}
if (stats.count>1) {
var prevMsg = 'pageview-prev-same';
if (stats.items[1].views > stats.items[0].views) {
prevMsg = 'pageview-prev-down';
} else if (stats.items[1].views < stats.items[0].views) {
prevMsg = 'pageview-prev-up';
}
text += ' ' + mw.message( prevMsg, Math.abs(stats.items[0].views - stats.items[1].views), stats.items[1].ago-stats.items[0].ago ).text();
var meanMsg = 'pageview-mean';
text += ' ' + mw.message( meanMsg, Math.round(stats.mean), stats.count ).text();
}
if (stats.count !== days) {
var incompleteMsg = 'pageview-incomplete';
text += ' ' + mw.message( incompleteMsg ).text();
}
var $stat = $('<li>')
.attr({'id': 'statbox', 'data-mw': 'interface'});
$stat
.text(text)
.prependTo('#footer-info');
if (stats.count>1) {
$stat
.addClass('statbox mw-collapsible mw-collapsed')
.append($('<div>').addClass('mw-collapsible-content'))
.makeCollapsible();
}
$stat.children('.mw-collapsible-toggle').mouseover(loadGraph);
}
var url = buildURI(ajax, {});
if(!url) return;
var statsRequest = $.ajax({
'cache':true,
'dataType': 'json',
'url': url })
.done(function(data){
if (!(data.items)) {
data.items = [];
}
data.items.reverse();
var num = 0;
var acc = 0;
var now = new Date();
var daylength = 24*60*60*1000;
$.each( data.items, function ( index, item ) {
acc += item.views;
num++;
var dtg = item.timestamp.replace(/^(\d{4})(\d{2})(\d{2}).*$/, '$1-$2-$3');
var then = new Date(dtg);
item.ago = Math.floor((now - then)/daylength);
});
stats.items = data.items;
stats.count = num;
stats.mean = acc/num;
});
var msgs = {
'pageview-now-single':'The page was only shown {{PLURAL:$1|one time|$1 times}} {{PLURAL:$2|yesterday|$2 days ago}}.',
'pageview-now-multiple':'The page was shown {{PLURAL:$1|one time|$1 times}} {{PLURAL:$2|yesterday|$2 days ago}},',
'pageview-prev-down':'down {{PLURAL:$1|one pageview|$1 pageviews}} from {{PLURAL:$2|the previous day|$2 days earlier}},',
'pageview-prev-same':'same as {{PLURAL:$2|the previous day|$2 days earlier}},',
'pageview-prev-up':'up {{PLURAL:$1|one pageview|$1 pageviews}} from {{PLURAL:$2|the previous day|$2 days earlier}},',
'pageview-mean':'with a mean of {{PLURAL:$1|one pageview|$1 pageviews}} over {{PLURAL:$2|one day|$2 days}}.',
'pageview-incomplete':'The dataset is incomplete.',
};
var amRequest = api.ajax({
action: 'query',
meta: 'allmessages',
amlang: conf.wgUserLanguage,
ammessages: Object.keys(msgs)
})
.done(function(data){
$.each( data.query.allmessages, function ( index, message ) {
if ( message.missing !== '' ) {
mw.messages.set( message.normalizedname, message['*'] );
} else if (msgs[message.name]) {
mw.messages.set( message.normalizedname, msgs[message.name] );
}
});
});
Promise.all([amRequest, statsRequest]).then(render);
});