Skip to content

Commit 731f96f

Browse files
[VarDumper] encode non-ASCII UTF-8 chars as HTML numeric entities
1 parent e8037dc commit 731f96f

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

Dumper/HtmlDumper.php

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ protected function getDumpHeader()
108108
<script>
109109
Sfjs = window.Sfjs || {};
110110
Sfjs.dump = Sfjs.dump || {};
111-
Sfjs.dump.childElts = document.getElementsByName('sf-dump-child');
112-
Sfjs.dump.childLen = 0;
113-
Sfjs.dump.instrument = function () {
111+
Sfjs.dump.childElts = Sfjs.dump.childElts || document.getElementsByName('sf-dump-child');
112+
Sfjs.dump.childLen = Sfjs.dump.childLen || 0;
113+
Sfjs.dump.instrument = Sfjs.dump.instrument || function () {
114114
var elt,
115115
i = this.childLen,
116116
aCompact = '▶</a><span class="sf-dump-compact">',
@@ -127,7 +127,7 @@ protected function getDumpHeader()
127127
++i;
128128
}
129129
};
130-
Sfjs.dump.toggle = function(a) {
130+
Sfjs.dump.toggle = Sfjs.dump.toggle || function(a) {
131131
var s = a.nextElementSibling;
132132
133133
if ('sf-dump-compact' == s.className) {
@@ -214,7 +214,7 @@ protected function style($style, $val)
214214
if ('ref' === $style) {
215215
$ref = substr($val, 1);
216216
if ('#' === $val[0]) {
217-
return "<a class=sf-dump-ref name=\"{$this->dumpId}-ref$ref\">$val</a>";
217+
return "<span class=sf-dump-ref id=\"{$this->dumpId}-ref$ref\">$val</span>";
218218
} else {
219219
return "<a class=sf-dump-ref href=\"#{$this->dumpId}-ref$ref\">$val</a>";
220220
}
@@ -261,6 +261,31 @@ protected function dumpLine($depth)
261261
}
262262
$this->lastDepth = $depth;
263263

264+
// Replaces non-ASCII UTF-8 chars by numeric HTML entities
265+
$this->line = preg_replace_callback(
266+
'/[\x80-\xFF]+/',
267+
function ($m) {
268+
$m = unpack('C*', $m[0]);
269+
$i = 1;
270+
$entities = '';
271+
272+
while (isset($m[$i])) {
273+
if (0xF0 <= $m[$i]) {
274+
$c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
275+
} elseif (0xE0 <= $m[$i]) {
276+
$c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
277+
} else {
278+
$c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
279+
}
280+
281+
$entities .= '&#'.$c.';';
282+
}
283+
284+
return $entities;
285+
},
286+
$this->line
287+
);
288+
264289
parent::dumpLine($depth);
265290
}
266291
}

Tests/HtmlDumperTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,16 @@ public function testGet()
5151
<<<EOTXT
5252
<foo></foo><bar><span class=sf-dump-0><span class=sf-dump-note>array:25</span> [<span name=sf-dump-child>
5353
<span class=sf-dump-1>"<span class=sf-dump-meta>number</span>" => <span class=sf-dump-num>1</span>
54-
<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>
54+
<span class=sf-dump-meta>0</span> => <span class=sf-dump-const>null</span> <span class=sf-dump-ref id="sf-dump-{$dumpId}-ref1">#1</span>
5555
"<span class=sf-dump-meta>const</span>" => <span class=sf-dump-num>1.1</span>
5656
<span class=sf-dump-meta>1</span> => <span class=sf-dump-const>true</span>
5757
<span class=sf-dump-meta>2</span> => <span class=sf-dump-const>false</span>
5858
<span class=sf-dump-meta>3</span> => <span class=sf-dump-num>NAN</span>
5959
<span class=sf-dump-meta>4</span> => <span class=sf-dump-num>INF</span>
6060
<span class=sf-dump-meta>5</span> => <span class=sf-dump-num>-INF</span>
6161
<span class=sf-dump-meta>6</span> => <span class=sf-dump-num>{$intMax}</span>
62-
"<span class=sf-dump-meta>str</span>" => "<span class=sf-dump-str>déjà</span>"
63-
<span class=sf-dump-meta>7</span> => b"<span class=sf-dump-str>é</span>"
62+
"<span class=sf-dump-meta>str</span>" => "<span class=sf-dump-str>d&#233;j&#224;</span>"
63+
<span class=sf-dump-meta>7</span> => b"<span class=sf-dump-str>&#233;</span>"
6464
"<span class=sf-dump-meta>[]</span>" => []
6565
"<span class=sf-dump-meta>res</span>" => resource:<span class=sf-dump-note>stream</span> {<span name=sf-dump-child>
6666
<span class=sf-dump-2><span class=sf-dump-meta>wrapper_type</span>: "<span class=sf-dump-str>plainfile</span>"
@@ -74,7 +74,7 @@ public function testGet()
7474
<span class=sf-dump-meta>options</span>: []
7575
</span></span>}
7676
<span class=sf-dump-meta>8</span> => resource:<span class=sf-dump-note>Unknown</span> {}
77-
"<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>
77+
"<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> <span class=sf-dump-ref id="sf-dump-{$dumpId}-ref2">#2</span>
7878
<span class=sf-dump-2><span class=sf-dump-public>foo</span>: "<span class=sf-dump-str>foo</span>"
7979
"<span class=sf-dump-public>bar</span>": "<span class=sf-dump-str>bar</span>"
8080
</span></span>}
@@ -92,17 +92,17 @@ public function testGet()
9292
</span></span>}
9393
"<span class=sf-dump-meta>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
9494
"<span class=sf-dump-meta>nobj</span>" => <span class=sf-dump-note>array:1</span> [<span name=sf-dump-child>
95-
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => {} <a class=sf-dump-ref name="sf-dump-{$dumpId}-ref3">#3</a>
95+
<span class=sf-dump-2><span class=sf-dump-meta>0</span> => {} <span class=sf-dump-ref id="sf-dump-{$dumpId}-ref3">#3</span>
9696
</span></span>]
97-
"<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>
97+
"<span class=sf-dump-meta>recurs</span>" => <span class=sf-dump-note>array:1</span> [<span name=sf-dump-child> <span class=sf-dump-ref id="sf-dump-{$dumpId}-ref4">#4</span>
9898
<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>]
9999
</span></span>]
100100
<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>
101101
"<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>}
102102
"<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>}
103103
"<span class=sf-dump-meta>snobj2</span>" => {<a class=sf-dump-ref href="#sf-dump-{$dumpId}-ref3">@3</a>}
104104
"<span class=sf-dump-meta>file</span>" => "<span class=sf-dump-str>{$var['file']}</span>"
105-
b"<span class=sf-dump-meta>bin-key-é</span>" => ""
105+
b"<span class=sf-dump-meta>bin-key-&#233;</span>" => ""
106106
</span></span>]
107107
</span></bar>
108108

0 commit comments

Comments
 (0)