mws

自用工具库

目前為 2022-12-03 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/445645/1124304/mws.js

var mws = new (class {
  sleep(milliseconds) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve()
      }, milliseconds)
    })
  }
  async _Step(selector, callback, need_content, timeout, milliseconds) {
    while (timeout--) {
      if (document.querySelector(selector) === null) {
        await this.sleep(milliseconds)
        continue
      } else {
        if (need_content) {
          if (document.querySelector(selector).innerText.length == 0) {
            await this.sleep(milliseconds)
            continue
          }
        }
      }
      break
    }

    callback(selector)
  }
  wait(selector, timeout = Infinity, milliseconds = 300, need_content = false) {
    return new Promise((resolve) => {
      this._Step(
        selector,
        function (selector) {
          resolve(document.querySelector(selector))
        },
        need_content,
        timeout,
        milliseconds
      )
    })
  }

  _ReadFileAsync(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader()
      reader.onload = () => {
        resolve(reader.result)
      }
      reader.onerror = reject
      reader.readAsDataURL(file)
    })
  }

  async _Img2Base64(url) {
    try {
      const imgBlob = await fetch(url).then((res) => res.blob())
      return await this._ReadFileAsync(imgBlob)
    } catch (error) {
      return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzODQgNTEyIj4gPHBhdGggZmlsbD0iIzRFNTA1NSIgZD0iTTIyNCAxMzZWMEgyNEMxMC43IDAgMCAxMC43IDAgMjR2NDY0YzAgMTMuMyAxMC43IDI0IDI0IDI0aDMzNmMxMy4zIDAgMjQtMTAuNyAyNC0yNFYxNjBIMjQ4Yy0xMy4yIDAtMjQtMTAuOC0yNC0yNHptMTYwLTE0LjF2Ni4xSDI1NlYwaDYuMWM2LjQgMCAxMi41IDIuNSAxNyA3bDk3LjkgOThjNC41IDQuNSA3IDEwLjYgNyAxNi45eiI+PC9wYXRoPiA8L3N2Zz4='
    }
  }

  async genBadgedFavicon(url, env, color = '#e8b254') {
    const img = await this._Img2Base64(url)
    return `data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
    <foreignObject x="0" y="0" width="100%" height="100%">
        <body xmlns="http://www.w3.org/1999/xhtml">
            <style>
                html,
                body {
                    height: 100%;
                    margin: 0;
                    text-align: center;
                }

                img {
                    display: block;
                    width: 100%;
                    height: 100%;
                    object-fit: contain;
                }

                strong {
                    position: absolute;
                    bottom: 0;
                    left: 50%;
                    transform: translateX(-50%);
                    text-transform: uppercase;
                    background-color: ${color};
                    color: #fff;
                    padding: 0px 2px;
                    border-radius: 2px;
                    font-size: 12px;
                    box-sizing: border-box;
                    max-width: 100%;
                    width: max-content;
                    height: 16px;
                    line-height: 16px;
                    word-break: break-all;
                    overflow: hidden;
                }

            </style>
            <strong>${env}</strong>
            <img src='${img}'></img>
        </body>
      </foreignObject>
    </svg>`
      .replace(/\n/g, '')
      .replace(/\t/g, '')
      .replace(/#/g, '%23')
  }
})()