Version Description
- 2017-09-07
- Don't apply lazyload on Divi slider
Download this release
Release Info
| Developer | wp_media |
| Plugin | |
| Version | 1.3.1 |
| Comparing to | |
| See all releases | |
Code changes from version 1.3 to 1.3.1
- readme.txt +5 -1
- rocket-lazy-load.php +11 -6
- vendor/composer/installed.json +11 -10
- vendor/paquettg/php-html-parser/composer.json +4 -3
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Curl.php +5 -0
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom.php +131 -9
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/AbstractNode.php +70 -10
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/HtmlNode.php +4 -0
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/InnerNode.php +34 -7
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/MockNode.php +3 -0
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/Tag.php +77 -1
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/TextNode.php +33 -3
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Finder.php +54 -0
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Options.php +1 -0
- vendor/paquettg/php-html-parser/src/PHPHtmlParser/Selector.php +1 -3
readme.txt
CHANGED
|
@@ -3,7 +3,7 @@ Contributors: creativejuiz, tabrisrp, wp_media
|
|
| 3 |
Tags: lazyload, lazy load, images, iframes, thumbnail, thumbnails, smiley, smilies, avatar, gravatar
|
| 4 |
Requires at least: 3.0
|
| 5 |
Tested up to: 4.8.1
|
| 6 |
-
Stable tag: 1.3
|
| 7 |
|
| 8 |
The tiny Lazy Load script for WordPress without jQuery, works for images and iframes.
|
| 9 |
|
|
@@ -50,6 +50,10 @@ You can also use the filters `rocket_lazyload_excluded_attributes` or `rocket_la
|
|
| 50 |
Some plugins are not compatible without lazy loading. Please open a support thread, and we will see how we can solve the issue by excluding lazy loading for this plugin.
|
| 51 |
|
| 52 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
= 1.3 =
|
| 54 |
* 2017-09-01
|
| 55 |
* Improve HTML parsing of images and iframes to be faster and more efficient
|
| 3 |
Tags: lazyload, lazy load, images, iframes, thumbnail, thumbnails, smiley, smilies, avatar, gravatar
|
| 4 |
Requires at least: 3.0
|
| 5 |
Tested up to: 4.8.1
|
| 6 |
+
Stable tag: 1.3.1
|
| 7 |
|
| 8 |
The tiny Lazy Load script for WordPress without jQuery, works for images and iframes.
|
| 9 |
|
| 50 |
Some plugins are not compatible without lazy loading. Please open a support thread, and we will see how we can solve the issue by excluding lazy loading for this plugin.
|
| 51 |
|
| 52 |
== Changelog ==
|
| 53 |
+
= 1.3.1 =
|
| 54 |
+
* 2017-09-07
|
| 55 |
+
* Don't apply lazyload on Divi slider
|
| 56 |
+
|
| 57 |
= 1.3 =
|
| 58 |
* 2017-09-01
|
| 59 |
* Improve HTML parsing of images and iframes to be faster and more efficient
|
rocket-lazy-load.php
CHANGED
|
@@ -5,7 +5,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
|
| 5 |
* Plugin Name: Rocket Lazy Load
|
| 6 |
* Plugin URI: http://wordpress.org/plugins/rocket-lazy-load/
|
| 7 |
* Description: The tiny Lazy Load script for WordPress without jQuery or others libraries.
|
| 8 |
-
* Version: 1.3
|
| 9 |
* Requires PHP: 5.4
|
| 10 |
* Author: WP Media
|
| 11 |
* Author URI: https://wp-rocket.me
|
|
@@ -27,7 +27,7 @@ defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
|
| 27 |
* You should have received a copy of the GNU General Public License
|
| 28 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
| 29 |
*/
|
| 30 |
-
define( 'ROCKET_LL_VERSION', '1.3' );
|
| 31 |
define( 'ROCKET_LL_PATH', realpath( plugin_dir_path( __FILE__ ) ) . '/' );
|
| 32 |
define( 'ROCKET_LL_3RD_PARTY_PATH', ROCKET_LL_PATH . '3rd-party/' );
|
| 33 |
define( 'ROCKET_LL_ASSETS_URL', plugin_dir_url( __FILE__ ) . 'assets/' );
|
|
@@ -165,7 +165,7 @@ add_action( 'wp_enqueue_scripts', 'rocket_lazyload_enqueue', PHP_INT_MAX );
|
|
| 165 |
*/
|
| 166 |
function rocket_lazyload_async_script( $tag, $handle ) {
|
| 167 |
if ( 'rocket-lazyload' === $handle ) {
|
| 168 |
-
return str_replace( '<script', '<script async data-
|
| 169 |
}
|
| 170 |
|
| 171 |
return $tag;
|
|
@@ -196,7 +196,7 @@ function rocket_lazyload_images( $html ) {
|
|
| 196 |
$dom->load( $html );
|
| 197 |
$images = $dom->getElementsByTag( 'img' );
|
| 198 |
|
| 199 |
-
if (
|
| 200 |
return $html;
|
| 201 |
}
|
| 202 |
|
|
@@ -207,6 +207,12 @@ function rocket_lazyload_images( $html ) {
|
|
| 207 |
continue;
|
| 208 |
}
|
| 209 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 210 |
$img = new PHPHtmlParser\Dom\Tag( 'img' );
|
| 211 |
|
| 212 |
foreach ( $image_attributes as $key => $value ) {
|
|
@@ -241,7 +247,6 @@ function rocket_lazyload_images( $html ) {
|
|
| 241 |
|
| 242 |
$noscript->addChild( $original_image );
|
| 243 |
|
| 244 |
-
$parent = $image->getParent();
|
| 245 |
$parent->insertAfter( $noscript, $image->id() );
|
| 246 |
}
|
| 247 |
|
|
@@ -437,7 +442,7 @@ function rocket_lazyload_iframes( $html ) {
|
|
| 437 |
$dom->load( $html );
|
| 438 |
$iframes = $dom->getElementsByTag( 'iframe' );
|
| 439 |
|
| 440 |
-
if (
|
| 441 |
return $html;
|
| 442 |
}
|
| 443 |
|
| 5 |
* Plugin Name: Rocket Lazy Load
|
| 6 |
* Plugin URI: http://wordpress.org/plugins/rocket-lazy-load/
|
| 7 |
* Description: The tiny Lazy Load script for WordPress without jQuery or others libraries.
|
| 8 |
+
* Version: 1.3.1
|
| 9 |
* Requires PHP: 5.4
|
| 10 |
* Author: WP Media
|
| 11 |
* Author URI: https://wp-rocket.me
|
| 27 |
* You should have received a copy of the GNU General Public License
|
| 28 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
| 29 |
*/
|
| 30 |
+
define( 'ROCKET_LL_VERSION', '1.3.1' );
|
| 31 |
define( 'ROCKET_LL_PATH', realpath( plugin_dir_path( __FILE__ ) ) . '/' );
|
| 32 |
define( 'ROCKET_LL_3RD_PARTY_PATH', ROCKET_LL_PATH . '3rd-party/' );
|
| 33 |
define( 'ROCKET_LL_ASSETS_URL', plugin_dir_url( __FILE__ ) . 'assets/' );
|
| 165 |
*/
|
| 166 |
function rocket_lazyload_async_script( $tag, $handle ) {
|
| 167 |
if ( 'rocket-lazyload' === $handle ) {
|
| 168 |
+
return str_replace( '<script', '<script async data-minify="1"', $tag );
|
| 169 |
}
|
| 170 |
|
| 171 |
return $tag;
|
| 196 |
$dom->load( $html );
|
| 197 |
$images = $dom->getElementsByTag( 'img' );
|
| 198 |
|
| 199 |
+
if ( empty( $images ) ) {
|
| 200 |
return $html;
|
| 201 |
}
|
| 202 |
|
| 207 |
continue;
|
| 208 |
}
|
| 209 |
|
| 210 |
+
$parent = $image->getParent();
|
| 211 |
+
|
| 212 |
+
if ( false !== strpos( $parent->getAttribute( 'class' ), 'et_pb_slide_image' ) ) {
|
| 213 |
+
continue;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
$img = new PHPHtmlParser\Dom\Tag( 'img' );
|
| 217 |
|
| 218 |
foreach ( $image_attributes as $key => $value ) {
|
| 247 |
|
| 248 |
$noscript->addChild( $original_image );
|
| 249 |
|
|
|
|
| 250 |
$parent->insertAfter( $noscript, $image->id() );
|
| 251 |
}
|
| 252 |
|
| 442 |
$dom->load( $html );
|
| 443 |
$iframes = $dom->getElementsByTag( 'iframe' );
|
| 444 |
|
| 445 |
+
if ( empty( $iframes ) ) {
|
| 446 |
return $html;
|
| 447 |
}
|
| 448 |
|
vendor/composer/installed.json
CHANGED
|
@@ -49,31 +49,32 @@
|
|
| 49 |
},
|
| 50 |
{
|
| 51 |
"name": "paquettg/php-html-parser",
|
| 52 |
-
"version": "
|
| 53 |
-
"version_normalized": "
|
| 54 |
"source": {
|
| 55 |
"type": "git",
|
| 56 |
"url": "https://github.com/paquettg/php-html-parser.git",
|
| 57 |
-
"reference": "
|
| 58 |
},
|
| 59 |
"dist": {
|
| 60 |
"type": "zip",
|
| 61 |
-
"url": "https://api.github.com/repos/paquettg/php-html-parser/zipball/
|
| 62 |
-
"reference": "
|
| 63 |
"shasum": ""
|
| 64 |
},
|
| 65 |
"require": {
|
|
|
|
| 66 |
"paquettg/string-encode": "~0.1.0",
|
| 67 |
-
"php": ">=5.
|
| 68 |
},
|
| 69 |
"require-dev": {
|
| 70 |
"mockery/mockery": "~0.9.0",
|
| 71 |
-
"phpunit/phpunit": "~
|
| 72 |
-
"satooshi/php-coveralls": "~0.
|
| 73 |
},
|
| 74 |
-
"time": "
|
| 75 |
"type": "library",
|
| 76 |
-
"installation-source": "
|
| 77 |
"autoload": {
|
| 78 |
"psr-0": {
|
| 79 |
"PHPHtmlParser": "src/"
|
| 49 |
},
|
| 50 |
{
|
| 51 |
"name": "paquettg/php-html-parser",
|
| 52 |
+
"version": "dev-dev",
|
| 53 |
+
"version_normalized": "dev-dev",
|
| 54 |
"source": {
|
| 55 |
"type": "git",
|
| 56 |
"url": "https://github.com/paquettg/php-html-parser.git",
|
| 57 |
+
"reference": "e85e379a07143f60471d289748f7d26513e28c99"
|
| 58 |
},
|
| 59 |
"dist": {
|
| 60 |
"type": "zip",
|
| 61 |
+
"url": "https://api.github.com/repos/paquettg/php-html-parser/zipball/e85e379a07143f60471d289748f7d26513e28c99",
|
| 62 |
+
"reference": "e85e379a07143f60471d289748f7d26513e28c99",
|
| 63 |
"shasum": ""
|
| 64 |
},
|
| 65 |
"require": {
|
| 66 |
+
"ext-mbstring": "*",
|
| 67 |
"paquettg/string-encode": "~0.1.0",
|
| 68 |
+
"php": ">=5.6"
|
| 69 |
},
|
| 70 |
"require-dev": {
|
| 71 |
"mockery/mockery": "~0.9.0",
|
| 72 |
+
"phpunit/phpunit": "~5.7.0",
|
| 73 |
+
"satooshi/php-coveralls": "~1.0.0"
|
| 74 |
},
|
| 75 |
+
"time": "2017-07-24T00:37:01+00:00",
|
| 76 |
"type": "library",
|
| 77 |
+
"installation-source": "source",
|
| 78 |
"autoload": {
|
| 79 |
"psr-0": {
|
| 80 |
"PHPHtmlParser": "src/"
|
vendor/paquettg/php-html-parser/composer.json
CHANGED
|
@@ -14,12 +14,13 @@
|
|
| 14 |
}
|
| 15 |
],
|
| 16 |
"require": {
|
| 17 |
-
"php": ">=5.
|
|
|
|
| 18 |
"paquettg/string-encode": "~0.1.0"
|
| 19 |
},
|
| 20 |
"require-dev": {
|
| 21 |
-
"phpunit/phpunit": "~
|
| 22 |
-
"satooshi/php-coveralls": "~0.
|
| 23 |
"mockery/mockery": "~0.9.0"
|
| 24 |
},
|
| 25 |
"autoload": {
|
| 14 |
}
|
| 15 |
],
|
| 16 |
"require": {
|
| 17 |
+
"php": ">=5.6",
|
| 18 |
+
"ext-mbstring": "*",
|
| 19 |
"paquettg/string-encode": "~0.1.0"
|
| 20 |
},
|
| 21 |
"require-dev": {
|
| 22 |
+
"phpunit/phpunit": "~5.7.0",
|
| 23 |
+
"satooshi/php-coveralls": "~1.0.0",
|
| 24 |
"mockery/mockery": "~0.9.0"
|
| 25 |
},
|
| 26 |
"autoload": {
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Curl.php
CHANGED
|
@@ -28,6 +28,11 @@ class Curl implements CurlInterface
|
|
| 28 |
|
| 29 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
| 30 |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
$content = curl_exec($ch);
|
| 33 |
if ($content === false) {
|
| 28 |
|
| 29 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
| 30 |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
| 31 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
| 32 |
+
curl_setopt($ch, CURLOPT_VERBOSE, true);
|
| 33 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
| 34 |
+
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36');
|
| 35 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
| 36 |
|
| 37 |
$content = curl_exec($ch);
|
| 38 |
if ($content === false) {
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom.php
CHANGED
|
@@ -79,17 +79,32 @@ class Dom
|
|
| 79 |
* @var array
|
| 80 |
*/
|
| 81 |
protected $selfClosing = [
|
| 82 |
-
'
|
|
|
|
|
|
|
| 83 |
'br',
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
'input',
|
| 85 |
-
'
|
| 86 |
'link',
|
| 87 |
-
'
|
| 88 |
-
'
|
| 89 |
-
'
|
| 90 |
'spacer',
|
|
|
|
|
|
|
| 91 |
];
|
| 92 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
/**
|
| 94 |
* Returns the inner html of the root node.
|
| 95 |
*
|
|
@@ -120,6 +135,7 @@ class Dom
|
|
| 120 |
*/
|
| 121 |
public function load($str, $options = [])
|
| 122 |
{
|
|
|
|
| 123 |
// check if it's a file
|
| 124 |
if (strpos($str, "\n") === false && is_file($str)) {
|
| 125 |
return $this->loadFromFile($str, $options);
|
|
@@ -219,6 +235,20 @@ class Dom
|
|
| 219 |
return $this->root->find($selector, $nth);
|
| 220 |
}
|
| 221 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
/**
|
| 223 |
* Adds the tag (or tags in an array) to the list of tags that will always
|
| 224 |
* be self closing.
|
|
@@ -267,6 +297,53 @@ class Dom
|
|
| 267 |
return $this;
|
| 268 |
}
|
| 269 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 270 |
/**
|
| 271 |
* Simple wrapper function that returns the first child.
|
| 272 |
*
|
|
@@ -291,6 +368,42 @@ class Dom
|
|
| 291 |
return $this->root->lastChild();
|
| 292 |
}
|
| 293 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
/**
|
| 295 |
* Simple wrapper function that returns an element by the
|
| 296 |
* id.
|
|
@@ -391,7 +504,9 @@ class Dom
|
|
| 391 |
}
|
| 392 |
|
| 393 |
// strip out server side scripts
|
| 394 |
-
|
|
|
|
|
|
|
| 395 |
|
| 396 |
// strip smarty scripts
|
| 397 |
$str = mb_eregi_replace("(\{\w)(.*?)(\})", '', $str);
|
|
@@ -450,7 +565,7 @@ class Dom
|
|
| 450 |
trim($str) != ''
|
| 451 |
) {
|
| 452 |
// we found text we care about
|
| 453 |
-
$textNode = new TextNode($str);
|
| 454 |
$activeNode->addChild($textNode);
|
| 455 |
}
|
| 456 |
}
|
|
@@ -516,8 +631,8 @@ class Dom
|
|
| 516 |
}
|
| 517 |
|
| 518 |
if (empty($name)) {
|
| 519 |
-
|
| 520 |
-
|
| 521 |
}
|
| 522 |
|
| 523 |
$this->content->skipByToken('blank');
|
|
@@ -588,6 +703,13 @@ class Dom
|
|
| 588 |
|
| 589 |
// We force self closing on this tag.
|
| 590 |
$node->getTag()->selfClosing();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 591 |
}
|
| 592 |
|
| 593 |
$this->content->fastForward(1);
|
| 79 |
* @var array
|
| 80 |
*/
|
| 81 |
protected $selfClosing = [
|
| 82 |
+
'area',
|
| 83 |
+
'base',
|
| 84 |
+
'basefont',
|
| 85 |
'br',
|
| 86 |
+
'col',
|
| 87 |
+
'embed',
|
| 88 |
+
'hr',
|
| 89 |
+
'img',
|
| 90 |
'input',
|
| 91 |
+
'keygen',
|
| 92 |
'link',
|
| 93 |
+
'meta',
|
| 94 |
+
'param',
|
| 95 |
+
'source',
|
| 96 |
'spacer',
|
| 97 |
+
'track',
|
| 98 |
+
'wbr'
|
| 99 |
];
|
| 100 |
|
| 101 |
+
/**
|
| 102 |
+
* A list of tags where there should be no /> at the end (html5 style)
|
| 103 |
+
*
|
| 104 |
+
* @var array
|
| 105 |
+
*/
|
| 106 |
+
protected $noSlash = [];
|
| 107 |
+
|
| 108 |
/**
|
| 109 |
* Returns the inner html of the root node.
|
| 110 |
*
|
| 135 |
*/
|
| 136 |
public function load($str, $options = [])
|
| 137 |
{
|
| 138 |
+
AbstractNode::resetCount();
|
| 139 |
// check if it's a file
|
| 140 |
if (strpos($str, "\n") === false && is_file($str)) {
|
| 141 |
return $this->loadFromFile($str, $options);
|
| 235 |
return $this->root->find($selector, $nth);
|
| 236 |
}
|
| 237 |
|
| 238 |
+
/**
|
| 239 |
+
* Find element by Id on the root node
|
| 240 |
+
*
|
| 241 |
+
* @param int $id Element Id
|
| 242 |
+
* @return mixed
|
| 243 |
+
*
|
| 244 |
+
*/
|
| 245 |
+
public function findById($id)
|
| 246 |
+
{
|
| 247 |
+
$this->isLoaded();
|
| 248 |
+
|
| 249 |
+
return $this->root->findById($id);
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
/**
|
| 253 |
* Adds the tag (or tags in an array) to the list of tags that will always
|
| 254 |
* be self closing.
|
| 297 |
return $this;
|
| 298 |
}
|
| 299 |
|
| 300 |
+
|
| 301 |
+
/**
|
| 302 |
+
* Adds a tag to the list of self closing tags that should not have a trailing slash
|
| 303 |
+
*
|
| 304 |
+
* @param $tag
|
| 305 |
+
* @return $this
|
| 306 |
+
*/
|
| 307 |
+
public function addNoSlashTag($tag)
|
| 308 |
+
{
|
| 309 |
+
if ( ! is_array($tag)) {
|
| 310 |
+
$tag = [$tag];
|
| 311 |
+
}
|
| 312 |
+
foreach ($tag as $value) {
|
| 313 |
+
$this->noSlash[] = $value;
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
return $this;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
/**
|
| 320 |
+
* Removes a tag from the list of no-slash tags.
|
| 321 |
+
*
|
| 322 |
+
* @param $tag
|
| 323 |
+
* @return $this
|
| 324 |
+
*/
|
| 325 |
+
public function removeNoSlashTag($tag)
|
| 326 |
+
{
|
| 327 |
+
if ( ! is_array($tag)) {
|
| 328 |
+
$tag = [$tag];
|
| 329 |
+
}
|
| 330 |
+
$this->noSlash = array_diff($this->noSlash, $tag);
|
| 331 |
+
|
| 332 |
+
return $this;
|
| 333 |
+
}
|
| 334 |
+
|
| 335 |
+
/**
|
| 336 |
+
* Empties the list of no-slash tags.
|
| 337 |
+
*
|
| 338 |
+
* @return $this
|
| 339 |
+
*/
|
| 340 |
+
public function clearNoSlashTags()
|
| 341 |
+
{
|
| 342 |
+
$this->noSlash = [];
|
| 343 |
+
|
| 344 |
+
return $this;
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
/**
|
| 348 |
* Simple wrapper function that returns the first child.
|
| 349 |
*
|
| 368 |
return $this->root->lastChild();
|
| 369 |
}
|
| 370 |
|
| 371 |
+
/**
|
| 372 |
+
* Simple wrapper function that returns count of child elements
|
| 373 |
+
*
|
| 374 |
+
* @return int
|
| 375 |
+
*/
|
| 376 |
+
public function countChildren()
|
| 377 |
+
{
|
| 378 |
+
$this->isLoaded();
|
| 379 |
+
|
| 380 |
+
return $this->root->countChildren();
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
/**
|
| 384 |
+
* Get array of children
|
| 385 |
+
*
|
| 386 |
+
* @return array
|
| 387 |
+
*/
|
| 388 |
+
public function getChildren()
|
| 389 |
+
{
|
| 390 |
+
$this->isLoaded();
|
| 391 |
+
|
| 392 |
+
return $this->root->getChildren();
|
| 393 |
+
}
|
| 394 |
+
|
| 395 |
+
/**
|
| 396 |
+
* Check if node have children nodes
|
| 397 |
+
*
|
| 398 |
+
* @return bool
|
| 399 |
+
*/
|
| 400 |
+
public function hasChildren()
|
| 401 |
+
{
|
| 402 |
+
$this->isLoaded();
|
| 403 |
+
|
| 404 |
+
return $this->root->hasChildren();
|
| 405 |
+
}
|
| 406 |
+
|
| 407 |
/**
|
| 408 |
* Simple wrapper function that returns an element by the
|
| 409 |
* id.
|
| 504 |
}
|
| 505 |
|
| 506 |
// strip out server side scripts
|
| 507 |
+
if ($this->options->get('serverSideScriptis') == true){
|
| 508 |
+
$str = mb_eregi_replace("(<\?)(.*?)(\?>)", '', $str);
|
| 509 |
+
}
|
| 510 |
|
| 511 |
// strip smarty scripts
|
| 512 |
$str = mb_eregi_replace("(\{\w)(.*?)(\})", '', $str);
|
| 565 |
trim($str) != ''
|
| 566 |
) {
|
| 567 |
// we found text we care about
|
| 568 |
+
$textNode = new TextNode($str, $this->options->removeDoubleSpace);
|
| 569 |
$activeNode->addChild($textNode);
|
| 570 |
}
|
| 571 |
}
|
| 631 |
}
|
| 632 |
|
| 633 |
if (empty($name)) {
|
| 634 |
+
$this->content->skipByToken('blank');
|
| 635 |
+
continue;
|
| 636 |
}
|
| 637 |
|
| 638 |
$this->content->skipByToken('blank');
|
| 703 |
|
| 704 |
// We force self closing on this tag.
|
| 705 |
$node->getTag()->selfClosing();
|
| 706 |
+
|
| 707 |
+
// Should this tag use a trailing slash?
|
| 708 |
+
if(in_array($tag, $this->noSlash))
|
| 709 |
+
{
|
| 710 |
+
$node->getTag()->noTrailingSlash();
|
| 711 |
+
}
|
| 712 |
+
|
| 713 |
}
|
| 714 |
|
| 715 |
$this->content->fastForward(1);
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/AbstractNode.php
CHANGED
|
@@ -5,6 +5,7 @@ use PHPHtmlParser\Exceptions\CircularException;
|
|
| 5 |
use PHPHtmlParser\Exceptions\ParentNotFoundException;
|
| 6 |
use PHPHtmlParser\Selector;
|
| 7 |
use stringEncode\Encode;
|
|
|
|
| 8 |
|
| 9 |
/**
|
| 10 |
* Dom node object.
|
|
@@ -17,7 +18,7 @@ use stringEncode\Encode;
|
|
| 17 |
*/
|
| 18 |
abstract class AbstractNode
|
| 19 |
{
|
| 20 |
-
|
| 21 |
/**
|
| 22 |
* Contains the tag name/type
|
| 23 |
*
|
|
@@ -54,11 +55,12 @@ abstract class AbstractNode
|
|
| 54 |
protected $encode;
|
| 55 |
|
| 56 |
/**
|
| 57 |
-
* Creates a unique
|
| 58 |
*/
|
| 59 |
public function __construct()
|
| 60 |
{
|
| 61 |
-
$this->id =
|
|
|
|
| 62 |
}
|
| 63 |
|
| 64 |
/**
|
|
@@ -83,7 +85,7 @@ abstract class AbstractNode
|
|
| 83 |
case 'tag':
|
| 84 |
return $this->getTag();
|
| 85 |
case 'parent':
|
| 86 |
-
$this->getParent();
|
| 87 |
}
|
| 88 |
|
| 89 |
return null;
|
|
@@ -110,6 +112,14 @@ abstract class AbstractNode
|
|
| 110 |
return $this->outerHtml();
|
| 111 |
}
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
/**
|
| 114 |
* Returns the id of this object.
|
| 115 |
*/
|
|
@@ -152,9 +162,6 @@ abstract class AbstractNode
|
|
| 152 |
// assign child to parent
|
| 153 |
$this->parent->addChild($this);
|
| 154 |
|
| 155 |
-
//clear any cache
|
| 156 |
-
$this->clear();
|
| 157 |
-
|
| 158 |
return $this;
|
| 159 |
}
|
| 160 |
|
|
@@ -169,8 +176,8 @@ abstract class AbstractNode
|
|
| 169 |
if ( ! is_null($this->parent)) {
|
| 170 |
$this->parent->removeChild($this->id);
|
| 171 |
}
|
| 172 |
-
|
| 173 |
-
$this->
|
| 174 |
}
|
| 175 |
|
| 176 |
/**
|
|
@@ -220,6 +227,15 @@ abstract class AbstractNode
|
|
| 220 |
return null;
|
| 221 |
}
|
| 222 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 223 |
/**
|
| 224 |
* Attempts to get the next sibling.
|
| 225 |
*
|
|
@@ -293,6 +309,18 @@ abstract class AbstractNode
|
|
| 293 |
return $attribute;
|
| 294 |
}
|
| 295 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 296 |
/**
|
| 297 |
* A wrapper method that simply calls the setAttribute method
|
| 298 |
* on the tag of this node.
|
|
@@ -305,6 +333,9 @@ abstract class AbstractNode
|
|
| 305 |
{
|
| 306 |
$this->tag->setAttribute($key, $value);
|
| 307 |
|
|
|
|
|
|
|
|
|
|
| 308 |
return $this;
|
| 309 |
}
|
| 310 |
|
|
@@ -318,6 +349,9 @@ abstract class AbstractNode
|
|
| 318 |
public function removeAttribute($key)
|
| 319 |
{
|
| 320 |
$this->tag->removeAttribute($key);
|
|
|
|
|
|
|
|
|
|
| 321 |
}
|
| 322 |
|
| 323 |
/**
|
|
@@ -329,8 +363,10 @@ abstract class AbstractNode
|
|
| 329 |
public function removeAllAttributes()
|
| 330 |
{
|
| 331 |
$this->tag->removeAllAttributes();
|
| 332 |
-
}
|
| 333 |
|
|
|
|
|
|
|
|
|
|
| 334 |
/**
|
| 335 |
* Function to locate a specific ancestor tag in the path to the root.
|
| 336 |
*
|
|
@@ -378,6 +414,20 @@ abstract class AbstractNode
|
|
| 378 |
return $nodes;
|
| 379 |
}
|
| 380 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 381 |
/**
|
| 382 |
* Gets the inner html of this node.
|
| 383 |
*
|
|
@@ -407,4 +457,14 @@ abstract class AbstractNode
|
|
| 407 |
* @return void
|
| 408 |
*/
|
| 409 |
abstract protected function clear();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 410 |
}
|
| 5 |
use PHPHtmlParser\Exceptions\ParentNotFoundException;
|
| 6 |
use PHPHtmlParser\Selector;
|
| 7 |
use stringEncode\Encode;
|
| 8 |
+
use PHPHtmlParser\Finder;
|
| 9 |
|
| 10 |
/**
|
| 11 |
* Dom node object.
|
| 18 |
*/
|
| 19 |
abstract class AbstractNode
|
| 20 |
{
|
| 21 |
+
private static $count = 0;
|
| 22 |
/**
|
| 23 |
* Contains the tag name/type
|
| 24 |
*
|
| 55 |
protected $encode;
|
| 56 |
|
| 57 |
/**
|
| 58 |
+
* Creates a unique id for this node.
|
| 59 |
*/
|
| 60 |
public function __construct()
|
| 61 |
{
|
| 62 |
+
$this->id = self::$count;
|
| 63 |
+
self::$count++;
|
| 64 |
}
|
| 65 |
|
| 66 |
/**
|
| 85 |
case 'tag':
|
| 86 |
return $this->getTag();
|
| 87 |
case 'parent':
|
| 88 |
+
return $this->getParent();
|
| 89 |
}
|
| 90 |
|
| 91 |
return null;
|
| 112 |
return $this->outerHtml();
|
| 113 |
}
|
| 114 |
|
| 115 |
+
/**
|
| 116 |
+
* Reset node counter
|
| 117 |
+
*/
|
| 118 |
+
public static function resetCount()
|
| 119 |
+
{
|
| 120 |
+
self::$count = 0;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
/**
|
| 124 |
* Returns the id of this object.
|
| 125 |
*/
|
| 162 |
// assign child to parent
|
| 163 |
$this->parent->addChild($this);
|
| 164 |
|
|
|
|
|
|
|
|
|
|
| 165 |
return $this;
|
| 166 |
}
|
| 167 |
|
| 176 |
if ( ! is_null($this->parent)) {
|
| 177 |
$this->parent->removeChild($this->id);
|
| 178 |
}
|
| 179 |
+
$this->parent->clear();
|
| 180 |
+
$this->clear();
|
| 181 |
}
|
| 182 |
|
| 183 |
/**
|
| 227 |
return null;
|
| 228 |
}
|
| 229 |
|
| 230 |
+
public function hasNextSibling()
|
| 231 |
+
{
|
| 232 |
+
if (is_null($this->parent) || (!$this->parent->hasChildren())) {
|
| 233 |
+
return false;
|
| 234 |
+
}
|
| 235 |
+
|
| 236 |
+
return $this->parent->hasNextChild($this->id());
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
/**
|
| 240 |
* Attempts to get the next sibling.
|
| 241 |
*
|
| 309 |
return $attribute;
|
| 310 |
}
|
| 311 |
|
| 312 |
+
/**
|
| 313 |
+
* A wrapper method that simply calls the hasAttribute method
|
| 314 |
+
* on the tag of this node.
|
| 315 |
+
*
|
| 316 |
+
* @param string $key
|
| 317 |
+
* @return bool
|
| 318 |
+
*/
|
| 319 |
+
public function hasAttribute($key)
|
| 320 |
+
{
|
| 321 |
+
return $this->tag->hasAttribute($key);
|
| 322 |
+
}
|
| 323 |
+
|
| 324 |
/**
|
| 325 |
* A wrapper method that simply calls the setAttribute method
|
| 326 |
* on the tag of this node.
|
| 333 |
{
|
| 334 |
$this->tag->setAttribute($key, $value);
|
| 335 |
|
| 336 |
+
//clear any cache
|
| 337 |
+
$this->clear();
|
| 338 |
+
|
| 339 |
return $this;
|
| 340 |
}
|
| 341 |
|
| 349 |
public function removeAttribute($key)
|
| 350 |
{
|
| 351 |
$this->tag->removeAttribute($key);
|
| 352 |
+
|
| 353 |
+
//clear any cache
|
| 354 |
+
$this->clear();
|
| 355 |
}
|
| 356 |
|
| 357 |
/**
|
| 363 |
public function removeAllAttributes()
|
| 364 |
{
|
| 365 |
$this->tag->removeAllAttributes();
|
|
|
|
| 366 |
|
| 367 |
+
//clear any cache
|
| 368 |
+
$this->clear();
|
| 369 |
+
}
|
| 370 |
/**
|
| 371 |
* Function to locate a specific ancestor tag in the path to the root.
|
| 372 |
*
|
| 414 |
return $nodes;
|
| 415 |
}
|
| 416 |
|
| 417 |
+
/**
|
| 418 |
+
* Find node by id
|
| 419 |
+
*
|
| 420 |
+
* @param $id
|
| 421 |
+
* @return bool|AbstractNode
|
| 422 |
+
*/
|
| 423 |
+
public function findById($id)
|
| 424 |
+
{
|
| 425 |
+
$finder= new Finder($id);
|
| 426 |
+
|
| 427 |
+
return $finder->find($this);
|
| 428 |
+
}
|
| 429 |
+
|
| 430 |
+
|
| 431 |
/**
|
| 432 |
* Gets the inner html of this node.
|
| 433 |
*
|
| 457 |
* @return void
|
| 458 |
*/
|
| 459 |
abstract protected function clear();
|
| 460 |
+
|
| 461 |
+
/**
|
| 462 |
+
* Check is node type textNode
|
| 463 |
+
*
|
| 464 |
+
* @return boolean
|
| 465 |
+
*/
|
| 466 |
+
public function isTextNode() {
|
| 467 |
+
|
| 468 |
+
return false;
|
| 469 |
+
}
|
| 470 |
}
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/HtmlNode.php
CHANGED
|
@@ -186,6 +186,10 @@ class HtmlNode extends InnerNode
|
|
| 186 |
$this->innerHtml = null;
|
| 187 |
$this->outerHtml = null;
|
| 188 |
$this->text = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
}
|
| 190 |
|
| 191 |
/**
|
| 186 |
$this->innerHtml = null;
|
| 187 |
$this->outerHtml = null;
|
| 188 |
$this->text = null;
|
| 189 |
+
|
| 190 |
+
if (is_null($this->parent) === false) {
|
| 191 |
+
$this->parent->clear();
|
| 192 |
+
}
|
| 193 |
}
|
| 194 |
|
| 195 |
/**
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/InnerNode.php
CHANGED
|
@@ -234,6 +234,18 @@ abstract class InnerNode extends ArrayNode
|
|
| 234 |
return $this;
|
| 235 |
}
|
| 236 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
/**
|
| 238 |
* Attempts to get the next child.
|
| 239 |
*
|
|
@@ -294,13 +306,28 @@ abstract class InnerNode extends ArrayNode
|
|
| 294 |
*/
|
| 295 |
public function replaceChild($childId, AbstractNode $newChild)
|
| 296 |
{
|
| 297 |
-
$oldChild
|
| 298 |
-
|
| 299 |
-
$
|
| 300 |
-
$
|
| 301 |
-
|
| 302 |
-
$this->children
|
| 303 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
}
|
| 305 |
|
| 306 |
/**
|
| 234 |
return $this;
|
| 235 |
}
|
| 236 |
|
| 237 |
+
/**
|
| 238 |
+
* Check if has next Child
|
| 239 |
+
*
|
| 240 |
+
* @param $id childId
|
| 241 |
+
* @return mixed
|
| 242 |
+
*/
|
| 243 |
+
public function hasNextChild($id)
|
| 244 |
+
{
|
| 245 |
+
$child= $this->getChild($id);
|
| 246 |
+
return $this->children[$child->id()]['next'];
|
| 247 |
+
}
|
| 248 |
+
|
| 249 |
/**
|
| 250 |
* Attempts to get the next child.
|
| 251 |
*
|
| 306 |
*/
|
| 307 |
public function replaceChild($childId, AbstractNode $newChild)
|
| 308 |
{
|
| 309 |
+
$oldChild = $this->children[$childId];
|
| 310 |
+
|
| 311 |
+
$newChild->prev = $oldChild['prev'];
|
| 312 |
+
$newChild->next = $oldChild['next'];
|
| 313 |
+
|
| 314 |
+
$keys = array_keys($this->children);
|
| 315 |
+
$index = array_search($childId, $keys, true);
|
| 316 |
+
$keys[$index] = $newChild->id();
|
| 317 |
+
$this->children = array_combine($keys, $this->children);
|
| 318 |
+
$this->children[$newChild->id()] = array(
|
| 319 |
+
'prev' => $oldChild['prev'],
|
| 320 |
+
'node' => $newChild,
|
| 321 |
+
'next' => $oldChild['next']
|
| 322 |
+
);
|
| 323 |
+
|
| 324 |
+
if ($oldChild['prev'] && isset($this->children[$newChild->prev])) {
|
| 325 |
+
$this->children[$oldChild['prev']]['next'] = $newChild->id();
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
if ($oldChild['next'] && isset($this->children[$newChild->next])) {
|
| 329 |
+
$this->children[$oldChild['next']]['prev'] = $newChild->id();
|
| 330 |
+
}
|
| 331 |
}
|
| 332 |
|
| 333 |
/**
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/MockNode.php
CHANGED
|
@@ -40,6 +40,9 @@ class MockNode extends InnerNode
|
|
| 40 |
$this->innerHtml = null;
|
| 41 |
$this->outerHtml = null;
|
| 42 |
$this->text = null;
|
|
|
|
|
|
|
|
|
|
| 43 |
}
|
| 44 |
|
| 45 |
/**
|
| 40 |
$this->innerHtml = null;
|
| 41 |
$this->outerHtml = null;
|
| 42 |
$this->text = null;
|
| 43 |
+
if (is_null($this->parent) === false) {
|
| 44 |
+
$this->parent->clear();
|
| 45 |
+
}
|
| 46 |
}
|
| 47 |
|
| 48 |
/**
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/Tag.php
CHANGED
|
@@ -33,6 +33,13 @@ class Tag
|
|
| 33 |
*/
|
| 34 |
protected $selfClosing = false;
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
/**
|
| 37 |
* Tag noise
|
| 38 |
*/
|
|
@@ -99,6 +106,19 @@ class Tag
|
|
| 99 |
return $this;
|
| 100 |
}
|
| 101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
/**
|
| 103 |
* Checks if the tag is self closing.
|
| 104 |
*
|
|
@@ -153,6 +173,51 @@ class Tag
|
|
| 153 |
return $this;
|
| 154 |
}
|
| 155 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
/**
|
| 157 |
* Removes an attribute from this tag.
|
| 158 |
*
|
|
@@ -225,6 +290,17 @@ class Tag
|
|
| 225 |
return $this->attr[$key];
|
| 226 |
}
|
| 227 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 228 |
/**
|
| 229 |
* Generates the opening tag for this object.
|
| 230 |
*
|
|
@@ -247,7 +323,7 @@ class Tag
|
|
| 247 |
}
|
| 248 |
}
|
| 249 |
|
| 250 |
-
if ($this->selfClosing) {
|
| 251 |
return $return.' />';
|
| 252 |
} else {
|
| 253 |
return $return.'>';
|
| 33 |
*/
|
| 34 |
protected $selfClosing = false;
|
| 35 |
|
| 36 |
+
/**
|
| 37 |
+
* If self-closing, will this use a trailing slash. />
|
| 38 |
+
*
|
| 39 |
+
* @var bool
|
| 40 |
+
*/
|
| 41 |
+
protected $trailingSlash = true;
|
| 42 |
+
|
| 43 |
/**
|
| 44 |
* Tag noise
|
| 45 |
*/
|
| 106 |
return $this;
|
| 107 |
}
|
| 108 |
|
| 109 |
+
|
| 110 |
+
/**
|
| 111 |
+
* Sets the tag to not use a trailing slash.
|
| 112 |
+
*
|
| 113 |
+
* @return $this
|
| 114 |
+
*/
|
| 115 |
+
public function noTrailingSlash()
|
| 116 |
+
{
|
| 117 |
+
$this->trailingSlash = false;
|
| 118 |
+
|
| 119 |
+
return $this;
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
/**
|
| 123 |
* Checks if the tag is self closing.
|
| 124 |
*
|
| 173 |
return $this;
|
| 174 |
}
|
| 175 |
|
| 176 |
+
/**
|
| 177 |
+
* Set inline style attribute value.
|
| 178 |
+
*
|
| 179 |
+
* @param $attr_key
|
| 180 |
+
* @param $attr_value
|
| 181 |
+
*/
|
| 182 |
+
public function setStyleAttributeValue($attr_key, $attr_value)
|
| 183 |
+
{
|
| 184 |
+
|
| 185 |
+
$style_array = $this->getStyleAttributeArray();
|
| 186 |
+
$style_array[$attr_key] = $attr_value;
|
| 187 |
+
|
| 188 |
+
$style_string = '';
|
| 189 |
+
foreach ($style_array as $key => $value) {
|
| 190 |
+
$style_string .= $key . ':' . $value . ';';
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
$this->setAttribute('style', $style_string);
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
/**
|
| 197 |
+
* Get style attribute in array
|
| 198 |
+
*
|
| 199 |
+
* @return array|null
|
| 200 |
+
*/
|
| 201 |
+
public function getStyleAttributeArray()
|
| 202 |
+
{
|
| 203 |
+
$value = $this->getAttribute('style')['value'];
|
| 204 |
+
|
| 205 |
+
if ($value === null) {
|
| 206 |
+
return null;
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
$value = explode(';', substr(trim($value), 0, -1));
|
| 210 |
+
$result = [];
|
| 211 |
+
foreach ($value as $attr) {
|
| 212 |
+
$attr = explode(':', $attr);
|
| 213 |
+
$result[$attr[0]] = $attr[1];
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
return $result;
|
| 217 |
+
}
|
| 218 |
+
|
| 219 |
+
|
| 220 |
+
|
| 221 |
/**
|
| 222 |
* Removes an attribute from this tag.
|
| 223 |
*
|
| 290 |
return $this->attr[$key];
|
| 291 |
}
|
| 292 |
|
| 293 |
+
/**
|
| 294 |
+
* Returns TRUE if node has attribute
|
| 295 |
+
*
|
| 296 |
+
* @param string $key
|
| 297 |
+
* @return bool
|
| 298 |
+
*/
|
| 299 |
+
public function hasAttribute($key)
|
| 300 |
+
{
|
| 301 |
+
return isset($this->attr[$key]);
|
| 302 |
+
}
|
| 303 |
+
|
| 304 |
/**
|
| 305 |
* Generates the opening tag for this object.
|
| 306 |
*
|
| 323 |
}
|
| 324 |
}
|
| 325 |
|
| 326 |
+
if ($this->selfClosing && $this->trailingSlash) {
|
| 327 |
return $return.' />';
|
| 328 |
} else {
|
| 329 |
return $return.'>';
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Dom/TextNode.php
CHANGED
|
@@ -35,10 +35,12 @@ class TextNode extends LeafNode
|
|
| 35 |
*
|
| 36 |
* @param string $text
|
| 37 |
*/
|
| 38 |
-
public function __construct($text)
|
| 39 |
{
|
| 40 |
-
|
| 41 |
-
|
|
|
|
|
|
|
| 42 |
|
| 43 |
// restore line breaks
|
| 44 |
$text = str_replace(' ', "\n", $text);
|
|
@@ -72,6 +74,24 @@ class TextNode extends LeafNode
|
|
| 72 |
}
|
| 73 |
}
|
| 74 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
/**
|
| 76 |
* This node has no html, just return the text.
|
| 77 |
*
|
|
@@ -102,4 +122,14 @@ class TextNode extends LeafNode
|
|
| 102 |
{
|
| 103 |
$this->convertedText = null;
|
| 104 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
}
|
| 35 |
*
|
| 36 |
* @param string $text
|
| 37 |
*/
|
| 38 |
+
public function __construct($text, $removeDoubleSpace = true)
|
| 39 |
{
|
| 40 |
+
if ($removeDoubleSpace) {
|
| 41 |
+
// remove double spaces
|
| 42 |
+
$text = mb_ereg_replace('\s+', ' ', $text);
|
| 43 |
+
}
|
| 44 |
|
| 45 |
// restore line breaks
|
| 46 |
$text = str_replace(' ', "\n", $text);
|
| 74 |
}
|
| 75 |
}
|
| 76 |
|
| 77 |
+
/**
|
| 78 |
+
* Sets the text for this node.
|
| 79 |
+
*
|
| 80 |
+
* @var string $text
|
| 81 |
+
* @return void
|
| 82 |
+
*/
|
| 83 |
+
public function setText($text)
|
| 84 |
+
{
|
| 85 |
+
$this->text = $text;
|
| 86 |
+
|
| 87 |
+
if ( ! is_null($this->encode)) {
|
| 88 |
+
$text = $this->encode->convert($text);
|
| 89 |
+
|
| 90 |
+
// remember the conversion
|
| 91 |
+
$this->convertedText = $text;
|
| 92 |
+
}
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
/**
|
| 96 |
* This node has no html, just return the text.
|
| 97 |
*
|
| 122 |
{
|
| 123 |
$this->convertedText = null;
|
| 124 |
}
|
| 125 |
+
|
| 126 |
+
/**
|
| 127 |
+
* Checks if the current node is a text node.
|
| 128 |
+
*
|
| 129 |
+
* @return bool
|
| 130 |
+
*/
|
| 131 |
+
public function isTextNode()
|
| 132 |
+
{
|
| 133 |
+
return true;
|
| 134 |
+
}
|
| 135 |
}
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Finder.php
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
namespace PHPHtmlParser;
|
| 4 |
+
|
| 5 |
+
use PHPHtmlParser\Dom\AbstractNode;
|
| 6 |
+
|
| 7 |
+
class Finder
|
| 8 |
+
{
|
| 9 |
+
private $id;
|
| 10 |
+
|
| 11 |
+
/**
|
| 12 |
+
* Finder constructor.
|
| 13 |
+
* @param $id
|
| 14 |
+
*/
|
| 15 |
+
public function __construct($id)
|
| 16 |
+
{
|
| 17 |
+
$this->id = $id;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
/**
|
| 21 |
+
*
|
| 22 |
+
* Find node in tree by id
|
| 23 |
+
*
|
| 24 |
+
* @param AbstractNode $node
|
| 25 |
+
* @return bool|AbstractNode
|
| 26 |
+
*/
|
| 27 |
+
public function find(AbstractNode $node)
|
| 28 |
+
{
|
| 29 |
+
if (!$node->id()) {
|
| 30 |
+
return $this->find($node->firstChild());
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
if ($node->id() == $this->id) {
|
| 34 |
+
return $node;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
if ($node->hasNextSibling()) {
|
| 38 |
+
$nextSibling = $node->nextSibling();
|
| 39 |
+
if ($nextSibling->id() == $this->id) {
|
| 40 |
+
return $nextSibling;
|
| 41 |
+
}
|
| 42 |
+
if ($nextSibling->id() > $this->id) {
|
| 43 |
+
return $this->find($node->firstChild());
|
| 44 |
+
}
|
| 45 |
+
if ($nextSibling->id() < $this->id) {
|
| 46 |
+
return $this->find($nextSibling);
|
| 47 |
+
}
|
| 48 |
+
} else if (!$node->isTextNode()) {
|
| 49 |
+
return $this->find($node->firstChild());
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
return false;
|
| 53 |
+
}
|
| 54 |
+
}
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Options.php
CHANGED
|
@@ -25,6 +25,7 @@ class Options
|
|
| 25 |
'removeScripts' => true,
|
| 26 |
'removeStyles' => true,
|
| 27 |
'preserveLineBreaks' => false,
|
|
|
|
| 28 |
];
|
| 29 |
|
| 30 |
/**
|
| 25 |
'removeScripts' => true,
|
| 26 |
'removeStyles' => true,
|
| 27 |
'preserveLineBreaks' => false,
|
| 28 |
+
'removeDoubleSpace' => true,
|
| 29 |
];
|
| 30 |
|
| 31 |
/**
|
vendor/paquettg/php-html-parser/src/PHPHtmlParser/Selector.php
CHANGED
|
@@ -232,9 +232,7 @@ class Selector
|
|
| 232 |
$pass = false;
|
| 233 |
}
|
| 234 |
} else {
|
| 235 |
-
if ($rule['key'] != 'plaintext' &&
|
| 236 |
-
is_null($child->getAttribute($rule['key']))
|
| 237 |
-
) {
|
| 238 |
$pass = false;
|
| 239 |
}
|
| 240 |
}
|
| 232 |
$pass = false;
|
| 233 |
}
|
| 234 |
} else {
|
| 235 |
+
if ($rule['key'] != 'plaintext' && !$child->hasAttribute($rule['key'])) {
|
|
|
|
|
|
|
| 236 |
$pass = false;
|
| 237 |
}
|
| 238 |
}
|
