See Release Notes
Long Term Support Release
<?php namespace Sabberworm\CSS\CSSList; use Sabberworm\CSS\RuleSet\DeclarationBlock; use Sabberworm\CSS\RuleSet\RuleSet; use Sabberworm\CSS\Property\Selector; use Sabberworm\CSS\Rule\Rule; use Sabberworm\CSS\Value\ValueList; use Sabberworm\CSS\Value\CSSFunction; /** * A CSSBlockList is a CSSList whose DeclarationBlocks are guaranteed to contain valid declaration blocks or at-rules. * Most CSSLists conform to this category but some at-rules (such as @keyframes) do not. */ abstract class CSSBlockList extends CSSList { public function __construct($iLineNo = 0) { parent::__construct($iLineNo); } protected function allDeclarationBlocks(&$aResult) { foreach ($this->aContents as $mContent) { if ($mContent instanceof DeclarationBlock) { $aResult[] = $mContent; } else if ($mContent instanceof CSSBlockList) { $mContent->allDeclarationBlocks($aResult); } } } protected function allRuleSets(&$aResult) { foreach ($this->aContents as $mContent) { if ($mContent instanceof RuleSet) { $aResult[] = $mContent; } else if ($mContent instanceof CSSBlockList) { $mContent->allRuleSets($aResult); } } } protected function allValues($oElement, &$aResult, $sSearchString = null, $bSearchInFunctionArguments = false) { if ($oElement instanceof CSSBlockList) { foreach ($oElement->getContents() as $oContent) { $this->allValues($oContent, $aResult, $sSearchString, $bSearchInFunctionArguments); } } else if ($oElement instanceof RuleSet) { foreach ($oElement->getRules($sSearchString) as $oRule) { $this->allValues($oRule, $aResult, $sSearchString, $bSearchInFunctionArguments); } } else if ($oElement instanceof Rule) { $this->allValues($oElement->getValue(), $aResult, $sSearchString, $bSearchInFunctionArguments); } else if ($oElement instanceof ValueList) { if ($bSearchInFunctionArguments || !($oElement instanceof CSSFunction)) { foreach ($oElement->getListComponents() as $mComponent) { $this->allValues($mComponent, $aResult, $sSearchString, $bSearchInFunctionArguments); } } } else { //Non-List Value or CSSString (CSS identifier) $aResult[] = $oElement; } } protected function allSelectors(&$aResult, $sSpecificitySearch = null) { $aDeclarationBlocks = array(); $this->allDeclarationBlocks($aDeclarationBlocks); foreach ($aDeclarationBlocks as $oBlock) { foreach ($oBlock->getSelectors() as $oSelector) { if ($sSpecificitySearch === null) { $aResult[] = $oSelector; } else {< $sComparison = "\$bRes = {$oSelector->getSpecificity()} $sSpecificitySearch;"; < eval($sComparison); < if ($bRes) {> $sComparator = '==='; > $aSpecificitySearch = explode(' ', $sSpecificitySearch); > $iTargetSpecificity = $aSpecificitySearch[0]; > if(count($aSpecificitySearch) > 1) { > $sComparator = $aSpecificitySearch[0]; > $iTargetSpecificity = $aSpecificitySearch[1]; > } > $iTargetSpecificity = (int)$iTargetSpecificity; > $iSelectorSpecificity = $oSelector->getSpecificity(); > $bMatches = false; > switch($sComparator) { > case '<=': > $bMatches = $iSelectorSpecificity <= $iTargetSpecificity; > break; > case '<': > $bMatches = $iSelectorSpecificity < $iTargetSpecificity; > break; > case '>=': > $bMatches = $iSelectorSpecificity >= $iTargetSpecificity; > break; > case '>': > $bMatches = $iSelectorSpecificity > $iTargetSpecificity; > break; > default: > $bMatches = $iSelectorSpecificity === $iTargetSpecificity; > break; > } > if ($bMatches) {$aResult[] = $oSelector; } } } } } }