Greasy Fork

Greasy Fork is available in English.

Pinterest - Open Original Image

Open the original (largest) image in a new tab by pressing 'z' while hovering over a pin

目前为 2018-10-23 提交的版本,查看 最新版本

// ==UserScript==
// @name         Pinterest - Open Original Image
// @namespace    http://tampermonkey.net/
// @version      0.1.2
// @description  Open the original (largest) image in a new tab by pressing 'z' while hovering over a pin
// @author       Valacar
// @include      https://*.pinterest.tld/*
// @grant        GM_openInTab
// @noframes
// @license      MIT
// @compatible   firefox Firefox
// @compatible   chrome Chrome
// ==/UserScript==

(function() {
  'use strict';

  // Custom key. Only single letters.
  const KEY_TO_OPEN = "z";

  // Immediately switch to new tab?
  // Note: Hold SHIFT key to do the opposite of this (e.g. shift-z)
  const ACTIVATE_NEW_TAB = true;

  function showImage(shouldActivateTab)
  {
    const imageData = getPinImageData();
    if (!(imageData && imageData.orig)) return;
    let imageOrig = imageData.orig;
    if (/\.(?:jpe?g|png|gif)$/.test(imageOrig.url)) {
      GM_openInTab(imageOrig.url, {active: shouldActivateTab});
    }
  }

  function getEventHandler(pin)
  {
    return Object.keys(pin).find(
      prop => prop.startsWith("__reactEventHandlers")
    );
  }

  function getPinImageData()
  {
    let el;
    let data;
    let handler;
    const hoveredElements = document.querySelectorAll(':hover');
    //console.debug(hoveredElements);
    let len = hoveredElements.length;
    while (len--) {
      el = hoveredElements[len];
      if (handler === undefined) handler = getEventHandler(el);
      if (!handler) continue;
      if (el.classList.contains("pinWrapper")) { // normal pin
        data = el[handler].children[1].props.images;
      } else if (el.hasAttribute("data-grid-item")) { // normal pin alternative
        data = el[handler].children.props.data.images;
      } else if (el.classList.contains("imageLink")) { // closeup image
        data = el[handler].children[1].props.pin.images;
      }
      if (data) {
        //console.debug(data);
        return data;
      }
    }
  }

  window.addEventListener("keydown",
    function(event) {
      if (event.defaultPrevented ||
        /(input|textarea)/i.test(document.activeElement.nodeName) ||
        document.activeElement.matches('[role="textarea"]'))
      {
        return;
      }
      switch (event.key) {
        case KEY_TO_OPEN.toLowerCase():
          showImage(ACTIVATE_NEW_TAB);
          break;
        case KEY_TO_OPEN.toUpperCase():
          showImage(!ACTIVATE_NEW_TAB);
          break;
        default:
          return;
      }
      event.preventDefault();
    },
    true
  );

})();