Greasy Fork

Greasy Fork is available in English.

迷深阅读体验优化脚本

自用。自动繁体转简体,并将着重号改为标注在文本上方。

当前为 2024-10-09 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         迷深阅读体验优化脚本
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  自用。自动繁体转简体,并将着重号改为标注在文本上方。
// @match        https://masiro.me/admin/novelReading*
// @grant        none
// @license      WTFPL
// ==/UserScript==

(function () {
  'use strict';

  let observer;
  let debounceTimer;

  // 异步加载脚本
  function loadScript(url) {
    return new Promise((resolve, reject) => {
      const script = document.createElement('script');
      script.src = url;
      script.onload = resolve;
      script.onerror = reject;
      document.head.appendChild(script);
    });
  }

  // 转换函数
  function convertToSimplified(OpenCC) {
    const contentElement = document.querySelector('.nvl-content');
    if (!contentElement) return;

    // 暂时断开观察器
    if (observer) {
      observer.disconnect();
    }

    let traditionalText = contentElement.innerHTML;
    const converter = OpenCC.Converter({ from: 'hk', to: 'cn' });
    let simplifiedText = converter(traditionalText);

    // 添加强调处理
    simplifiedText = simplifiedText.replace(/([^,。!?\n<>]+)/g, function (sentence) {
      return sentence.replace(/([\u4e00-\u9fa5]·)+[\u4e00-\u9fa5]/g, function (match) {
        if (match.split('·').length >= 3 && match.split('·').every(char => char.length === 1)) {
          const emphasizedText = match.replace(/·/g, '');
          return `<span style="text-emphasis: dot;">${emphasizedText}</span>`;
        }
        return match;
      });
    });

    contentElement.innerHTML = simplifiedText;

    // 重新连接观察器
    if (observer) {
      observer.observe(contentElement, { childList: true, subtree: true, characterData: true });
    }
  }

  // 添加监测函数
  function observeContentChanges(OpenCC) {
    const contentElement = document.querySelector('.nvl-content');
    if (!contentElement) return;

    observer = new MutationObserver((mutations) => {
      let shouldConvert = false;
      for (let mutation of mutations) {
        if (mutation.type === 'childList' || mutation.type === 'characterData') {
          shouldConvert = true;
          break;
        }
      }
      if (shouldConvert) {
        clearTimeout(debounceTimer);
        debounceTimer = setTimeout(() => {
          convertToSimplified(OpenCC);
        }, 300); // 300毫秒的延迟
      }
    });

    observer.observe(contentElement, { childList: true, subtree: true, characterData: true });
  }

  // 主函数
  async function main() {
    try {
      await loadScript('https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/t2cn.js');

      // 确保 OpenCC 对象已加载
      if (typeof OpenCC === 'undefined') {
        throw new Error('OpenCC 未正确加载');
      }

      // 确保 DOM 完全加载
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
          convertToSimplified(OpenCC);
          observeContentChanges(OpenCC);
        });
      } else {
        convertToSimplified(OpenCC);
        observeContentChanges(OpenCC);
      }
    } catch (error) {
      console.error('加载 OpenCC 或执行转换时出错:', error);
    }
  }

  // 执行主函数
  main();
})();