您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
browse image(embeded a link) by a Popup Image Viewer ( Original version by NIO, Tweaked Design version by decembre)
- // ==UserScript==
- // @name PopupX - Flickr Tweak (Only Tiny Design Tweak for Flickr + Autopager support)
- // @namespace http://userscripts.org/users/45256
- // @description browse image(embeded a link) by a Popup Image Viewer ( Original version by NIO, Tweaked Design version by decembre)
- // @include http://*.pixnet.net/album/*
- // @include http://photo.pchome.com.tw/*
- // @include http://www.wretch.cc/album/*
- // @include http://www.wretch.cc/album/
- // @include http://www.wretch.cc/blog/*
- // @include http://picasaweb.google.com*
- // @include http://album.blog.yam.com/*
- // @include http://gnn.gamer.com.tw/*
- // @include http://*nownews.com*/*
- // @include http://2cat.twbbs.org/*
- // @include http://komica*.dreamhosters.com/*
- // @include http://blog.roodo.com/*
- // @include http://iphonecake.com/*
- // @include http://*.flickr.com/*
- // @include http://*.engadget.com/*
- // @include http://www.facebook.com/album.php*
- // @include http://class.ruten.com.tw/*
- // @version 0.0.1.20140630035010
- // ==/UserScript==
- /*
- ________________________________________________
- ________________________________________________
- >>> Original Author : nio
- // @name PopupX
- // @namespace http://userscripts.org/users/45256
- // @description browse image(embeded a link) by a Popup Image Viewer
- Go here for more information....
- >>> Thanks to Alesa Dam for her help!
- ________________________________________________
- ________________________________________________
- is Tweaked version for Flickr:
- ________________________________________________
- >> 2010-/08/18 : (Thanks to Alesa Dam ) : Press the shift (MAJ) while hovering a thumbnail, if I you want shows the preview . This way you can decide yourself when to see a bigger picture or not.
- >> 2010-/08/16
- - Added support to Autopager ...by inserting at the end of the script :
- window.addEventListener('AutoPagerAfterInsert', function(){PopupImage.load(); }, false);
- Now no needs to click on the blue button (must find a way to convert it in a On/Off button...)
- >> 2010/08/13
- - Idea of Alesa Dam : changed line 314 from this:"//img[@class='pc_img' or @class='setThumb' or @class='nextprev_thumb' ]"
- into this:"//img[(@class='pc_img' or @class='setThumb' or @class='nextprev_thumb') and not(contains(@src,'/cols/') or contains(@src,'_z.jpg'))]"
- to make it ignore collection mozaics (which contain '/cols/' in the src attribute) and 640px wide medium images (which contain '_z.jpg' int the src)
- >> 2010/08/12
- - just tweak Design by decembre (no new functions)
- */
- //CHANGE LOG in the Original Version
- // 2010/02/25 -
- // * support website: class.ruten.com.tw
- // * modify toolbox style
- // 2009/07/23 -
- // * support website: www.facebook.com/ profile.php & album.php
- // * fixed toolbox style: set width
- // 2009/06/14 -
- // * fixed website pattern: Gamer GNN
- // * some style changed.
- // 2009/06/03 -
- // * support website: *.engadget.com
- // 2009/05/28 -
- // * append a toolbox at top-left
- // * add a option: shrink image
- // 2009/05/27 -
- // * fixed pattern for yam
- // 2009/05/24 -
- // * support website: iphonecake.com, *.flickr.com
- // * add reload button.
- // * compatible with google chrome (bookmarklet).
- (function(){
- var __fit = false;
- var PopupImage =
- {
- //樣式集
- data :
- [
- //Pixnet相簿
- [
- /.*\.pixnet\.net\/album\//,
- /\/thumb_/,
- '/',
- '//*[@id="contentBody"]//img[@class="thumb"]'
- ],
- //PCHome Photo
- [
- /photo\.pchome\.com\.tw/,
- /s\./,
- '.',
- '//span[@class="PostponeImg Cover"]'
- // '//span/img[1]'
- ],
- //無名個人相簿
- [
- /www\.wretch\.cc\/album\/.+/,
- /thumbs\/t/,
- '',
- '//*[@class="side"]/a/img[1]'
- ],
- //無名相簿首頁
- [
- /www\.wretch\.cc\/album\/$/,
- /thumbs\/t/,
- '',
- '//*[@class="image_link"]/a/img[1]' //'.image_link >a>img:first-child'
- ],
- //無名blog頁面
- [
- /www\.wretch\.cc\/blog\/.+/,
- /http:\/\/([\w\W]+cover\/)([\w\W]+)_\w+([\w\W]*)$/,
- 'http://cover.wretch.cc/$2$3',
- "//*[@class='boxMySpaceImg' or @class='bighead' or @id='whowrapper']//img[1]"
- //'a.bighead>img:first-child, #whowrapper a img, #boxMySpace .boxMySpaceImg a img'
- ],
- //Picasaweb
- [
- /picasaweb\.google\.com(\.tw)?\/\w+/,
- /\/(s\d{2,4})(\-\w+)?\//,
- '/s640/',
- "//a/img[1]" //'a>img:first-child'
- ],
- //Yam
- [
- /album\.blog\.yam\.com\/\w+/,
- /\/album\/[\w]_/,
- '/album/',
- "//*[@class='photoimg' or @class='albumShow' or @id='sideBlock' or @id='albumList']//a/img" //'.photoimg a>img, .albumShow a>img, #sideBlock a>img, #albumList a>img';
- ],
- //Gamer GNN
- [
- /gnn\.gamer\.com\.tw\//,
- /\/(M|S)\//,
- '/B/',
- "//img[@class='gnnPIC']" //"//a[starts-with(@href,'javascript:showpic(')]/img" //'a[href^="javascript:showpic("]>img'
- ],
- //NowNews
- [
- /www\.nownews\.com\//,
- /s(\d+\.(jpg|JPG))/,
- 'i$1',
- "//a/img" //'a>img:first-child'
- ],
- //2cat (no frameset)
- [
- /2cat\.twbbs\.org\//,
- /thumb\/(\d+)s/,
- 'src/$1',
- "//div[@class='threadpost' or @class='reply']/a/img"
- ],
- //komica*.dreamhosters (no frameset)
- [
- /komica\d+\.dreamhosters\.com\//,
- /thumb\/(\d+)s/,
- 'src/$1',
- "//*[contains(name(),'FORM') or contains(name(),'form') or contains(name(),'TABLE')]//a/img"
- ],
- //Roodo Blog
- //sample: http://blog.roodo.com/ace_kaha/
- [
- /blog\.roodo\.com\//,
- /(\w+)_s/,
- '$1',
- "//div[@class='pict']//img"
- ],
- //iphonecake.com
- [
- /iphonecake\.com/,
- /(?:\-\w+)(\.jpg)/,
- '$1',
- "//img[@class='attachment-thumbnail']"
- ],
- //www.flickr.com
- [
- /flickr\.com/,
- /_[a-z](\.jpg)$/,
- '$1',
- "//img[(@class='pc_img' or @class='setThumb' or @class='nextprev_thumb') and not(contains(@src,'/cols/') or contains(@src,'_z.jpg'))]"
- ],
- //mining.tw
- // [
- // /mining\.tw/,
- // /http:\/\/([\w\W]+cover\/)([\w\W]+)_\w+([\w\W]*)$/,
- // 'http://cover.wretch.cc/$2$3',
- // "//div[@class='mPic']/a/img"
- // ],
- //http://chinese.engadget.com
- [
- /\w+\.engadget\.com/,
- /_thumbnail/,
- '',
- "//*[@class='thumb' or @class='postgallery']//a/img"
- ],
- //facebook album
- //facebook profile
- [
- /www\.facebook\.com\/(album|profile)\.php/,
- /s([\d_]+)?\.jpg/,
- 'n$1.jpg',
- "//div[@id='photos_of_wrapper' or @id='album_container' or @id='tab_content']//a/img"
- ],
- //ruten.com
- [
- /\.ruten\.com\.tw/,
- /_\w\.jpg$/,
- "_m.jpg",
- "//div[@id='bestgoods_div']/parent::td//a/img | //*[@class='featured-first' or @class='all-products']//a/img"
- ]
- ],
- //樣式組
- //針對不同網站有個別的設定
- PatternSet: function()
- {
- this.urlExpression = //;
- this.patternBefore = //;
- this.patternAfter = '';
- this.imgSelector = '';
- // self 指物件本身
- var self = this;
- //插入真實圖片元素
- this.appendTrueImage =
- function(srcImgNode, patternSet)
- {
- patternSet = self;
- var imgSrc = srcImgNode.getAttribute('src');
- //if (imgSrc == null)
- //imgSrc = srcImgNode.src;
- if (imgSrc == null || imgSrc == "")
- {
- if (location.href.match(/photo\.pchome/))
- {
- imgSrc = srcImgNode.getAttribute('id');
- imgSrc = imgSrc.replace(/Img\[([\w\/\.\-]+)\]/, '$1');
- }
- else if (location.href.match(/www\.wretch\.cc\/blog\/.+/))
- {
- var re = /\/blog\/(\w+)/;
- var after = 'http://cover.wretch.cc/$1.jpg';
- var href = srcImgNode.parentNode.getAttribute('href');
- imgSrc = href.replace(re, after).toLowerCase();
- }
- }
- imgSrc = imgSrc.replace(patternSet.patternBefore, patternSet.patternAfter);
- var imgNode = document.createElement('img');
- imgNode.setAttribute('class', 'trueImg');
- imgNode.setAttribute('src', imgSrc);
- imgNode.style.display = 'none';
- srcImgNode.parentNode.appendChild(imgNode);
- srcImgNode.addEventListener('mouseover',
- function(ev)
- // Alesa Dam change : only shows the preview if I press shift (MAJ) while hovering a thumbnail. This way y can decide yourself when to see a bigger picture or not.
- {
- if (!ev.shiftKey) {
- return;
- }
- PopupImage.show();
- var true_nodes = PopupImage.getElementsByClassName(ev.target.parentNode, 'trueImg');
- if (true_nodes.length == 0)
- true_nodes = PopupImage.getElementsByClassName(ev.target.parentNode.parentNode, 'trueImg');
- if (true_nodes.length > 0)
- {
- var srcNode = true_nodes[0];
- var get_src = srcNode.getAttribute('src');
- //顯示圖片
- PopupImage.setViewerSrc(get_src);
- //自動縮放
- //if (PopupImage.isFitWindow)
- if (__fit)
- {
- var sW = srcNode.width;
- var sH = srcNode.height;
- var iW = window.innerWidth;
- var iH = window.innerHeight;
- var dx = sW/iW;
- var dy = sH/iH;
- console.log('dx: '+dx+', dy:' + dy);
- // alert('dx: '+dx+', dy:' + dy);
- if (dx > 1 || dy > 1)
- {
- var fixed_ratio = 0.95;
- var ratio = dx > dy ? dx : dy;
- console.log('ratio: ' + ratio + ' after w,h: '+ (sW/ratio)*fixed_ratio + ',' + (sH/ratio)*fixed_ratio );
- PopupImage.setWidth((sW/ratio)*fixed_ratio);
- PopupImage.setHeight((sH/ratio)*fixed_ratio);
- }
- else
- {
- PopupImage.setWidth("");
- PopupImage.setHeight("");
- }
- }
- else
- {
- PopupImage.setWidth("");
- PopupImage.setHeight("");
- }
- }
- },
- false);
- srcImgNode.addEventListener('mouseout',
- function(ev)
- {
- PopupImage.hide();
- },
- false);
- srcImgNode.addEventListener('mousemove',
- function(ev)
- {
- var viewportWidth = window.innerWidth;
- var viewportHeight = window.innerHeight;
- var x,y;
- var paddingX= 100;
- var paddingY = 100;
- var imgWidth = PopupImage.getWidth();
- var imgHeight = PopupImage.getHeight();
- if(ev.pageX >= viewportWidth/2)
- {
- x = ev.pageX - imgWidth - paddingX;
- offsetX = (typeof(window.pageXOffset)=='undefined') ? ev.pageX - ev.clientX : window.pageXOffset;
- x = (x >= offsetX) ? x: offsetX;
- }
- else
- {
- x = eval(ev.pageX + paddingX);
- var dx = (ev.pageX + imgWidth + paddingX) - viewportWidth;
- x = (dx > 0) ? x-dx : x;
- }
- if (ev.clientY >= viewportHeight/2)
- {
- y = ev.pageY - imgHeight - paddingY;
- offsetY = (typeof(window.pageYOffset)=='undefined') ? ev.pageY - ev.clientY : window.pageYOffset;
- y = (y >= offsetY) ? y : offsetY;
- }
- else
- {
- y = eval(ev.pageY + paddingY);
- dy = (viewportHeight -( ev.clientY + imgHeight) - paddingY);
- y = (dy >= 0) ? y : y+dy-50;
- }
- PopupImage.setViewerPos(x, y);
- },
- false);
- },
- //列舉元素
- this.selectNodes =
- function(xpathExpr)
- {
- var nodes = new Array();
- var iters = document.evaluate(xpathExpr, document, null, XPathResult.ANY_TYPE, null);
- var node;
- while (node = iters.iterateNext())
- {
- nodes.push(node);
- };
- return nodes;
- },
- //檢查網址
- this.check = function()
- {
- if (location.href.match(self.urlExpression))
- self.set();
- },
- //建立所有物件及連結
- this.set = function()
- {
- PopupImage.isGetProfile = true;
- var nodes = this.selectNodes(this.imgSelector);
- for(var i=0;i<nodes.length;i++)
- {
- //建立原始圖片元素
- this.appendTrueImage(nodes[i], this);
- }
- }
- },
- //存放所有樣式組
- patterns : null,
- //頁面不支援的訊息
- NOT_SUPPORT_MSG : 'Not support this page !',
- //載入樣式
- loadPatterns :
- function()
- {
- var d = this.data;
- var aList = [];
- for (var i=0; i<d.length; i++)
- {
- var set = d[i];
- var p = new this.PatternSet();
- p.urlExpression = set[0];
- p.patternBefore = set[1];
- p.patternAfter = set[2];
- p.imgSelector = set[3];
- aList.push(p);
- }
- this.patterns = aList;
- return d.length;
- },
- //viewer flag
- isViewerShow: false,
- //match profile
- isGetProfile: false,
- //show not support alert
- isAlert : true,
- //auto fit
- isFitWindow: true,
- //viewer hide or show
- hide: function()
- {
- var viewer = document.getElementById('pi_viewer');
- if (viewer)
- {
- viewer.style.display = 'none';
- viewer.style.zIndex = 0;
- }
- },
- show: function()
- {
- var viewer = document.getElementById('pi_viewer');
- if (viewer)
- {
- viewer.style.display = 'block';
- viewer.style.zIndex = 65535;
- }
- },
- //設定位置
- setViewerPos: function(x,y)
- {
- var viewer = document.getElementById('pi_viewer');
- if (viewer)
- {
- viewer.style.top = eval(y + 10) + 'px';
- viewer.style.left = eval(x+ 10) + 'px';
- }
- },
- //取得寬度
- getWidth: function()
- {
- return document.getElementById('pi_viewer').offsetWidth;
- },
- //取得高度
- getHeight: function()
- {
- return document.getElementById('pi_viewer').offsetHeight;
- },
- setWidth: function(val)
- {
- var p = document.getElementById('pi_viewer');
- if (val)
- {
- p.style.width = val + ' px';
- p.width = val;
- }
- else //val = ''
- {
- p.style.removeProperty('width');
- p.removeAttribute('width');
- }
- },
- setHeight: function()
- {
- var p = document.getElementById('pi_viewer');
- if (val)
- {
- p.style.height = val + ' px';
- p.height = val;
- }
- else //val = ''
- {
- p.style.removeProperty('height');
- p.removeAttribute('height');
- }
- },
- getElementsByClassName : function (parentElement,className){
- var elems = parentElement.getElementsByTagName("*");
- var result=[];
- for (i=0; j=elems[i]; i++){
- if ((" "+j.className+" ").indexOf(" "+className+" ")!=-1)
- {
- result.push(j);
- }
- }
- return result;
- },
- //改變顯示路徑
- setViewerSrc: function(src)
- {
- //alert(src);
- var viewer = document.getElementById('pi_viewer');
- if (viewer)
- {
- viewer.setAttribute('src', src);
- }
- },
- //create PopupViewer Element
- setViewer: function()
- {
- var viewerNode = document.getElementById('pi_viewer');
- if (!viewerNode )
- {
- viewerNode = document.createElement('img');
- viewerNode.setAttribute('id', 'pi_viewer');
- ///decembre change : de dashed à solid 20px
- viewerNode.setAttribute('style', 'background: white;display: none;z-index:99;top:0;left:0;color:black;position:absolute;border:#888 solid 20px');
- document.body.appendChild(viewerNode);
- viewerNode.addEventListener('mouseover', function() {PopupImage.show();}, false);
- viewerNode.addEventListener('mouseout', function() {PopupImage.hide();}, false);
- viewerNode.addEventListener('click', function(){PopupImage.hide();}, false);
- }
- },
- //append a tool box
- setToolTip: function()
- {
- if (document.getElementById('pi_tooltip') == null)
- {
- var toolBox = document.createElement('div');
- /// decembre Change : width de 20px à 5px ; position fixed à ; top: de 300px à 500px, left à right , border de solid gray 1px à 0, padding de 2px à 0px, background : de #F2A531 (orange) à #FFFFFF (blanc)
- toolBox.setAttribute('style', 'width:5px; position:fixed; top:350px;right:10px;border:0;padding:0px;background:#FFFFFF;opacity:0.5;font:8px verdana !important;');
- toolBox.setAttribute('id', 'pi_tooltip');
- document.body.appendChild(toolBox);
- }
- },
- //append a reload button
- setReloadButton: function()
- {
- if (document.getElementById('pi_reload') == null)
- {
- var reloadImg = document.createElement('img');
- reloadImg.setAttribute('style', 'border:0;');
- /// decembre change image reload par bouton bleu
- reloadImg.src="data:;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABc0lEQVQ4je2Tz27TQByEv7XXSYgtIqWh4U9aop7gCThxgCOvwIG34EF4KlQJVQhUJLhUpCRumjiOY9fuZnd/HMqpROoZiZFGc5pvTqM+ffOtH5kMvlwy/pwxOitlP7c8MI6OqbFmw+Z6TupmTMlJsUGGoyCiQWP1zMv7gwPehUMOkxL9aEMwqWDRQLUF5yDw2LYhjzO+d+f+2K042VR8LYrgXP+qebW3x7glaB1AqBShAqUgjqAfC8976Gc9BoOI/nbF4XLC+GxCki78sRYI2CEFhAruacWgA09i4WGboBK6sub+MpZuWarOzvJt0M5UNwN3Au7Sf8A/AZDbFrwA4sEJ6K3HWI8X+btkPKyN8LMEDUxDrMso8pTFbKnyNFNX6uUH92b0lLdJT143in5uaK3MzZFqA8aB3WKpyfUFp9GEj5Jx0tTqtKrUVPHCBwzptB/LKNnnqBXLkYoYWkdiGrzZsL6ek7oLzln+ubOnQHOFxv4Gzp29cH1mY9IAAAAASUVORK5CYII=";
- /// decembre Change :
- // reloadImg.setAttribute('style', "position:fixed; top:20px;left:10px;border:0;cursor:pointer;");
- reloadImg.setAttribute('style', "border:0;cursor:pointer;");
- reloadImg.setAttribute('title', 'PopupX reload');
- reloadImg.setAttribute('id', 'pi_reload');
- reloadImg.addEventListener('click', function(){PopupImage.load(); }, false);
- document.getElementById('pi_tooltip').appendChild(reloadImg);
- }
- },
- //append a checkbox
- setFitCheckbox: function()
- {
- if (document.getElementById('pi_fit') == null)
- {
- var fit = document.createElement('label');
- fit.setAttribute('fit', '1');
- fit.setAttribute('id', 'pi_fit');
- ///decembre change : black à red
- fit.setAttribute('style', 'color:red !important;cursor:pointer;');
- fit.textContent = 'S: ' + (__fit ? "O" : "X");
- fit.setAttribute('title', fit.textContent);
- fit.addEventListener('click', function(){
- __fit = fit.getAttribute('fit') == '1' ? true : false;
- this.isFitWindow = __fit;
- fit.setAttribute('fit', (!this.isFitWindow)*1+'');
- fit.textContent = 'S: ' + (this.isFitWindow ? "O" : "X");
- fit.setAttribute('title', fit.textContent);
- }, false);
- document.getElementById('pi_tooltip').appendChild(document.createElement('hr'));
- document.getElementById('pi_tooltip').appendChild(fit);
- }
- },
- //check browser
- CheckBrowser: function()
- {
- if (navigator.userAgent)
- {
- if (typeof String.prototype.replace_regx == 'function')
- //if Google Chrome
- String.prototype.replace = String.prototype.replace_regx;
- }
- },
- //init
- init: function()
- {
- this.CheckBrowser();
- this.setViewer();
- this.setToolTip();
- this.setReloadButton();
- this.setFitCheckbox();
- },
- //load all
- load : function()
- {
- this.init();
- var count = this.loadPatterns();
- for(var i=0;i<count;i++)
- {
- this.patterns[i].check();
- }
- if (!PopupImage.isGetProfile && PopupImage.isAlert)
- {
- alert(this.NOT_SUPPORT_MSG);
- }
- }
- };
- (function()
- {
- //decembre change : Added support to Autopager
- PopupImage.isAlert = false;
- PopupImage.load();
- window.addEventListener('AutoPagerAfterInsert', function(){PopupImage.load(); }, false);
- })();
- })();