添加Github文件下载、复制按钮、图片点击放大(右击恢复)、issues中只查看用户相关态度的内容、issues列表项从新标签页打开
// ==UserScript== // @name Github助手 // @namespace https://github.com/yeomanye // @version 0.7.2 // @description 添加Github文件下载、复制按钮、图片点击放大(右击恢复)、issues中只查看用户相关态度的内容、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 // @require https://greasyfork.org/scripts/53536-ui/code/UI.js?version=281393 // @author Ming Ye // @include 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; /** * 初始化函数 * @return {[type]} [description] */ function init(){ createDownLink(); createCopyLink(); bindImgClick(); createFilterPanel(); openIssueFromNew(); } /** * 创建下载链接 * @return {[type]} [description] */ 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); }); } /** * issues页面从新标签打开 * @return {[type]} [description] */ function openIssueFromNew(){ var tmpArr = href.split('/'); if(tmpArr[tmpArr.length - 1].indexOf('issues') < 0) return; $('.issues-listing .js-navigation-container a').on('click',function(e){ e.preventDefault(); e.stopPropagation(); log('this',this); window.open(this.href); }); } /** * 创建复制链接 * @return {[type]} [description] */ 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(){ timeout = null; 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); $a.on('click',function(){ showTips('Copy Success'); }); new Clipboard('.copyButton'); log.logObj('text',text); }; $a.one('click',function(evt){ if(timeout){ clearTimeout(timeout); addClickHandler(); } $a.click(); }); var timeout = setTimeout(addClickHandler,1000); } /** * 点击图片处理函数 * @return {[type]} [description] */ function bindImgClick(){ var $imgs = $('article img'); var srcArr = []; var newImg = null; var $modal = null; var width = $(window).width(),height = $(window).height(); //如果是issues页面,则改变img集合 var tmpArr = href.split('/'); if(tmpArr[tmpArr.length - 2].indexOf('issues')>=0){ $imgs = $('#show_issue .comment img'); } 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,userSelect:'none'}); var oldImg = e.currentTarget; newImg.src = oldImg.src; //计算宽高 newImg.onload = newImgOnload; }; $imgs.each(function(i,img){ var aElm = img.parentNode; if(aElm.getAttribute('rel') !== 'noopener noreferrer') return; aElm.removeAttribute('href'); var $img = $(img); $img.css('cursor','pointer').on('click',imgClickHandler); //去重 let index = srcArr.indexOf(img.src); if(index < 0) srcArr.push(img.src); }); } /** * 在Issue页面生成过滤面板 * @return {[type]} [description] */ 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(); }); })();