Direct links to images and pages on Google Images
// ==UserScript== // @name Google DWIMages // @description Direct links to images and pages on Google Images // @author chocolateboy // @copyright chocolateboy // @version 3.1.0 // @namespace https://github.com/chocolateboy/userscripts // @license GPL // @include https://www.google.tld/search?*tbm=isch* // @include https://www.google.tld/search?*udm=2* // @grant none // ==/UserScript== // NOTE This file is generated from src/google-dwimages.user.ts and should not be edited directly. "use strict"; (() => { // src/lib/util.ts var constant = (value) => (..._args) => value; // src/lib/observer.ts var INIT = { childList: true, subtree: true }; var done = constant(false); var r###me = constant(true); var observe = (...args) => { const $ = document; const [target, init, callback] = args.length === 3 ? args : args.length === 2 ? args[0] instanceof Element ? [args[0], INIT, args[1]] : [$.body, args[0], args[1]] : [$.body, INIT, args[0]]; const $callback = (mutations, observer2) => { observer2.disconnect(); const r###me2 = callback({ mutations, observer: observer2, target, init }); if (r###me2 !== false) { observer2.observe(target, init); } }; const observer = new MutationObserver($callback); queueMicrotask(() => $callback([], observer)); return observer; }; // src/google-dwimages.user.ts // @license GPL var EVENTS = [ "auxclick", "click", "contextmenu", "focus", "focusin", "keydown", "mousedown", "touchstart" ]; var LINK_TARGET = "_blank"; var R###LT = ":scope > :is([data-lpage], [data-ri]):not([data-status])"; var R###LTS = ":has(> :is([data-lpage], [data-ri]))"; var stopPropagation = (e) => { e.stopPropagation(); }; var onImageLink = (link, r###lt) => { const { searchParams: params } = new URL(link.href); const src = params.get("imgurl"); if (!src) { console.warn("Can't find image URL in r###lt link:", { r###lt, link, params }); return; } const image = link.querySelector(":scope img"); if (!image) { console.warn("Can't find image in r###lt link:", { r###lt, link }); return; } link.href = src; link.title = image.alt; link.target = LINK_TARGET; r###lt.dataset.status = "fixed" /* FIXED */; image.parentElement.innerHTML = image.parentElement.innerHTML; }; var onR###lt = (r###lt) => { r###lt.dataset.status = "pending" /* PENDING */; for (const event of EVENTS) { r###lt.addEventListener(event, stopPropagation); } const imageLink = r###lt.querySelector(":scope a"); if (!imageLink) { console.warn("Can't find image link in r###lt:", r###lt); return; } observe(imageLink, { attributeFilter: ["href"] }, () => { return imageLink.href && done(onImageLink(imageLink, r###lt)); }); }; var run = () => { const r###lts = document.querySelector(R###LTS); if (!r###lts) { console.warn("Can't find r###lt container"); return; } observe(r###lts, { childList: true }, () => { r###lts.querySelectorAll(R###LT).forEach(onR###lt); }); }; run(); })();