Skip to content

Commit 29e8b7e

Browse files
committed
Reworked mediaquery extraction once again (preserving the order in which they are accessed)
1 parent b09f288 commit 29e8b7e

File tree

3 files changed

+77
-51
lines changed

3 files changed

+77
-51
lines changed

src/Css/Rule/Processor.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@ public function splitIntoSeparateMediaQueries($rulesString)
2222

2323
$indexedRules = [];
2424

25-
$first = true;
2625
foreach ($queryParts as $part) {
27-
if ($first) {
28-
$first = false;
29-
$indexedRules[''] = (array)explode('}', $part);
26+
if (strpos($part,' ') !== 0) {
27+
$indexedRules[][''] = (array)explode('}', $part);
3028
continue;
3129
}
3230

33-
$mediaQueryString = "@media" . substr($part, 0, strpos($part, '{'));
31+
$mediaQueryString = "@media".substr($part, 0, strpos($part, '{'));
3432
$mediaQueryRules = substr($part, strpos($part, '{') + 1);
3533
$mediaQueryRules = substr($mediaQueryRules, 0, -1);
36-
$indexedRules[$mediaQueryString] = (array)explode('}', $mediaQueryRules);
34+
35+
$indexedRules[][$mediaQueryString] = (array)explode('}', $mediaQueryRules) ;
3736
}
3837

38+
3939
return $indexedRules;
4040
}
4141

@@ -147,11 +147,9 @@ public function calculateSpecificityBasedOnASelector($selector)
147147
public function convertArrayToObjects(array $mediaQueryRules, array $objects = array())
148148
{
149149

150-
foreach ($mediaQueryRules as $media => $rules) {
151-
$order = 1;
152-
foreach ($rules as $rule) {
153-
$objects = array_merge($objects, $this->convertToObjects($media, $rule, $order));
154-
$order++;
150+
foreach ($mediaQueryRules as $order => $ruleSet) {
151+
foreach (reset($ruleSet) as $rule) {
152+
$objects = array_merge($objects, $this->convertToObjects(key($ruleSet), $rule, $order));
155153
}
156154
}
157155

src/CssStore.php

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PageSpecificCss;
44

55
use PageSpecificCss\Css\Property\Property;
6+
use PageSpecificCss\Css\Rule\Rule;
67

78
class CssStore
89
{
@@ -11,7 +12,8 @@ class CssStore
1112

1213
public function addCssStyles($cssRules)
1314
{
14-
$this->styles = array_merge_recursive($this->styles, $cssRules);
15+
$this->styles = array_merge($this->styles, $cssRules);
16+
1517
return $this;
1618
}
1719

@@ -32,9 +34,23 @@ public function dumpStyles($path)
3234

3335
public function compileStyles()
3436
{
35-
return join('', array_map(function ($properties, $key) {
36-
return $this->parseMediaToString($key, $properties);
37-
}, $this->styles, array_keys($this->styles)));
37+
38+
// Structure rules in order, by media query
39+
$styles = $this->prepareStylesForProcessing();
40+
41+
42+
return join(
43+
'',
44+
array_map(
45+
function ($styleGroup) {
46+
$media = key($styleGroup);
47+
$rules = reset($styleGroup);
48+
49+
return $this->parseMediaToString($media, $rules);
50+
},
51+
$styles
52+
)
53+
);
3854
}
3955

4056
/**
@@ -46,35 +62,69 @@ public function compileStyles()
4662
*/
4763
private function parseMediaToString($media, array $rules)
4864
{
65+
4966
if ($media == '') {
5067
return
51-
join('', array_map(function ($properties, $selector) {
52-
return $this->parsePropertiesToString($selector, $properties);
53-
}, $rules, array_keys($rules))
68+
join(
69+
'',
70+
array_map(
71+
function ($rule) {
72+
/** @var Rule $rule */
73+
return $this->parsePropertiesToString($rule->getSelector(), $rule->getProperties());
74+
},
75+
$rules
76+
)
5477
);
5578

5679
}
5780

58-
return "$media { " . join('', array_map(function ($properties, $selector) {
59-
return $this->parsePropertiesToString($selector, $properties);
60-
}, $rules, array_keys($rules))
61-
) . "}";
81+
return "$media { ".join(
82+
'',
83+
array_map(
84+
function ($rule, $selector) {
85+
/** @var Rule $rule */
86+
return $this->parsePropertiesToString($rule->getSelector(), $rule->getProperties());
87+
},
88+
$rules
89+
)
90+
)."}";
6291

6392

6493
}
6594

6695
/**
6796
*
68-
* @return string
97+
* @param $selector
98+
* @param array $properties
6999
*
100+
* @return string
70101
*/
71102
private function parsePropertiesToString($selector, array $properties)
72103
{
73-
return "$selector { " .
74-
join('', array_map(function (Property $property) {
75-
return $property->getName() . ': ' . $property->getValue() . ';';
76-
}, $properties)
77-
) .
104+
return "$selector { ".
105+
join(
106+
'',
107+
array_map(
108+
function (Property $property) {
109+
return $property->getName().': '.$property->getValue().';';
110+
},
111+
$properties
112+
)
113+
).
78114
"}";
79115
}
116+
117+
private function prepareStylesForProcessing()
118+
{
119+
// Group styles by order and media
120+
$groupedStyles = [];
121+
122+
/** @var Rule $style */
123+
foreach ($this->styles as $style) {
124+
$groupedStyles[$style->getOrder()][$style->getMedia()][] = $style;
125+
}
126+
127+
128+
return $groupedStyles;
129+
}
80130
}

src/PageSpecificCss.php

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ public function extractCss($html)
102102

103103
$xPath = new \DOMXPath($document);
104104

105-
usort($this->rules, [RuleProcessor::class, 'sortOnSpecificity']);
106105

107106
$applicable_rules = array_filter($this->rules, function (Rule $rule) use ($xPath) {
108107
try {
@@ -121,29 +120,8 @@ public function extractCss($html)
121120
return true;
122121
});
123122

124-
$applicable_rules = $this->groupRulesBySelector($applicable_rules);
125-
return $applicable_rules;
126-
}
127-
128-
/**
129-
* @param Rule[] $applicable_rules
130-
*
131-
* @return array
132-
*/
133-
private function groupRulesBySelector($applicable_rules)
134-
{
135-
$grouped = [];
136-
137-
foreach ($applicable_rules as $applicable_rule) {
138-
/** @var Rule $applicable_rule */
139-
if (isset($grouped[$applicable_rule->getMedia()][$applicable_rule->getSelector()])) {
140-
$grouped[$applicable_rule->getMedia()][$applicable_rule->getSelector()] = array_merge($grouped[$applicable_rule->getMedia()][$applicable_rule->getSelector()], $applicable_rule->getProperties());
141-
} else {
142-
$grouped[$applicable_rule->getMedia()][$applicable_rule->getSelector()] = $applicable_rule->getProperties();
143-
}
144-
}
145123

146-
return $grouped;
124+
return $applicable_rules;
147125
}
148126

149127
public function addHtmlToStore($rawHtml)

0 commit comments

Comments
 (0)