Image Viewer

inject this script into any page, and right-click on the image you want to view full-size

14.03.2020 itibariyledir. En son verisyonu görün.

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name       Image Viewer
// @namespace  https://gist.github.com/bradenbest/04bd0fc2d57ec650449f
// @version    1.6.1
// @description  inject this script into any page, and right-click on the image you want to view full-size
// @copyright  2014 - 2017, Braden Best
//
// @match *
// ==/UserScript==

const firefox = /Firefox/i.test(navigator.userAgent);

function mk_node({
    name = "span",
    props = [],
    styles = [],
    events = [],
    extra = null
} = {}){
    let el = document.createElement(name);

    props.forEach(function([name, value]){
        el[name] = value;
    });

    styles.forEach(function([name, value]){
        el.style[name] = value;
    });

    events.forEach(function([name, callback]){
        el.addEventListener(name, function(ev){
            callback(ev, el);
        });
    });

    if(extra)
        extra(el);

    return el;
}

function mk_img(url){
    return mk_node({
        name: "img",
        props: [
            ["src",        url],
            ["className",  "img_viewer"],
            ["draggable",  "false"],
            ["dragging",   0],
            ["mousepos",   [0,0]],
            ["tabIndex",   0]
        ],
        styles: [
            ["position",  "absolute"],
            ["left",      "0px"],
            ["top",       (80 + document.body.scrollTop) + "px"],
            ["zIndex",    "2147483647"]
        ],
        events: [
            ["mousedown", function(ev, self){
                self.dragging = firefox
                    ? !self.dragging
                    : 1;

                self.mousepos[0] = (ev.clientX || ev.pageX);
                self.mousepos[1] = (ev.clientY || ev.pageY);
            }],
            ["mouseup", function(unused, self){
                if(firefox)
                    return false;

                self.dragging = 0;
            }],
            ["mousemove", function(ev, self){
                let curX = (ev.clientX || ev.pageX);
                let curY = (ev.clientY || ev.pageY);
                let diffX = curX - self.mousepos[0];
                let diffY = curY - self.mousepos[1];

                if(!self.dragging || (!diffX && !diffY))
                    return false;

                self.mousepos = [curX, curY];
                self.style.left = parseInt(self.style.left) + diffX + "px";
                self.style.top  = parseInt(self.style.top)  + diffY + "px";
            }],
            ["keydown", function(ev, self){
                let dispatch = ({
                    "ArrowUp":    ["height", -10],
                    "ArrowDown":  ["height", +10],
                    "ArrowLeft":  ["width",  -10],
                    "ArrowRight": ["width",  +10]
                })[ev.key] || ["width", 0];

                self[dispatch[0]] = +self[dispatch[0]] + dispatch[1];
            }]
        ]
    });
}

function mk_img_helper({img, img_helper_link}){
    let el = mk_node({
        name: "div",
        props: [
            ["innerHTML", "Click here to close image"],
            ["className", "img_viewer"]
        ],
        styles: [
            ["position",     "fixed"],
            ["left",         "0px"],
            ["top",          "0px"],
            ["margin",       "0"],
            ["padding",      "5px 0"],
            ["width",        "100%"],
            ["height",       "50px"],
            ["background",   "#fff"],
            ["borderBottom", "1px solid #ccc"],
            ["color",        "#000"],
            ["fontSize",     "12px"],
            ["textAlign",    "center"],
            ["zIndex",       "2147483647"]
        ],
        events: [
            ["click", function(unused, unused2){
                document.body.removeChild(img);
                document.body.removeChild(el);
                document.body.removeChild(img_helper_link);
            }]
        ]
    });

    return el;
}

function mk_img_helper_link(url){
    return mk_node({
        name: "a",
        props: [
            ["innerHTML", "Direct URL"],
            ["href", url],
            ["target", "_blank"],
            ["className", "img_viewer"]
        ],
        styles: [
            ["margin", "0"],
            ["padding", "0"],
            ["background", "#fff"],
            ["borderBottom", "1px solid #ccc"],
            ["display", "block"],
            ["width", "100%"],
            ["height", "20px"],
            ["position", "fixed"],
            ["left", "0"],
            ["top", "50px"],
            ["fontSize", "12px"],
            ["textAlign", "center"],
            ["zIndex", "2147483647"]
        ]
    });
}

function mk_img_group(url){
    let img = mk_img(url);
    let img_helper_link = mk_img_helper_link(url);
    let img_helper = mk_img_helper({img, img_helper_link});

    [img, img_helper, img_helper_link].forEach(function(node){
        document.body.appendChild(node);
    });

    return { img, img_helper, img_helper_link };
}

function clear(){
    [...document.querySelectorAll(".img_viewer")]
        .forEach(function(viewer){
            document.body.removeChild(viewer);
        });
}

function init(){
    [...document.querySelectorAll("img")].forEach(function(img){
        img.addEventListener("contextmenu", function(ev){
            mk_img_group(img.src);
            ev.preventDefault();
        });
    });

    document.body.addEventListener("mouseup", function(ev){
        if(firefox)
            return false;

        [...document.querySelectorAll(".img_viewer")]
            .forEach(function(viewer){
                viewer.dragging = 0;
            });
    });

    document.body.addEventListener("keydown", function(ev){
        let dispatch = ({
            "Escape":  clear,
            "Control": init
        })[ev.key] || (()=>null);

        dispatch();
    });
}

init();
console.log("Image Viewer started up.");
console.log("Try right-clicking an image");