tonyrulez

Google Search "View Image" Button

Aug 8th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
CSS 7.81 KB | None | 0 0
  1. // ==UserScript==
  2. // @name            Google Search "View Image" Button
  3. // @name:ru         Google Search кнопка "Показать в полном размере"
  4. // @name:sl         Gumb "Ogled slike" na Google Slikah
  5. // @name:uk         Google Search кнопка "Показати зображення"
  6. // @name:lt         Google paieškos mygtukas "Rodyti vaizdą"
  7. // @name:pl         Przycisk "Pokaż obraz" w wyszukiwarce obrazów Google
  8. // @name:ja         Google 検索「画像を表示」ボタン
  9. // @name:ko         Google 검색 ‘이미지 보기’ 버튼
  10. // @name:nl         Google zoeken "Afbeelding bekijken" knop
  11. // @name:sk         Tlačidlo "Zobraziť obrázok" pre Google Search
  12. // @namespace       https://github.com/devunt/make-gis-great-again
  13. // @icon            https://raw.githubusercontent.com/devunt/make-gis-great-again/master/icons/icon.png
  14. // @version         1.5.0.4
  15. // @description     This userscript adds "View Image" button to Google Image Search results.
  16. // @description:ru  Этот скрипт добавляет кнопку "Показать в полном размере" к результатам Google Image Search.
  17. // @description:sl  Ponovno prikaže gumb "Ogled slike" na Google Slikah.
  18. // @description:uk  Цей скрипт додає кнопку "Показати зображення" до результатів Google Image Search.
  19. // @description:lt  Šis vartotojo skriptas prideda mygtuką "Rodyti vaizdą" į Google vaizdo paieškos rezultatus.
  20. // @description:pl  Ten skrypt przywraca przycisk "Pokaż obraz" do wyszukiwarki obrazów Google.
  21. // @description:ja  この UserScript は Google 画像検索結果に「画像を表示」ボタンを追加します。
  22. // @description:ko  이 유저스크립트는 Google 이미지 검색 결과에 ‘이미지 보기’ 버튼을 추가합니다.
  23. // @description:nl  Voegt de "Afbeelding bekijken" knop aan toe aan Google Afbeeldingen.
  24. // @description:sk  Toto rozšírenie pridáva tlačidlo "Zobraziť obrázok" do výsledkov vyhľadávania Google Search.
  25. // @author          Bae Junehyeon
  26. // @run-at          document-end
  27. // @include         http*://*.google.tld/search*tbm=isch*
  28. // @include         http*://*.google.tld/imgres*
  29. // ==/UserScript==
  30.  
  31. const lang = {
  32.     ar: 'عرض الصورة',
  33.     cs: 'Zobrazit obrázek',
  34.     da: 'Vis billede',
  35.     de: 'Bild ansehen',
  36.     en: 'View image',
  37.     es: 'Ver imagen',
  38.     fi: 'Näytä kuva',
  39.     fr: 'Voir l\'image',
  40.     he: 'הצג תמונה',  // also 'iw'
  41.     hu: 'Kép megtekintése',
  42.     it: 'Apri immagine',
  43.     iw: 'הצג תמונה',  // same as 'he'
  44.     ja: '画像を表示',
  45.     ko: '이미지 보기',
  46.     lt: 'Rodyti vaizdą',
  47.     nl: 'Afbeelding bekijken',
  48.     no: 'Se bilde',
  49.     pl: 'Pokaż obraz',
  50.     pt: 'Ver imagem',
  51.     ru: 'Показать в полном размере',
  52.     se: 'Visa bild',  // also 'sv'
  53.     sk: 'Zobraziť obrázok',
  54.     sl: 'Ogled slike',
  55.     sv: 'Visa bild',  // same as 'se'
  56.     tr: 'Resmi görüntüle',
  57.     uk: 'Показати зображення',
  58.     zh: '查看原图',
  59.     'zh-CN': '查看原图',  // also 'zh'
  60.     },
  61.   srch = {
  62.     cs: 'Vyhledat podle obrázku',
  63.     da: 'Søg efter billede',
  64.     de: 'Zur "Bildersuche"',
  65.     en: 'Search by image',
  66.     es: 'Buscar por imagen',
  67.     fr: 'Recherche par image',
  68.     he: 'חפש לפי תמונה',  // also 'iw'
  69.     hu: 'Keresés kép alapján',
  70.     it: 'Ricerca tramite immagine',
  71.     iw: 'חפש לפי תמונה',  // same as 'he'
  72.     ja: '画像を検索',
  73.     ko: '이미지로 검색',
  74.     nl: 'Afbeelding zoeken',
  75.     no: 'Søk med bilde',
  76.     pl: 'Wyszukiwanie obrazem',
  77.     pt: 'Pesquisar por imagem',
  78.     ru: 'Поиск по картинке',
  79.     se: 'Fler storlekar',  // also 'sv'
  80.     sk: 'Vyhľadať podľa obrázku',
  81.     sl: 'Iskanje s sliko',
  82.     sv: 'Fler storlekar',  // same as 'se'
  83.     tr: 'Görselle Ara',
  84.     zh: '以图搜图',
  85.     };
  86.  
  87. const pgL=document.documentElement.lang;
  88. const localizedViewImage = lang[pgL] || lang[pgL.split('-')[0]] || lang[navigator.language] || lang[navigator.language.split('-')[0]] || lang['en'];
  89. const SBItxt = srch[pgL] || srch[pgL.split('-')[0]] || srch[navigator.language] || srch[navigator.language.split('-')[0]] || srch['en'];
  90.  
  91. function addButton(node) {
  92.   if (node.nodeType === Node.ELEMENT_NODE) {
  93.     if (node.classList.contains('irc_ris')) {
  94.       let container = node.closest('.irc_c');
  95.  
  96.       let similarImages = node.querySelectorAll('.rg_l');
  97.       [].forEach.call(similarImages, (image) => {
  98.         image.addEventListener('click', updateLinkAfterClickOnSimilar);
  99.       });
  100.  
  101.       let findSrc;
  102.       try{findSrc=container.querySelector(':scope .irc_t .irc_mi').src;}
  103.       catch(e){}
  104.  
  105.       let thumbnail = node.querySelector('.irc_rimask.irc_rist');
  106.       let src = findSrc || unescape(thumbnail.querySelector('.rg_l').href.match(/imgurl=([^&]+)/)[1]);
  107.  
  108.       let buttons = container.querySelector('.irc_but_r tr');
  109.       // new version
  110.       let nv=false;
  111.       if (!buttons) {
  112.         buttons = container.querySelector('.Qc8zh > .irc_ab');
  113.         nv=true;
  114.         }
  115.  
  116.       let button = buttons.querySelector(nv? 'a.mgisga' : 'td.mgisga');
  117.       if (button === null) {
  118.         let openButton = buttons.querySelector(nv ? 'a' : 'td');
  119.  
  120.         button = openButton.cloneNode(true);
  121.         // moved down: button.classList.add('mgisga');
  122.         let sp=button.querySelector(nv ? 'div span:nth-child(2)' : 'a span:nth-child(2)');
  123.         sp.innerText = localizedViewImage;
  124.         // remove icon and style
  125.         sp.parentNode.removeChild(sp.previousElementSibling);
  126.         sp.className='';
  127.  
  128.         let link = nv ? button : button.querySelector('a');
  129.         link.href = src;
  130.         if (!nv) link.className = '';
  131.         link.removeAttribute('data-cthref');
  132.         link.removeAttribute('jsaction');
  133.         link.removeAttribute('data-ved');
  134.  
  135.         button.classList.remove('irc_lth');
  136.         button.classList.add('mgisga');
  137.         if (nv && button.classList.contains('irc_hol')) button.style='margin-left: 8px;';
  138.  
  139.         openButton.after(button);
  140.  
  141.         // adding "Search by image"
  142.         let lnks = container.querySelector('.irc_b .irc_hd .irc_dsh');
  143.         let style = 'margin-left:1em', cls = 'o5rIVb SBIlnk';
  144.         if (!lnks) {
  145.           lnks = container.querySelector('.irc_ft').parentNode;
  146.           cls += ' irc_help';
  147.           style = '';
  148.           }
  149.         let lnkSBI = document.createElement('a');
  150.         let RE=/.*[\?&](hl=[^&]+)/.exec(location.search); // catch last &hl=xx parameter
  151.         lnkSBI.setAttribute('hrefbase','/searchbyimage?'+(RE?RE[1]+'&':'')+'image_url=');
  152.         lnkSBI.setAttribute('target','_blank');
  153.         lnkSBI.setAttribute('class',cls);
  154.         lnkSBI.setAttribute('style',style);
  155.         lnkSBI.innerText= SBItxt;
  156.         lnks.appendChild(lnkSBI);
  157.       }
  158.  
  159.       let link = nv ? button : button.querySelector('a');
  160.       link.href = src;
  161.       link = container.querySelector('.SBIlnk');
  162.       link.href = link.attributes.hrefbase.value + src;
  163.     }
  164.   }
  165. }
  166.  
  167. function updateLinkAfterClickOnSimilar({target:node}) {
  168.   let src = unescape(node.closest('.rg_l').href.match(/imgurl=([^&]+)/)[1]);
  169.   let container = node.closest('.irc_c');
  170.   let button = container.querySelector('.mgisga');
  171.   let link = button.querySelector('a');
  172.   if (!link) link = button;
  173.   link.href = src;
  174.   link = container.querySelector('.SBIlnk');
  175.   link.href = link.attributes.hrefbase.value + src;
  176. }
  177.  
  178. const observer = new MutationObserver((mutations) => {
  179.   mutations.forEach((mutation) => {
  180.     const addedNodes = mutation.addedNodes || [];
  181.  
  182.     [].forEach.call(addedNodes, (newNode) => {
  183.         addButton(newNode);
  184.     });
  185.   });
  186. });
  187.  
  188. observer.observe(document.body, {
  189.   childList: true,
  190.   subtree: true
  191. });
  192.  
  193. addButton(document.body);
Add Comment
Please, Sign In to add comment