Greasy Fork is available in English.

DSP2B戴森球蓝图预览工具

快速预览戴森球蓝图

// ==UserScript==
// @name         DSP2B戴森球蓝图预览工具
// @namespace    maxzhang666/dsp-viewer
// @version      0.0.4
// @author       maxzhang666
// @description  快速预览戴森球蓝图
// @license      MIT
// @icon         https://www.dsp2b.com/favicon.ico
// @include      https://www.dsp2b.com/*
// @include      https://www.dsp2b.com/zh-CN/blueprint/*
// @include      https://www.dysonsphereblueprints.com/*
// @include      https://www.dysonsphereblueprints.com/blueprints/*
// @grant        GM_addStyle
// @grant        GM_openInTab
// @grant        unsafeWindow
// ==/UserScript==

(e=>{if(typeof GM_addStyle=="function"){GM_addStyle(e);return}const t=document.createElement("style");t.textContent=e,document.head.append(t)})(' .dsp-viewer-cn{padding:1em 2em;border:none;border-radius:5px;font-weight:700;letter-spacing:5px;text-transform:uppercase;cursor:pointer;color:#2c9caf;transition:all 1s;font-size:15px;position:relative;overflow:hidden;outline:2px solid #2c9caf}.dsp-viewer-cn:hover{color:#fff;transform:scale(1.1);outline:2px solid #70bdca;box-shadow:4px 5px 17px -4px #268391}.dsp-viewer-cn:before{content:"";position:absolute;left:-50px;top:0;width:0;height:100%;background-color:#2c9caf;transform:skew(45deg);z-index:-1;transition:width 1s}.dsp-viewer-cn:hover:before{width:250%}.dsp-viewer-box,details{display:flex;justify-content:center;padding-bottom:15px}.dsp-viewer-box button{width:100%}.dsp-viewer-en{position:relative;padding:0 35px;background:#d7265f;font-size:17px;font-weight:500;color:#fff;border:3px solid #d7265f;border-radius:.4rem;box-shadow:0 0 #fec1958c;transition:all .3s ease-in-out;cursor:pointer;margin-bottom:0;line-height:1em}.star-1{position:absolute;top:20%;left:20%;width:25px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all 1s cubic-bezier(.05,.83,.43,.96)}.star-2{position:absolute;top:45%;left:45%;width:15px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all 1s cubic-bezier(0,.4,0,1.01)}.star-3{position:absolute;top:40%;left:40%;width:5px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all 1s cubic-bezier(0,.4,0,1.01)}.star-4{position:absolute;top:20%;left:40%;width:8px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all .8s cubic-bezier(0,.4,0,1.01)}.star-5{position:absolute;top:25%;left:45%;width:15px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all .6s cubic-bezier(0,.4,0,1.01)}.star-6{position:absolute;top:5%;left:50%;width:5px;height:auto;filter:drop-shadow(0 0 0 #fffdef);z-index:-5;transition:all .8s ease}.dsp-viewer-en:hover{background:transparent;color:#d7265f;border-color:#d7265f;box-shadow:0 0 25px #fec1958c}.dsp-viewer-en:hover .star-1{position:absolute;top:-80%;left:-30%;width:25px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.dsp-viewer-en:hover .star-2{position:absolute;top:-25%;left:10%;width:15px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.dsp-viewer-en:hover .star-3{position:absolute;top:55%;left:25%;width:5px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.dsp-viewer-en:hover .star-4{position:absolute;top:30%;left:80%;width:8px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.dsp-viewer-en:hover .star-5{position:absolute;top:25%;left:115%;width:15px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.dsp-viewer-en:hover .star-6{position:absolute;top:5%;left:60%;width:5px;height:auto;filter:drop-shadow(0 0 10px #fffdef);z-index:2}.fil0{fill:#fffdef} ');

(function () {
  'use strict';

  var _GM_openInTab = /* @__PURE__ */ (() => "undefined" != typeof GM_openInTab ? GM_openInTab : void 0)(), _unsafeWindow = /* @__PURE__ */ (() => "undefined" != typeof unsafeWindow ? unsafeWindow : void 0)();
  _unsafeWindow.addEventListener("popstate", () => {
  }), setInterval(function process() {
    let url = _unsafeWindow.location.href;
    if (currentUrl === url) return;
    (/dsp2b\.com\/zh-CN(?:\?.*|\/?)$/i.test(url) || /dsp2b\.com\/zh-CN\/collection/i.test(url)) && listInit();
    /dsp2b\.com\/zh-CN\/blueprint/i.test(url) && detailInit();
    /dysonsphereblueprints\.com\/blueprints/i.test(url) && detailInit("en");
    /dysonsphereblueprints\.com(\/(blueprints\?search=[\w&=]*))?\/?$/.test(url) && listInit("en");
    currentUrl = url;
  }, 500);
  let currentUrl = "";
  function listInit(type = "cn") {
    let cards;
    cards = "cn" == type ? _unsafeWindow.document.querySelectorAll(".ant-card-cover") : _unsafeWindow.document.querySelectorAll(".o-blueprint-card__cover"), cards.forEach((ele) => {
      var _a;
      ele.querySelectorAll(".dsp-viewer").forEach((btn) => {
        btn.remove();
      }), "cn" == type ? ((_a = ele.querySelector(".dsp-viewer-cn")) == null ? void 0 : _a.remove(), ele.append(getBtn("list", type))) : ele.after(getBtn("list", type));
    });
  }
  function detailInit(type = "cn") {
    let desc;
    "cn" == type ? (desc = _unsafeWindow.document.querySelector(".markdown-body"), desc && desc.before(getBtn("details", type))) : (desc = _unsafeWindow.document.querySelector(".t-blueprint__title"), desc && desc.append(getBtn("details", type)));
  }
  function getBtn(suffix = "list", type = "cn") {
    let btn, div = _unsafeWindow.document.createElement("div");
    return div.className = `dsp-viewer-box ${suffix}`, "cn" == type ? (btn = _unsafeWindow.document.createElement("button"), btn.textContent = "蓝图预览") : (btn = _unsafeWindow.document.createElement("button"), btn.innerHTML = '蓝图预览<div class="star-1"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" version="1.1"     style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"      viewBox="0 0 784.11 815.53" xmlns:xlink="http://www.w3.org/1999/xlink"><defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div><div class="star-2">\n    <svg\n      xmlns="http://www.w3.org/2000/svg"\n      xml:space="preserve"\n      version="1.1"\n      style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"\n      viewBox="0 0 784.11 815.53"\n      xmlns:xlink="http://www.w3.org/1999/xlink"\n    >\n      <defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div><div class="star-3">\n    <svg\n      xmlns="http://www.w3.org/2000/svg"\n      xml:space="preserve"\n      version="1.1"\n      style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"\n      viewBox="0 0 784.11 815.53"\n      xmlns:xlink="http://www.w3.org/1999/xlink"\n    >\n      <defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div><div class="star-4">\n    <svg\n      xmlns="http://www.w3.org/2000/svg"\n      xml:space="preserve"\n      version="1.1"\n      style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"\n      viewBox="0 0 784.11 815.53"\n      xmlns:xlink="http://www.w3.org/1999/xlink"\n    >\n      <defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div><div class="star-5">\n    <svg\n      xmlns="http://www.w3.org/2000/svg"\n      xml:space="preserve"\n      version="1.1"\n      style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"\n      viewBox="0 0 784.11 815.53"\n      xmlns:xlink="http://www.w3.org/1999/xlink"\n    >\n      <defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div><div class="star-6">\n    <svg\n      xmlns="http://www.w3.org/2000/svg"\n      xml:space="preserve"\n      version="1.1"\n      style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"\n      viewBox="0 0 784.11 815.53"\n      xmlns:xlink="http://www.w3.org/1999/xlink"\n    >\n      <defs></defs>\n      <g id="Layer_x0020_1">\n        <metadata id="CorelCorpID_0Corel-Layer"></metadata>\n        <path\n          class="fil0"\n          d="M392.05 0c-20.9,210.08 -184.06,378.41 -392.05,407.78 207.96,29.37 371.12,197.68 392.05,407.74 20.93,-210.06 184.09,-378.37 392.05,-407.74 -207.98,-29.38 -371.16,-197.69 -392.06,-407.78z"\n        ></path>\n      </g>\n    </svg>\n  </div>'), btn.className = `dsp-viewer-${type}`, btn.onclick = (event) => {
      !function viewBlueprint(event2, suffix2, type2 = "cn") {
        var _a, _b, _c;
        let id, regex, url = "";
        if ("list" == suffix2) {
          let a = (_a = event2.target.parentNode) == null ? void 0 : _a.querySelector("a");
          a || (a = (_c = (_b = event2.target.parentNode) == null ? void 0 : _b.parentNode) == null ? void 0 : _c.querySelector("a")), a && (url = a.href);
        } else url = currentUrl;
        regex = "cn" == type2 ? /\/blueprint\/([a-f0-9]+)$/ : /\/blueprints\/(.*)$/;
        const match = url.match(regex);
        match && match.length > 0 && (id = match[1]);
        id && _GM_openInTab(`https://dsp.huizhek.com/?bp=${id}&type=${type2}`);
      }(event, suffix, type);
    }, "list" == suffix && "cn" == type ? btn : (div.append(btn), div);
  }

})();