Clean Font Families

Changes fonts back to their generic font family

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name			Clean Font Families
// @namespace		http://userscripts.org
// @include			*
// @description		Changes fonts back to their generic font family
// @author			Ralf Helbing ([email protected]), based on Sans-Serif Default by Pete Farmer <pfarmer at collaboros.com>
// @version        0.1
// ==/UserScript==

var	sansSerif = [ 'sans-serif', 'arial', 'verdana', 'tahoma', 'geneva', 'helvetica'];
var	serif = [ 'serif', 'times', 'georgia'];
var	mono = [ 'monospaced', 'fixed', 'courier'];

// set up regexps for font families
var sansSerifRegExps = new Array();
for ( var i = 0;  i < sansSerif.length;  i++) {
	var matchEx = new RegExp( sansSerif[ i], "i");
	sansSerifRegExps.push( matchEx);
}
var sansSerifRegExp = sansSerifRegExps.shift();

var serifRegExps = new Array();
for ( var i = 0;  i < serif.length;  i++) {
	var matchEx = new RegExp( serif[ i], "i");
	serifRegExps.push( matchEx);
}
var serifRegExp = serifRegExps.shift();

var monoRegExps = new Array();
for ( var i = 0;  i < mono.length;  i++) {
	var matchEx = new RegExp( mono[ i], "i");
	monoRegExps.push( matchEx);
}
var monoRegExp = monoRegExps.shift();

function	logThis( logString) {
	// GM_log( logString);
}

function cleanElementItem0( item, regex, itemInfo, replacement) {
	if ( itemInfo == replacement) {
		logThis( "already clean: " + item);
		return true;
	}
	if ( regex.test( itemInfo)) {
		var style;
		if ( typeof( item.setProperty) == "function") {
			style = item;
		} else {
			style = item.style;
		}
		style.setProperty( "font-family", replacement, "");
		logThis( "setting " + item + " with " + itemInfo + " to " + replacement);
		return true;
	}
	// logThis( "not cleaning " + item + " with " + item.style.fontFamily);
	return false;
}

function cleanElementItem( elementItem, elementFontFamily) {
	// logThis( "testing " + elementItem + " with " + elementFontFamily);
	if ( cleanElementItem0( elementItem, sansSerifRegExp, elementFontFamily, 'sans-serif')) {
		return true;
	}
	if ( cleanElementItem0( elementItem, serifRegExp, elementFontFamily, 'serif')) {
		return true;
	}
	if ( cleanElementItem0( elementItem, monoRegExp, elementFontFamily, 'monospace')) {
		return true;
	}
	var matched = false;
	// logThis( "testing " + elementItem + " with " + elementFontFamily);
	for ( var i = 0;  i < sansSerifRegExps.length;  i++) {
		matched = cleanElementItem0( elementItem, sansSerifRegExps[ i], elementFontFamily, 'sans-serif');
		if ( matched)
			return true;
	}
	if ( ! matched) {
		for ( var i = 0;  i < serifRegExps.length;  i++) {
			matched = cleanElementItem0( elementItem, serifRegExps[ i], elementFontFamily, 'serif');
			if ( matched)
				return true;
		}
	}
	if ( ! matched) {
		for ( var i = 0;  i < monoRegExps.length;  i++) {
			matched = cleanElementItem0( elementItem, monoRegExps[ i], elementFontFamily, 'monospace');
			if ( matched)
				return true;
		}
	}
	return false;
}


function processStyleSheet(sheet) {
    logThis( "processing stylesheet: " + sheet + "/" + sheet.href);
	// FF does not like us to retrieve rules from disabled css
	if ( sheet.disabled) {
		logThis( "disabled");
		return;
	}
    for (var which=0; which<sheet.cssRules.length; which++) {
        // logThis("sheet.cssRule "+ which +": "+sheet.cssRules[which].cssText);
		var rule = sheet.cssRules[which];
        if (rule.type == rule.STYLE_RULE) {
			var cssStyle = rule.style;
			var	elementFontFamily = cssStyle.getPropertyValue("font-family");
			cleanElementItem( cssStyle, elementFontFamily);
        }
        if (rule.type == rule.IMPORT_RULE) {
            logThis("Recursing into an import rule: " + rule.cssText);
            processStyleSheet(rule.styleSheet);
        }
        if (rule.type == rule.MEDIA_RULE &&
            ( rule.media.mediaText == "screen" || rule.media.mediaText == "print")) {
            logThis("Recursing into media rule: " + rule.cssText);
            processStyleSheet(rule);
        }
    }
}

// Process all stylesheets
for(var i = 0; i < document.styleSheets.length; i++) {
    var sheet = document.styleSheets[i]
    processStyleSheet(sheet);
}
logThis("CSS finished");
var elementList = document.getElementsByTagName('*');
for (var eI = elementList.length - 1; eI >= 0; eI--) {
	// get computed font family
	var elementItem = elementList[ eI];
	var style = getComputedStyle(elementItem, null);
	if ( style == null) {
		continue;
	}
	var	elementFontFamily = style.fontFamily;
	// if parent exists, check if font family different
	var parent = elementItem.parentNode;
	if ( parent != null && parent.nodeType == Node.ELEMENT_NODE) {
		// logThis("parent type: " + parent.nodeType + " of " + elementItem);
		style = getComputedStyle(parent, null);
		if ( style != null) {
			var parentFontFamily = style.fontFamily;
			if ( parentFontFamily == ( elementFontFamily)) {
				// logThis( "Font " + elementFontFamily + " for " + elementItem + " == " + parentFontFamily);
				continue;	// change nothing if font family was inherited
			} else {
				// logThis( "Font " + elementFontFamily + " for " + elementItem + " != " + parentFontFamily);
			}
		}
	}
	if ( cleanElementItem( elementItem, elementFontFamily)) {
		continue;
	}
}