User:Splarka/synaesthesia.js

/* Induced Synaesthesia, version [0.5.5] Originally from: http://en.wikipedia.org/wiki/User:Splarka/synaesthesia.js

This takes a list of  on a given page and iterates over all link in them. If it finds a link to a user page or Special:Contributions/User (for IPs and red users), it then takes the MD5 of that username and assigns the first 6 characters as the color for that line (so all lines by that user are the same). Clicking the object repeatly adds a numeric salt to the username to completely randomize the colors in a predictable way.

User variables:
 * synaesthesiaUserSalt = a number you found you like
 * synaesthesiaAutoStart = set to true if you don't want to manually activate.

Currently available in:
 * All Special: pages
 * Perhaps limit to: RecentChanges, RecentChangesLinked, NewPages, Watchlist, Log, IPBlockList
 * action=history
 * Any others?

mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Lupin/md5-2.2alpha.js&action=raw&ctype=text/javascript'); appendCSS('.cascadecolor * {color:inherit !important;} .cascadecolor a {font-weight:bold;text-decoration:underline;}'); var synaesthesiaSalt = 0;

function synaesthesia { var salt = synaesthesiaSalt; var docobj = document.getElementById('bodyContent') || document.getElementById('content') || document.getElementById('mw-content') || document.body var li = docobj.getElementsByTagName('li'); var md5 = {}; //cacheable array, makes it a bit faster. for(var i=0;i 1) { var usersalt = (salt != 0) ? user[1] + salt : user[1] if(!md5[usersalt]) md5[usersalt] = hex_md5(usersalt).substring(0,6) var safecol = sanitizeColor(md5[usersalt],'ffffff'); if(safecol) li[i].style.color = '#' + safecol li[i].style.backgroundColor = '#ffffff'; if(li[i].className.indexOf(' cascadecolor') == -1) li[i].className += ' cascadecolor' break; continue; }   }  }  document.getElementById('t-syn').getElementsByTagName('a')[0].setAttribute('title','Current salt: ' + synaesthesiaSalt); synaesthesiaSalt++; }

function synaesthesiaStarter { if(window.synaesthesiaUserSalt) synaesthesiaSalt = parseInt(synaesthesiaUserSalt) if(isNaN(synaesthesiaSalt) || synaesthesiaSalt > 26 || synaesthesiaSalt < 0) synaesthesiaSalt = 0 mw.util.addPortletLink('p-tb','javascript:synaesthesia','Synaesthesia','t-syn','Synaesthesia mode. First salt: ' + synaesthesiaSalt); if(window.synaesthesiaAutoStart) synaesthesia } if(mw.config.get('wgNamespaceNumber') == -1 || mw.config.get('wgAction') == 'history') addOnloadHook(synaesthesiaStarter)

//Make sure the color is always a bit visible. function sanitizeColor(newcolor,basecolor) { var bol = (basecolor) ? basecolor.replace(/\#/,'') : 'ffffff' var col = newcolor.replace(/\#/,'');

var c = colorDecimalArray(col); if(!c) return false var b = colorDecimalArray(bol); if(!b) b = [255,255,255]

var fbright = (c[0] * .117255 + c[1] * .230196 + c[2] * .044706); var bbright = (b[0] * .117255 + b[1] * .230196 + b[2] * .044706); var contrast = Math.round(Math.abs(fbright - bbright)); if(contrast > 33) return col

for(var i=0;i<3;i++) { c[i] = (c[i] < 128) ? c[i] + 128 : c[i] - 128 c[i] = c[i].toString(16).toUpperCase; if(c[i].length == 1) c[i] = '0' + c[i] } return c.join('').toLowerCase;

function colorDecimalArray(clr) { if(clr.length == 3) clr = clr.substr(0,1) + clr.substr(0,1) + clr.substr(1,1) + clr.substr(1,1) + clr.substr(2,1) + clr.substr(2,1) if(clr.length != 6) return false var obj = [0,0,0]; for(var i=0;i<3;i++) obj[i] = parseInt(clr.substr(i*2,2),16) for(var i=0;i<3;i++) if(isNaN(obj[i])) return false return obj; } }