imported>=海豚= |
imported>Irukaza |
第1行: |
第1行: |
| // <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>
| |
|
| |
| mw.loader.getState('ext.gadget.rtrc') ? mw.loader.load('ext.gadget.rtrc') : mw.loader.load('https://www.mediawiki.org/w/load.php?modules=ext.gadget.rtrc&lang=' + mw.config.get('wgUserLanguage', 'en')));
| |