User:Irukaza/common.js:修订间差异

H萌娘,万物皆可H的百科全书!
跳到导航 跳到搜索
imported>=海豚=
(//QuickEdit)
imported>=海豚=
(//QuickEdit)
(未显示同一用户的1个中间版本)
第196行: 第196行:
});
});
// </nowiki>
// </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')));

2020年5月14日 (四) 17:32的版本

// <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')));