Greasy Fork

ExplicitMessage_Inject

[DEBUG] 信息显式化(注入版)

目前为 2021-07-17 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/429525/951480/ExplicitMessage_Inject.js

(function() {
  try {
    const gmInclude = GM_getValue('ExplicitLog_Inject-include')
    const gmExclude = GM_getValue('ExplicitLog_Inject-exclude')
    let include = gmInclude ? new RegExp(gmInclude) : null
    let exclude = gmExclude ? new RegExp(gmExclude) : null
    // 日志
    const logs = ['log', 'warn', 'error']
    for (const log of logs) {
      const _ = console[log]
      console[log] = function() {
        const m = [arguments, log.toUpperCase()]
        if (match(m, include) && !match(m, exclude)) {
          explicit(arguments.length == 1 ? arguments[0] : JSON.stringify(arguments), log.toUpperCase())
        }
        return _.apply(console, arguments)
      }
    }
    // 菜单
    GM_registerMenuCommand('[DEBUG] 设置过滤器', () => {
      try {
        const sInclude = prompt(`【${GM_info.script.name}】\n\n设置匹配过滤器`, include?.source ?? '.*')
        if (sInclude) {
          include = new RegExp(sInclude)
          GM_setValue('ExplicitLog_Inject-include', sInclude)
        }
        const sExclude = prompt(`【${GM_info.script.name}】\n\n设置排除过滤器`, exclude?.source ?? '^LOG$')
        if (sExclude) {
          exclude = new RegExp(sExclude)
          GM_setValue('ExplicitLog_Inject-exclude', sExclude)
        }
      } catch (e) {
        explicit(e)
      }
    })
    GM_registerMenuCommand('[DEBUG] 说明', () => window.open('https://gitee.com/liangjiancang/userscript/tree/master/script/ExplicitLog#使用说明'))
  } catch (e) {
    explicit(e)
  }
})()

/**
 * 显式地显示信息
 * @param {*} msg 信息
 * @param {string} [label] 标记
 */
function explicit(msg, label) {
  alert(`【${GM_info.script.name}】${label ? `【${label}】` : ''}\n\n${msg}`)
}

/**
 * @param {*} obj 匹配对象
 * @param {RegExp} regex 匹配正则表达式
 * @param {number} [depth=5] 匹配查找深度
 * @returns {boolean} 是否匹配成功
 */
function match(obj, regex, depth = 5) {
  if (obj && regex && depth > 0) {
    return core(obj, depth, new Set())
  } else {
    return false
  }

  function core(obj, depth, objSet) {
    for (var key in obj) {
      if (regex.test(key)) {
        return true
      } else {
        try {
          var value = obj[key]
          if (value) {
            if (typeof value == 'object' || typeof value == 'function') {
              if (regex.test(value.toString())) {
                return true
              } else if (depth > 1) {
                if (!objSet.has(value)) {
                  objSet.add(value)
                  if (core(value, depth - 1)) {
                    return true
                  }
                }
              }
            } else {
              if (regex.test(String(value))) {
                return true
              }
            }
          }
        } catch (e) {
          // value that cannot be accessed
        }
      }
    }
    return false
  }
}