// ==UserScript== // @name Block stupid fonts // @namespace - // @description Block stupid fonts // @version 1.2 // @grant none // ==/UserScript== // // /** * Userscript to whitelist or replace certain fonts and block the rest. * Author: Hiltjo Posthuma * License: WTFPL. * * TODO: * [ ] some sites still show blacklisted fonts: http://www.polygon.com/2012/10/17/3515164/league-of-legends-lan-version-in-development-at-riot-games-mac-client * [ ] test on sites with event. * [x] remove whitelist, replacelist basicly does the same if replaced with the same font. * [?] don't set defaultfont?, doesnt always seem to yield the desired results. * [x] dont use window onload event, use greasemonkey @run-at metadata? * doesn't seem to work for all sites. * [x] able to replace certain fonts. * [x] set @grant metadata to prevent Greasemonkey whining when you change the script. * * Changelog: * v1.2: * - Set Greasemonkey @grand metadata line to lower permissions. * - Ability to replace fonts. * - Simplification, remove stats and 'cache' logic, assume the browsers javascript engine is smart *derp*. * - Inherit font from parent if no fonts match the whitelist. * - Specify a default sane font for sites. * - Remove window load event. * * v1.1: * - Added execute once on window load. */ (function() { /* Replace these fonts (match regex, replaced font name) */ var replacelist = [ /* Whitelist */ [ 'arial' ], [ 'helvetica' ], [ 'liberation sans' ], [ 'verdana' ], [ 'tahoma' ], [ 'serif' ], [ 'sans-serif' ], [ 'monospace' ], /* Replace */ [ '.* mono', 'monospace' ], [ 'courier .*', 'monospace' ], [ '.*', null ] // Remove the rest. ]; var defaultfont = 'sans-serif'; var els = document.getElementsByTagName('*'); for(var i = 0; i < els.length; i++) { var cstyle = window.getComputedStyle(els[i], null); if(cstyle === null || typeof(cstyle) == 'undefined') continue; var fontfamily = cstyle.getPropertyValue('font-family') || ''; if(fontfamily == '') continue; var fonts = fontfamily.split(','); var newfonts = []; var ischanged = false; for(var j = 0; j < fonts.length; j++) { for(var r = 0; r < replacelist.length; r++) { var re = new RegExp('^["\']?' + replacelist[r][0] + '["\']?$', 'i'); if(fonts[j].match(re)) { if(replacelist[r].length > 1) { if(replacelist[r][1] !== null) newfonts.push(replacelist[r][1]); ischanged = true; } else newfonts.push(fonts[j]); break; } } } if(ischanged || fonts.length != newfonts.length) { /* Only set style if fonts were changed. */ var fns = newfonts.join(','); if(!fns.length) { // els[i].style.fontFamily = fns; // } else { if(els[i].tagName.toLowerCase() == 'body' || els[i].tagName.toLowerCase() == 'html') { // Make sure to set a proper default font if the site doesnt specify any sane font in our whitelist. // els[i].style.fontFamily = defaultfont; fns = defaultfont; } else { // els[i].style.fontFamily = 'inherit'; fns = 'sans-serif'; // 'inherit'; } } els[i].style.setProperty('font-family', fns, 'important'); // els[i].style.fontFamily = fns; } } })();