/** * Format arguments to be used for exception message. * * @param array $args * * @return string */ private function formatArgs($args) { $context = new Context(); $message = $argsFormatted = []; $message[] = trim($this->selector->toCSS($context)); if ($args) { $message[] = '('; foreach ($args as $a) { $argValue = ''; if (isset($a['name'])) { $argValue .= $a['name'] . ':'; } if ($a['value'] instanceof GenerateCSSInterface) { $argValue .= $a['value']->toCSS($context); } else { $argValue .= '???'; } $argsFormatted[] = $argValue; } $message[] = implode(', ', $argsFormatted); $message[] = ')'; } return implode('', $message); }
/** * Finds a selector. * * @param SelectorNode $selector * @param RulesetNode $self * @param Context $context * @param mixed $filter * * @return array */ public function find(SelectorNode $selector, Context $context, RulesetNode $self = null, $filter = null) { $key = $selector->toCSS($context); if (!$self) { $self = $this; } if (!array_key_exists($key, $this->lookups)) { $rules = []; foreach ($this->rulesets() as $rule) { if ($rule === $self) { continue; } foreach ($rule->selectors as $ruleSelector) { /* @var $ruleSelector SelectorNode */ $match = $selector->match($ruleSelector); if ($match) { if (count($selector->elements) > $match) { if (!$filter || call_user_func($filter, $rule)) { /* @var $rule RulesetNode */ $foundMixins = $rule->find(new SelectorNode(array_slice($selector->elements, $match)), $context, $self, $filter); for ($i = 0; $i < count($foundMixins); ++$i) { array_push($foundMixins[$i]['path'], $rule); } $rules = array_merge($rules, $foundMixins); } } else { $rules[] = ['rule' => $rule, 'path' => []]; } break; } } } $this->lookups[$key] = $rules; } return $this->lookups[$key]; }