Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/3rdparty.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'symfony/css-selector/XPath/Extension/HtmlExtension.php')
-rw-r--r--symfony/css-selector/XPath/Extension/HtmlExtension.php187
1 files changed, 187 insertions, 0 deletions
diff --git a/symfony/css-selector/XPath/Extension/HtmlExtension.php b/symfony/css-selector/XPath/Extension/HtmlExtension.php
new file mode 100644
index 00000000..6edc0858
--- /dev/null
+++ b/symfony/css-selector/XPath/Extension/HtmlExtension.php
@@ -0,0 +1,187 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * 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\Exception\ExpressionErrorException;
+use Symfony\Component\CssSelector\Node\FunctionNode;
+use Symfony\Component\CssSelector\XPath\Translator;
+use Symfony\Component\CssSelector\XPath\XPathExpr;
+
+/**
+ * XPath expression translator HTML 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 <jeanfrancois.simon@sensiolabs.com>
+ *
+ * @internal
+ */
+class HtmlExtension extends AbstractExtension
+{
+ public function __construct(Translator $translator)
+ {
+ $translator
+ ->getExtension('node')
+ ->setFlag(NodeExtension::ELEMENT_NAME_IN_LOWER_CASE, true)
+ ->setFlag(NodeExtension::ATTRIBUTE_NAME_IN_LOWER_CASE, true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPseudoClassTranslators(): array
+ {
+ return [
+ 'checked' => [$this, 'translateChecked'],
+ 'link' => [$this, 'translateLink'],
+ 'disabled' => [$this, 'translateDisabled'],
+ 'enabled' => [$this, 'translateEnabled'],
+ 'selected' => [$this, 'translateSelected'],
+ 'invalid' => [$this, 'translateInvalid'],
+ 'hover' => [$this, 'translateHover'],
+ 'visited' => [$this, 'translateVisited'],
+ ];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getFunctionTranslators(): array
+ {
+ return [
+ 'lang' => [$this, 'translateLang'],
+ ];
+ }
+
+ public function translateChecked(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition(
+ '(@checked '
+ ."and (name(.) = 'input' or name(.) = 'command')"
+ ."and (@type = 'checkbox' or @type = 'radio'))"
+ );
+ }
+
+ public function translateLink(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition("@href and (name(.) = 'a' or name(.) = 'link' or name(.) = 'area')");
+ }
+
+ public function translateDisabled(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition(
+ '('
+ .'@disabled and'
+ .'('
+ ."(name(.) = 'input' and @type != 'hidden')"
+ ." or name(.) = 'button'"
+ ." or name(.) = 'select'"
+ ." or name(.) = 'textarea'"
+ ." or name(.) = 'command'"
+ ." or name(.) = 'fieldset'"
+ ." or name(.) = 'optgroup'"
+ ." or name(.) = 'option'"
+ .')'
+ .') or ('
+ ."(name(.) = 'input' and @type != 'hidden')"
+ ." or name(.) = 'button'"
+ ." or name(.) = 'select'"
+ ." or name(.) = 'textarea'"
+ .')'
+ .' and ancestor::fieldset[@disabled]'
+ );
+ // todo: in the second half, add "and is not a descendant of that fieldset element's first legend element child, if any."
+ }
+
+ public function translateEnabled(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition(
+ '('
+ .'@href and ('
+ ."name(.) = 'a'"
+ ." or name(.) = 'link'"
+ ." or name(.) = 'area'"
+ .')'
+ .') or ('
+ .'('
+ ."name(.) = 'command'"
+ ." or name(.) = 'fieldset'"
+ ." or name(.) = 'optgroup'"
+ .')'
+ .' and not(@disabled)'
+ .') or ('
+ .'('
+ ."(name(.) = 'input' and @type != 'hidden')"
+ ." or name(.) = 'button'"
+ ." or name(.) = 'select'"
+ ." or name(.) = 'textarea'"
+ ." or name(.) = 'keygen'"
+ .')'
+ .' and not (@disabled or ancestor::fieldset[@disabled])'
+ .') or ('
+ ."name(.) = 'option' and not("
+ .'@disabled or ancestor::optgroup[@disabled]'
+ .')'
+ .')'
+ );
+ }
+
+ /**
+ * @throws ExpressionErrorException
+ */
+ public function translateLang(XPathExpr $xpath, FunctionNode $function): XPathExpr
+ {
+ $arguments = $function->getArguments();
+ foreach ($arguments as $token) {
+ if (!($token->isString() || $token->isIdentifier())) {
+ throw new ExpressionErrorException('Expected a single string or identifier for :lang(), got '.implode(', ', $arguments));
+ }
+ }
+
+ return $xpath->addCondition(sprintf(
+ 'ancestor-or-self::*[@lang][1][starts-with(concat('
+ ."translate(@%s, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '-')"
+ .', %s)]',
+ 'lang',
+ Translator::getXpathLiteral(strtolower($arguments[0]->getValue()).'-')
+ ));
+ }
+
+ public function translateSelected(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition("(@selected and name(.) = 'option')");
+ }
+
+ public function translateInvalid(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition('0');
+ }
+
+ public function translateHover(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition('0');
+ }
+
+ public function translateVisited(XPathExpr $xpath): XPathExpr
+ {
+ return $xpath->addCondition('0');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName(): string
+ {
+ return 'html';
+ }
+}