diff --git a/framework/yii/views/errorHandler/callStackItem.php b/framework/yii/views/errorHandler/callStackItem.php index 696c0b7..c59473e 100644 --- a/framework/yii/views/errorHandler/callStackItem.php +++ b/framework/yii/views/errorHandler/callStackItem.php @@ -13,7 +13,8 @@ */ $context = $this->context; ?> -
window.onload = function() { - var i, imax, - codeBlocks = Sizzle('pre'), + var codeBlocks = Sizzle('pre'), callStackItems = Sizzle('.call-stack-item'); // highlight code blocks - for (i = 0, imax = codeBlocks.length; i < imax; ++i) { + for (var i = 0, imax = codeBlocks.length; i < imax; ++i) { hljs.highlightBlock(codeBlocks[i], ' '); } // code block hover line document.onmousemove = function(e) { - var lines, i, imax, j, jmax, k, kmax, - event = e || window.event, - y = event.clientY, - lineFound = false; - for (i = 0, imax = codeBlocks.length; i < imax; ++i) { - lines = codeBlocks[i].getClientRects(); - for (j = 0, jmax = lines.length; j < jmax; ++j) { - if (y > lines[j].top && y < lines[j].bottom) { + var event = e || window.event, + clientY = event.clientY, + lineFound = false, + hoverLines = Sizzle('.hover-line'); + + for (var i = 0, imax = codeBlocks.length; i < imax; ++i) { + var lines = codeBlocks[i].getClientRects(); + for (var j = 0, jmax = lines.length; j < jmax; ++j) { + if (clientY > lines[j].top && clientY < lines[j].bottom) { lineFound = true; break; } @@ -442,8 +433,8 @@ window.onload = function() { break; } } - var hoverLines = Sizzle('.hover-line'); - for (k = 0, kmax = hoverLines.length; k < kmax; ++k) { + + for (var k = 0, kmax = hoverLines.length; k < kmax; ++k) { hoverLines[k].className = 'hover-line'; } if (lineFound) { @@ -452,13 +443,34 @@ window.onload = function() { line[0].className = 'hover-line hover'; } } - } + }; + + var refreshCallStackItemCode = function(callStackItem) { + var top = callStackItem.offsetTop - window.scrollY, + lines = Sizzle('pre', callStackItem)[0].getClientRects(), + lineNumbers = Sizzle('.lines-item', callStackItem), + errorLine = Sizzle('.error-line', callStackItem)[0], + hoverLines = Sizzle('.hover-line', callStackItem); + for (var i = 0, imax = lines.length; i < imax; ++i) { + lineNumbers[i].style.top = parseInt(lines[i].top - top) + 'px'; + hoverLines[i].style.top = parseInt(lines[i].top - top) + 'px'; + hoverLines[i].style.height = parseInt(lines[i].bottom - lines[i].top) + 'px'; + if (parseInt(callStackItem.getAttribute('data-line')) == i) { + errorLine.style.top = parseInt(lines[i].top - top) + 'px'; + errorLine.style.height = parseInt(lines[i].bottom - lines[i].top) + 'px'; + } + } + }; + + for (var i = 0, imax = callStackItems.length; i < imax; ++i) { + refreshCallStackItemCode(callStackItems[i]); - // toggle code block visibility - for (i = 0, imax = callStackItems.length; i < imax; i++) { + // toggle code block visibility Sizzle('.element-wrap', callStackItems[i])[0].addEventListener('click', function() { - var code = Sizzle('.code-wrap', this.parentNode)[0]; + var callStackItem = this.parentNode, + code = Sizzle('.code-wrap', callStackItem)[0]; code.style.display = window.getComputedStyle(code).display == 'block' ? 'none' : 'block'; + refreshCallStackItemCode(callStackItem); }); } };