// ==UserScript== // @name Highlight Every Code // @name:zh-CN 代码片段高亮 // @name:zh-TW 程式碼片斷高亮 // @namespace hoothin // @version 1.6 // @description Add a icon to popup a window that allows syntax highlighting and beautify and word count of source code snippets on current page // @description:zh-CN 选择代码片段后点击图标弹出新窗口显示语法高亮美化与格式化后的代码与字数统计 // @description:zh-TW 選擇程式碼片段後點選圖示彈出新視窗顯示語法高亮美化與格式化後的程式碼與字數統計 // @author Hoothin // @grant GM_openInTab // @compatible chrome // @compatible firefox // @license MIT License // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=rixixi@sina.com&item_name=Greasy+Fork+donation // @contributionAmount 1 // @include * // @downloadURL none // ==/UserScript== (function() { 'use strict'; var isChrome=unsafeWindow.chrome; var codeIcon=document.createElement("img"); var codes, selStr, scrollX, scrollY, customInput=false; codeIcon.style.cssText="position:fixed;z-index:99999;cursor:pointer;transition:opacity 0.5s ease-in-out 0s;opacity:0;border:5px solid rgba(0, 0, 0, 0.2);border-radius:10px;"; codeIcon.title="Show this code snippet"; codeIcon.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAYAgMAAACD0OXYAAAACVBMVEX7+/swMDBTU1MLxgsCAAAAJElEQVQI12MIBYEAGLUKBBbAqAUMQICgAoAqoBQ95JaCnASjAAgXMdk3d5HTAAAAAElFTkSuQmCC"; codeIcon.onmousedown=function(){ if(customInput){ selStr=prompt("Input code here",""); codes=selStr.replace(/&/g, "&").replace(/\/g,">"); } let html='Code Snippet'+ ''+ ''+ ''+ ''+ ''+ ''+ 'Code formatting: Javaspcript '+ 'Html '+ 'Css '+ 'Raw ('+selStr.length+' words)'+ '
' + codes + "
"; if(isChrome){ let c = window.open("", "_blank", "width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=0"); c.document.write(html); c.document.close(); }else{ GM_openInTab('data:text/html;charset=utf-8,' + encodeURIComponent(html)); } }; document.addEventListener('mousedown', function(o) { codeIcon.style.opacity=0; customInput=false; if(codeIcon.parentNode)codeIcon.parentNode.removeChild(codeIcon); }); document.addEventListener('mouseup', function(o) { if (o.button === 0 && (o.ctrlKey || o.altKey || o.metaKey || o.shiftKey)) { var customInputKey=(o.ctrlKey && o.shiftKey); setTimeout(function(){ selStr=document.getSelection().toString(); codes=selStr.replace(/&/g, "&").replace(/\/g,">"); if(!codes && customInputKey){ customInput=true; } if(codes || customInputKey){ document.body.appendChild(codeIcon); let pos=getMousePos(o); let left, top; if(isChrome){ top=pos.y>document.documentElement.clientHeight-50?(pos.y-30):(pos.y+20); left=pos.x>document.documentElement.clientWidth-50?(pos.x-30):(pos.x+20); }else{ top=pos.y-30; left=pos.x+15; } codeIcon.style.opacity=0.9; codeIcon.style.top=top+"px"; codeIcon.style.left=left+"px"; } },1); } },false); function getMousePos(event) { var e = event || window.event; scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; scrollY = document.documentElement.scrollTop || document.body.scrollTop; var x = (e.pageX || e.clientX) - scrollX; var y = (e.pageY || e.clientY) - scrollY; return { 'x': x, 'y': y }; } })();