* * 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:----wrl8R4Vd81PJt5fqmDihD75P8ckmICyP2E813yvlyY1QxAKYE37d45aM/NTgj3FlAVWHwCbpadmV3LUYfAMs8+wlUyl85Q7Qrk3SWK6e6gRrcwAcnzE88Wxr4Sud3Of4CPB7S57CK8Sr3DOhWLcMpDfph/iRsbOAli8zwXf9Mw3l/dG6cxGhEKhx8YqMsCkGS2cHRcq1Rnj3pktWqiVKPxvKsiRB2esCkxj2RgtbeyOnovNp91gI5KiEY79HzxbiUvY9LyRfbLUx0fLz4ESIhkjuWp31Iow0lZhDoq80zMKVLTKrTfI6ZkAEUjAC5ycuK3geemDgEObJKns2Zrb3ToY+sbMGm8F3OMMUHmeVLepgUkkq5dM3xljAdsPJKzSBXDG+f6QWqHK10KRNqSWDgG0lGPryqVYxtaKpmE81N3Sy1cDHckTXupNd/TwxUmQygLZytcyoAX1eZk6482rPq5C7x1lzP5Hj4wg3itVxvYRAtW/SedVVaoq0GGOb00DdTxYGyXPOJNXRwHwp7viDl24kg7QUYTqBS+jF21ofJOIPSby5hCfh1pEKy03QWNIm8vAmnjKmhkDgMp5JcVdVSrHxCbs0bOQZljuRql14daIOrDiQO7EB3eWxqV3cWkf6yxtAMDuJ6HnJeIADH5X8RO6uPNP77gPXsjjE3MDflhM=----ATTACHMENT:----NDk0MDc0MjE3MjY0OTkxMSA2NDQ2MDM1NDA1ODYzNTg3IDY5Mzg4Nzk3MTI0NTg3NzU=