2 java -jar compiler.jar --js $FileName$ --js_output_file ../inc/kint.js --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})()"
5 if ( typeof kintInitialized === 'undefined' ) {
8 visiblePluses : [], // all visible toggle carets
9 currentPlus : -1, // currently selected caret
11 selectText : function( element ) {
12 var selection = window.getSelection(),
13 range = document.createRange();
15 range.selectNodeContents(element);
16 selection.removeAllRanges();
17 selection.addRange(range);
20 each : function( selector, callback ) {
21 Array.prototype.slice.call(document.querySelectorAll(selector), 0).forEach(callback)
24 hasClass : function( target, className ) {
25 if ( !target.classList ) return false;
27 if ( typeof className === 'undefined' ) {
28 className = 'kint-show';
30 return target.classList.contains(className);
33 addClass : function( target, className ) {
34 if ( typeof className === 'undefined' ) {
35 className = 'kint-show';
37 target.classList.add(className);
40 removeClass : function( target, className ) {
41 if ( typeof className === 'undefined' ) {
42 className = 'kint-show';
44 target.classList.remove(className);
48 next : function( element ) {
50 element = element.nextElementSibling;
51 } while ( element.nodeName.toLowerCase() !== 'dd' );
56 toggle : function( element, hide ) {
57 var parent = kint.next(element);
59 if ( typeof hide === 'undefined' ) {
60 hide = kint.hasClass(element);
64 kint.removeClass(element);
66 kint.addClass(element);
69 if ( parent.childNodes.length === 1 ) {
70 parent = parent.childNodes[0].childNodes[0]; // reuse variable cause I can
72 // parent is checked in case of empty <pre> when array("\n") is dumped
73 if ( parent && kint.hasClass(parent, 'kint-parent') ) {
74 kint.toggle(parent, hide)
79 toggleChildren : function( element, hide ) {
80 var parent = kint.next(element)
81 , nodes = parent.getElementsByClassName('kint-parent')
84 if ( typeof hide === 'undefined' ) {
85 hide = kint.hasClass(element);
89 kint.toggle(nodes[i], hide);
91 kint.toggle(element, hide);
94 toggleAll : function( caret ) {
95 var elements = document.getElementsByClassName('kint-parent')
97 , visible = kint.hasClass(caret.parentNode);
100 kint.toggle(elements[i], visible);
104 switchTab : function( target ) {
105 var lis, el = target, index = 0;
107 target.parentNode.getElementsByClassName('kint-active-tab')[0].className = '';
108 target.className = 'kint-active-tab';
110 // take the index of clicked title tab and make the same n-th content tab visible
111 while ( el = el.previousSibling ) el.nodeType === 1 && index++;
112 lis = target.parentNode.nextSibling.childNodes;
113 for ( var i = 0; i < lis.length; i++ ) {
115 lis[i].style.display = 'block';
117 if ( lis[i].childNodes.length === 1 ) {
118 el = lis[i].childNodes[0].childNodes[0];
120 if ( kint.hasClass(el, 'kint-parent') ) {
121 kint.toggle(el, false)
125 lis[i].style.display = 'none';
130 isSibling : function( el ) {
133 if ( !el || kint.hasClass(el, 'kint') ) break;
139 fetchVisiblePluses : function() {
140 kint.visiblePluses = [];
141 kint.each('.kint nav, .kint-tabs>li:not(.kint-active-tab)', function( el ) {
142 if ( el.offsetWidth !== 0 || el.offsetHeight !== 0 ) {
143 kint.visiblePluses.push(el)
148 openInNewWindow : function( kintContainer ) {
151 if ( newWindow = window.open() ) {
152 newWindow.document.open();
153 newWindow.document.write(
156 + '<title>Kint (' + new Date().toISOString() + ')</title>'
157 + '<meta charset="utf-8">'
158 + document.getElementsByClassName('-kint-js')[0].outerHTML
159 + document.getElementsByClassName('-kint-css')[0].outerHTML
162 + '<input style="width: 100%" placeholder="Take some notes!">'
163 + '<div class="kint">'
164 + kintContainer.parentNode.outerHTML
167 newWindow.document.close();
171 sortTable : function( table, column ) {
172 var tbody = table.tBodies[0];
174 var format = function( s ) {
175 var n = column === 1 ? s.replace(/^#/, '') : s;
177 return s.trim().toLocaleLowerCase();
180 return isNaN(n) ? s.trim() : n;
185 [].slice.call(table.tBodies[0].rows)
186 .sort(function( a, b ) {
187 a = format(a.cells[column].textContent);
188 b = format(b.cells[column].textContent);
189 if ( a < b ) return -1;
190 if ( a > b ) return 1;
194 .forEach(function( el ) {
195 tbody.appendChild(el);
200 cleanup : function( i ) {
201 var focusedClass = 'kint-focused';
202 var prevElement = document.querySelector('.' + focusedClass);
203 prevElement && kint.removeClass(prevElement, focusedClass);
206 var el = kint.visiblePluses[i];
207 kint.addClass(el, focusedClass);
210 var offsetTop = function( el ) {
211 return el.offsetTop + ( el.offsetParent ? offsetTop(el.offsetParent) : 0 );
214 var top = offsetTop(el) - (window.innerHeight / 2 );
215 window.scrollTo(0, top);
218 kint.currentPlus = i;
221 moveCursor : function( up, i ) {
222 // todo make the first VISIBLE plus active
225 i = kint.visiblePluses.length - 1;
228 if ( ++i >= kint.visiblePluses.length ) {
233 kint.keyCallBacks.cleanup(i);
239 window.addEventListener("click", function( e ) {
240 var target = e.target
241 , nodeName = target.nodeName.toLowerCase();
243 if ( !kint.isSibling(target) ) return;
245 // auto-select name of variable
246 if ( nodeName === 'dfn' ) {
247 kint.selectText(target);
248 target = target.parentNode;
249 } else if ( nodeName === 'var' ) { // stupid workaround for misc elements
250 target = target.parentNode; // to not stop event from further propagating
251 nodeName = target.nodeName.toLowerCase()
252 } else if ( nodeName === 'th' ) {
254 kint.sortTable(target.parentNode.parentNode.parentNode, target.cellIndex)
260 if ( nodeName === 'li' && target.parentNode.className === 'kint-tabs' ) {
261 if ( target.className !== 'kint-active-tab' ) {
262 kint.switchTab(target);
263 if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
268 // handle clicks on the navigation caret
269 if ( nodeName === 'nav' ) {
270 // special case for nav in footer
271 if ( target.parentNode.nodeName.toLowerCase() === 'footer' ) {
272 target = target.parentNode;
273 if ( kint.hasClass(target) ) {
274 kint.removeClass(target)
276 kint.addClass(target)
279 // ensure doubleclick has different behaviour, see below
280 setTimeout(function() {
281 var timer = parseInt(target.kintTimer, 10);
285 kint.toggleChildren(target.parentNode); // <dt>
286 if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
293 } else if ( kint.hasClass(target, 'kint-parent') ) {
295 if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
297 } else if ( kint.hasClass(target, 'kint-ide-link') ) {
299 var ajax = new XMLHttpRequest(); // add ajax call to contact editor but prevent link default action
300 ajax.open('GET', target.href);
303 } else if ( kint.hasClass(target, 'kint-popup-trigger') ) {
304 var kintContainer = target.parentNode;
305 if ( kintContainer.nodeName.toLowerCase() === 'footer' ) {
306 kintContainer = kintContainer.previousSibling;
308 while ( kintContainer && !kint.hasClass(kintContainer, 'kint-parent') ) {
309 kintContainer = kintContainer.parentNode;
313 kint.openInNewWindow(kintContainer);
314 } else if ( nodeName === 'pre' && e.detail === 3 ) { // triple click pre to select it all
315 kint.selectText(target);
319 window.addEventListener("dblclick", function( e ) {
320 var target = e.target;
321 if ( !kint.isSibling(target) ) return;
323 if ( target.nodeName.toLowerCase() === 'nav' ) {
324 target.kintTimer = 2;
325 kint.toggleAll(target);
326 if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
331 // keyboard navigation
332 window.onkeydown = function( e ) { // direct assignment is used to have priority over ex FAYT
334 // do nothing if alt/ctrl key is pressed or if we're actually typing somewhere
335 if ( e.target !== document.body || e.altKey || e.ctrlKey ) return;
337 var keyCode = e.keyCode
338 , shiftKey = e.shiftKey
339 , i = kint.currentPlus;
342 if ( keyCode === 68 ) { // 'd' : toggles navigation on/off
344 kint.fetchVisiblePluses();
345 return kint.keyCallBacks.moveCursor(false, i);
347 kint.keyCallBacks.cleanup(-1);
351 if ( i === -1 ) return;
353 if ( keyCode === 9 ) { // TAB : moves up/down depending on shift key
354 return kint.keyCallBacks.moveCursor(shiftKey, i);
355 } else if ( keyCode === 38 ) { // ARROW UP : moves up
356 return kint.keyCallBacks.moveCursor(true, i);
357 } else if ( keyCode === 40 ) { // ARROW DOWN : down
358 return kint.keyCallBacks.moveCursor(false, i);
363 var kintNode = kint.visiblePluses[i];
364 if ( kintNode.nodeName.toLowerCase() === 'li' ) { // we're on a trace tab
365 if ( keyCode === 32 || keyCode === 13 ) { // SPACE/ENTER
366 kint.switchTab(kintNode);
367 kint.fetchVisiblePluses();
368 return kint.keyCallBacks.moveCursor(true, i);
369 } else if ( keyCode === 39 ) { // arrows
370 return kint.keyCallBacks.moveCursor(false, i);
371 } else if ( keyCode === 37 ) {
372 return kint.keyCallBacks.moveCursor(true, i);
376 kintNode = kintNode.parentNode; // simple dump
377 if ( keyCode === 32 || keyCode === 13 ) { // SPACE/ENTER : toggles
378 kint.toggle(kintNode);
379 kint.fetchVisiblePluses();
381 } else if ( keyCode === 39 || keyCode === 37 ) { // ARROW LEFT/RIGHT : respectively hides/shows and traverses
382 var visible = kint.hasClass(kintNode);
383 var hide = keyCode === 37;
386 kint.toggleChildren(kintNode, hide); // expand/collapse all children if immediate ones are showing
388 if ( hide ) { // LEFT
389 // traverse to parent and THEN hide
390 do {kintNode = kintNode.parentNode} while ( kintNode && kintNode.nodeName.toLowerCase() !== 'dd' );
393 kintNode = kintNode.previousElementSibling;
396 var parentPlus = kintNode.querySelector('nav');
397 while ( parentPlus !== kint.visiblePluses[++i] ) {}
398 kint.keyCallBacks.cleanup(i)
399 } else { // we are at root
400 kintNode = kint.visiblePluses[i].parentNode;
403 kint.toggle(kintNode, hide);
405 kint.fetchVisiblePluses();
410 window.addEventListener("load", function( e ) { // colorize microtime results relative to others
411 var elements = Array.prototype.slice.call(document.querySelectorAll('.kint-microtime'), 0);
412 elements.forEach(function( el ) {
413 var value = parseFloat(el.innerHTML)
418 elements.forEach(function( el ) {
419 var val = parseFloat(el.innerHTML);
421 if ( min > val ) min = val;
422 if ( max < val ) max = val;
425 ratio = 1 - (value - min) / (max - min);
427 el.style.background = 'hsl(' + Math.round(ratio * 120) + ',60%,70%)';
432 // debug purposes only, removed in minified source
434 if ( !window.console )return;
435 var l = arguments.length, o = 0;
436 while ( o < l )console.log(arguments[o++])