aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2022-08-18 11:14:40 +0200
committerGravatar GitHub <noreply@github.com> 2022-08-18 11:14:40 +0200
commit2acf3a4dd87af5c09fcf513517cb852ff6e909ce (patch)
tree6e1b687ad1f2359e652250f4d354645bc2f23c64 /lib
parentea0d924985dc0c5aa089ed59c15282ea7e84c7a4 (diff)
CssXPath-StarSelector (#4506)
* CssXPath-StarSelector Add support for selectors such as `a[href*="example"]` https://developer.mozilla.org/docs/Web/CSS/Attribute_selectors Translated to `.//a[contains(@href,"example")]` Upstream PR: https://github.com/PhpGt/CssXPath/pull/181 * Upstream merged
Diffstat (limited to 'lib')
-rw-r--r--lib/.gitignore4
-rw-r--r--lib/composer.json8
-rw-r--r--lib/phpgt/cssxpath/README.md4
-rw-r--r--lib/phpgt/cssxpath/src/CssXPathException.php2
-rw-r--r--lib/phpgt/cssxpath/src/NotYetImplementedException.php2
-rw-r--r--lib/phpgt/cssxpath/src/Translator.php25
6 files changed, 29 insertions, 16 deletions
diff --git a/lib/.gitignore b/lib/.gitignore
index b599767a7..812bbfe76 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -1,9 +1,7 @@
autoload.php
composer.lock
composer/
-phpgt/cssxpath/.github/
-phpgt/cssxpath/.gitignore
-phpgt/cssxpath/.scrutinizer.yml
+phpgt/cssxpath/.*
phpgt/cssxpath/composer.json
phpgt/cssxpath/CONTRIBUTING.md
phpgt/cssxpath/test/
diff --git a/lib/composer.json b/lib/composer.json
index 6fdc90ef4..017adfea6 100644
--- a/lib/composer.json
+++ b/lib/composer.json
@@ -4,9 +4,15 @@
"type": "project",
"homepage": "https://freshrss.org/",
"license": "AGPL-3.0",
+ "repositories": [
+ {
+ "type": "git",
+ "url": "https://github.com/PhpGt/CssXPath.git"
+ }
+ ],
"require": {
"php": ">=7.0.0",
- "phpgt/cssxpath": "v1.1.4",
+ "phpgt/cssxpath": "dev-master#4fbe420aba3d9e729940107ded4236a835a1a132",
"phpmailer/phpmailer": "6.6.0"
},
"config": {
diff --git a/lib/phpgt/cssxpath/README.md b/lib/phpgt/cssxpath/README.md
index 9082c8bbf..8dfeabc42 100644
--- a/lib/phpgt/cssxpath/README.md
+++ b/lib/phpgt/cssxpath/README.md
@@ -1,5 +1,5 @@
-Translate CSS selectors to XPath queries.
-=========================================
+Translate CSS selectors to XPath queries
+========================================
A lightweight and dependency free CSS to XPath translator. This repository is used to bring modern DOM functionality like [`querySelectorAll()`][qsa] to PHP in the [PHP.Gt/Dom][gt-dom] project.
diff --git a/lib/phpgt/cssxpath/src/CssXPathException.php b/lib/phpgt/cssxpath/src/CssXPathException.php
index 81ad3ac9d..bd7798243 100644
--- a/lib/phpgt/cssxpath/src/CssXPathException.php
+++ b/lib/phpgt/cssxpath/src/CssXPathException.php
@@ -3,4 +3,4 @@ namespace Gt\CssXPath;
use RuntimeException;
-class CssXPathException extends RuntimeException {} \ No newline at end of file
+class CssXPathException extends RuntimeException {}
diff --git a/lib/phpgt/cssxpath/src/NotYetImplementedException.php b/lib/phpgt/cssxpath/src/NotYetImplementedException.php
index 39d12b3bc..70d9492cf 100644
--- a/lib/phpgt/cssxpath/src/NotYetImplementedException.php
+++ b/lib/phpgt/cssxpath/src/NotYetImplementedException.php
@@ -1,4 +1,4 @@
<?php
namespace Gt\CssXPath;
-class NotYetImplementedException extends CssXPathException {} \ No newline at end of file
+class NotYetImplementedException extends CssXPathException {}
diff --git a/lib/phpgt/cssxpath/src/Translator.php b/lib/phpgt/cssxpath/src/Translator.php
index 140909099..01ed98bc6 100644
--- a/lib/phpgt/cssxpath/src/Translator.php
+++ b/lib/phpgt/cssxpath/src/Translator.php
@@ -12,7 +12,7 @@ class Translator {
. '|(#(?P<id>[\w-]*))'
. '|(\.(?P<class>[\w-]*))'
. '|(?P<sibling>\s*\+\s*)'
- . "|(\[(?P<attribute>[\w-]*)((?P<attribute_equals>[=~$]+)(?P<attribute_value>(.+\[\]'?)|[^\]]+))*\])+"
+ . "|(\[(?P<attribute>[\w-]*)((?P<attribute_equals>[=~$*]+)(?P<attribute_value>(.+\[\]'?)|[^\]]+))*\])+"
. '|(?P<descendant>\s+)'
. '/';
@@ -61,7 +61,7 @@ class Translator {
$thread = array_values($thread);
$xpath = [$this->prefix];
- $prevType = "";
+ $hasElement = false;
foreach($thread as $threadKey => $currentThreadItem) {
$next = isset($thread[$threadKey + 1])
? $thread[$threadKey + 1]
@@ -71,6 +71,7 @@ class Translator {
case "star":
case "element":
$xpath []= $currentThreadItem['content'];
+ $hasElement = true;
break;
case "pseudo":
@@ -160,23 +161,26 @@ class Translator {
case "child":
array_push($xpath, "/");
+ $hasElement = false;
break;
case "id":
array_push(
$xpath,
- ($prevType != "element" ? '*' : '')
+ ($hasElement ? '' : '*')
. "[@id='{$currentThreadItem['content']}']"
);
+ $hasElement = true;
break;
case "class":
// https://devhints.io/xpath#class-check
array_push(
$xpath,
- (($prevType != "element" && $prevType != "class") ? '*' : '')
+ ($hasElement ? '' : '*')
. "[contains(concat(' ',normalize-space(@class),' '),' {$currentThreadItem['content']} ')]"
);
+ $hasElement = true;
break;
case "sibling":
@@ -184,11 +188,13 @@ class Translator {
$xpath,
"/following-sibling::*[1]/self::"
);
+ $hasElement = false;
break;
case "attribute":
- if(!$prevType) {
+ if(!$hasElement) {
array_push($xpath, "*");
+ $hasElement = true;
}
/** @var null|array<int, array<string, string>> $detail */
@@ -220,7 +226,11 @@ class Translator {
break;
case self::EQUALS_CONTAINS:
- throw new NotYetImplementedException();
+ array_push(
+ $xpath,
+ "[contains(@{$currentThreadItem['content']},\"{$valueString}\")]"
+ );
+ break;
case self::EQUALS_CONTAINS_WORD:
array_push(
@@ -257,10 +267,9 @@ class Translator {
case "descendant":
array_push($xpath, "//");
+ $hasElement = false;
break;
}
-
- $prevType = $currentThreadItem["type"];
}
return implode("", $xpath);