Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 26 |
JsCollectionGrouper | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 26 |
group | |
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 26 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Asset\JsCollectionGrouper. | |
*/ | |
namespace Drupal\Core\Asset; | |
/** | |
* Groups JavaScript assets. | |
*/ | |
class JsCollectionGrouper implements AssetCollectionGrouperInterface { | |
/** | |
* {@inheritdoc} | |
* | |
* Puts multiple items into the same group if they are groupable and if they | |
* are for the same browsers. Items of the 'file' type are groupable if their | |
* 'preprocess' flag is TRUE. Items of the 'inline', 'settings', or 'external' | |
* type are not groupable. | |
* | |
* Also ensures that the process of grouping items does not change their | |
* relative order. This requirement may result in multiple groups for the same | |
* type and browsers, if needed to accommodate other items in between. | |
*/ | |
public function group(array $js_assets) { | |
$groups = array(); | |
// If a group can contain multiple items, we track the information that must | |
// be the same for each item in the group, so that when we iterate the next | |
// item, we can determine if it can be put into the current group, or if a | |
// new group needs to be made for it. | |
$current_group_keys = NULL; | |
$index = -1; | |
foreach ($js_assets as $item) { | |
// The browsers for which the JavaScript item needs to be loaded is part | |
// of the information that determines when a new group is needed, but the | |
// order of keys in the array doesn't matter, and we don't want a new | |
// group if all that's different is that order. | |
ksort($item['browsers']); | |
switch ($item['type']) { | |
case 'file': | |
// Group file items if their 'preprocess' flag is TRUE. | |
// Help ensure maximum reuse of aggregate files by only grouping | |
// together items that share the same 'group' value. | |
$group_keys = $item['preprocess'] ? array($item['type'], $item['group'], $item['browsers']) : FALSE; | |
break; | |
case 'external': | |
case 'setting': | |
case 'inline': | |
// Do not group external, settings, and inline items. | |
$group_keys = FALSE; | |
break; | |
} | |
// If the group keys don't match the most recent group we're working with, | |
// then a new group must be made. | |
if ($group_keys !== $current_group_keys) { | |
$index++; | |
// Initialize the new group with the same properties as the first item | |
// being placed into it. The item's 'data' and 'weight' properties are | |
// unique to the item and should not be carried over to the group. | |
$groups[$index] = $item; | |
unset($groups[$index]['data'], $groups[$index]['weight']); | |
$groups[$index]['items'] = array(); | |
$current_group_keys = $group_keys ? $group_keys : NULL; | |
} | |
// Add the item to the current group. | |
$groups[$index]['items'][] = $item; | |
} | |
return $groups; | |
} | |
} |