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();
    });
})();