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.

User:Lethosor/rater 0.1.js

From Dwarf Fortress Wiki
< User:Lethosor
Revision as of 22:45, 13 April 2013 by Lethosor (talk | contribs) (New rating script (which does little to no actual work))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files
/*
Rating Script (DF Wiki)

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

addOnloadHook(function(){jQuery(function($){
	SCOPE = this
	var rater = {}
	function PD(e){//preventDefault
		if(e && 'preventDefault' in e && 'call' in e.preventDefault)
			e.preventDefault()
	}
	
	rater.page = {
		name: wgPageName,
		url: wgScript+'?title='+wgPageName
	}

	// 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.box.clear = function(){
		rater.box.html('')
		rater.box.append(rater.cancel_link)
			.append($('<h2>').text('Rating '+wgPageName));
	};
	rater.box.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){
		PD(e);
		rater.overlay.stop(1,1).fadeIn(500);
		rater.box.stop(1,1).fadeIn(500);
		rater.box.clear()
		rater.box.append('<p>Performing automatic tests, please wait...</p>');
		rater.begin_tests();
	};
	$('body').on('click', 'a[href=#rater-invoke]', rater.invoke)
	
	/*
	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--
		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'
		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=250', 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++
			}
			return num;
		});
		tests.add('orphaned', wgScript+'/Special:WhatLinksHere/'+wgPageName, function(data){
			return !$(data).find('#mw-whatlinkshere-list').length;
		});
		tests.add('deadend', render_url, function(data){
			return !$(data).find('a[href*="'+wgScript+'"]').length;
		});
		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.display_test_results=function(){
		rater.box.clear();
		data=tests.results;
		for(i in data){
			if(i in {}) continue;
			rater.box.append($("<p>"+i+": "+data[i]+"</p>"));
		}
		
		
		rater.score = 0
			+rater.score_bool(data.deadend,-25)
			+rater.score_bool(data.orphaned,-50)
			+rater.score_int(data.redlinks,-5)
			+rater.score_int(data.editors,35,-30)
		;
		rater.box.append($("<p>").text("Score: "+rater.score))
	};
	
	//export
	rater.tests = tests;
	window.rater=rater
	return rater;
	
});});