Greasy Fork is available in English.

Search Switcher

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

// ==UserScript==
// @name                Search 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              XanderWang
// @icon                https://i.loli.net/2020/05/29/DxSmHAy2o53FdUY.png
// @license             GPL-3.0
// @include             www.baidu.com/*
// @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                05/29/2020
// @modified            05/29/2020
// @version             1.0.2
// @namespace http://xander/wang
// ==/UserScript==

{
  const sites = [
    {
      name: '百度',
      host: 'baidu.com',
      link: 'https://www.baidu.com/s',
      key: 'wd',
      hide: false
    },
    {
      name: '必应',
      host: 'bing.com',
      link: 'https://bing.com/search',
      key: 'q',
      hide: false
    },
    {
      name: '谷歌',
      host: 'google.com',
      link: 'https://www.google.com/search',
      key: 'q',
      hide: false
    },
    {
      name: '谷歌镜像',
      host: 'google.fuckcloudnative.io',
      link: 'https://google.fuckcloudnative.io/search',
      key: 'q',
      hide: true
    },
    {
      name: '搜搜',
      host: 'so.com',
      link: 'https://www.so.com/s',
      key: 'q',
      hide: false
    },
    {
      name: '搜狗',
      host: 'sogou.com',
      link: 'https://www.sogou.com/web',
      key: 'query',
      hide: false
    }
  ];

  const css = `
    .search-warpper {
      position: fixed;
      left: 0;
      top: 0;
    }

    .search-switcher {
      position: fixed;
      opacity: 0.2;
      top: 80px;
      right: calc(100% - 10px);
      z-index: 9999999;
      transition: all 400ms;
    }

    .search-switcher:hover {
      top: 80px;
      left: 0px;
      right:auto;
      opacity: 1;
      border-radius: 0 20px;
    }
    
    .search-switcher .search-list {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      box-sizing:border-box;
      background-color: #000;
      border-radius: 0px 10px 10px 0px;
      color: #fff;
      padding: 10px;
      box-shadow: 5px 5px 5px #777;
    }

    .search-switcher .search-list a {
      color: #0cf;
      height: 25px;
      line-height: 25px;
    }

    .search-switcher .search-list a.mirror {
      font-weight: bold;
    }
    `;

  function setup() {
    console.log('location:', location);
    let site;
    let isMirror;
    for (let s of sites) {
      if (location.host.includes(s.host)) {
        site = s;
      }
    }
    let siteList = sites.filter(({ host , hide}) => !location.hostname.includes(host) && !hide );
    console.log('siteList:', siteList);
    
    let query = new URLSearchParams(location.search).get(site.key || 'q');
    console.log('site:', site, ',query:', query);
    if( query == null ) {
      return   
    }
    
    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}`;
      console.log('href:', href);
      return `<a href='${href}' target='_blank' >${text}</a>`;
    };
    const tags = siteList
      .filter(({ hidden }) => !hidden)
      .map(aTag)
      .join('');

    content.innerHTML = `
    <div id='search-switcher' class='search-switcher'>
      <div id='search-list' class="search-list">${tags}</div>
    </div>`;
    body.appendChild(content);
    
    const searchDiv = document.getElementById('search-switcher')[0];
    console.log('searchDiv:', searchDiv.clientHeight);
    console.log('body:', body.clientHeight);
  }

  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