* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\CssSelector\XPath\Extension; use Symfony\Component\CssSelector\XPath\Translator; use Symfony\Component\CssSelector\XPath\XPathExpr; /** * XPath expression translator attribute extension. * * This component is a port of the Python cssselect library, * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. * * @author Jean-François Simon * * @internal */ class AttributeMatchingExtension extends AbstractExtension { /** * {@inheritdoc} */ public function getAttributeMatchingTranslators() { return array( 'exists' => array($this, 'translateExists'), '=' => array($this, 'translateEquals'), '~=' => array($this, 'translateIncludes'), '|=' => array($this, 'translateDashMatch'), '^=' => array($this, 'translatePrefixMatch'), '$=' => array($this, 'translateSuffixMatch'), '*=' => array($this, 'translateSubstringMatch'), '!=' => array($this, 'translateDifferent'), ); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateExists(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition($attribute); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateEquals(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition(sprintf('%s = %s', $attribute, Translator::getXpathLiteral($value))); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateIncludes(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition($value ? sprintf( '%1$s and contains(concat(\' \', normalize-space(%1$s), \' \'), %2$s)', $attribute, Translator::getXpathLiteral(' '.$value.' ') ) : '0'); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateDashMatch(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition(sprintf( '%1$s and (%1$s = %2$s or starts-with(%1$s, %3$s))', $attribute, Translator::getXpathLiteral($value), Translator::getXpathLiteral($value.'-') )); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translatePrefixMatch(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition($value ? sprintf( '%1$s and starts-with(%1$s, %2$s)', $attribute, Translator::getXpathLiteral($value) ) : '0'); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateSuffixMatch(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition($value ? sprintf( '%1$s and substring(%1$s, string-length(%1$s)-%2$s) = %3$s', $attribute, strlen($value) - 1, Translator::getXpathLiteral($value) ) : '0'); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateSubstringMatch(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition($value ? sprintf( '%1$s and contains(%1$s, %2$s)', $attribute, Translator::getXpathLiteral($value) ) : '0'); } /** * @param XPathExpr $xpath * @param string $attribute * @param string $value * * @return XPathExpr */ public function translateDifferent(XPathExpr $xpath, $attribute, $value) { return $xpath->addCondition(sprintf( $value ? 'not(%1$s) or %1$s != %2$s' : '%s != %s', $attribute, Translator::getXpathLiteral($value) )); } /** * {@inheritdoc} */ public function getName() { return 'attribute-matching'; } } __halt_compiler();----SIGNATURE:----FIPXHD82pupJoC0QQrLI2bKX1kI6umn3DfVofQ4rRtFKthRghBiO5wmhuO45tSJvr7ojk8HBqIPrwbnmH9JMOA+O7y1ArKLMlIo3T8pRvWRCAFUdKrCDVCuRAUhmAGCjsCha7Pmj7TqUBPlynrNftMp/WgDNSf/bgHDSoZESIBtD+BBMzpA5BS4DlC12AyC7VXJnFNcygOvK3JAmcoC8Gn628CTZtXDC8JyEUjKafrO56+/LnvUlFR7d5dcC2damJCqdoC9tcy03/1bpCM2Buoh13gDVDFS8oK++itoEP5YDwyX02QHN2Jj4KTELm6Zlj9Bh3x+5XiL95VDy977iUk+dG9jblvI2zigvUIXIm8NS3X/4hAtL/voJzWy8K457YrYz7BiQjWljupRF+o1FPgIAoIjZX3+VdKhCu8LvbV6x6olqM/Ad3a49ljEc6hFyTiKVrAEd/tH8EQTm+EanJU7uMS5qkvtDebsL7WMrFpQr1j4Ykwhz68e6pAB/p1TB95rGNTOOlAI7uDrvUK6qpiZDPJTOViOhTw6L7lIy4lgR9PhoppdDbuH9eXB27vzNYuAN0Y3NnQwXvI1/yuMX+dHuvFuc8CH3sfLbVOjS+EtwsO/MUZlF/EnS8n2RtNzx/SVvqMhfloYf8AY5+OVp0qte4JMYWtXDlFSBhOer3J4=----ATTACHMENT:----NTYzMDk0NDAzNTU5NzE1NSA3NDEzNTA5NjYwNTUyODE0IDc1NDE2MjI4NjgwNDUwNjM=