Greasy Fork 还支持 简体中文。

Github助手

添加Github文件下载、复制按钮、图片点击放大(右击恢复)、issues中只查看用户相关态度的内容的内容

От 22.02.2018. Виж последната версия.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Github助手
// @namespace    https://github.com/yeomanye
// @version      0.5.1
// @description  添加Github文件下载、复制按钮、图片点击放大(右击恢复)、issues中只查看用户相关态度的内容的内容
// @require      https://greasyfork.org/scripts/34143-debug/code/debug.js?version=246342
// @require      https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js
// @require      https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js
// @require      https://cdn.bootcss.com/jquery.pjax/1.1.0/jquery.pjax.min.js
// @author       Ming Ye
// @match        https://github.com
// @include      https://github.com/*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    myDebugger.debugD = false;
    var log = myDebugger.consoleFactory("github-btn","log",null);
    var debugTrue = myDebugger.debugTrue;  
    var href = location.href;
    // 初始化函数
    function init(){
        createDownLink();
        createCopyLink();
        bindImgClick();
        createFilterPanel();
    }
    //创建下载链接
    function createDownLink(){
        //如果不是repository页面则直接返回
        var $files = $('.octicon.octicon-file');
        if($files.length === 0) return;
        var mouseOverHandler = function(evt){
        // debugTrue();
        var elem = evt.currentTarget,
            aElm = elem.querySelector('.fileDownLink');
        aElm.style.visibility = 'visible';
        };

        var mouseOutHandler = function(evt){
            // debugTrue();
            var elem = evt.currentTarget,
                aElm = elem.querySelector('.fileDownLink');
            aElm.style.visibility = 'hidden';
        };

        var linkClick = function(evt){
            var elem = evt.currentTarget;
            var $link = $('<a></a>');
            $link.attr('href',elem.getAttribute('download-url'));
            $link.attr('download',elem.getAttribute('filename'));
            $link.get(0).click();
        };
        
        
        // debugTrue();
        var origin = location.origin,
            href = location.href,
            path = href.replace(origin,'');
        if(path.indexOf('tree')<0)
            path += 'tree/master/';
        path = path.replace('tree','raw');
        $files.each(function(i,fileElm){
            var trElm = fileElm.parentNode.parentNode,
                cntElm = trElm.querySelector('.content'),
                cntA = cntElm.querySelector('a'),
                fileName = cntA.innerText,
                $a = $('<a></a>');
            $a.text('下载');
            $a.attr({class:'fileDownLink','download-url':path+fileName,'filename':fileName});
            $a.css({cursor:'pointer',visibility:'hidden'});
            cntElm.appendChild($a.get(0));
            log.logObj('tr',trElm);
            trElm.onmouseover=mouseOverHandler;
            trElm.onmouseout=mouseOutHandler;
            $a.on('click',linkClick);
        });
    }
    //创建复制链接
    function createCopyLink(){
        //如果不是具体的文件页面则直接返回
        var $btnGroup = $('.file-actions .BtnGroup');
        if($btnGroup.length == 0)return;

        var tmpArr = location.href.split('/');
        tmpArr = tmpArr[tmpArr.length-1].split('.');//获取扩展名
        var excludeExts = ['jpg','md','markdown','MD','png'];
        if(tmpArr.length > 1 && excludeExts.indexOf(tmpArr[1]) >= 0) return;
        var $a = $('<a></a>');
        $a.attr({href:'#',class:'btn btn-sm BtnGroup-item copyButton'});
        $a.html('Copy');
        $btnGroup.append($a);
        var addClickHandler = function(){
            var $codes = $('.js-file-line-container .js-file-line'),
                text = "";
            $codes.each(function(index,code){
                log.logObj('code',code);
                text += code.innerText;
                if(code.innerText.indexOf('\n')<0) text += '\n';
            });
            $a.attr('data-clipboard-text',text);
            new Clipboard('.copyButton');
            log.logObj('text',text);     
        };
        $a.one('click',function(evt){
            clearTimeout(timeout);
            addClickHandler();
            $a.click();
        });
        var timeout = setTimeout(addClickHandler,1000);
    }
    //点击图片处理函数
    function bindImgClick(){
        var $imgs = $('article img');
        var srcArr = [];
        var newImg = null;
        var $modal = null;
        var width = $(window).width(),height = $(window).height();
        var newImgOnload = function(){
            var imgWidth = newImg.width,imgHeight = newImg.height;
            if(imgWidth > width || imgHeight > height)
            if(height > width){
                newImg.width = width;
            }else{
                newImg.height = height;
            }
            newImg.style.marginLeft = (width - newImg.width)/2 + 'px';
            newImg.style.marginTop = (height - newImg.height)/2 + 'px';
        };
        var initModal = function(){
            $modal = $('<div></div>');
            newImg = new Image();
            $modal.css({position:'fixed',width:width+'px',height:height+'px','background-color':'rgba(0,0,0,0.5)',top:0,left:0,'z-index':-1,'padding-top':0,'padding-left':'auto',visibility:'hidden'});
            $modal.append(newImg);
            $('body').append($modal);
            $modal.on('contextmenu',function(e){
                $modal.css({'z-index':-1,'visibility':'hidden'});
                return false;
            });
            $modal.on('click',function(e){
                var mouseX = e.originalEvent.x || e.originalEvent.layerX || 0;
                log.logObj('mouseX',mouseX);
                var oldSrc = newImg.src;
                var index = srcArr.indexOf(oldSrc);
                if(mouseX > width/2) {
                    //当前src在数组中的位置
                    index = ++index >= srcArr.length ? 0 : index;
                    newImg.src = srcArr[index];
                }else{
                    index = --index < 0 ? srcArr.length - 1 : index;
                    newImg.src = srcArr[index];
                }
                newImg.onload = newImgOnload;
            });
        };
        var imgClickHandler = function(e){
            log('imgClickHandler');
            if(!$modal) initModal();
            $modal.css({visibility:'visible','z-index':999});
            var oldImg = e.currentTarget;
            newImg.src = oldImg.src;
            //计算宽高
            newImg.onload = newImgOnload;
        };
        $imgs.each(function(i,img){
            var aElm = img.parentNode;
            aElm.removeAttribute('href');
            var $img = $(img);
            $img.css('cursor','pointer').on('click',imgClickHandler);
            srcArr.push(img.src);
        });
    }
    //在Issue页面生成过滤面板
    function createFilterPanel(){
        //如果不是具体issus页面,则直接退出函数
        var tmpArr = href.split('/');
        if(tmpArr[tmpArr.length - 2].indexOf('issues')<0)return;

        var $panel = $('.add-reactions-options.mx-1.mb-1').eq(0).clone(true);
        $('.discussion-sidebar-item.sidebar-assignee.js-discussion-sidebar-item').prepend($panel);
        var $cancelBtn = $('<button></button>').text('X');
        $cancelBtn.get(0).className = 'btn-link add-reactions-options-item js-reaction-option-item cancel-filter-btn';
        $panel.append($cancelBtn);
        var $btns = $panel.find('button');
        var filterHandler = function(evt){
            var btn = evt.currentTarget;
            var val = btn.value;
            var className = btn.className;
            log('value',val);
            var $comments = $('.timeline-comment-wrapper.js-comment-container');
            var authors = [];
            //显示全部
            if(className.indexOf('cancel-filter-btn')>=0){
                $comments.each(function(index,comment){
                    $comments.eq(index).css('display','block');
                });
                return;
            }
            //替换特殊情况
            val.replace('LAUGH unreact','LAUGH react');
            $comments.each(function(index,comment){
                var $comment = $comments.eq(index);
                var $sumBtns = $comment.find('.btn-link.reaction-summary-item');
                $sumBtns.each(function(i,btn){
                    if(btn.value === val){
                        authors.push($comment.find('a.author').text());
                    }
                });
            });
            $comments.each(function(index,comment){
                var $comment = $comments.eq(index);
                var authorName = $comment.find('a.author').text();
                if(authors.indexOf(authorName)<0){
                    $comment.css('display','none');
                }else{
                    $comment.css('display','block');
                }
            });
            $comments.eq(0).css('display','block');
        };
        $btns.each(function(index,elem){
            elem.addEventListener('click',filterHandler);
        });
    }
    init();
    $(document).on('pjax:success',function(evt){
        log('pjax:success');
        init();
    });
})();