Default fonts

Replace web fonts with browser's default fonts

  1. // ==UserScript==
  2. // @name Default fonts
  3. // @version 1.1
  4. // @description Replace web fonts with browser's default fonts
  5. // @author KenHV
  6. // @namespace https://kenhv.com
  7. // @supportURL https://kenhv.com
  8. // @homepageURL https://kenhv.com
  9. // @match *://*/*
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. "use strict";
  16.  
  17. // Cache to keep track of processed rules and stylesheets
  18. const processedRules = new WeakSet();
  19. const processedStyleSheets = new WeakSet();
  20.  
  21. function fontReplace() {
  22. Array.from(document.styleSheets).forEach((styleSheet) => {
  23. if (processedStyleSheets.has(styleSheet)) {
  24. return;
  25. }
  26.  
  27. let rules;
  28. try {
  29. rules = Array.from(styleSheet.cssRules);
  30. } catch (err) {
  31. return;
  32. }
  33.  
  34. rules.forEach((rule) => {
  35. if (rule instanceof CSSStyleRule && !processedRules.has(rule)) {
  36. if (rule.style.fontFamily.includes("sans")) {
  37. rule.style.fontFamily = "sans-serif";
  38. processedRules.add(rule);
  39. return;
  40. }
  41. if (rule.style.fontFamily.includes("serif")) {
  42. rule.style.fontFamily = "serif";
  43. processedRules.add(rule);
  44. return;
  45. }
  46. if (rule.style.fontFamily.includes("mono")) {
  47. rule.style.fontFamily = "monospace";
  48. processedRules.add(rule);
  49. return;
  50. }
  51. processedRules.add(rule);
  52. }
  53. });
  54.  
  55. processedStyleSheets.add(styleSheet);
  56. });
  57. }
  58.  
  59. fontReplace();
  60.  
  61. // Use MutationObserver to react to changes in the DOM
  62. const observer = new MutationObserver(() => {
  63. fontReplace();
  64. });
  65.  
  66. observer.observe(document.documentElement, {
  67. childList: true,
  68. subtree: true,
  69. });
  70. })();