Site Switcher

Add links to each other in search engines. Including multiple search modes.

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name                Site Switcher
// @name:zh-CN          一键切换搜索/镜像站
// @name:zh-TW          壹鍵切換搜索/镜像站
// @description         Add links to each other in search engines. Including multiple search modes.
// @description:zh-CN   在常用的搜索引擎/镜像站页面中添加互相切换的按钮。
// @description:zh-TW   在常用的搜索引擎/镜像站頁面中添加互相切換的按鈕。

// @author              l1xnan
// @namespace           http://hzy.pw
// @homepageURL         http://hzy.pw/p/1849
// @supportURL          https://github.com/h2y/link-fix
// @icon                http://q.qlogo.cn/qqapp/100229475/F1260A6CECA521F6BE517A08C4294D8A/100
// @license             GPL-3.0
// @include             https://github.com/*
// @include             https://github.com.cnpmjs.org/*
// @include             *.baidu.com/*
// @exclude             *.baidu.com/link?*
// @include             *.so.com/*
// @include             *.bing.com/*
// @include             *.zhihu.com/search?*
// @include             *.soku.com/*
// @include             *.sogou.com/*
// @include             /^https?://[a-z]+\.google\.[a-z,\.]+/.+$/
// @grant               none
// @run-at              document_end

// @date                02/16/2020
// @modified            02/16/2020
// @version             1.0.0
// ==/UserScript==

{
  const sites = [
    {
      name: '百度',
      host: 'baidu.com',
      link: 'https://www.baidu.com/s',
      key: 'wd',
    },
    {
      name: '必应',
      host: 'bing.com',
      link: 'https://bing.com/search',
      key: 'q',
    },
    {
      name: '谷歌',
      host: 'www.google.com',
      link: 'https://www.google.com/search',
      key: 'q',
      mirror: 'google.fuckcloudnative.io',
    },
    {
      name: 'Github',
      host: 'github.com',
      link: 'https://github.com/search',
      key: 'q',
      mirror: 'github.com.cnpmjs.org',
    },
    // {
    //   name: '搜搜',
    //   host: 'so.com',
    //   link: 'https://www.so.com/s?q=',
    //   key: 'q',
    //   hidden: true,
    // },
    // {
    //   name: '搜狗',
    //   host: 'sogou.com',
    //   link: 'https://www.sogou.com/web?query=',
    //   key: 'query',
    //   hidden: true,
    // },
  ];

  // 镜像站
  const mirrors = {
    'github.com': 'https://github.com.cnpmjs.org/search?q=',
    'google.com': 'https://google.fuckcloudnative.io/search?q=',
  };
  const css = `
  .search-switcher {
      position: fixed;
      box-sizing:border-box;
      background-color: #000;
      opacity: 0.3;
      border-radius: 40px;
      color: #fff;
      padding: 15px 20px;
      bottom: 100px;
      left: -280px;
      width: 300px;
      z-index: 9999999;
      transition: all 400ms;
    }
    .search-switcher:hover {
      left: 5px;
      opacity: 1;
      border-radius: 10px;
      box-shadow: 5px -5px 10px #777;
    }
    .search-switcher p {
      margin: 0;
    }
    p.search-switcher-title {
      font-weight: bold;
      margin-bottom: 5px;
    }
    .search-switcher a {
      color: #0cf;
      margin-right: 20px;
    }
    .search-switcher a.mirror {
      font-weight: bold;
    }
    `;

  function setup() {
    let site;
    let isMirror;
    for (let s of sites) {
      if (location.host.includes(s.host)) {
        site = s;
      }
      if (location.href.includes(s.mirror)) {
        site = s;
        isMirror = true;
      }
    }
    sites.filter(({ host }) => location.hostname.includes(host))[0];
    let mirror = sites.filter(({ mirror }) =>
      location.hostname.includes(mirror),
    )[0];

    let query = new URLSearchParams(location.search).get(site.key || 'q');
    console.log(site, query, isMirror);
    const body = document.getElementsByTagName('body')[0];

    // 样式
    const style = document.createElement('style');
    style.innerHTML = css;
    body.appendChild(style);

    // 生成切换框
    const content = document.createElement('div');
    const aTag = ({ link, name, host, mirror, key }) => {
      let className = '';
      let text = name;
      let href = `${link}?${key}=${query}`;
      if (mirror && name === site.name) {
        href = location.href.replace(host, mirror);
        text = '镜像';
        className = 'mirror';
        if (isMirror) {
          text = '原站';
          href = location.href.replace(mirror, host);
        }
      }
      return `<a href='${href}' target='_blank' class=${className}>${text}</a>`;
    };
    const tags = sites
      .filter(({ hidden }) => !hidden)
      .map(aTag)
      .join('');

    content.innerHTML = `
      <div id='search-switcher' class='search-switcher'>
        <p class='search-switcher-title'>一键切换引擎:</p>
        <p>${tags}</p>
      </div>`;
    body.appendChild(content);
  }

  let href0 = '';

  !(function init() {
    var href = location.href;
    if (href0 != href) {
      var oldDOM = document.getElementById('search-switcher');
      if (oldDOM) {
        oldDOM.parentNode.removeChild(oldDOM);
      }
      setup();
      href0 = href;
    }
    setTimeout(init, 2222);
  })();
}
//end userScript