Skip to content

Commit

Permalink
Proposed fix for MyIntervals#237
Browse files Browse the repository at this point in the history
  • Loading branch information
Synchro committed May 8, 2016
1 parent 27c6f4d commit 037a559
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
17 changes: 11 additions & 6 deletions Classes/Emogrifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -924,21 +924,26 @@ private function copyCssWithMediaToStyleNode(\DOMDocument $xmlDocument, \DOMXPat

/**
* Extracts the media queries from $css.
* Skips empty media queries.
* @link http://stackoverflow.com/questions/36910664/recursive-subroutine-regex-to-match-css-media-queries/36911319#36911319
*
* @param string $css
*
* @return string[][] numeric array with string sub-arrays with the keys "css" and "query"
*/
private function extractMediaQueriesFromCss($css)
{
preg_match_all('#(?<query>@media[^{]*\\{(?<css>(.*?)\\})(\\s*)\\})#s', $css, $mediaQueries);
preg_match_all('/@media\b[^{]*({((?:[^{}]+|(?1))*)})/', $css, $mediaQueries, PREG_SET_ORDER);
$result = [];
foreach (array_keys($mediaQueries['css']) as $key) {
$result[] = [
'css' => $mediaQueries['css'][$key],
'query' => $mediaQueries['query'][$key],
];
foreach ($mediaQueries as $query) {
if (!empty(trim($query[2]))) {
$result[] = [
'css' => trim($query[2]),
'query' => $query[0],
];
}
}

return $result;
}

Expand Down
22 changes: 20 additions & 2 deletions Tests/Unit/EmogrifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1180,7 +1180,7 @@ public function invalidMediaPreserveDataProvider()
*
* @dataProvider invalidMediaPreserveDataProvider
*/
public function emogrifyWithInvalidMediaQueryaNotContainsInnerCss($css)
public function emogrifyWithInvalidMediaQueryNotContainsInnerCss($css)
{
$html = $this->html5DocumentType . PHP_EOL . '<html><h1></h1></html>';
$this->subject->setHtml($html);
Expand Down Expand Up @@ -1245,6 +1245,24 @@ public function emogrifyFromHtmlWithInValidMediaQueryNotContainsInlineCss($css)
self::assertNotContains('style="color: red"', $result);
}

/**
* @link https://github.com/jjriv/emogrifier/issues/237
* @test
* @skip
*/
public function emogrifyIgnoreEmptyMediaQuery()
{
$css = '@media screen { } @media tv { h1 { color:red; } }';
$html = $this->html5DocumentType . PHP_EOL . '<html><h1></h1></html>';
$this->subject->setHtml($html);
$this->subject->setCss($css);

$result = $this->subject->emogrify();

self::assertContains('color:red', $result);
self::assertNotContains('@media screen', $result);
}

/**
* @test
*/
Expand Down Expand Up @@ -1841,7 +1859,7 @@ public function multiLineMediaQueryWithUnixLineEndingsIsAppliedOnlyOnce()
public function multipleMediaQueriesAreAppliedOnlyOnce()
{
$css = "@media all {\n" .
".medium {font-size:18px;\n" .
".medium {font-size:18px;}\n" .
".small {font-size:14px;}\n" .
'}' .
"@media screen {\n" .
Expand Down

0 comments on commit 037a559

Please sign in to comment.