Search Multiple Tags / 多标签搜索

Gallery page supports selecting multiple tags to search. / 画廊页面支持选择多个标签进行搜索。

// ==UserScript==
// @name         Search Multiple Tags / 多标签搜索
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Gallery page supports selecting multiple tags to search. / 画廊页面支持选择多个标签进行搜索。
// @author       ssnangua
// @match        https://e-hentai.org/g/*
// @match        https://exhentai.org/g/*
// @icon         https://e-hentai.org/favicon.ico
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function () {
  "use strict";

  const $taglist = document.querySelector("#taglist");
  if (!$taglist) return;

  const [bgColor, color] = location.hostname === "e-hentai.org" ? ["#d5c5c6", "royalblue"] : ["#34353b", "skyblue"];

  const $tags = [...$taglist.querySelectorAll("a")];
  $tags.forEach(($tag) => {
    $tag.addEventListener("click", () => {
      $tag.selected = !$tag.selected;
      $tag.parentNode.style.background = $tag.selected ? bgColor : "";
      $tag.style.color = $tag.style.color === "blue" ? color : "";

      $act2.style.display = $tags.some(($tag) => $tag.selected) ? "" : "none";
    });
  });

  const $act2 = document.createElement("div");
  $act2.id = "tagmenu_act2";
  $act2.style.display = "none";
  $act2.innerHTML = `
    <img src="https://ehgt.org/g/mr.gif" class="mr" alt="&gt;">
    <a id="search_tags" href="#">Search Selected Tags</a>
  `;
  $taglist.appendChild($act2);

  $act2.querySelector("#search_tags").addEventListener("click", () => {
    const tags = $tags
      .filter(($tag) => $tag.selected)
      .map(($tag) => {
        const [tc, td] = $tag.onclick
          .toString()
          .match(/'(.*?)'/)[1]
          .split(":");
        return `${tc}:"${td}$"`;
      });
    window.open(location.origin + "?f_search=" + tags.join("+"));
  });

  GM_addStyle(`
    #tagmenu_act2 {
      padding: 2px;
      margin: 0;
      float: left;
      width: 554px;
      height: 26px;
      font-size: 9pt;
    }
    #tagmenu_act2 img {
      padding-bottom: 1px;
    }
    #tagmenu_act2 a {
      text-decoration: none;
      font-weight: bold;
    }
  `);
})();