Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions config/phpmd.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag"/>
<rule ref="rulesets/cleancode.xml/StaticAccess">
<properties>
<!-- Avoid false positives when calling factory and cache-clearing methods -->
<property name="ignorepattern" value="/^(from|create|clear)/" />
<!-- Avoid false positives when calling methods that are intentionally static -->
<property name="ignorepattern" value="/^(from|create|clear|parse$|normalizePropertyName$)/" />
</properties>
</rule>

Expand Down
2 changes: 1 addition & 1 deletion config/phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ parameters:
path: ../src/CssInliner.php

-
message: '#^Parameter \#1 \$name of method Pelago\\Emogrifier\\Utilities\\DeclarationBlockParser\:\:normalizePropertyName\(\) expects non\-empty\-string, mixed given\.$#'
message: '#^Parameter \#1 \$name of static method Pelago\\Emogrifier\\Utilities\\DeclarationBlockParser\:\:normalizePropertyName\(\) expects non\-empty\-string, mixed given\.$#'
identifier: argument.type
count: 1
path: ../src/CssInliner.php
Expand Down
21 changes: 8 additions & 13 deletions src/CssInliner.php
Original file line number Diff line number Diff line change
Expand Up @@ -435,12 +435,10 @@ private function getAllNodesWithStyleAttribute(): \DOMNodeList
*/
private function normalizeStyleAttributes(\DOMElement $node): void
{
$declarationBlockParser = new DeclarationBlockParser();

$pattern = '/-{0,2}+[_a-zA-Z][\\w\\-]*+(?=:)/S';
/** @param array<array-key, string> $propertyNameMatches */
$callback = static function (array $propertyNameMatches) use ($declarationBlockParser): string {
return $declarationBlockParser->normalizePropertyName($propertyNameMatches[0]);
$callback = static function (array $propertyNameMatches): string {
return DeclarationBlockParser::normalizePropertyName($propertyNameMatches[0]);
};
if (\function_exists('Safe\\preg_replace_callback')) {
$normalizedOriginalStyle = preg_replace_callback($pattern, $callback, $node->getAttribute('style'));
Expand All @@ -453,7 +451,7 @@ private function normalizeStyleAttributes(\DOMElement $node): void
// In order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles.
$nodePath = $node->getNodePath();
if (\is_string($nodePath) && ($nodePath !== '') && !isset($this->styleAttributesForNodes[$nodePath])) {
$this->styleAttributesForNodes[$nodePath] = $declarationBlockParser->parse($normalizedOriginalStyle);
$this->styleAttributesForNodes[$nodePath] = DeclarationBlockParser::parse($normalizedOriginalStyle);
$this->visitedNodes[$nodePath] = $node;
}

Expand Down Expand Up @@ -759,16 +757,15 @@ private function getCssSelectorPrecedence(string $selector): int
private function copyInlinableCssToStyleAttribute(\DOMElement $node, array $cssRule): void
{
$declarationsBlock = $cssRule['declarationsBlock'];
$declarationBlockParser = new DeclarationBlockParser();
$newStyleDeclarations = $declarationBlockParser->parse($declarationsBlock);
$newStyleDeclarations = DeclarationBlockParser::parse($declarationsBlock);
if ($newStyleDeclarations === []) {
return;
}

// if it has a style attribute, get it, process it, and append (overwrite) new stuff
if ($node->hasAttribute('style')) {
// break it up into an associative array
$oldStyleDeclarations = $declarationBlockParser->parse($node->getAttribute('style'));
$oldStyleDeclarations = DeclarationBlockParser::parse($node->getAttribute('style'));
} else {
$oldStyleDeclarations = [];
}
Expand Down Expand Up @@ -816,14 +813,13 @@ private function generateStyleStringFromDeclarationsArrays(array $oldStyles, arr

$combinedStyles = \array_merge($oldStyles, $newStyles);

$declarationBlockParser = new DeclarationBlockParser();
$style = '';
foreach ($combinedStyles as $attributeName => $attributeValue) {
$trimmedAttributeName = \trim($attributeName);
if ($trimmedAttributeName === '') {
throw new \UnexpectedValueException('An empty property name was encountered.', 1727046078);
}
$propertyName = $declarationBlockParser->normalizePropertyName($trimmedAttributeName);
$propertyName = DeclarationBlockParser::normalizePropertyName($trimmedAttributeName);
$propertyValue = \trim($attributeValue);
$style .= $propertyName . ': ' . $propertyValue . '; ';
}
Expand All @@ -847,10 +843,9 @@ private function attributeValueIsImportant(string $attributeValue): bool
*/
private function fillStyleAttributesWithMergedStyles(): void
{
$declarationBlockParser = new DeclarationBlockParser();
foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
$node = $this->visitedNodes[$nodePath];
$currentStyleAttributes = $declarationBlockParser->parse($node->getAttribute('style'));
$currentStyleAttributes = DeclarationBlockParser::parse($node->getAttribute('style'));
$node->setAttribute(
'style',
$this->generateStyleStringFromDeclarationsArrays(
Expand Down Expand Up @@ -887,7 +882,7 @@ private function removeImportantAnnotationFromAllInlineStyles(): void
private function removeImportantAnnotationFromNodeInlineStyle(\DOMElement $node): void
{
$style = $node->getAttribute('style');
$inlineStyleDeclarations = (new DeclarationBlockParser())->parse((bool) $style ? $style : '');
$inlineStyleDeclarations = DeclarationBlockParser::parse((bool) $style ? $style : '');
/** @var array<string, string> $regularStyleDeclarations */
$regularStyleDeclarations = [];
/** @var array<string, string> $importantStyleDeclarations */
Expand Down
3 changes: 1 addition & 2 deletions src/HtmlProcessor/CssToAttributeConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@ final class CssToAttributeConverter extends AbstractHtmlProcessor
*/
public function convertCssToVisualAttributes(): self
{
$declarationBlockParser = new DeclarationBlockParser();
foreach ($this->getAllNodesWithStyleAttribute() as $node) {
$inlineStyleDeclarations = $declarationBlockParser->parse($node->getAttribute('style'));
$inlineStyleDeclarations = DeclarationBlockParser::parse($node->getAttribute('style'));
$this->mapCssToHtmlAttributes($inlineStyleDeclarations, $node);
}

Expand Down
2 changes: 1 addition & 1 deletion src/HtmlProcessor/CssVariableEvaluator.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public function evaluateVariables(): self

// Avoid parsing declarations if none use or define a variable
if (preg_match('/(?<![\\w\\-])--[\\w\\-]/', $style) !== 0) {
$declarations = (new DeclarationBlockParser())->parse($style);
$declarations = DeclarationBlockParser::parse($style);
$variableDefinitions =
$this->getVariableDefinitionsFromDeclarations($declarations) + $currentAncestorDefinitions;
$this->currentVariableDefinitions = $variableDefinitions;
Expand Down
6 changes: 3 additions & 3 deletions src/Utilities/DeclarationBlockParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static function clearCache(): void
*
* @return non-empty-string
*/
public function normalizePropertyName(string $name): string
public static function normalizePropertyName(string $name): string
{
if (\substr($name, 0, 2) === '--') {
return $name;
Expand Down Expand Up @@ -77,7 +77,7 @@ public function normalizePropertyName(string $name): string
*
* @throws \UnexpectedValueException if an empty property name is encountered (which cannot happen)
*/
public function parse(string $declarationBlock): array
public static function parse(string $declarationBlock): array
{
$trimmedDeclarationBlock = \trim($declarationBlock, "; \n\r\t\v\x00");
if ($trimmedDeclarationBlock === '') {
Expand All @@ -103,7 +103,7 @@ public function parse(string $declarationBlock): array

$propertyName = $matches[1];
$propertyValue = $matches[2];
$properties[$this->normalizePropertyName($propertyName)] = $propertyValue;
$properties[self::normalizePropertyName($propertyName)] = $propertyValue;
}
self::$cache[$trimmedDeclarationBlock] = $properties;

Expand Down
3 changes: 1 addition & 2 deletions tests/Unit/CssInlinerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3922,8 +3922,7 @@ public function copyUninlinableCssToStyleNodeHasNoSideEffects(): void
*/
public function inlineCssClearsDeclarationBlockParserCache(): void
{
$subject = new DeclarationBlockParser();
$subject->parse('color: green;');
DeclarationBlockParser::parse('color: green;');

$cacheProperty = new \ReflectionProperty(DeclarationBlockParser::class, 'cache');
if (\PHP_VERSION_ID < 80100) {
Expand Down
20 changes: 6 additions & 14 deletions tests/Unit/Utilities/DeclarationBlockParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,7 @@ public function providePropertyNameAndExpectedNormalization(): array
*/
public function normalizesPropertyName(string $name, string $expectedNormalization): void
{
$subject = new DeclarationBlockParser();

$result = $subject->normalizePropertyName($name);
$result = DeclarationBlockParser::normalizePropertyName($name);

self::assertSame($expectedNormalization, $result);
}
Expand Down Expand Up @@ -264,9 +262,7 @@ public function provideDeclarationBlockAsStringAndArray(): array
*/
public function parses(string $declarationBlockAsString, array $declarationBlockAsArray): void
{
$subject = new DeclarationBlockParser();

$result = $subject->parse($declarationBlockAsString);
$result = DeclarationBlockParser::parse($declarationBlockAsString);

self::assertSame($declarationBlockAsArray, $result);
}
Expand All @@ -276,9 +272,7 @@ public function parses(string $declarationBlockAsString, array $declarationBlock
*/
public function overridesEarlierDeclarationWithLaterOne(): void
{
$subject = new DeclarationBlockParser();

$result = $subject->parse('color: red; color: green;');
$result = DeclarationBlockParser::parse('color: red; color: green;');

self::assertSame(['color' => 'green'], $result);
}
Expand All @@ -291,11 +285,10 @@ public function overridesEarlierDeclarationWithLaterOne(): void
*/
public function providesConsistentResults(): void
{
$subject = new DeclarationBlockParser();
$declarationBlock = 'color: green;';

$firstResult = $subject->parse($declarationBlock);
$secondResult = $subject->parse($declarationBlock);
$firstResult = DeclarationBlockParser::parse($declarationBlock);
$secondResult = DeclarationBlockParser::parse($declarationBlock);

self::assertSame($firstResult, $secondResult);
}
Expand All @@ -305,8 +298,7 @@ public function providesConsistentResults(): void
*/
public function clearCacheEmptiesStaticCache(): void
{
$subject = new DeclarationBlockParser();
$subject->parse('color: green;');
DeclarationBlockParser::parse('color: green;');

DeclarationBlockParser::clearCache();

Expand Down
Loading