软替换网页默认字体

强制替换网页默认字体为 MiSans、FZYouSong GBK 509R(方正悠宋)、Cascadia Mono、Noto Sans Mono CJK SC。用户可根据需求修改脚本中的字体设置。使用前需确保已安装所需字体。

目前為 2024-12-16 提交的版本,檢視 最新版本

// ==UserScript==
// @name         软替换网页默认字体
// @namespace    chNt6w8D6cVSQE93BSC8VS6QxNshGaSP9QcK82kruzbN5E4K2TJKxbNjpAXDfJKe
// @description  强制替换网页默认字体为 MiSans、FZYouSong GBK 509R(方正悠宋)、Cascadia Mono、Noto Sans Mono CJK SC。用户可根据需求修改脚本中的字体设置。使用前需确保已安装所需字体。
// @version      5
// @license      Apache License 2.0
// @author       Anonymous
// @compatible   firefox
// @compatible   safari
// @compatible   chrome
// @match        *://*/*
// @grant        GM_addStyle
// @run-at       document-start
// ==/UserScript==

/*
 * Todo 1
 * 目标是实现根据页面中的字形自动选择合适的方案:
 * - 当检测到传统字形时,使用传统字形方案;
 * - 当检测到简化字形时,使用简化字形方案;
 * - 对于未知语言的页面,使用我们默认设置的简化字形方案。
 * 目前还不想实现。。。。。。。因为效果区别不大,检测还可能耗费性能。
 */

/*
 * Todo 2
 * 通过油猴的功能保存用户的设置数据。
 * 目前还不想实现。。。。。。。因为能用就行。
 */

(function () {
    "use strict";

    // 优先使用系统级的中文字体,因为系统级的中文字体一般也包括拉丁文的字形,这样可以看起来更和谐。

    // 无衬线字体
    const fontSansLatinA = 'MiSans';
    const fontSansLatinB = 'MiSans L3';
    const fontSansLatinC = 'Arial';

    const fontSansSimplifiedChineseA = 'MiSans';
    const fontSansSimplifiedChineseB = 'MiSans L3';
    const fontSansSimplifiedChineseC = 'Arial';

    const fontSansTraditionalChineseA = 'MiSans TC';
    const fontSansTraditionalChineseB = 'MiSans L3';
    const fontSansTraditionalChineseC = 'Arial';

    // 衬线字体
    const fontSerifLatinA = 'FZYouSong GBK 509R';
    const fontSerifLatinB = 'Times New Roman';
    const fontSerifLatinC = 'Arial';

    const fontSerifSimplifiedChineseA = 'FZYouSong GBK 509R';
    const fontSerifSimplifiedChineseB = 'Times New Roman';
    const fontSerifSimplifiedChineseC = 'Arial';

    const fontSerifTraditionalChineseA = 'FZYouSong GBK 509R';//保留,暂时没有更好的选择,目前字形是不对的。
    const fontSerifTraditionalChineseB = 'Times New Roman';
    const fontSerifTraditionalChineseC = 'Arial';

    // 等宽字体 ( 理论上只需要配置拉丁文的替换,因为在实际的网站上,“等宽字体 ≈ 代码字体 ≈ 拉丁文等宽字体”。)
    const fontMonoLatinA = 'Cascadia Mono';
    const fontMonoLatinB = 'Noto Sans Mono CJK SC';
    const fontMonoLatinC = 'Arial';

    const fontMonoSimplifiedChineseA = 'Cascadia Mono';
    const fontMonoSimplifiedChineseB = 'Noto Sans Mono CJK SC';
    const fontMonoSimplifiedChineseC = 'Arial';

    const fontMonoTraditionalChineseA = 'Cascadia Mono';
    const fontMonoTraditionalChineseB = 'Noto Sans Mono CJK TC';
    const fontMonoTraditionalChineseC = 'Arial';

    GM_addStyle(`
      /* -------------------------------------------------------------------- 基本字体 ---------------------------------------------------------------------- */
        @font-face {
            font-family: 'sans-serif';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'serif';
            src: local('${fontSerifLatinA}'), local('${fontSerifLatinB}'), local('${fontSerifLatinC}');
        }
        @font-face {
            font-family: 'monospace';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
      /* ------------------------------------------------------------------ 无衬线字体 拉丁文 ------------------------------------------------------------------- */
        @font-face {
            font-family: 'Arial';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Verdana';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Helvetica';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'San Francisco';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'San Francisco Pro';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Helvetica Neue';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Tahoma';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Segoe UI';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Google Sans';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Google Sans Text';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Roboto';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Noto Sans';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'DejaVu Sans';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
        @font-face {
            font-family: 'Liberation Sans';
            src: local('${fontSansLatinA}'), local('${fontSansLatinB}'), local('${fontSansLatinC}');
        }
      /* ------------------------------------------------------------------ 无衬线字体 简化字形 ------------------------------------------------------------------ */
        @font-face {
            font-family: 'HarmonyOS Sans';          /* 鸿蒙字体 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'Noto Sans SC';            /* 谷歌豆腐字体 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'SimHei';                  /* 中易黑体 ( Windows 里的 黑体 ) */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: '黑体';                    /* 中易黑体 ( Windows 里的 黑体 ) */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'Microsoft YaHei';         /* 微软雅黑 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: '微软雅黑';                 /* 微软雅黑 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'Microsoft YaHei UI';      /* 微软雅黑 UI */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: '微软雅黑 UI';              /* 微软雅黑 UI */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'PingFang SC';             /* 苹方 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'Hiragino Sans GB';        /* 冬青黑体 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'STHeiti';                 /* 华文黑体 */
            src: local('${fontSansSimplifiedChineseA}'), local('${fontSansSimplifiedChineseB}'), local('${fontSansSimplifiedChineseC}');
        }
      /* ------------------------------------------------------------------ 无衬线字体 传统字形 ------------------------------------------------------------------ */
        @font-face {
            font-family: 'Noto Sans TC';            /* 谷歌豆腐字体 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
        @font-face {
            font-family: 'Microsoft JhengHei';      /* 微軟正黑體 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
        @font-face {
            font-family: '微軟正黑體';                /* 微軟正黑體 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
        @font-face {
            font-family: 'Microsoft JhengHei UI';    /* 微軟正黑體 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
        @font-face {
            font-family: '微軟正黑體修正';             /* 微軟正黑體 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
        @font-face {
            font-family: 'MHei';                     /* 蒙纳黑体 */
            src: local('${fontSansTraditionalChineseA}'), local('${fontSansTraditionalChineseB}'), local('${fontSansTraditionalChineseC}');
        }
      /* ------------------------------------------------------------------- 衬线字体 拉丁文 ------------------------------------------------------------------- */
        /* 个人认为大部分拉丁文衬线字体都很有自己的风格,而且很美观,所以选择不替换 */
        @font-face {
            font-family: '衬线拉丁文保留';
            src: local('${fontSerifLatinA}'), local('${fontSerifLatinB}'), local('${fontSerifLatinC}');
        }
      /* ------------------------------------------------------------------ 衬线字体 简化字形 ------------------------------------------------------------------- */
        @font-face {
            font-family: 'SimSun';                  /* 中易宋体 ( Windows 里的 宋体 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: '宋体';                     /* 中易宋体 ( Windows 里的 宋体 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'NSimSun';                 /* 中易新宋体 ( Windows 里的 新宋体 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: '新宋体';                   /* 中易新宋体 ( Windows 里的 新宋体 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'FangSong';                /* 中易仿宋 ( Windows 里的 仿宋 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'FangSong_GB2312';         /* 中易仿宋 ( Windows 里的 仿宋 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: '仿宋';                     /* 中易仿宋 ( Windows 里的 仿宋 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: '仿宋_GB2312';              /* 中易仿宋 ( Windows 里的 仿宋 ) */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'STSong';                  /* 华文宋体 */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'STFangsong';              /* 华文仿宋 */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
        @font-face {
            font-family: 'STZhongsong';             /* 华文中宋 */
            src: local('${fontSerifSimplifiedChineseA}'), local('${fontSerifSimplifiedChineseB}'), local('${fontSerifSimplifiedChineseC}');
        }
      /* ------------------------------------------------------------------ 衬线字体 传统字形 ------------------------------------------------------------------- */
        /* 没有足够的网站做测试,暂时不写相应的规则 */
        @font-face {
            font-family: '衬线传统字形保留';
            src: local('${fontSerifTraditionalChineseA}'), local('${fontSerifTraditionalChineseB}'), local('${fontSerifTraditionalChineseC}');
        }
      /* ----------------------------------------------------------------- 等宽字体(代码)拉丁文 ------------------------------------------------------------------ */
        @font-face {
            font-family: 'Menlo';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Monaco';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Consolas';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Courier';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Courier New';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Andale Mono';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Ubuntu Mono';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Fira Code';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Fira Mono';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'DejaVu Sans Mono';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Liberation Mono';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
        @font-face {
            font-family: 'Source Code Pro';
            src: local('${fontMonoLatinA}'), local('${fontMonoLatinB}'), local('${fontMonoLatinC}');
        }
      /* ----------------------------------------------------------------- 等宽字体(代码)简化字形 ----------------------------------------------------------------- */
        @font-face {
            font-family: 'Noto Sans Mono CJK SC';
            src: local('${fontMonoSimplifiedChineseA}'), local('${fontMonoSimplifiedChineseB}'), local('${fontMonoSimplifiedChineseC}');
        }
      /* ----------------------------------------------------------------- 等宽字体(代码)传统字形 ----------------------------------------------------------------- */
        @font-face {
            font-family: 'Noto Sans Mono CJK TC';
            src: local('${fontMonoTraditionalChineseA}'), local('${fontMonoTraditionalChineseB}'), local('${fontMonoTraditionalChineseC}');
        }
        body {
            -webkit-font-smoothing: antialiased;  /* 对 WebKit 浏览器启用抗锯齿 */
            -moz-osx-font-smoothing: grayscale;   /* 对 Firefox 浏览器启用灰阶平滑 */
        }
    `);
    console.log.info("字体样式注入完毕。");
})();