فهرست منبع

Fix BrowserConsoleHandler formatting

This resolves an issue whereby all styles would be applied in reverse
order to the formatting markers.
Trevor North 6 سال پیش
والد
کامیت
0ff3a9bd03
2فایلهای تغییر یافته به همراه21 افزوده شده و 4 حذف شده
  1. 5 4
      src/Monolog/Handler/BrowserConsoleHandler.php
  2. 16 0
      tests/Monolog/Handler/BrowserConsoleHandlerTest.php

+ 5 - 4
src/Monolog/Handler/BrowserConsoleHandler.php

@@ -164,21 +164,22 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
 
     private static function handleStyles($formatted)
     {
-        $args = array(static::quote('font-weight: normal'));
+        $args = array();
         $format = '%c' . $formatted;
         preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
 
         foreach (array_reverse($matches) as $match) {
-            $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
             $args[] = '"font-weight: normal"';
+            $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
 
             $pos = $match[0][1];
             $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0]));
         }
 
-        array_unshift($args, static::quote($format));
+        $args[] = static::quote('font-weight: normal');
+        $args[] = static::quote($format);
 
-        return $args;
+        return array_reverse($args);
     }
 
     private static function handleCustomStyles($style, $string)

+ 16 - 0
tests/Monolog/Handler/BrowserConsoleHandlerTest.php

@@ -48,6 +48,22 @@ EOF;
         $this->assertEquals($expected, $this->generateScript());
     }
 
+    public function testStylingMultiple()
+    {
+        $handler = new BrowserConsoleHandler();
+        $handler->setFormatter($this->getIdentityFormatter());
+
+        $handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}[[baz]]{color: blue}'));
+
+        $expected = <<<EOF
+(function (c) {if (c && c.groupCollapsed) {
+c.log("%cfoo%cbar%c%cbaz%c", "font-weight: normal", "color: red", "font-weight: normal", "color: blue", "font-weight: normal");
+}})(console);
+EOF;
+
+        $this->assertEquals($expected, $this->generateScript());
+    }
+
     public function testEscaping()
     {
         $handler = new BrowserConsoleHandler();