Clean Font Families

Changes fonts back to their generic font family

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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;
	}
}