Site Switcher

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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

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

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

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.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==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