Skip to content

Commit 0e4953c

Browse files
committed
feature #12355 [VarDumper] Use symfony.com's colorscheme (nicolas-grekas, WouterJ)
This PR was merged into the 2.6-dev branch. Discussion ---------- [VarDumper] Use symfony.com's colorscheme As promised, this PR changed the current colorscheme to something used in Symfony. This means developers have a consistent experience and the colorscheme is easier to read. While doings this, I also improved the `HtmlDumper#style()` method to make it easier to understand and maintain. I also changed a bit of the output it created, mostly adding visibility prefixes to properties. **Before** ![sf-dump-before](https://cloud.githubusercontent.com/assets/749025/4828241/b070d32e-5f7e-11e4-9d51-865ffd47753e.png) **After** ![sf-dump-after](https://cloud.githubusercontent.com/assets/749025/4828244/b4ec3e52-5f7e-11e4-9031-71f41bc30c25.png) | Q | A | ------------- | --- | Bug fix? | yes | New feature? | yes | BC breaks? | - | Deprecations? | - | Tests pass? | - | Fixed tickets | #12348 | License | MIT | Doc PR | the one about the VarDumper Commits ------- 07a1e70 Changed meta color a316420 [VarDumper] use symfony.com colorscheme 7ffba44 [VarDumper] UML prefixes for properties
2 parents ecc5843 + 856311d commit 0e4953c

File tree

4 files changed

+69
-57
lines changed

4 files changed

+69
-57
lines changed

Dumper/CliDumper.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class CliDumper extends AbstractDumper
3939
'protected' => '38;5;166',
4040
'private' => '38;5;160',
4141
'meta' => '38;5;27',
42+
'key' => '38;5;27',
43+
'index' => '38;5;27',
4244
);
4345

4446
protected static $controlCharsRx = '/[\x00-\x1F\x7F]/';
@@ -258,14 +260,16 @@ protected function dumpKey(Cursor $cursor)
258260
if (null !== $key = $cursor->hashKey) {
259261
$attr = array('binary' => $cursor->hashKeyIsBinary);
260262
$bin = $cursor->hashKeyIsBinary ? 'b' : '';
263+
$style = 'key';
261264
switch ($cursor->hashType) {
262265
default:
263266
case Cursor::HASH_INDEXED:
267+
$style = 'index';
264268
case Cursor::HASH_ASSOC:
265269
if (is_int($key)) {
266-
$this->line .= $this->style('meta', $key).' => ';
270+
$this->line .= $this->style($style, $key).' => ';
267271
} else {
268-
$this->line .= $bin.'"'.$this->style('meta', $key).'" => ';
272+
$this->line .= $bin.'"'.$this->style($style, $key).'" => ';
269273
}
270274
break;
271275

@@ -274,28 +278,33 @@ protected function dumpKey(Cursor $cursor)
274278
// No break;
275279
case Cursor::HASH_OBJECT:
276280
if (!isset($key[0]) || "\0" !== $key[0]) {
277-
$this->line .= $bin.$this->style('public', $key).': ';
281+
$this->line .= '+'.$bin.$this->style('public', $key).': ';
278282
} elseif (0 < strpos($key, "\0", 1)) {
279283
$key = explode("\0", substr($key, 1), 2);
280284

281285
switch ($key[0]) {
282286
case '+': // User inserted keys
283287
$attr['dynamic'] = true;
284-
$this->line .= $bin.'"'.$this->style('public', $key[1], $attr).'": ';
288+
$this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": ';
285289
break 2;
286-
287-
case '~': $style = 'meta'; break;
288-
case '*': $style = 'protected'; break;
290+
case '~':
291+
$style = 'meta';
292+
break;
293+
case '*':
294+
$style = 'protected';
295+
$bin = '#'.$bin;
296+
break;
289297
default:
290298
$attr['class'] = $key[0];
291299
$style = 'private';
300+
$bin = '-'.$bin;
292301
break;
293302
}
294303

295304
$this->line .= $bin.$this->style($style, $key[1], $attr).': ';
296305
} else {
297306
// This case should not happen
298-
$this->line .= $bin.'"'.$this->style('private', $key, array('class' => '')).'": ';
307+
$this->line .= '-'.$bin.'"'.$this->style('private', $key, array('class' => '')).'": ';
299308
}
300309
break;
301310
}

Dumper/HtmlDumper.php

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,19 @@ class HtmlDumper extends CliDumper
3131
protected $headerIsDumped = false;
3232
protected $lastDepth = -1;
3333
protected $styles = array(
34-
'num' => 'font-weight:bold;color:#0087FF',
35-
'const' => 'font-weight:bold;color:#0087FF',
36-
'str' => 'font-weight:bold;color:#00D7FF',
34+
'num' => 'font-weight:bold;color:#1299DA',
35+
'const' => 'font-weight:bold',
36+
'str' => 'font-weight:bold;color:#56DB3A',
3737
'cchr' => 'font-style: italic',
38-
'note' => 'color:#D7AF00',
39-
'ref' => 'color:#585858',
40-
'solo-ref' => 'color:#585858',
41-
'public' => 'color:#008700',
42-
'protected' => 'color:#D75F00',
43-
'private' => 'color:#D70000',
44-
'meta' => 'color:#005FFF',
38+
'note' => 'color:#1299DA',
39+
'ref' => 'color:#A0A0A0',
40+
'solo-ref' => 'color:#A0A0A0',
41+
'public' => 'color:#FFFFFF',
42+
'protected' => 'color:#FFFFFF',
43+
'private' => 'color:#FFFFFF',
44+
'meta' => 'color:#B729D9',
45+
'key' => 'color:#56DB3A',
46+
'index' => 'color:#1299DA',
4547
);
4648

4749
/**
@@ -150,7 +152,7 @@ function a(e, f) {
150152
});
151153
a('mouseover', function (a) {
152154
if (a = idRx.exec(a.className)) {
153-
refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: yellow; border-radius: 2px}';
155+
refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: #B729D9; color: #FFF !important; border-radius: 2px}';
154156
}
155157
});
156158
a('click', function (a, e) {
@@ -245,13 +247,12 @@ function a(e, f) {
245247
<style>
246248
pre.sf-dump {
247249
display: block;
248-
background-color: #300a24;
250+
background-color: #18171B;
249251
white-space: pre;
250252
line-height: 1.2em;
251-
color: #eee8d5;
252-
font: 12px monospace, sans-serif;
253+
color: #FF8400;
254+
font: 12px Menlo, Monaco, Consolas, monospace;
253255
padding: 5px;
254-
border-radius: 5px;
255256
}
256257
pre.sf-dump span {
257258
display: inline;
@@ -337,8 +338,8 @@ protected function style($style, $value, $attr = array())
337338

338339
if ('const' === $style && array_key_exists('value', $attr)) {
339340
$style .= sprintf(' title="%s"', htmlspecialchars(json_encode($attr['value']), ENT_QUOTES, 'UTF-8'));
340-
} elseif ('public' === $style && !empty($attr['dynamic'])) {
341-
$style .= ' title="Runtime added dynamic property"';
341+
} elseif ('public' === $style) {
342+
$style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property');
342343
} elseif ('str' === $style && 1 < $attr['length']) {
343344
$style .= sprintf(' title="%s%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
344345
} elseif ('note' === $style) {
@@ -347,8 +348,10 @@ protected function style($style, $value, $attr = array())
347348
} elseif (':' === $v[0]) {
348349
return sprintf('<abbr title="`%s` resource" class=sf-dump-%s>%s</abbr>', substr($v, 1), $style, $v);
349350
}
351+
} elseif ('protected' === $style) {
352+
$style .= ' title="Protected property"';
350353
} elseif ('private' === $style) {
351-
$style .= sprintf(' title="%s::%s"', $attr['class'], $v);
354+
$style .= sprintf(' title="Private property defined in class:&#10;`%s`"', $attr['class']);
352355
}
353356

354357
return "<span class=sf-dump-$style>$v</span>";

Tests/CliDumperTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ public function testGet()
7272
}
7373
8 => :Unknown {@{$res2}}
7474
"obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
75-
foo: "foo"
76-
"bar": "bar"
75+
+foo: "foo"
76+
+"bar": "bar"
7777
}
7878
"closure" => Closure {#%d
7979
reflection: """

Tests/HtmlDumperTest.php

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,19 @@ public function testGet()
5252
$this->assertStringMatchesFormat(
5353
<<<EOTXT
5454
<foo></foo><bar><span class=sf-dump-note>array:25</span> [<samp>
55-
"<span class=sf-dump-meta>number</span>" => <span class=sf-dump-num>1</span>
56-
<span class=sf-dump-meta>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
57-
"<span class=sf-dump-meta>const</span>" => <span class=sf-dump-num>1.1</span>
58-
<span class=sf-dump-meta>1</span> => <span class=sf-dump-const>true</span>
59-
<span class=sf-dump-meta>2</span> => <span class=sf-dump-const>false</span>
60-
<span class=sf-dump-meta>3</span> => <span class=sf-dump-num>NAN</span>
61-
<span class=sf-dump-meta>4</span> => <span class=sf-dump-num>INF</span>
62-
<span class=sf-dump-meta>5</span> => <span class=sf-dump-num>-INF</span>
63-
<span class=sf-dump-meta>6</span> => <span class=sf-dump-num>{$intMax}</span>
64-
"<span class=sf-dump-meta>str</span>" => "<span class=sf-dump-str title="4 characters">d&#233;j&#224;</span>"
65-
<span class=sf-dump-meta>7</span> => b"<span class=sf-dump-str title="2 binary or non-UTF-8 characters">&#233;<span class=sf-dump-cchr title=\\x00>@</span></span>"
66-
"<span class=sf-dump-meta>[]</span>" => []
67-
"<span class=sf-dump-meta>res</span>" => <abbr title="`stream` resource" class=sf-dump-note>:stream</abbr> {<a class=sf-dump-solo-ref>@{$res1}</a><samp>
55+
"<span class=sf-dump-key>number</span>" => <span class=sf-dump-num>1</span>
56+
<span class=sf-dump-key>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
57+
"<span class=sf-dump-key>const</span>" => <span class=sf-dump-num>1.1</span>
58+
<span class=sf-dump-key>1</span> => <span class=sf-dump-const>true</span>
59+
<span class=sf-dump-key>2</span> => <span class=sf-dump-const>false</span>
60+
<span class=sf-dump-key>3</span> => <span class=sf-dump-num>NAN</span>
61+
<span class=sf-dump-key>4</span> => <span class=sf-dump-num>INF</span>
62+
<span class=sf-dump-key>5</span> => <span class=sf-dump-num>-INF</span>
63+
<span class=sf-dump-key>6</span> => <span class=sf-dump-num>{$intMax}</span>
64+
"<span class=sf-dump-key>str</span>" => "<span class=sf-dump-str title="4 characters">d&#233;j&#224;</span>"
65+
<span class=sf-dump-key>7</span> => b"<span class=sf-dump-str title="2 binary or non-UTF-8 characters">&#233;<span class=sf-dump-cchr title=\\x00>@</span></span>"
66+
"<span class=sf-dump-key>[]</span>" => []
67+
"<span class=sf-dump-key>res</span>" => <abbr title="`stream` resource" class=sf-dump-note>:stream</abbr> {<a class=sf-dump-solo-ref>@{$res1}</a><samp>
6868
<span class=sf-dump-meta>wrapper_type</span>: "<span class=sf-dump-str title="9 characters">plainfile</span>"
6969
<span class=sf-dump-meta>stream_type</span>: "<span class=sf-dump-str title="5 characters">STDIO</span>"
7070
<span class=sf-dump-meta>mode</span>: "<span class=sf-dump-str>r</span>"
@@ -75,12 +75,12 @@ public function testGet()
7575
<span class=sf-dump-meta>eof</span>: <span class=sf-dump-const>false</span>
7676
<span class=sf-dump-meta>options</span>: []
7777
</samp>}
78-
<span class=sf-dump-meta>8</span> => <abbr title="`Unknown` resource" class=sf-dump-note>:Unknown</abbr> {<a class=sf-dump-solo-ref>@{$res2}</a>}
79-
"<span class=sf-dump-meta>obj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp id={$dumpId}-ref2%d>
80-
<span class=sf-dump-public>foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>"
81-
"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>"
78+
<span class=sf-dump-key>8</span> => <abbr title="`Unknown` resource" class=sf-dump-note>:Unknown</abbr> {<a class=sf-dump-solo-ref>@{$res2}</a>}
79+
"<span class=sf-dump-key>obj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp id={$dumpId}-ref2%d>
80+
+<span class=sf-dump-public title="Public property">foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>"
81+
+"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>"
8282
</samp>}
83-
"<span class=sf-dump-meta>closure</span>" => <span class=sf-dump-note>Closure</span> {<a class=sf-dump-solo-ref>#%d</a><samp>
83+
"<span class=sf-dump-key>closure</span>" => <span class=sf-dump-note>Closure</span> {<a class=sf-dump-solo-ref>#%d</a><samp>
8484
<span class=sf-dump-meta>reflection</span>: """
8585
<span class=sf-dump-str title="%d characters">Closure [ &lt;user&gt; {$closureLabel} Symfony\Component\VarDumper\Tests\Fixture\{closure} ] {</span>
8686
<span class=sf-dump-str title="%d characters"> @@ {$var['file']} {$var['line']} - {$var['line']}</span>
@@ -92,19 +92,19 @@ public function testGet()
9292
<span class=sf-dump-str title="%d characters">}</span>
9393
"""
9494
</samp>}
95-
"<span class=sf-dump-meta>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
96-
"<span class=sf-dump-meta>nobj</span>" => <span class=sf-dump-note>array:1</span> [<samp>
97-
<span class=sf-dump-meta>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
95+
"<span class=sf-dump-key>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
96+
"<span class=sf-dump-key>nobj</span>" => <span class=sf-dump-note>array:1</span> [<samp>
97+
<span class=sf-dump-index>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
9898
</samp>]
99-
"<span class=sf-dump-meta>recurs</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<samp id={$dumpId}-ref04>
100-
<span class=sf-dump-meta>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a>]
99+
"<span class=sf-dump-key>recurs</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<samp id={$dumpId}-ref04>
100+
<span class=sf-dump-index>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a>]
101101
</samp>]
102-
<span class=sf-dump-meta>9</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
103-
"<span class=sf-dump-meta>sobj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a>}
104-
"<span class=sf-dump-meta>snobj</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
105-
"<span class=sf-dump-meta>snobj2</span>" => {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
106-
"<span class=sf-dump-meta>file</span>" => "<span class=sf-dump-str title="%d characters">{$var['file']}</span>"
107-
b"<span class=sf-dump-meta>bin-key-&#233;</span>" => ""
102+
<span class=sf-dump-key>9</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
103+
"<span class=sf-dump-key>sobj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a>}
104+
"<span class=sf-dump-key>snobj</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
105+
"<span class=sf-dump-key>snobj2</span>" => {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
106+
"<span class=sf-dump-key>file</span>" => "<span class=sf-dump-str title="%d characters">{$var['file']}</span>"
107+
b"<span class=sf-dump-key>bin-key-&#233;</span>" => ""
108108
</samp>]
109109
</bar>
110110

0 commit comments

Comments
 (0)