v50 Steam/Premium information for editors
  • v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
  • Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.

Difference between revisions of "User:Lethosor/rater 0.1.js"

From Dwarf Fortress Wiki
Jump to navigation Jump to search
m (update again)
m (add stuff)
Line 6: Line 6:
  
 
//Like python: 'a{0}b'.format('c') == 'acb'
 
//Like python: 'a{0}b'.format('c') == 'acb'
String.prototype.format=function(){s=this;for(i=0;i<arguments.length;i++){s=s.replace(RegExp('\\{'+i+'\\}','g'), arguments[i])};return s}
+
String.prototype.format=function(){s=this;for(i=0;i<arguments.length;i++){s=s.replace(RegExp('\\{'+i+'\\}','g'), arguments[i])};return s};
 +
String.prototype.capitalize=function(){return this.slice(0,1).toUpperCase()+this.slice(1)};
 
addOnloadHook(function(){jQuery(function($){
 
addOnloadHook(function(){jQuery(function($){
 
SCOPE = this
 
SCOPE = this
Line 14: Line 15:
 
e.preventDefault()
 
e.preventDefault()
 
}
 
}
function is_func(x){ return !!(x&&x['call'])}
+
function is_func(x){return !!(x&&x['call'])}
 
rater.page = {
 
rater.page = {
 
name: wgPageName,
 
name: wgPageName,
Line 44: Line 45:
 
rater.cancel_link = $('<a>').text('Cancel').attr('href','#rater-cancel').css({color:'red',  
 
rater.cancel_link = $('<a>').text('Cancel').attr('href','#rater-cancel').css({color:'red',  
 
'float':'right'}).appendTo(rater.box);
 
'float':'right'}).appendTo(rater.box);
 +
 +
rater.popup={};
 +
rater.popup.overlay = $('<div>').css({width:'100%', height:'100%', top:0, left:0,
 +
position:'fixed', 'background-color':'rgba(128,128,128,0.5)', 'z-index':10001})
 +
.hide().appendTo('body');
 +
rater.popup.box = $('<div>').css({width:'40%', height:'60%', top:'20%', left:'30%',
 +
position:'fixed', 'background-color':'white', 'z-index':10002, padding:'1em',
 +
overflow:'scroll'})
 +
.hide().appendTo('body');
 +
rater.popup.close_link = $('<a>').text('Close').attr('href','#rater-popup-hide').css({color:'red',
 +
'float':'right'}).appendTo(rater.popup.box);
 
rater.box.clear = function(){
 
rater.box.clear = function(){
 
rater.box.html('')
 
rater.box.html('')
Line 50: Line 62:
 
return rater.box;
 
return rater.box;
 
};
 
};
 +
rater.popup_show=function(e){//note _ - avoid $ clash
 +
PD(e);
 +
rater.popup.box.stop(1,1).fadeIn(500);
 +
rater.popup.overlay.stop(1,1).fadeIn(500);
 +
};
 +
rater.popup_hide = function(e){
 +
PD(e)
 +
rater.popup.overlay.stop(1,1).fadeOut(500);
 +
rater.popup.box.stop(1,1).fadeOut(500);
 +
};
 +
$('body').on('click','a[href=#rater-popup-hide]',rater.popup_hide);
 
rater.box.clear();
 
rater.box.clear();
 +
rater.popup.clear=function(){
 +
rater.popup.box.html('').append(rater.popup.close_link)
 +
};
 +
rater.popup.clear();
 +
 
 
 
rater.cancel = function(e){
 
rater.cancel = function(e){
Line 183: Line 211:
 
'linkshere': {type:1,name:'Incoming links'},
 
'linkshere': {type:1,name:'Incoming links'},
 
'editors': {type:'o',name:'Editor count',str:function(o){return o.total},
 
'editors': {type:'o',name:'Editor count',str:function(o){return o.total},
int:function(o){return o.total;}},
+
int:function(o){return o.total;},
 +
info:function(o,view){
 +
tbl=$("<table>").appendTo(view)
 +
for(i in o){
 +
if(i in {}||i=='total') continue;
 +
tbl.append('<tr><td>{0}:</td><td>{1}</td></tr>'.format(i,o[i]))
 +
}
 +
tbl.append('<tr style="font-weight:bold"><td>Total:</td><td>{0}</td></tr>'
 +
.format(o.total))
 +
},
 +
},
 
'length': {type:'o', str:function(obj){
 
'length': {type:'o', str:function(obj){
 
return "Weighted: {0} ({1} characters, {2} without templates)"
 
return "Weighted: {0} ({1} characters, {2} without templates)"
.format(obj.average,obj.full,obj.notemplate)
+
.format(obj.average,obj.full,obj.notemplate);},
},name:'Article length'},
+
name:'Article length'},
 
};
 
};
 
 
Line 194: Line 232:
 
rater.box.clear();
 
rater.box.clear();
 
data=tests.results;
 
data=tests.results;
for(i in data){
+
for(var i in data){
 
name=md[i].name;
 
name=md[i].name;
 
str=is_func(md[i].str)?md[i].str(data[i]):data[i];
 
str=is_func(md[i].str)?md[i].str(data[i]):data[i];
rater.box.append($("<p>"+name+": "+str+"</p>"));
+
app=''
 +
if(is_func(md[i].info)){
 +
app=$('<a href="#">[Info]</a>').data({f:md[i].info,d:data[i]})
 +
.click(function(e){d=$(this).data()
 +
rater.popup.clear(); rater.popup_show(e);
 +
d.f(d.d,rater.popup.box.append($("<div>")))
 +
}).css('padding-left','1em');
 +
}
 +
rater.box.append($("<p>"+name+": "+str+"</p>").append(app));
 
}
 
}
 
 

Revision as of 17:01, 14 April 2013

/*
Rating Script (DF Wiki)

Improved version -- now uses jQuery, extra options (existence not guaranteed)
*/

//Like python: 'a{0}b'.format('c') == 'acb'
String.prototype.format=function(){s=this;for(i=0;i<arguments.length;i++){s=s.replace(RegExp('\\{'+i+'\\}','g'), arguments[i])};return s};
String.prototype.capitalize=function(){return this.slice(0,1).toUpperCase()+this.slice(1)};
addOnloadHook(function(){jQuery(function($){
	SCOPE = this
	var rater = {}
	function PD(e){//preventDefault
		if(e && e['preventDefault'] && 'call' in e.preventDefault)
			e.preventDefault()
	}
	function is_func(x){return !!(x&&x['call'])}
	rater.page = {
		name: wgPageName,
		url: wgScript+'/'+wgPageName
	}
	
	rater.is_valid_page = function(page){
		if(!page) page=wgPageName;
		ns=page.split(':')[0];
		if('DF2012 v0.31 40d 23a'.split(' ').indexOf(ns)+1) return true
		if($('#norate').length) return false
		return false
	};
	
	rater.error_invalid_page=function(){
		rater.box.clear().append('<span class="error">Invalid page</span>')
			.append("<p>This page is in an invalid namespace. You can "+
				"<a href='#rater-force'>view this page's rating anyway</a> or "+
				"<a href='#rater-cancel'>close this window</a>.</p>")
	};
	
	// Set up UI
	rater.overlay = $('<div>').css({width:'100%', height:'100%', top:0, left:0,
		position:'fixed', 'background-color':'rgba(128,128,128,0.5)', 'z-index':9999})
		.hide().appendTo('body');
	rater.box = $('<div>').css({width:'80%', height:'80%', top:'10%', left:'10%',
		position:'fixed', 'background-color':'white', 'z-index':10000, padding:'1em'})
		.hide().appendTo('body');
	rater.cancel_link = $('<a>').text('Cancel').attr('href','#rater-cancel').css({color:'red', 
		'float':'right'}).appendTo(rater.box);
	
	rater.popup={};
	rater.popup.overlay = $('<div>').css({width:'100%', height:'100%', top:0, left:0,
		position:'fixed', 'background-color':'rgba(128,128,128,0.5)', 'z-index':10001})
		.hide().appendTo('body');
	rater.popup.box = $('<div>').css({width:'40%', height:'60%', top:'20%', left:'30%',
		position:'fixed', 'background-color':'white', 'z-index':10002, padding:'1em',
		overflow:'scroll'})
		.hide().appendTo('body');
	rater.popup.close_link = $('<a>').text('Close').attr('href','#rater-popup-hide').css({color:'red', 
		'float':'right'}).appendTo(rater.popup.box);
	rater.box.clear = function(){
		rater.box.html('')
		rater.box.append(rater.cancel_link)
			.append($('<h2>').text('Rating '+wgPageName));
		return rater.box;
	};
	rater.popup_show=function(e){//note _ - avoid $ clash
		PD(e);
		rater.popup.box.stop(1,1).fadeIn(500);
		rater.popup.overlay.stop(1,1).fadeIn(500);
	};
	rater.popup_hide = function(e){
		PD(e)
		rater.popup.overlay.stop(1,1).fadeOut(500);
		rater.popup.box.stop(1,1).fadeOut(500);
	}; 
	$('body').on('click','a[href=#rater-popup-hide]',rater.popup_hide);
	rater.box.clear();
	rater.popup.clear=function(){
		rater.popup.box.html('').append(rater.popup.close_link)
	};
	rater.popup.clear();

	
	rater.cancel = function(e){
		PD(e)
		rater.overlay.stop(1,1).fadeOut(500);
		rater.box.stop(1,1).fadeOut(500);
	}; 
	$('body').on('click','a[href=#rater-cancel]',rater.cancel);
	
	// Set up link
	rater.show_link = $("<li>").append($('<span>').append(
		$("<a href='#rater-invoke'>").text('Rate')
	));
	$("#left-navigation #p-namespaces ul:nth(0)").append(rater.show_link)
	
	rater.invoke = function(e, force){
		PD(e);
		rater.overlay.stop(1,1).fadeIn(500);
		rater.box.stop(1,1).fadeIn(500);
		if(!rater.is_valid_page(wgPageName) && !force)
			return rater.error_invalid_page();
		rater.box.clear()
		rater.box.append('<p>Performing automatic tests (<span class="rater-tests-left"></span> remaining), please wait...</p>');
		rater.begin_tests();
	};
	$('body').on('click', 'a[href=#rater-invoke]', rater.invoke)
	$('body').on('click', 'a[href=#rater-force]', function(e){rater.invoke(e,1)});
	
	/*
	Tests
	
	Usage: Specify a URL to get data from and `processor` function to extract the
	needed data
	
	*/
	var tests={};
	tests.list={}; //list of all tests
	tests.results={}; //shortcut: data[x]==lists[x].data
	
	tests.num_waiting = 0;
	
	tests.add = function(name, data_url, processor){ 
		//Note: jQuery caches Ajax requests by default, no need to here
		tests.list[name] = {data_url:data_url, processor:processor}; 
		//console.log('retrieving')
		$.get(data_url, function(data){
			tests.process(name, data);
		});
		tests.num_waiting++
	};
	tests.process = function(name,raw_data){
		result = tests.list[name].processor(raw_data);
		tests.list[name].result = tests.results[name] = result
		tests.num_waiting--
		$(".rater-tests-left").text(tests.num_waiting)
		if(tests.num_waiting <= 0){
			setTimeout(tests.all_complete, 1); //avoid stacking
		}
	};
	
	tests.all_callbacks=[]; //when all tests are done
	tests.all_complete = function(){
		for(i=0; i<tests.all_callbacks.length; i++){
			tests.all_callbacks[i]();
		}
	};
	tests.add_callback=function(func){
		tests.all_callbacks.push(func);
	};
	
	rater.begin_tests = function(){
		render_url=rater.page.url+'?action=render'
		raw_url=rater.page.url+'?action=raw'
		tests.add('redlinks', render_url, function(data){
			all_links = data.match(/<a .*<\/a>/g);
			if(!all_links) return 0; //no links
			total_redlinks=0;
			$.each(all_links, function(i,link){
				if(link.match(/href=.*redlink=1/)) total_redlinks++;
			});
			return total_redlinks
		});
		tests.add('editors', rater.page.url+'?action=history&limit=100', function(data){
			all_editors = data.match(/<li>.*<\/li>/g)
			if(!all_editors) return 0; //no editors
			editors={};
			$.each(all_editors, function(i,li){
				ed = $(li).find('.mw-userlink:nth(0)').text()
				if(!(ed in editors)) editors[ed]=0;
				editors[ed]++ 
			});
			num=0;
			for(i in editors){
				if(i in {}) continue;
				num++
			}
			editors.total=num;
			return editors;
		});
		tests.add('linkshere', wgScript+'/Special:WhatLinksHere/'+wgPageName, function(data){
			return $(data).find('#mw-whatlinkshere-list').length;
		});
		tests.add('links', render_url, function(data){
			return $(data).find('a[href*="'+wgScript+'"]').length;
		});
		tests.add('length', raw_url, function(data){
			var a={
				'full':data.length,
				'nospace':data.replace(/\s/g,'').length,
				'notemplate':data.replace(/{{[^}]*?}}/g,'').length,
				'raw':data.replace(/\s/g,'').replace(/{{[^}]*?}}/g,'').length
			};
			a.average=.1 * a.full + .2*a.nospace + .3*a.notemplate + .4*a.raw
			return a
		});
		tests.add_callback(function(){
			rater.display_test_results();
		});
	};
	
	rater.score_bool=function(v,y,n){
		if(isNaN(Number(n))) n=-y;
		return Number(v?y:n);
	};
	rater.score_int=function(v,weight,base){
		if(!base) base=0;
		return v*weight+base;
	};
	rater.metadata = {
		'redlinks':{type:1,name:'Redlinks'},
		'links': {type:1,name:'Outbound links'},
		'linkshere': {type:1,name:'Incoming links'},
		'editors': {type:'o',name:'Editor count',str:function(o){return o.total},
			int:function(o){return o.total;},
			info:function(o,view){
				tbl=$("<table>").appendTo(view)
				for(i in o){
					if(i in {}||i=='total') continue;
					tbl.append('<tr><td>{0}:</td><td>{1}</td></tr>'.format(i,o[i]))
				}
				tbl.append('<tr style="font-weight:bold"><td>Total:</td><td>{0}</td></tr>'
					.format(o.total))
			},
		},
		'length': {type:'o', str:function(obj){
			return "Weighted: {0} ({1} characters, {2} without templates)"
				.format(obj.average,obj.full,obj.notemplate);},
		name:'Article length'},
	};
	
	rater.display_test_results=function(){
		var md=rater.metadata;
		rater.box.clear();
		data=tests.results;
		for(var i in data){
			name=md[i].name;
			str=is_func(md[i].str)?md[i].str(data[i]):data[i];
			app=''
			if(is_func(md[i].info)){
				app=$('<a href="#">[Info]</a>').data({f:md[i].info,d:data[i]})
				.click(function(e){d=$(this).data()
					rater.popup.clear();	rater.popup_show(e);
					d.f(d.d,rater.popup.box.append($("<div>")))
				}).css('padding-left','1em');
			}
			rater.box.append($("<p>"+name+": "+str+"</p>").append(app));
		}
		
		
		rater.score = 0
			+rater.score_bool(!data.links,-25) 		//orphaned
			+rater.score_bool(!data.linkshere,-30) 	//dead end
			+rater.score_int(data.links,0.5)
			+rater.score_int(data.linkshere,0.75)
			+rater.score_int(data.redlinks,-5,10)
			+rater.score_int(data.editors.total,20,-15)
			
		;
		rater.box.append($("<p>").text("Score: "+rater.score))
	};
	
	//export
	rater.tests = tests;
	window.rater=rater
	return rater;
	
});});