// ==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 // @downloadURL https://update.greasyfork.icu/scripts/1781/SO%20-%20Code%20line%20nums.user.js // @updateURL https://update.greasyfork.icu/scripts/1781/SO%20-%20Code%20line%20nums.meta.js // ==/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