Clean Font Families

Changes fonts back to their generic font family

  1. // ==UserScript==
  2. // @name Clean Font Families
  3. // @namespace http://userscripts.org
  4. // @include *
  5. // @description Changes fonts back to their generic font family
  6. // @author Ralf Helbing (ralf@pkmd.de), based on Sans-Serif Default by Pete Farmer <pfarmer at collaboros.com>
  7. // @version 0.1
  8. // ==/UserScript==
  9.  
  10. var sansSerif = [ 'sans-serif', 'arial', 'verdana', 'tahoma', 'geneva', 'helvetica'];
  11. var serif = [ 'serif', 'times', 'georgia'];
  12. var mono = [ 'monospaced', 'fixed', 'courier'];
  13.  
  14. // set up regexps for font families
  15. var sansSerifRegExps = new Array();
  16. for ( var i = 0; i < sansSerif.length; i++) {
  17. var matchEx = new RegExp( sansSerif[ i], "i");
  18. sansSerifRegExps.push( matchEx);
  19. }
  20. var sansSerifRegExp = sansSerifRegExps.shift();
  21.  
  22. var serifRegExps = new Array();
  23. for ( var i = 0; i < serif.length; i++) {
  24. var matchEx = new RegExp( serif[ i], "i");
  25. serifRegExps.push( matchEx);
  26. }
  27. var serifRegExp = serifRegExps.shift();
  28.  
  29. var monoRegExps = new Array();
  30. for ( var i = 0; i < mono.length; i++) {
  31. var matchEx = new RegExp( mono[ i], "i");
  32. monoRegExps.push( matchEx);
  33. }
  34. var monoRegExp = monoRegExps.shift();
  35.  
  36. function logThis( logString) {
  37. // GM_log( logString);
  38. }
  39.  
  40. function cleanElementItem0( item, regex, itemInfo, replacement) {
  41. if ( itemInfo == replacement) {
  42. logThis( "already clean: " + item);
  43. return true;
  44. }
  45. if ( regex.test( itemInfo)) {
  46. var style;
  47. if ( typeof( item.setProperty) == "function") {
  48. style = item;
  49. } else {
  50. style = item.style;
  51. }
  52. style.setProperty( "font-family", replacement, "");
  53. logThis( "setting " + item + " with " + itemInfo + " to " + replacement);
  54. return true;
  55. }
  56. // logThis( "not cleaning " + item + " with " + item.style.fontFamily);
  57. return false;
  58. }
  59.  
  60. function cleanElementItem( elementItem, elementFontFamily) {
  61. // logThis( "testing " + elementItem + " with " + elementFontFamily);
  62. if ( cleanElementItem0( elementItem, sansSerifRegExp, elementFontFamily, 'sans-serif')) {
  63. return true;
  64. }
  65. if ( cleanElementItem0( elementItem, serifRegExp, elementFontFamily, 'serif')) {
  66. return true;
  67. }
  68. if ( cleanElementItem0( elementItem, monoRegExp, elementFontFamily, 'monospace')) {
  69. return true;
  70. }
  71. var matched = false;
  72. // logThis( "testing " + elementItem + " with " + elementFontFamily);
  73. for ( var i = 0; i < sansSerifRegExps.length; i++) {
  74. matched = cleanElementItem0( elementItem, sansSerifRegExps[ i], elementFontFamily, 'sans-serif');
  75. if ( matched)
  76. return true;
  77. }
  78. if ( ! matched) {
  79. for ( var i = 0; i < serifRegExps.length; i++) {
  80. matched = cleanElementItem0( elementItem, serifRegExps[ i], elementFontFamily, 'serif');
  81. if ( matched)
  82. return true;
  83. }
  84. }
  85. if ( ! matched) {
  86. for ( var i = 0; i < monoRegExps.length; i++) {
  87. matched = cleanElementItem0( elementItem, monoRegExps[ i], elementFontFamily, 'monospace');
  88. if ( matched)
  89. return true;
  90. }
  91. }
  92. return false;
  93. }
  94.  
  95.  
  96. function processStyleSheet(sheet) {
  97. logThis( "processing stylesheet: " + sheet + "/" + sheet.href);
  98. // FF does not like us to retrieve rules from disabled css
  99. if ( sheet.disabled) {
  100. logThis( "disabled");
  101. return;
  102. }
  103. for (var which=0; which<sheet.cssRules.length; which++) {
  104. // logThis("sheet.cssRule "+ which +": "+sheet.cssRules[which].cssText);
  105. var rule = sheet.cssRules[which];
  106. if (rule.type == rule.STYLE_RULE) {
  107. var cssStyle = rule.style;
  108. var elementFontFamily = cssStyle.getPropertyValue("font-family");
  109. cleanElementItem( cssStyle, elementFontFamily);
  110. }
  111. if (rule.type == rule.IMPORT_RULE) {
  112. logThis("Recursing into an import rule: " + rule.cssText);
  113. processStyleSheet(rule.styleSheet);
  114. }
  115. if (rule.type == rule.MEDIA_RULE &&
  116. ( rule.media.mediaText == "screen" || rule.media.mediaText == "print")) {
  117. logThis("Recursing into media rule: " + rule.cssText);
  118. processStyleSheet(rule);
  119. }
  120. }
  121. }
  122.  
  123. // Process all stylesheets
  124. for(var i = 0; i < document.styleSheets.length; i++) {
  125. var sheet = document.styleSheets[i]
  126. processStyleSheet(sheet);
  127. }
  128. logThis("CSS finished");
  129. var elementList = document.getElementsByTagName('*');
  130. for (var eI = elementList.length - 1; eI >= 0; eI--) {
  131. // get computed font family
  132. var elementItem = elementList[ eI];
  133. var style = getComputedStyle(elementItem, null);
  134. if ( style == null) {
  135. continue;
  136. }
  137. var elementFontFamily = style.fontFamily;
  138. // if parent exists, check if font family different
  139. var parent = elementItem.parentNode;
  140. if ( parent != null && parent.nodeType == Node.ELEMENT_NODE) {
  141. // logThis("parent type: " + parent.nodeType + " of " + elementItem);
  142. style = getComputedStyle(parent, null);
  143. if ( style != null) {
  144. var parentFontFamily = style.fontFamily;
  145. if ( parentFontFamily == ( elementFontFamily)) {
  146. // logThis( "Font " + elementFontFamily + " for " + elementItem + " == " + parentFontFamily);
  147. continue; // change nothing if font family was inherited
  148. } else {
  149. // logThis( "Font " + elementFontFamily + " for " + elementItem + " != " + parentFontFamily);
  150. }
  151. }
  152. }
  153. if ( cleanElementItem( elementItem, elementFontFamily)) {
  154. continue;
  155. }
  156. }