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"
Jump to navigation
Jump to search
m (This should do for now) |
(update again, better display (length makes sense)) |
||
Line 5: | Line 5: | ||
*/ | */ | ||
− | + | //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} | ||
addOnloadHook(function(){jQuery(function($){ | addOnloadHook(function(){jQuery(function($){ | ||
SCOPE = this | SCOPE = this | ||
var rater = {} | var rater = {} | ||
function PD(e){//preventDefault | function PD(e){//preventDefault | ||
− | if(e && 'preventDefault' | + | if(e && e['preventDefault'] && 'call' in e.preventDefault) |
e.preventDefault() | e.preventDefault() | ||
} | } | ||
− | + | function is_func(x){ return !!(x&&x['call'])} | |
rater.page = { | rater.page = { | ||
name: wgPageName, | name: wgPageName, | ||
Line 20: | Line 21: | ||
rater.is_valid_page = function(page){ | rater.is_valid_page = function(page){ | ||
+ | if(!page) page=wgPageName; | ||
ns=page.split(':')[0]; | ns=page.split(':')[0]; | ||
if('DF2012 v0.31 40d 23a'.split(' ').indexOf(ns)+1) return true | if('DF2012 v0.31 40d 23a'.split(' ').indexOf(ns)+1) return true | ||
Line 28: | Line 30: | ||
rater.error_invalid_page=function(){ | rater.error_invalid_page=function(){ | ||
rater.box.clear().append('<span class="error">Invalid page</span>') | 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>") | ||
}; | }; | ||
Line 72: | Line 76: | ||
}; | }; | ||
$('body').on('click', 'a[href=#rater-invoke]', rater.invoke) | $('body').on('click', 'a[href=#rater-invoke]', rater.invoke) | ||
+ | $('body').on('click', 'a[href=#rater-force]', function(e){rater.invoke(e,1)}); | ||
/* | /* | ||
Line 173: | Line 178: | ||
}; | }; | ||
rater.metadata = { | rater.metadata = { | ||
− | + | 'redlinks':{type:1,name:'Redlinks'}, | |
+ | 'links': {type:1,name:'Outbound links'}, | ||
+ | 'linkshere': {type:1,name:'Incoming links'}, | ||
+ | 'editors': {type:1,name:'Editor count'}, | ||
+ | '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(){ | rater.display_test_results=function(){ | ||
+ | var md=rater.metadata; | ||
rater.box.clear(); | rater.box.clear(); | ||
data=tests.results; | data=tests.results; | ||
for(i in data){ | for(i in data){ | ||
− | + | name=md[i].name; | |
− | rater.box.append($("<p>"+ | + | str=is_func(md[i].str)?md[i].str(data[i]):data[i]; |
+ | rater.box.append($("<p>"+name+": "+str+"</p>")); | ||
} | } | ||
Revision as of 15:48, 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}
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.box.clear = function(){
rater.box.html('')
rater.box.append(rater.cancel_link)
.append($('<h2>').text('Rating '+wgPageName));
return rater.box;
};
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, 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++
}
return num;
});
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:1,name:'Editor count'},
'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(i in data){
name=md[i].name;
str=is_func(md[i].str)?md[i].str(data[i]):data[i];
rater.box.append($("<p>"+name+": "+str+"</p>"));
}
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,20,-15)
;
rater.box.append($("<p>").text("Score: "+rater.score))
};
//export
rater.tests = tests;
window.rater=rater
return rater;
});});