您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show line numbers next to code in question
- // ==UserScript==
- // @name SO - Code line nums
- // @namespace http://mdev.me/
- // @description Show line numbers next to code in question
- // @include http://*stackoverflow.com/questions/*
- // @version 6
- // @grant none
- // ==/UserScript==
- var styles = document.createElement('link');
- styles.rel = 'stylesheet';
- styles.type = 'text/css';
- styles.href = 'http://mdev.me/SOcln.css';
- document.querySelector('head').appendChild(styles);
- var initLines = function() {
- var codeBlocks = N('body').findAll('#question pre, .answer pre, .wmd-preview pre');
- O(codeBlocks).loop(function(n){
- n = N(n);
- if(n.hasClass('mdevLinesEnabled') || n.hasClass('mdevLinesDisabled'))
- {
- n.removeClass('mdevLinesEnabled');n.removeClass('mdevLinesDisabled');
- N(n.find('.mdevLineBox')).remove();
- N(n.find('.mdevLinesToggle')).remove();
- n.n.style.paddingLeft = '';
- }
- n.n.style.position = 'relative';
- var codeEl = n.find("code");
- if(!codeEl) return;
- var codeH = codeEl.offsetHeight;
- var span = N(codeEl).find("span");
- var spanH = 17;
- var lineNoOffset = 1;
- if(span)
- {
- spanH = span.offsetHeight;
- var spanLines = span.innerHTML.match(/\r?\n/g);
- spanLines = spanLines ? spanLines.length+1 : 1;
- spanH = spanH/spanLines;
- if(N(span).find('span')) span = N(span).find('span');
- var m = null
- if(m = span.innerHTML.match(/^#Line:(\d+)/))
- {
- lineNoOffset = D(m[1]).toInt();
- }
- }
- else
- {
- spanH = parseInt(N(codeEl).getCompStyle('lineHeight'));
- if(m = codeEl.innerHTML.match(/^#Line:(\d+)/))
- {
- lineNoOffset = D(m[1]).toInt();
- }
- }
- var firstSpan = N(codeEl).find("span");
- var lastSpan = N(codeEl).findAll("span");
- lastSpan = lastSpan[lastSpan.length-1];
- var lines = Math.floor(codeH/spanH);
- if(firstSpan.innerHTML.match(/^\s*\r?\n\s*$/)) lines++;
- if(lastSpan.innerHTML.match(/^\s*\r?\n\s*$/)) lines++;
- if(lines>5)
- {
- n.addClass('mdevLinesEnabled');
- var lineBox = document.createElement('div');
- lineBox.className = 'mdevLineBox';
- lineBox.style.visibility = 'hidden';
- var lineNosAdded = 0;
- while(lineNosAdded<lines && lineNosAdded<200)
- {
- var lineNo = document.createElement('span');
- lineNo.className = 'mdevLineNo';
- lineNo.innerHTML = lineNosAdded+lineNoOffset;
- lineBox.appendChild(lineNo);
- lineNosAdded++;
- }
- n.n.appendChild(lineBox);
- var linesToggle = document.createElement('div');
- linesToggle.className = 'mdevLinesToggle';
- linesToggle.innerHTML = '#L';
- linesToggle.style.cursor = 'pointer';
- n.n.appendChild(linesToggle);
- disableSelection(linesToggle);
- addEvent(linesToggle,'click',function(e){
- var toggleLines = function(showHide){
- var pre = N(this).parent();
- var box = N(this).prev('div','mdevLineBox');
- var show = df(showHide,'string')&&showHide=='show';
- var hide = df(showHide,'string')&&showHide=='hide';
- var override = show||hide;
- show = (override&&show) || (!override&&N(box).getCompStyle('visibility')!='visible');
- hide = (override&&hide) || (!override&&N(box).getCompStyle('visibility')=='visible');
- if(show)
- {
- pre.style.paddingLeft = box.offsetWidth+10+"px";
- box.style.visibility = 'visible';
- }
- else if(hide)
- {
- pre.style.paddingLeft = "5px";
- box.style.visibility = 'hidden';
- }
- }
- var disable = function() {
- var pre = N(this).parent();
- toggleLines.call(this,'hide');
- N(pre).removeClass('mdevLinesEnabled');
- N(pre).addClass('mdevLinesDisabled');
- }
- if(e.shiftKey)
- {
- var show = N(N(this).prev('div','mdevLineBox')).getCompStyle('visibility')!='visible';
- O(N('#question').findAll('pre.mdevLinesEnabled')).loop(function(pre) {
- var that = N(pre).find('.mdevLinesToggle');
- if(e.ctrlKey) disable.call(that);
- else toggleLines.call(that,show?'show':'hide');
- })
- }
- else if(e.ctrlKey)
- {
- disable.call(this);
- }
- else toggleLines.call(this);
- })
- }
- });
- }
- var initScript = function() {
- addEvent(window,'load',function() {
- initLines();
- })
- }
- function disableSelection(target)
- {
- if (typeof target.onselectstart!="undefined")
- target.onselectstart=function(){return false}
- else if (typeof target.style.MozUserSelect!="undefined")
- target.style.MozUserSelect="none"
- else
- target.onmousedown=function(){return false}
- target.style.cursor = "default"
- }
- var scriptTag = document.createElement('script');
- scriptTag.type = 'text/javascript';
- scriptTag.src = 'https://greasyfork.org/scripts/1780-so-code-line-nums-prot-min-js-utility/code/SO%20-%20Code%20line%20nums%20%28protminjs%20utility%29.js';
- scriptTag.onreadystatechange=function(){if(this.readyState=='complete')initScript();}
- scriptTag.onload = initScript;
- document.body.appendChild(scriptTag);
- window.initLines = initLines;