[VarDumper] Ctrl+click toggles-all and fix IE8 support

This commit is contained in:
Nicolas Grekas 2015-03-26 13:40:21 +01:00
parent 12c1febd11
commit 70f1f24fd0

101
src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php Executable file → Normal file
View File

@ -115,56 +115,52 @@ Sfdump = window.Sfdump || (function (doc) {
var refStyle = doc.createElement('style'), var refStyle = doc.createElement('style'),
rxEsc = /([.*+?^${}()|\[\]\/\\])/g, rxEsc = /([.*+?^${}()|\[\]\/\\])/g,
idRx = /\bsf-dump-\d+-ref[012]\w+\b/; idRx = /\bsf-dump-\d+-ref[012]\w+\b/,
addEventListener = function (e, n, cb) {
e.addEventListener(n, cb, false);
};
doc.documentElement.firstChild.appendChild(refStyle); doc.documentElement.firstChild.appendChild(refStyle);
function expandAll(a) { if (!doc.addEventListener) {
toggle(a, true); addEventListener = function (element, eventName, callback) {
var samp = a.nextSibling; element.attachEvent('on' + eventName, function (e) {
for (var i = 0; i < samp.children.length; i++) { e.preventDefault = function () {e.returnValue = false;};
var child = samp.children[i]; e.target = e.srcElement;
if (child.tagName !== 'A') { callback(e);
continue; });
} };
if (! /\bsf-dump-compact\b/.test(child.nextSibling.className)) {
continue
}
expandAll(child);
}
} }
var altKeyPressed = false; function toggle(a, recursive) {
function keysPressed(e) { var s = a.nextSibling || {}, oldClass = s.className, arrow, newClass;
if (e.keyCode === 18) {
altKeyPressed = true;
}
}
function keysReleased(e) {
if (e.keyCode === 18) {
altKeyPressed = false;
}
}
window.addEventListener('keydown', keysPressed, false);
window.addEventListener('keyup', keysReleased, false);
function toggle(a, ignoreAltKey) { if ('sf-dump-compact' == oldClass) {
if (! ignoreAltKey && altKeyPressed) { arrow = '▼';
expandAll(a); newClass = 'sf-dump-expanded';
return true; } else if ('sf-dump-expanded' == oldClass) {
} arrow = '▶';
var s = a.nextSibling || {}; newClass = 'sf-dump-compact';
if ('sf-dump-compact' == s.className) {
a.lastChild.innerHTML = '▼';
s.className = 'sf-dump-expanded';
} else if ('sf-dump-expanded' == s.className) {
a.lastChild.innerHTML = '▶';
s.className = 'sf-dump-compact';
} else { } else {
return false; return false;
} }
a.lastChild.innerHTML = arrow;
s.className = newClass;
if (recursive) {
try {
a = s.querySelectorAll('.'+oldClass);
for (s = 0; s < a.length; ++s) {
if (a[s].className !== newClass) {
a[s].className = newClass;
a[s].previousSibling.lastChild.innerHTML = arrow;
}
}
} catch (e) {
}
}
return true; return true;
}; };
@ -172,7 +168,7 @@ return function (root) {
root = doc.getElementById(root); root = doc.getElementById(root);
function a(e, f) { function a(e, f) {
root.addEventListener(e, function (e) { addEventListener(root, e, function (e) {
if ('A' == e.target.tagName) { if ('A' == e.target.tagName) {
f(e.target, e); f(e.target, e);
} else if ('A' == e.target.parentNode.tagName) { } else if ('A' == e.target.parentNode.tagName) {
@ -180,20 +176,23 @@ return function (root) {
} }
}); });
}; };
root.addEventListener('mouseover', function (e) { addEventListener(root, 'mouseover', function (e) {
if ('' != refStyle.innerHTML) { if ('' != refStyle.innerHTML) {
refStyle.innerHTML = ''; refStyle.innerHTML = '';
} }
}); });
a('mouseover', function (a) { a('mouseover', function (a) {
if (a = idRx.exec(a.className)) { if (a = idRx.exec(a.className)) {
refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: #B729D9; color: #FFF !important; border-radius: 2px}'; try {
refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: #B729D9; color: #FFF !important; border-radius: 2px}';
} catch (e) {
}
} }
}); });
a('click', function (a, e) { a('click', function (a, e) {
if (/\bsf-dump-toggle\b/.test(a.className)) { if (/\bsf-dump-toggle\b/.test(a.className)) {
e.preventDefault(); e.preventDefault();
if (!toggle(a)) { if (!toggle(a, e.ctrlKey)) {
var r = doc.getElementById(a.getAttribute('href').substr(1)), var r = doc.getElementById(a.getAttribute('href').substr(1)),
s = r.previousSibling, s = r.previousSibling,
f = r.parentNode, f = r.parentNode,
@ -207,9 +206,19 @@ return function (root) {
r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\$1'), 'mg'), t[0]); r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\$1'), 'mg'), t[0]);
} }
if ('sf-dump-compact' == r.className) { if ('sf-dump-compact' == r.className) {
toggle(s); toggle(s, e.ctrlKey);
} }
} }
if (doc.getSelection) {
try {
doc.getSelection().removeAllRanges();
} catch (e) {
doc.getSelection().empty();
}
} else {
doc.selection.empty();
}
} }
}); });
@ -243,7 +252,7 @@ return function (root) {
} else { } else {
a.innerHTML += ' '; a.innerHTML += ' ';
} }
a.title = 'hold ALT and click to expand all children'; a.title = (a.title ? a.title+'\n' : '')+'[Ctrl+click] Expand all children';
a.innerHTML += '<span>▼</span>'; a.innerHTML += '<span>▼</span>';
a.className += ' sf-dump-toggle'; a.className += ' sf-dump-toggle';
if ('sf-dump' != elt.parentNode.className) { if ('sf-dump' != elt.parentNode.className) {