User:Irukaza/common.js:修订间差异
跳到导航
跳到搜索
imported>=海豚= (//QuickEdit) |
imported>=海豚= (//QuickEdit) |
||
第1行: | 第1行: | ||
// | // <nowiki> | ||
// Code to make a footer message about pageviews | |||
// © John Erling Blad, Creative Commons by Attribution 3.0 | |||
mw. | $(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': 'hmoegirl.com', | |||
'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); | |||
return new mw.Uri( jQuery.extend({}, args, { 'path': path.join('/')}) ); | |||
}; | |||
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').size() > 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 statsRequest = $.ajax({ | |||
'cache':true, | |||
'dataType': 'json', | |||
'url': buildURI(ajax, {}) }) | |||
.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':'本条目在{{PLURAL:$2|昨天|$2天前}}仅有$1次浏览。', | |||
'pageview-now-multiple':'本条目{{PLURAL:$2|昨天|$2天前}}被浏览$1次,', | |||
'pageview-prev-down':'较那天之前$2天减少$1次浏览,', | |||
'pageview-prev-same':'与那天之前$2天相同,', | |||
'pageview-prev-up':'较那天之前$2天增长$1次浏览,', | |||
'pageview-mean':'在$2天内平均浏览量为$1次。', | |||
'pageview-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); | |||
}); | |||
// </nowiki> |
2020年5月14日 (四) 17:11的版本
// <nowiki>
// 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': 'hmoegirl.com',
'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);
return new mw.Uri( jQuery.extend({}, args, { 'path': path.join('/')}) );
};
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').size() > 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 statsRequest = $.ajax({
'cache':true,
'dataType': 'json',
'url': buildURI(ajax, {}) })
.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':'本条目在{{PLURAL:$2|昨天|$2天前}}仅有$1次浏览。',
'pageview-now-multiple':'本条目{{PLURAL:$2|昨天|$2天前}}被浏览$1次,',
'pageview-prev-down':'较那天之前$2天减少$1次浏览,',
'pageview-prev-same':'与那天之前$2天相同,',
'pageview-prev-up':'较那天之前$2天增长$1次浏览,',
'pageview-mean':'在$2天内平均浏览量为$1次。',
'pageview-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);
});
// </nowiki>