LLMS_DOM_Document
LLMS_DOM_Document Class
Contents
Source Source
File: includes/class-llms-dom-document.php
class LLMS_DOM_Document { /** * Stores the load method name * * @var string */ private $load_method = 'load_with_mb_convert_encoding'; /** * Stores the HTML string to load * * @var string */ private $source; /** * Stores the DOMDocument instance * * @var DOMDocument */ private $dom; /** * Stores loading errors * * @var null|WP_Error */ private $error; /** * This forces DOMDocument to convert non-utf8 characters into HTML entities and without relying on `mb_convert_encoding()`. * * @var string */ private $utf8_fixer = '<meta id="llms-get-dom-doc-utf-fixer" http-equiv="Content-Type" content="text/html; charset=utf-8">'; /** * Constructor * * @since 4.13.0 * * @param string $source An HTML string, either a full HTML document or a partial string. * @return void */ public function __construct( $source ) { if ( ! class_exists( 'DOMDocument' ) ) { $this->error = new WP_Error( 'llms-dom-document-missing', __( 'DOMDocument not available.', 'lifterlms' ) ); return; } /** * Filters the convert encoding method to be used when loading the source in the DOMDocument * * @param boolean $use_mb_convert_encoding Whether or not the convert encoding method should be used when loading the source in the DOMDocument. * Default is `true`. Requires `mbstring` PHP extension. */ $use_mb_convert_encoding = apply_filters( 'llms_dom_document_use_mb_convert_encoding', true ); if ( ! ( $use_mb_convert_encoding && function_exists( 'mb_convert_encoding' ) ) ) { $this->load_method = 'load_with_meta_utf_fixer'; } $this->source = $source; $this->dom = new DOMDocument(); } /** * Load the HTML string in the DOMDocument * * This function suppresses PHP warnings that would be thrown by DOMDocument when * loading a partial string or an HTML string with errors. * * @since 4.13.0 * * @return boolean|WP_Error Returns `true` if the source is loaded fine. * Or an error object when DOMDocument isn't available or an error is encountered during loading. */ public function load() { if ( is_wp_error( $this->error ) && $this->error->has_errors() ) { return $this->error; } // Don't throw or log warnings. $libxml_state = libxml_use_internal_errors( true ); $this->{$this->load_method}(); // Clear and restore errors. libxml_clear_errors(); libxml_use_internal_errors( $libxml_state ); return is_wp_error( $this->error ) && $this->error->has_errors() ? $this->error : true; } /** * Returns the DOMDocument * * @since 4.13.0 * * @return DOMDocument Returns an instance of DOMDocument. */ public function dom() { return $this->dom; } /** * Load the HTML string in the DOMDocument using mb_convert_econding * * @since 4.13.0 * * @return void */ private function load_with_mb_convert_encoding() { if ( ! $this->dom->loadHTML( mb_convert_encoding( $this->source, 'HTML-ENTITIES', 'UTF-8' ) ) ) { $this->error = new WP_Error( 'llms-dom-document-error', __( 'DOMDocument XML Error encountered.', 'lifterlms' ), libxml_get_errors() ); } } /** * Load the HTML string in the DOMDocument using the meta ut8 fixer * * @since 4.13.0 * * @return void */ private function load_with_meta_utf_fixer() { if ( ! $this->dom->loadHTML( $this->utf8_fixer . $this->source ) ) { $this->error = new WP_Error( 'llms-dom-document-error', __( 'DOMDocument XML Error encountered.', 'lifterlms' ), libxml_get_errors() ); return; } // Remove the fixer meta element, if it's not removed it creates invalid HTML5 Markup. $meta = $this->dom->getElementById( 'llms-get-dom-doc-utf-fixer' ); if ( $meta ) { $meta->parentNode->removeChild( $meta ); // phpcs:ignore: WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase } } }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- dom — Returns the DOMDocument
- load — Load the HTML string in the DOMDocument
- load_with_mb_convert_encoding — Load the HTML string in the DOMDocument using mb_convert_econding
- load_with_meta_utf_fixer — Load the HTML string in the DOMDocument using the meta ut8 fixer
Changelog Changelog
Version | Description |
---|---|
4.13.0 | Introduced. |