minor #12109 [VarDumper] Improved dump in html (hason)

This PR was merged into the 2.6-dev branch.

Discussion
----------

[VarDumper] Improved dump in html

| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | http://www.w3.org/TR/html5/dom.html#the-id-attribute
| License       | MIT
| Doc PR        | -

Commits
-------

f214eda [VarDumper] Added unique id for every single dump in html
This commit is contained in:
Fabien Potencier 2014-10-03 14:41:34 +02:00
commit 063826d17f
4 changed files with 52 additions and 33 deletions

View File

@ -77,6 +77,7 @@ class DumpExtensionTest extends \PHPUnit_Framework_TestCase
if ($debug) {
$this->assertStringStartsWith('<script>', $dump);
$dump = preg_replace('/^.*?<pre/', '<pre', $dump);
$dump = preg_replace('/sf-dump-\\d{2,}/', 'sf-dump', $dump);
}
$this->assertEquals($expectedOutput, $dump);
}

View File

@ -32,18 +32,21 @@ class DumpDataCollectorTest extends \PHPUnit_Framework_TestCase
$collector->dump($data); $line = __LINE__;
$this->assertSame(1, $collector->getDumpsCount());
$dump = $collector->getDumps('html');
$this->assertTrue(isset($dump[0]['data']));
$dump[0]['data'] = preg_replace('/^.*?<pre/', '<pre', $dump[0]['data']);
preg_match('/sf-dump-(\\d{2,})/', $dump[0]['data'], $matches);
$dumpId = $matches[1];
$xDump = array(
array(
'data' => "<pre id=sf-dump><span class=sf-dump-0><span class=sf-dump-num>123</span>\n</span></pre><script>Sfjs.dump.instrument()</script>\n",
'data' => "<pre id=sf-dump-{$dumpId}><span class=sf-dump-0><span class=sf-dump-num>123</span>\n</span></pre><script>Sfjs.dump.instrument()</script>\n",
'name' => 'DumpDataCollectorTest.php',
'file' => __FILE__,
'line' => $line,
'fileExcerpt' => false,
),
);
$dump = $collector->getDumps('html');
$this->assertTrue(isset($dump[0]['data']));
$dump[0]['data'] = preg_replace('/^.*?<pre/', '<pre', $dump[0]['data']);
$this->assertSame($xDump, $dump);
$this->assertStringStartsWith(

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\VarDumper\Dumper;
use Symfony\Component\VarDumper\Cloner\Cursor;
use Symfony\Component\VarDumper\Cloner\Data;
/**
* HtmlDumper dumps variables as HTML.
@ -23,8 +24,9 @@ class HtmlDumper extends CliDumper
public static $defaultOutputStream = 'php://output';
protected $dumpHeader;
protected $dumpPrefix = '<pre id=sf-dump>';
protected $dumpPrefix = '<pre id=%id%>';
protected $dumpSuffix = '</pre><script>Sfjs.dump.instrument()</script>';
protected $dumpId = 'sf-dump';
protected $colors = true;
protected $headerIsDumped = false;
protected $lastDepth = -1;
@ -82,6 +84,15 @@ class HtmlDumper extends CliDumper
$this->dumpSuffix = $suffix;
}
/**
* {@inheritdoc}
*/
public function dump(Data $data, $lineDumper = null)
{
$this->dumpId = 'sf-dump-'.mt_rand();
parent::dump($data, $lineDumper);
}
/**
* Dumps the HTML header.
*/
@ -90,7 +101,7 @@ class HtmlDumper extends CliDumper
$this->headerIsDumped = true;
if (null !== $this->dumpHeader) {
return $this->dumpHeader;
return str_replace('%id%', $this->dumpId, $this->dumpHeader);
}
$line = <<<'EOHTML'
@ -129,7 +140,7 @@ Sfjs.dump.toggle = function(a) {
};
</script>
<style>
#sf-dump {
#%id% {
display: block;
background-color: #300a24;
white-space: pre;
@ -138,31 +149,33 @@ Sfjs.dump.toggle = function(a) {
font: 12px monospace, sans-serif;
padding: 5px;
}
#sf-dump span {
#%id% span {
display: inline;
}
#sf-dump .sf-dump-compact {
#%id% .sf-dump-compact {
display: none;
}
#sf-dump abbr {
#%id% abbr {
text-decoration: none;
border: none;
cursor: help;
}
#sf-dump a {
#%id% a {
text-decoration: none;
cursor: pointer;
}
#sf-dump a:hover {
#%id% a:hover {
text-decoration: underline;
}
EOHTML;
foreach ($this->styles as $class => $style) {
$line .= "#sf-dump .sf-dump-$class {{$style}}";
$line .= "#%id% .sf-dump-$class {{$style}}";
}
return $this->dumpHeader = preg_replace('/\s+/', ' ', $line).'</style>'.$this->dumpHeader;
$this->dumpHeader = preg_replace('/\s+/', ' ', $line).'</style>'.$this->dumpHeader;
return str_replace('%id%', $this->dumpId, $this->dumpHeader);
}
/**
@ -201,9 +214,9 @@ EOHTML;
if ('ref' === $style) {
$ref = substr($val, 1);
if ('#' === $val[0]) {
return "<a class=sf-dump-ref name=\"sf-dump-ref$ref\">$val</a>";
return "<a class=sf-dump-ref name=\"{$this->dumpId}-ref$ref\">$val</a>";
} else {
return "<a class=sf-dump-ref href=\"#sf-dump-ref$ref\">$val</a>";
return "<a class=sf-dump-ref href=\"#{$this->dumpId}-ref$ref\">$val</a>";
}
}
@ -236,14 +249,14 @@ EOHTML;
}
if (-1 === $this->lastDepth) {
$this->line = $this->dumpPrefix.$this->line;
$this->line = str_replace('%id%', $this->dumpId, $this->dumpPrefix).$this->line;
}
if (!$this->headerIsDumped) {
$this->line = $this->getDumpHeader().$this->line;
}
if (-1 === $depth) {
$this->line .= $this->dumpSuffix;
$this->line .= str_replace('%id%', $this->dumpId, $this->dumpSuffix);
parent::dumpLine(0);
}
$this->lastDepth = $depth;

View File

@ -33,7 +33,7 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
unset($a['uri']);
return $a;
}
},
));
$data = $cloner->cloneVar($var);
@ -44,12 +44,14 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
$out = preg_replace('/[ \t]+$/m', '', $out);
$var['file'] = htmlspecialchars($var['file'], ENT_QUOTES, 'UTF-8');
$intMax = PHP_INT_MAX;
preg_match('/sf-dump-(\\d{2,})/', $out, $matches);
$dumpId = $matches[1];
$this->assertSame(
<<<EOTXT
<foo></foo><bar><span class=sf-dump-0><span class=sf-dump-note>array:25</span> [<span name=sf-dump-child>
<span class=sf-dump-1>"<span class=sf-dump-meta>number</span>" => <span class=sf-dump-num>1</span>
<span class=sf-dump-meta>0</span> => <span class=sf-dump-const>null</span> <a class=sf-dump-ref name="sf-dump-ref1">#1</a>
<span class=sf-dump-meta>0</span> => <span class=sf-dump-const>null</span> <a class=sf-dump-ref name="sf-dump-{$dumpId}-ref1">#1</a>
"<span class=sf-dump-meta>const</span>" => <span class=sf-dump-num>1.1</span>
<span class=sf-dump-meta>1</span> => <span class=sf-dump-const>true</span>
<span class=sf-dump-meta>2</span> => <span class=sf-dump-const>false</span>
@ -72,7 +74,7 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
<span class=sf-dump-meta>options</span>: []
</span></span>}
<span class=sf-dump-meta>8</span> => resource:<span class=sf-dump-note>Unknown</span> {}
"<span class=sf-dump-meta>obj</span>" => <span class=sf-dump-note><abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr></span> {<span name=sf-dump-child> <a class=sf-dump-ref name="sf-dump-ref2">#2</a>
"<span class=sf-dump-meta>obj</span>" => <span class=sf-dump-note><abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr></span> {<span name=sf-dump-child> <a class=sf-dump-ref name="sf-dump-{$dumpId}-ref2">#2</a>
<span class=sf-dump-2><span class=sf-dump-public>foo</span>: "<span class=sf-dump-str>foo</span>"
"<span class=sf-dump-public>bar</span>": "<span class=sf-dump-str>bar</span>"
</span></span>}
@ -90,15 +92,15 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
</span></span>}
"<span class=sf-dump-meta>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
"<span class=sf-dump-meta>nobj</span>" => <span class=sf-dump-note>array:1</span> [<span name=sf-dump-child>
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => {} <a class=sf-dump-ref name="sf-dump-ref3">#3</a>
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => {} <a class=sf-dump-ref name="sf-dump-{$dumpId}-ref3">#3</a>
</span></span>]
"<span class=sf-dump-meta>recurs</span>" => <span class=sf-dump-note>array:1</span> [<span name=sf-dump-child> <a class=sf-dump-ref name="sf-dump-ref4">#4</a>
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => <a class=sf-dump-ref href="#sf-dump-ref4">&4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href="#sf-dump-ref4">@4</a>]
"<span class=sf-dump-meta>recurs</span>" => <span class=sf-dump-note>array:1</span> [<span name=sf-dump-child> <a class=sf-dump-ref name="sf-dump-{$dumpId}-ref4">#4</a>
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => <a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref4">&4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref4">@4</a>]
</span></span>]
<span class=sf-dump-meta>9</span> => <a class=sf-dump-ref href="#sf-dump-ref1">&1</a> <span class=sf-dump-const>null</span>
"<span class=sf-dump-meta>sobj</span>" => <span class=sf-dump-note><abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr></span> {<a class=sf-dump-ref href="#sf-dump-ref2">@2</a>}
"<span class=sf-dump-meta>snobj</span>" => <a class=sf-dump-ref href="#sf-dump-ref3">&3</a> {<a class=sf-dump-ref href="#sf-dump-ref3">@3</a>}
"<span class=sf-dump-meta>snobj2</span>" => {<a class=sf-dump-ref href="#sf-dump-ref3">@3</a>}
<span class=sf-dump-meta>9</span> => <a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref1">&1</a> <span class=sf-dump-const>null</span>
"<span class=sf-dump-meta>sobj</span>" => <span class=sf-dump-note><abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr></span> {<a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref2">@2</a>}
"<span class=sf-dump-meta>snobj</span>" => <a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref3">&3</a> {<a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref3">@3</a>}
"<span class=sf-dump-meta>snobj2</span>" => {<a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref3">@3</a>}
"<span class=sf-dump-meta>file</span>" => "<span class=sf-dump-str>{$var['file']}</span>"
b"<span class=sf-dump-meta>bin-key-é</span>" => ""
</span></span>]