package and depencies
This commit is contained in:
		
							
								
								
									
										11
									
								
								vendor/masterminds/html5/CREDITS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/masterminds/html5/CREDITS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| Matt Butcher [technosophos] <technosophos@gmail.com> (lead) | ||||
| Matt Farina  [mattfarina] <matt@mattfarina.com> (lead) | ||||
| Asmir Mustafic [goetas] <goetas@lignano.it> (contributor) | ||||
| Edward Z. Yang [ezyang] <ezyang@mit.edu> (contributor) | ||||
| Geoffrey Sneddon [gsnedders] <geoffers@gmail.com> (contributor) | ||||
| Kukhar Vasily [ngreduce] <ngreduce@gmail.com> (contributor) | ||||
| Rune Christensen [MrElectronic] <mrelectronic@example.com> (contributor) | ||||
| Mišo Belica [miso-belica] <miso-belica@example.com> (contributor) | ||||
| Asmir Mustafic [goetas] <goetas@example.com> (contributor) | ||||
| KITAITI Makoto [KitaitiMakoto] <KitaitiMakoto@example.com> (contributor)  | ||||
| Jacob Floyd [cognifloyd] <cognifloyd@gmail.com> (contributor) | ||||
							
								
								
									
										66
									
								
								vendor/masterminds/html5/LICENSE.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								vendor/masterminds/html5/LICENSE.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| ## HTML5-PHP License | ||||
|  | ||||
| Copyright (c) 2013 The Authors of HTML5-PHP | ||||
|  | ||||
| Matt Butcher - mattbutcher@google.com | ||||
| Matt Farina - matt@mattfarina.com | ||||
| Asmir Mustafic - goetas@gmail.com | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
| this software and associated documentation files (the "Software"), to deal in  | ||||
| the Software without restriction, including without limitation the rights to  | ||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
| the Software, and to permit persons to whom the Software is furnished to do so, | ||||
| subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| ## HTML5Lib License | ||||
|  | ||||
| Portions of this are based on html5lib's PHP version, which was a | ||||
| sub-project of html5lib. The following is the list of contributors from | ||||
| html5lib: | ||||
|  | ||||
| html5lib: | ||||
|  | ||||
| Copyright (c) 2006-2009 The Authors | ||||
|  | ||||
| Contributors: | ||||
| James Graham - jg307@cam.ac.uk | ||||
| Anne van Kesteren - annevankesteren@gmail.com | ||||
| Lachlan Hunt - lachlan.hunt@lachy.id.au | ||||
| Matt McDonald - kanashii@kanashii.ca | ||||
| Sam Ruby - rubys@intertwingly.net | ||||
| Ian Hickson (Google) - ian@hixie.ch | ||||
| Thomas Broyer - t.broyer@ltgt.net | ||||
| Jacques Distler - distler@golem.ph.utexas.edu | ||||
| Henri Sivonen - hsivonen@iki.fi | ||||
| Adam Barth - abarth@webkit.org | ||||
| Eric Seidel - eric@webkit.org | ||||
| The Mozilla Foundation (contributions from Henri Sivonen since 2008) | ||||
| David Flanagan (Mozilla) - dflanagan@mozilla.com | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||
| this software and associated documentation files (the "Software"), to deal in  | ||||
| the Software without restriction, including without limitation the rights to  | ||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||
| the Software, and to permit persons to whom the Software is furnished to do so, | ||||
| subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										270
									
								
								vendor/masterminds/html5/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								vendor/masterminds/html5/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| > # UKRAINE NEEDS YOUR HELP NOW! | ||||
| > | ||||
| > On 24 February 2022, Russian [President Vladimir Putin ordered an invasion of Ukraine by Russian Armed Forces](https://www.bbc.com/news/world-europe-60504334). | ||||
| > | ||||
| > Your support is urgently needed. | ||||
| > | ||||
| > - Donate to the volunteers. Here is the volunteer fund helping the Ukrainian army to provide all the necessary equipment: | ||||
| >  https://bank.gov.ua/en/news/all/natsionalniy-bank-vidkriv-spetsrahunok-dlya-zboru-koshtiv-na-potrebi-armiyi or https://savelife.in.ua/en/donate/ | ||||
| > - Triple-check social media sources. Russian disinformation is attempting to coverup and distort the reality in Ukraine. | ||||
| > - Help Ukrainian refugees who are fleeing Russian attacks and shellings: https://www.globalcitizen.org/en/content/ways-to-help-ukraine-conflict/ | ||||
| > -  Put pressure on your political representatives to provide help to Ukraine. | ||||
| > -  Believe in the Ukrainian people, they will not surrender, they don't have another Ukraine. | ||||
| > | ||||
| > THANK YOU! | ||||
| ---- | ||||
|  | ||||
| # HTML5-PHP | ||||
|  | ||||
| HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP. | ||||
| It is stable and used in many production websites, and has | ||||
| well over [five million downloads](https://packagist.org/packages/masterminds/html5). | ||||
|  | ||||
| HTML5 provides the following features. | ||||
|  | ||||
| - An HTML5 serializer | ||||
| - Support for PHP namespaces | ||||
| - Composer support | ||||
| - Event-based (SAX-like) parser | ||||
| - A DOM tree builder | ||||
| - Interoperability with [QueryPath](https://github.com/technosophos/querypath) | ||||
| - Runs on **PHP** 5.3.0 or newer | ||||
|  | ||||
| [](https://travis-ci.org/Masterminds/html5-php) | ||||
| [](https://packagist.org/packages/masterminds/html5) | ||||
| [](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) | ||||
| [](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) | ||||
| [](https://masterminds.github.io/stability/sustained.html) | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| Install HTML5-PHP using [composer](http://getcomposer.org/). | ||||
|  | ||||
| By adding the `masterminds/html5` dependency to your `composer.json` file: | ||||
|  | ||||
| ```json | ||||
| { | ||||
|   "require" : { | ||||
|     "masterminds/html5": "^2.0" | ||||
|   }, | ||||
| } | ||||
| ``` | ||||
|  | ||||
| By invoking require command via composer executable: | ||||
|  | ||||
| ```bash | ||||
| composer require masterminds/html5 | ||||
| ``` | ||||
|  | ||||
| ## Basic Usage | ||||
|  | ||||
| HTML5-PHP has a high-level API and a low-level API. | ||||
|  | ||||
| Here is how you use the high-level `HTML5` library API: | ||||
|  | ||||
| ```php | ||||
| <?php | ||||
| // Assuming you installed from Composer: | ||||
| require "vendor/autoload.php"; | ||||
|  | ||||
| use Masterminds\HTML5; | ||||
|  | ||||
| // An example HTML document: | ||||
| $html = <<< 'HERE' | ||||
|   <html> | ||||
|   <head> | ||||
|     <title>TEST</title> | ||||
|   </head> | ||||
|   <body id='foo'> | ||||
|     <h1>Hello World</h1> | ||||
|     <p>This is a test of the HTML5 parser.</p> | ||||
|   </body> | ||||
|   </html> | ||||
| HERE; | ||||
|  | ||||
| // Parse the document. $dom is a DOMDocument. | ||||
| $html5 = new HTML5(); | ||||
| $dom = $html5->loadHTML($html); | ||||
|  | ||||
| // Render it as HTML5: | ||||
| print $html5->saveHTML($dom); | ||||
|  | ||||
| // Or save it to a file: | ||||
| $html5->save($dom, 'out.html'); | ||||
| ``` | ||||
|  | ||||
| The `$dom` created by the parser is a full `DOMDocument` object. And the | ||||
| `save()` and `saveHTML()` methods will take any DOMDocument. | ||||
|  | ||||
| ### Options | ||||
|  | ||||
| It is possible to pass in an array of configuration options when loading | ||||
| an HTML5 document. | ||||
|  | ||||
| ```php | ||||
| // An associative array of options | ||||
| $options = array( | ||||
|   'option_name' => 'option_value', | ||||
| ); | ||||
|  | ||||
| // Provide the options to the constructor | ||||
| $html5 = new HTML5($options); | ||||
|  | ||||
| $dom = $html5->loadHTML($html); | ||||
| ``` | ||||
|  | ||||
| The following options are supported: | ||||
|  | ||||
| * `encode_entities` (boolean): Indicates that the serializer should aggressively | ||||
|   encode characters as entities. Without this, it only encodes the bare | ||||
|   minimum. | ||||
| * `disable_html_ns` (boolean): Prevents the parser from automatically | ||||
|   assigning the HTML5 namespace to the DOM document. This is for | ||||
|   non-namespace aware DOM tools. | ||||
| * `target_document` (\DOMDocument): A DOM document that will be used as the | ||||
|   destination for the parsed nodes. | ||||
| * `implicit_namespaces` (array): An assoc array of namespaces that should be | ||||
|   used by the parser. Name is tag prefix, value is NS URI. | ||||
|  | ||||
| ## The Low-Level API | ||||
|  | ||||
| This library provides the following low-level APIs that you can use to | ||||
| create more customized HTML5 tools: | ||||
|  | ||||
| - A SAX-like event-based parser that you can hook into for special kinds | ||||
| of parsing. | ||||
| - A flexible error-reporting mechanism that can be tuned to document | ||||
| syntax checking. | ||||
| - A DOM implementation that uses PHP's built-in DOM library. | ||||
|  | ||||
| The unit tests exercise each piece of the API, and every public function | ||||
| is well-documented. | ||||
|  | ||||
| ### Parser Design | ||||
|  | ||||
| The parser is designed as follows: | ||||
|  | ||||
| - The `Scanner` handles scanning on behalf of the parser. | ||||
| - The `Tokenizer` requests data off of the scanner, parses it, clasifies | ||||
| it, and sends it to an `EventHandler`. It is a *recursive descent parser.* | ||||
| - The `EventHandler` receives notifications and data for each specific | ||||
| semantic event that occurs during tokenization. | ||||
| - The `DOMBuilder` is an `EventHandler` that listens for tokenizing | ||||
| events and builds a document tree (`DOMDocument`) based on the events. | ||||
|  | ||||
| ### Serializer Design | ||||
|  | ||||
| The serializer takes a data structure (the `DOMDocument`) and transforms | ||||
| it into a character representation -- an HTML5 document. | ||||
|  | ||||
| The serializer is broken into three parts: | ||||
|  | ||||
| - The `OutputRules` contain the rules to turn DOM elements into strings. The | ||||
| rules are an implementation of the interface `RulesInterface` allowing for | ||||
| different rule sets to be used. | ||||
| - The `Traverser`, which is a special-purpose tree walker. It visits | ||||
| each node node in the tree and uses the `OutputRules` to transform the node | ||||
| into a string. | ||||
| - `HTML5` manages the `Traverser` and stores the resultant data | ||||
| in the correct place. | ||||
|  | ||||
| The serializer (`save()`, `saveHTML()`) follows the | ||||
| [section 8.9 of the HTML 5.0 spec](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments). | ||||
| So tags are serialized according to these rules: | ||||
|  | ||||
| - A tag with children: <foo>CHILDREN</foo> | ||||
| - A tag that cannot have content: <foo> (no closing tag) | ||||
| - A tag that could have content, but doesn't: <foo></foo> | ||||
|  | ||||
| ## Known Issues (Or, Things We Designed Against the Spec) | ||||
|  | ||||
| Please check the issue queue for a full list, but the following are | ||||
| issues known issues that are not presently on the roadmap: | ||||
|  | ||||
| - Namespaces: HTML5 only [supports a selected list of namespaces](http://www.w3.org/TR/html5/infrastructure.html#namespaces) | ||||
|   and they do not operate in the same way as XML namespaces. A `:` has no special | ||||
|   meaning. | ||||
|   By default the parser does not support XML style namespaces via `:`; | ||||
|   to enable the XML namespaces see the  [XML Namespaces section](#xml-namespaces) | ||||
| - Scripts: This parser does not contain a JavaScript or a CSS | ||||
|   interpreter. While one may be supplied, not all features will be | ||||
|   supported. | ||||
| - Rentrance: The current parser is not re-entrant. (Thus you can't pause | ||||
|   the parser to modify the HTML string mid-parse.) | ||||
| - Validation: The current tree builder is **not** a validating parser. | ||||
|   While it will correct some HTML, it does not check that the HTML | ||||
|   conforms to the standard. (Should you wish, you can build a validating | ||||
|   parser by extending DOMTree or building your own EventHandler | ||||
|   implementation.) | ||||
|   * There is limited support for insertion modes. | ||||
|   * Some autocorrection is done automatically. | ||||
|   * Per the spec, many legacy tags are admitted and correctly handled, | ||||
|     even though they are technically not part of HTML5. | ||||
| - Attribute names and values: Due to the implementation details of the | ||||
|   PHP implementation of DOM, attribute names that do not follow the | ||||
|   XML 1.0 standard are not inserted into the DOM. (Effectively, they | ||||
|   are ignored.) If you've got a clever fix for this, jump in! | ||||
| - Processor Instructions: The HTML5 spec does not allow processor | ||||
|   instructions. We do. Since this is a server-side library, we think | ||||
|   this is useful. And that means, dear reader, that in some cases you | ||||
|   can parse the HTML from a mixed PHP/HTML document. This, however, | ||||
|   is an incidental feature, not a core feature. | ||||
| - HTML manifests: Unsupported. | ||||
| - PLAINTEXT: Unsupported. | ||||
| - Adoption Agency Algorithm: Not yet implemented. (8.2.5.4.7) | ||||
|  | ||||
| ## XML Namespaces | ||||
|  | ||||
| To use XML style namespaces you have to configure well the main `HTML5` instance. | ||||
|  | ||||
| ```php | ||||
| use Masterminds\HTML5; | ||||
| $html = new HTML5(array( | ||||
|     "xmlNamespaces" => true | ||||
| )); | ||||
|  | ||||
| $dom = $html->loadHTML('<t:tag xmlns:t="http://www.example.com"/>'); | ||||
|  | ||||
| $dom->documentElement->namespaceURI; // http://www.example.com | ||||
|  | ||||
| ``` | ||||
|  | ||||
| You can also add some default prefixes that will not require the namespace declaration, | ||||
| but its elements will be namespaced. | ||||
|  | ||||
| ```php | ||||
| use Masterminds\HTML5; | ||||
| $html = new HTML5(array( | ||||
|     "implicitNamespaces"=>array( | ||||
|         "t"=>"http://www.example.com" | ||||
|     ) | ||||
| )); | ||||
|  | ||||
| $dom = $html->loadHTML('<t:tag/>'); | ||||
|  | ||||
| $dom->documentElement->namespaceURI; // http://www.example.com | ||||
|  | ||||
| ``` | ||||
|  | ||||
| ## Thanks to... | ||||
|  | ||||
| The dedicated (and patient) contributors of patches small and large, | ||||
| who have already made this library better.See the CREDITS file for | ||||
| a list of contributors. | ||||
|  | ||||
| We owe a huge debt of gratitude to the original authors of html5lib. | ||||
|  | ||||
| While not much of the original parser remains, we learned a lot from | ||||
| reading the html5lib library. And some pieces remain here. In | ||||
| particular, much of the UTF-8 and Unicode handling is derived from the | ||||
| html5lib project. | ||||
|  | ||||
| ## License | ||||
|  | ||||
| This software is released under the MIT license. The original html5lib | ||||
| library was also released under the MIT license. | ||||
|  | ||||
| See LICENSE.txt | ||||
|  | ||||
| Certain files contain copyright assertions by specific individuals | ||||
| involved with html5lib. Those have been retained where appropriate. | ||||
							
								
								
									
										157
									
								
								vendor/masterminds/html5/RELEASE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								vendor/masterminds/html5/RELEASE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| # Release Notes | ||||
|  | ||||
| 2.7.6  (2021-08-18) | ||||
|  | ||||
| - #218: Address comment handling issues  | ||||
|  | ||||
| 2.7.5  (2021-07-01) | ||||
|  | ||||
| - #204: Travis: Enable tests on PHP 8.0  | ||||
| - #207: Fix PHP 8.1 deprecations  | ||||
|  | ||||
| 2.7.4  (2020-10-01) | ||||
|  | ||||
| - #191: Fix travisci build  | ||||
| - #195: Add .gitattributes file with export-ignore rules  | ||||
| - #194: Fix query parameter parsed as character entity | ||||
|  | ||||
| 2.7.3 (2020-07-05) | ||||
|  | ||||
| - #190: mitigate cyclic reference between output rules and the traverser objects  | ||||
|  | ||||
| 2.7.2 (2020-07-01) | ||||
|  | ||||
| - #187: Fixed memory leak in HTML5::saveHTML()  | ||||
| - #186: Add special case for end tag </br> | ||||
|  | ||||
| 2.7.1 (2020-06-14) | ||||
|  | ||||
| - #171: add PHP 7.4 job  | ||||
| - #178: Prevent infinite loop on un-terminated entity declaration at EOF  | ||||
|  | ||||
| 2.7.0 (2019-07-25) | ||||
|  | ||||
| - #164: Drop HHVM support | ||||
| - #168: Set default encoding in the DOMDocument object | ||||
|  | ||||
| 2.6.0 (2019-03-10) | ||||
|  | ||||
| - #163: Allow to pass a charset to the Scanner | ||||
|  | ||||
| 2.5.0 (2018-12-27) | ||||
|  | ||||
| - #162, #161, #155, #154, #153, #151: big performance improvements | ||||
| - #156: fixed typos | ||||
| - #160: adopt and enforce code style | ||||
| - #159: remove deprecated php unit base test case | ||||
| - #150: backport changes from old master branch  | ||||
|  | ||||
| 2.4.0 (2018-11-17) | ||||
|  | ||||
| - #148: Improve performance by moving sequence matching  | ||||
| - #147: Improve the Tokenizer performance  | ||||
| - #146: Improve performance by relying on a native string instead of InputStream  | ||||
| - #144: Add DOM extension in composer.json | ||||
| - #145: Add more extensions on composer.json, improve phpdocs and remove dead code  | ||||
| - #143: Remove experimental comment  | ||||
|  | ||||
| 2.3.1 (2018-10-18) | ||||
|  | ||||
| - #121: Audio is not a block tag (fixed by #141) | ||||
| - #136: Handle illegal self-closing according to spec (fixed by #137) | ||||
| - #141: Minor fixes in the README | ||||
|  | ||||
| 2.3.0 (2017-09-04) | ||||
|  | ||||
| - #129: image within inline svg breaks system (fixed by #133)  | ||||
| - #131: ² does not work (fixed by #132) | ||||
| - #134: Improve tokenizer performance by 20% (alternative version of #130 thanks to @MichaelHeerklotz) | ||||
| - #135: Raw & in attributes | ||||
|  | ||||
| 2.2.2 (2016-09-22) | ||||
|  | ||||
| - #116: In XML mode, tags are case sensitive | ||||
| - #115: Fix PHP Notice in OutputRules | ||||
| - #112: fix parsing of options of an optgroup | ||||
| - #111: Adding test for the address tag | ||||
|  | ||||
| 2.2.1 (2016-05-10) | ||||
|  | ||||
| - #109: Fixed issue where address tag could be written without closing tag (thanks sylus) | ||||
|  | ||||
| 2.2.0 (2016-04-11) | ||||
|  | ||||
| - #105: Enable composer cache (for CI/CD) | ||||
| - #100: Use mb_substitute_character inset of ini_set for environments where ini_set is disable (e.g., shared hosting) | ||||
| - #98: Allow link, meta, style tags in noscript tags | ||||
| - #96: Fixed xml:href on svgs that use the "use" breaking | ||||
| - #94: Counting UTF8 characters performance improvement | ||||
| - #93: Use newer version of coveralls package | ||||
| - #90: Remove duplicate test | ||||
| - #87: Allow multiple root nodes | ||||
|  | ||||
| 2.1.2 (2015-06-07) | ||||
| - #82: Support for PHP7 | ||||
| - #84: Improved boolean attribute handling | ||||
|  | ||||
| 2.1.1 (2015-03-23) | ||||
| - #78: Fixes bug where unmatched entity like string drops everything after &. | ||||
|  | ||||
| 2.1.0 (2015-02-01) | ||||
| - #74: Added `disable_html_ns` and `target_doc` dom parsing options | ||||
| - Unified option names | ||||
| - #73: Fixed alphabet, ß now can be detected | ||||
| - #75 and #76: Allow whitespace in RCDATA tags | ||||
| - #77: Fixed parsing blunder for json embeds | ||||
| - #72: Add options to HTML methods | ||||
|  | ||||
| 2.0.2 (2014-12-17) | ||||
| - #50: empty document handling | ||||
| - #63: tags with strange capitalization | ||||
| - #65: dashes and underscores as allowed characters in tag names | ||||
| - #68: Fixed issue with non-inline elements inside inline containers | ||||
|  | ||||
| 2.0.1 (2014-09-23) | ||||
| - #59: Fixed issue parsing some fragments. | ||||
| - #56: Incorrectly saw 0 as empty string | ||||
| - Sami as new documentation generator | ||||
|  | ||||
| 2.0.0 (2014-07-28) | ||||
| - #53: Improved boolean attributes handling | ||||
| - #52: Facebook HHVM compatibility | ||||
| - #48: Adopted PSR-2 as coding standard | ||||
| - #47: Moved everything to Masterminds namespace | ||||
| - #45: Added custom namespaces | ||||
| - #44: Added support to XML-style namespaces | ||||
| - #37: Refactored HTML5 class removing static methods | ||||
|  | ||||
| 1.0.5 (2014-06-10) | ||||
| - #38: Set the dev-master branch as the 1.0.x branch for composer (goetas) | ||||
| - #34: Tests use PSR-4 for autoloading. (goetas) | ||||
| - #40, #41: Fix entity handling in RCDATA sections. (KitaitiMakoto) | ||||
| - #32: Fixed issue where wharacter references were being incorrectly encoded in style tags. | ||||
|  | ||||
| 1.0.4 (2014-04-29) | ||||
| - #30/#31 Don't throw an exception for invalid tag names. | ||||
|  | ||||
| 1.0.3 (2014-02-28) | ||||
| - #23 and #29: Ignore attributes with illegal chars in name for the PHP DOM. | ||||
|  | ||||
| 1.0.2 (2014-02-12) | ||||
| - #23: Handle missing tag close in attribute list. | ||||
| - #25: Fixed text escaping in the serializer (HTML% 8.3). | ||||
| - #27: Fixed tests on Windows: changed "\n" -> PHP_EOL. | ||||
| - #28: Fixed infinite loop for char "&" in unquoted attribute in parser. | ||||
| - #26: Updated tag name case handling to deal with uppercase usage. | ||||
| - #24: Newlines and tabs are allowed inside quoted attributes (HTML5 8.2.4). | ||||
| - Fixed Travis CI testing. | ||||
|  | ||||
| 1.0.1 (2013-11-07) | ||||
| - CDATA encoding is improved. (Non-standard; Issue #19) | ||||
| - Some parser rules were not returning the new current element. (Issue #20) | ||||
| - Added, to the README, details on code test coverage and to packagist version. | ||||
| - Fixed processor instructions. | ||||
| - Improved test coverage and documentation coverage. | ||||
|  | ||||
| 1.0.0 (2013-10-02) | ||||
| - Initial release. | ||||
							
								
								
									
										21
									
								
								vendor/masterminds/html5/UPGRADING.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/masterminds/html5/UPGRADING.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| From 1.x to 2.x | ||||
| ================= | ||||
|  | ||||
| - All classes uses `Masterminds` namespace. | ||||
| - All public static methods has been removed from `HTML5` class and the general API to access the HTML5 functionalities has changed.  | ||||
|  | ||||
|     Before: | ||||
|      | ||||
|         $dom = \HTML5::loadHTML('<html>....'); | ||||
|         \HTML5::saveHTML($dom); | ||||
|          | ||||
|     After: | ||||
|  | ||||
|         use Masterminds\HTML5; | ||||
|          | ||||
|         $html5 = new HTML5(); | ||||
|          | ||||
|         $dom = $html5->loadHTML('<html>....'); | ||||
|         echo $html5->saveHTML($dom); | ||||
|  | ||||
|  | ||||
							
								
								
									
										26
									
								
								vendor/masterminds/html5/bin/entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/masterminds/html5/bin/entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Fetch the entities.json file and convert to PHP datastructure. | ||||
|  */ | ||||
|  | ||||
| // The URL to the official entities JSON file. | ||||
| $ENTITIES_URL = 'http://www.w3.org/TR/2012/CR-html5-20121217/entities.json'; | ||||
|  | ||||
| $payload = file_get_contents($ENTITIES_URL); | ||||
| $json = json_decode($payload); | ||||
|  | ||||
| $table = array(); | ||||
| foreach ($json as $name => $obj) { | ||||
|     $sname = substr($name, 1, -1); | ||||
|     $table[$sname] = $obj->characters; | ||||
| } | ||||
|  | ||||
| echo '<?php | ||||
| namespace Masterminds\\HTML5; | ||||
| /** Entity lookup tables. This class is automatically generated. */ | ||||
| class Entities { | ||||
|   public static $byName = '; | ||||
| var_export($table); | ||||
| echo '; | ||||
| }' . PHP_EOL; | ||||
| //print serialize($table); | ||||
							
								
								
									
										42
									
								
								vendor/masterminds/html5/composer.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/masterminds/html5/composer.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| { | ||||
|     "name": "masterminds/html5", | ||||
|     "description": "An HTML5 parser and serializer.", | ||||
|     "type": "library", | ||||
|     "homepage": "http://masterminds.github.io/html5-php", | ||||
|     "license": "MIT", | ||||
|     "keywords": ["xml", "html", "html5", "dom", "parser", "serializer", "querypath"], | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Matt Butcher", | ||||
|             "email": "technosophos@gmail.com" | ||||
|         }, | ||||
|         { | ||||
|             "name": "Matt Farina", | ||||
|             "email": "matt@mattfarina.com" | ||||
|         }, | ||||
|         { | ||||
|             "name": "Asmir Mustafic", | ||||
|             "email": "goetas@gmail.com" | ||||
|         } | ||||
|     ], | ||||
|     "require" : { | ||||
|         "ext-ctype": "*", | ||||
|         "ext-dom": "*", | ||||
|         "ext-libxml" : "*", | ||||
|         "php" : ">=5.3.0" | ||||
|     }, | ||||
|     "require-dev": { | ||||
|         "phpunit/phpunit" : "^4.8.35 || ^5.7.21 || ^6 || ^7" | ||||
|     }, | ||||
|     "autoload": { | ||||
|         "psr-4": {"Masterminds\\": "src"} | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "psr-4": {"Masterminds\\HTML5\\Tests\\": "test/HTML5"} | ||||
|     }, | ||||
|     "extra": { | ||||
|         "branch-alias": { | ||||
|             "dev-master": "2.7-dev" | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										246
									
								
								vendor/masterminds/html5/src/HTML5.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								vendor/masterminds/html5/src/HTML5.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,246 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds; | ||||
|  | ||||
| use Masterminds\HTML5\Parser\DOMTreeBuilder; | ||||
| use Masterminds\HTML5\Parser\Scanner; | ||||
| use Masterminds\HTML5\Parser\Tokenizer; | ||||
| use Masterminds\HTML5\Serializer\OutputRules; | ||||
| use Masterminds\HTML5\Serializer\Traverser; | ||||
|  | ||||
| /** | ||||
|  * This class offers convenience methods for parsing and serializing HTML5. | ||||
|  * It is roughly designed to mirror the \DOMDocument native class. | ||||
|  */ | ||||
| class HTML5 | ||||
| { | ||||
|     /** | ||||
|      * Global options for the parser and serializer. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     private $defaultOptions = array( | ||||
|         // Whether the serializer should aggressively encode all characters as entities. | ||||
|         'encode_entities' => false, | ||||
|  | ||||
|         // Prevents the parser from automatically assigning the HTML5 namespace to the DOM document. | ||||
|         'disable_html_ns' => false, | ||||
|     ); | ||||
|  | ||||
|     protected $errors = array(); | ||||
|  | ||||
|     public function __construct(array $defaultOptions = array()) | ||||
|     { | ||||
|         $this->defaultOptions = array_merge($this->defaultOptions, $defaultOptions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the current default options. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getOptions() | ||||
|     { | ||||
|         return $this->defaultOptions; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Load and parse an HTML file. | ||||
|      * | ||||
|      * This will apply the HTML5 parser, which is tolerant of many | ||||
|      * varieties of HTML, including XHTML 1, HTML 4, and well-formed HTML | ||||
|      * 3. Note that in these cases, not all of the old data will be | ||||
|      * preserved. For example, XHTML's XML declaration will be removed. | ||||
|      * | ||||
|      * The rules governing parsing are set out in the HTML 5 spec. | ||||
|      * | ||||
|      * @param string|resource $file    The path to the file to parse. If this is a resource, it is | ||||
|      *                                 assumed to be an open stream whose pointer is set to the first | ||||
|      *                                 byte of input. | ||||
|      * @param array           $options Configuration options when parsing the HTML. | ||||
|      * | ||||
|      * @return \DOMDocument A DOM document. These object type is defined by the libxml | ||||
|      *                      library, and should have been included with your version of PHP. | ||||
|      */ | ||||
|     public function load($file, array $options = array()) | ||||
|     { | ||||
|         // Handle the case where file is a resource. | ||||
|         if (is_resource($file)) { | ||||
|             return $this->parse(stream_get_contents($file), $options); | ||||
|         } | ||||
|  | ||||
|         return $this->parse(file_get_contents($file), $options); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse a HTML Document from a string. | ||||
|      * | ||||
|      * Take a string of HTML 5 (or earlier) and parse it into a | ||||
|      * DOMDocument. | ||||
|      * | ||||
|      * @param string $string  A html5 document as a string. | ||||
|      * @param array  $options Configuration options when parsing the HTML. | ||||
|      * | ||||
|      * @return \DOMDocument A DOM document. DOM is part of libxml, which is included with | ||||
|      *                      almost all distribtions of PHP. | ||||
|      */ | ||||
|     public function loadHTML($string, array $options = array()) | ||||
|     { | ||||
|         return $this->parse($string, $options); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Convenience function to load an HTML file. | ||||
|      * | ||||
|      * This is here to provide backwards compatibility with the | ||||
|      * PHP DOM implementation. It simply calls load(). | ||||
|      * | ||||
|      * @param string $file    The path to the file to parse. If this is a resource, it is | ||||
|      *                        assumed to be an open stream whose pointer is set to the first | ||||
|      *                        byte of input. | ||||
|      * @param array  $options Configuration options when parsing the HTML. | ||||
|      * | ||||
|      * @return \DOMDocument A DOM document. These object type is defined by the libxml | ||||
|      *                      library, and should have been included with your version of PHP. | ||||
|      */ | ||||
|     public function loadHTMLFile($file, array $options = array()) | ||||
|     { | ||||
|         return $this->load($file, $options); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse a HTML fragment from a string. | ||||
|      * | ||||
|      * @param string $string  the HTML5 fragment as a string | ||||
|      * @param array  $options Configuration options when parsing the HTML | ||||
|      * | ||||
|      * @return \DOMDocumentFragment A DOM fragment. The DOM is part of libxml, which is included with | ||||
|      *                              almost all distributions of PHP. | ||||
|      */ | ||||
|     public function loadHTMLFragment($string, array $options = array()) | ||||
|     { | ||||
|         return $this->parseFragment($string, $options); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return all errors encountered into parsing phase. | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getErrors() | ||||
|     { | ||||
|         return $this->errors; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return true it some errors were encountered into parsing phase. | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function hasErrors() | ||||
|     { | ||||
|         return count($this->errors) > 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse an input string. | ||||
|      * | ||||
|      * @param string $input | ||||
|      * @param array  $options | ||||
|      * | ||||
|      * @return \DOMDocument | ||||
|      */ | ||||
|     public function parse($input, array $options = array()) | ||||
|     { | ||||
|         $this->errors = array(); | ||||
|         $options = array_merge($this->defaultOptions, $options); | ||||
|         $events = new DOMTreeBuilder(false, $options); | ||||
|         $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); | ||||
|         $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); | ||||
|  | ||||
|         $parser->parse(); | ||||
|         $this->errors = $events->getErrors(); | ||||
|  | ||||
|         return $events->document(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Parse an input stream where the stream is a fragment. | ||||
|      * | ||||
|      * Lower-level loading function. This requires an input stream instead | ||||
|      * of a string, file, or resource. | ||||
|      * | ||||
|      * @param string $input   The input data to parse in the form of a string. | ||||
|      * @param array  $options An array of options. | ||||
|      * | ||||
|      * @return \DOMDocumentFragment | ||||
|      */ | ||||
|     public function parseFragment($input, array $options = array()) | ||||
|     { | ||||
|         $options = array_merge($this->defaultOptions, $options); | ||||
|         $events = new DOMTreeBuilder(true, $options); | ||||
|         $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); | ||||
|         $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); | ||||
|  | ||||
|         $parser->parse(); | ||||
|         $this->errors = $events->getErrors(); | ||||
|  | ||||
|         return $events->fragment(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Save a DOM into a given file as HTML5. | ||||
|      * | ||||
|      * @param mixed           $dom     The DOM to be serialized. | ||||
|      * @param string|resource $file    The filename to be written or resource to write to. | ||||
|      * @param array           $options Configuration options when serializing the DOM. These include: | ||||
|      *                                 - encode_entities: Text written to the output is escaped by default and not all | ||||
|      *                                 entities are encoded. If this is set to true all entities will be encoded. | ||||
|      *                                 Defaults to false. | ||||
|      */ | ||||
|     public function save($dom, $file, $options = array()) | ||||
|     { | ||||
|         $close = true; | ||||
|         if (is_resource($file)) { | ||||
|             $stream = $file; | ||||
|             $close = false; | ||||
|         } else { | ||||
|             $stream = fopen($file, 'wb'); | ||||
|         } | ||||
|         $options = array_merge($this->defaultOptions, $options); | ||||
|         $rules = new OutputRules($stream, $options); | ||||
|         $trav = new Traverser($dom, $stream, $rules, $options); | ||||
|  | ||||
|         $trav->walk(); | ||||
|         /* | ||||
|          * release the traverser to avoid cyclic references and allow PHP to free memory without waiting for gc_collect_cycles | ||||
|          */ | ||||
|         $rules->unsetTraverser(); | ||||
|         if ($close) { | ||||
|             fclose($stream); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Convert a DOM into an HTML5 string. | ||||
|      * | ||||
|      * @param mixed $dom     The DOM to be serialized. | ||||
|      * @param array $options Configuration options when serializing the DOM. These include: | ||||
|      *                       - encode_entities: Text written to the output is escaped by default and not all | ||||
|      *                       entities are encoded. If this is set to true all entities will be encoded. | ||||
|      *                       Defaults to false. | ||||
|      * | ||||
|      * @return string A HTML5 documented generated from the DOM. | ||||
|      */ | ||||
|     public function saveHTML($dom, $options = array()) | ||||
|     { | ||||
|         $stream = fopen('php://temp', 'wb'); | ||||
|         $this->save($dom, $stream, array_merge($this->defaultOptions, $options)); | ||||
|  | ||||
|         $html = stream_get_contents($stream, -1, 0); | ||||
|  | ||||
|         fclose($stream); | ||||
|  | ||||
|         return $html; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										619
									
								
								vendor/masterminds/html5/src/HTML5/Elements.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										619
									
								
								vendor/masterminds/html5/src/HTML5/Elements.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,619 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Provide general element functions. | ||||
|  */ | ||||
|  | ||||
| namespace Masterminds\HTML5; | ||||
|  | ||||
| /** | ||||
|  * This class provides general information about HTML5 elements, | ||||
|  * including syntactic and semantic issues. | ||||
|  * Parsers and serializers can | ||||
|  * use this class as a reference point for information about the rules | ||||
|  * of various HTML5 elements. | ||||
|  * | ||||
|  * @todo consider using a bitmask table lookup. There is enough overlap in | ||||
|  *       naming that this could significantly shrink the size and maybe make it | ||||
|  *       faster. See the Go teams implementation at https://code.google.com/p/go/source/browse/html/atom. | ||||
|  */ | ||||
| class Elements | ||||
| { | ||||
|     /** | ||||
|      * Indicates an element is described in the specification. | ||||
|      */ | ||||
|     const KNOWN_ELEMENT = 1; | ||||
|  | ||||
|     // From section 8.1.2: "script", "style" | ||||
|     // From 8.2.5.4.7 ("in body" insertion mode): "noembed" | ||||
|     // From 8.4 "style", "xmp", "iframe", "noembed", "noframes" | ||||
|     /** | ||||
|      * Indicates the contained text should be processed as raw text. | ||||
|      */ | ||||
|     const TEXT_RAW = 2; | ||||
|  | ||||
|     // From section 8.1.2: "textarea", "title" | ||||
|     /** | ||||
|      * Indicates the contained text should be processed as RCDATA. | ||||
|      */ | ||||
|     const TEXT_RCDATA = 4; | ||||
|  | ||||
|     /** | ||||
|      * Indicates the tag cannot have content. | ||||
|      */ | ||||
|     const VOID_TAG = 8; | ||||
|  | ||||
|     // "address", "article", "aside", "blockquote", "center", "details", "dialog", "dir", "div", "dl", | ||||
|     // "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "menu", | ||||
|     // "nav", "ol", "p", "section", "summary", "ul" | ||||
|     // "h1", "h2", "h3", "h4", "h5", "h6" | ||||
|     // "pre", "listing" | ||||
|     // "form" | ||||
|     // "plaintext" | ||||
|     /** | ||||
|      * Indicates that if a previous event is for a P tag, that element | ||||
|      * should be considered closed. | ||||
|      */ | ||||
|     const AUTOCLOSE_P = 16; | ||||
|  | ||||
|     /** | ||||
|      * Indicates that the text inside is plaintext (pre). | ||||
|      */ | ||||
|     const TEXT_PLAINTEXT = 32; | ||||
|  | ||||
|     // See https://developer.mozilla.org/en-US/docs/HTML/Block-level_elements | ||||
|     /** | ||||
|      * Indicates that the tag is a block. | ||||
|      */ | ||||
|     const BLOCK_TAG = 64; | ||||
|  | ||||
|     /** | ||||
|      * Indicates that the tag allows only inline elements as child nodes. | ||||
|      */ | ||||
|     const BLOCK_ONLY_INLINE = 128; | ||||
|  | ||||
|     /** | ||||
|      * The HTML5 elements as defined in http://dev.w3.org/html5/markup/elements.html. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     public static $html5 = array( | ||||
|         'a' => 1, | ||||
|         'abbr' => 1, | ||||
|         'address' => 65, // NORMAL | BLOCK_TAG | ||||
|         'area' => 9, // NORMAL | VOID_TAG | ||||
|         'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'audio' => 1, // NORMAL | ||||
|         'b' => 1, | ||||
|         'base' => 9, // NORMAL | VOID_TAG | ||||
|         'bdi' => 1, | ||||
|         'bdo' => 1, | ||||
|         'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'body' => 1, | ||||
|         'br' => 9, // NORMAL | VOID_TAG | ||||
|         'button' => 1, | ||||
|         'canvas' => 65, // NORMAL | BLOCK_TAG | ||||
|         'caption' => 1, | ||||
|         'cite' => 1, | ||||
|         'code' => 1, | ||||
|         'col' => 9, // NORMAL | VOID_TAG | ||||
|         'colgroup' => 1, | ||||
|         'command' => 9, // NORMAL | VOID_TAG | ||||
|                         // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data | ||||
|         'datalist' => 1, | ||||
|         'dd' => 65, // NORMAL | BLOCK_TAG | ||||
|         'del' => 1, | ||||
|         'details' => 17, // NORMAL | AUTOCLOSE_P, | ||||
|         'dfn' => 1, | ||||
|         'dialog' => 17, // NORMAL | AUTOCLOSE_P, | ||||
|         'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'dt' => 1, | ||||
|         'em' => 1, | ||||
|         'embed' => 9, // NORMAL | VOID_TAG | ||||
|         'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'head' => 1, | ||||
|         'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'hr' => 73, // NORMAL | VOID_TAG | ||||
|         'html' => 1, | ||||
|         'i' => 1, | ||||
|         'iframe' => 3, // NORMAL | TEXT_RAW | ||||
|         'img' => 9, // NORMAL | VOID_TAG | ||||
|         'input' => 9, // NORMAL | VOID_TAG | ||||
|         'kbd' => 1, | ||||
|         'ins' => 1, | ||||
|         'keygen' => 9, // NORMAL | VOID_TAG | ||||
|         'label' => 1, | ||||
|         'legend' => 1, | ||||
|         'li' => 1, | ||||
|         'link' => 9, // NORMAL | VOID_TAG | ||||
|         'map' => 1, | ||||
|         'mark' => 1, | ||||
|         'menu' => 17, // NORMAL | AUTOCLOSE_P, | ||||
|         'meta' => 9, // NORMAL | VOID_TAG | ||||
|         'meter' => 1, | ||||
|         'nav' => 17, // NORMAL | AUTOCLOSE_P, | ||||
|         'noscript' => 65, // NORMAL | BLOCK_TAG | ||||
|         'object' => 1, | ||||
|         'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'optgroup' => 1, | ||||
|         'option' => 1, | ||||
|         'output' => 65, // NORMAL | BLOCK_TAG | ||||
|         'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE | ||||
|         'param' => 9, // NORMAL | VOID_TAG | ||||
|         'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'progress' => 1, | ||||
|         'q' => 1, | ||||
|         'rp' => 1, | ||||
|         'rt' => 1, | ||||
|         'ruby' => 1, | ||||
|         's' => 1, | ||||
|         'samp' => 1, | ||||
|         'script' => 3, // NORMAL | TEXT_RAW | ||||
|         'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'select' => 1, | ||||
|         'small' => 1, | ||||
|         'source' => 9, // NORMAL | VOID_TAG | ||||
|         'span' => 1, | ||||
|         'strong' => 1, | ||||
|         'style' => 3, // NORMAL | TEXT_RAW | ||||
|         'sub' => 1, | ||||
|         'summary' => 17, // NORMAL | AUTOCLOSE_P, | ||||
|         'sup' => 1, | ||||
|         'table' => 65, // NORMAL | BLOCK_TAG | ||||
|         'tbody' => 1, | ||||
|         'td' => 1, | ||||
|         'textarea' => 5, // NORMAL | TEXT_RCDATA | ||||
|         'tfoot' => 65, // NORMAL | BLOCK_TAG | ||||
|         'th' => 1, | ||||
|         'thead' => 1, | ||||
|         'time' => 1, | ||||
|         'title' => 5, // NORMAL | TEXT_RCDATA | ||||
|         'tr' => 1, | ||||
|         'track' => 9, // NORMAL | VOID_TAG | ||||
|         'u' => 1, | ||||
|         'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | ||||
|         'var' => 1, | ||||
|         'video' => 65, // NORMAL | BLOCK_TAG | ||||
|         'wbr' => 9, // NORMAL | VOID_TAG | ||||
|  | ||||
|         // Legacy? | ||||
|         'basefont' => 8, // VOID_TAG | ||||
|         'bgsound' => 8, // VOID_TAG | ||||
|         'noframes' => 2, // RAW_TEXT | ||||
|         'frame' => 9, // NORMAL | VOID_TAG | ||||
|         'frameset' => 1, | ||||
|         'center' => 16, | ||||
|         'dir' => 16, | ||||
|         'listing' => 16, // AUTOCLOSE_P | ||||
|         'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT | ||||
|         'applet' => 0, | ||||
|         'marquee' => 0, | ||||
|         'isindex' => 8, // VOID_TAG | ||||
|         'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT | ||||
|         'noembed' => 2, // RAW_TEXT | ||||
|         ); | ||||
|  | ||||
|     /** | ||||
|      * The MathML elements. | ||||
|      * See http://www.w3.org/wiki/MathML/Elements. | ||||
|      * | ||||
|      * In our case we are only concerned with presentation MathML and not content | ||||
|      * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     public static $mathml = array( | ||||
|         'maction' => 1, | ||||
|         'maligngroup' => 1, | ||||
|         'malignmark' => 1, | ||||
|         'math' => 1, | ||||
|         'menclose' => 1, | ||||
|         'merror' => 1, | ||||
|         'mfenced' => 1, | ||||
|         'mfrac' => 1, | ||||
|         'mglyph' => 1, | ||||
|         'mi' => 1, | ||||
|         'mlabeledtr' => 1, | ||||
|         'mlongdiv' => 1, | ||||
|         'mmultiscripts' => 1, | ||||
|         'mn' => 1, | ||||
|         'mo' => 1, | ||||
|         'mover' => 1, | ||||
|         'mpadded' => 1, | ||||
|         'mphantom' => 1, | ||||
|         'mroot' => 1, | ||||
|         'mrow' => 1, | ||||
|         'ms' => 1, | ||||
|         'mscarries' => 1, | ||||
|         'mscarry' => 1, | ||||
|         'msgroup' => 1, | ||||
|         'msline' => 1, | ||||
|         'mspace' => 1, | ||||
|         'msqrt' => 1, | ||||
|         'msrow' => 1, | ||||
|         'mstack' => 1, | ||||
|         'mstyle' => 1, | ||||
|         'msub' => 1, | ||||
|         'msup' => 1, | ||||
|         'msubsup' => 1, | ||||
|         'mtable' => 1, | ||||
|         'mtd' => 1, | ||||
|         'mtext' => 1, | ||||
|         'mtr' => 1, | ||||
|         'munder' => 1, | ||||
|         'munderover' => 1, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * The svg elements. | ||||
|      * | ||||
|      * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element. | ||||
|      * The w3c list appears to be lacking in some areas like filter effect elements. | ||||
|      * That list can be found at http://www.w3.org/wiki/SVG/Elements. | ||||
|      * | ||||
|      * Note, FireFox appears to do a better job rendering filter effects than chrome. | ||||
|      * While they are in the spec I'm not sure how widely implemented they are. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     public static $svg = array( | ||||
|         'a' => 1, | ||||
|         'altGlyph' => 1, | ||||
|         'altGlyphDef' => 1, | ||||
|         'altGlyphItem' => 1, | ||||
|         'animate' => 1, | ||||
|         'animateColor' => 1, | ||||
|         'animateMotion' => 1, | ||||
|         'animateTransform' => 1, | ||||
|         'circle' => 1, | ||||
|         'clipPath' => 1, | ||||
|         'color-profile' => 1, | ||||
|         'cursor' => 1, | ||||
|         'defs' => 1, | ||||
|         'desc' => 1, | ||||
|         'ellipse' => 1, | ||||
|         'feBlend' => 1, | ||||
|         'feColorMatrix' => 1, | ||||
|         'feComponentTransfer' => 1, | ||||
|         'feComposite' => 1, | ||||
|         'feConvolveMatrix' => 1, | ||||
|         'feDiffuseLighting' => 1, | ||||
|         'feDisplacementMap' => 1, | ||||
|         'feDistantLight' => 1, | ||||
|         'feFlood' => 1, | ||||
|         'feFuncA' => 1, | ||||
|         'feFuncB' => 1, | ||||
|         'feFuncG' => 1, | ||||
|         'feFuncR' => 1, | ||||
|         'feGaussianBlur' => 1, | ||||
|         'feImage' => 1, | ||||
|         'feMerge' => 1, | ||||
|         'feMergeNode' => 1, | ||||
|         'feMorphology' => 1, | ||||
|         'feOffset' => 1, | ||||
|         'fePointLight' => 1, | ||||
|         'feSpecularLighting' => 1, | ||||
|         'feSpotLight' => 1, | ||||
|         'feTile' => 1, | ||||
|         'feTurbulence' => 1, | ||||
|         'filter' => 1, | ||||
|         'font' => 1, | ||||
|         'font-face' => 1, | ||||
|         'font-face-format' => 1, | ||||
|         'font-face-name' => 1, | ||||
|         'font-face-src' => 1, | ||||
|         'font-face-uri' => 1, | ||||
|         'foreignObject' => 1, | ||||
|         'g' => 1, | ||||
|         'glyph' => 1, | ||||
|         'glyphRef' => 1, | ||||
|         'hkern' => 1, | ||||
|         'image' => 1, | ||||
|         'line' => 1, | ||||
|         'linearGradient' => 1, | ||||
|         'marker' => 1, | ||||
|         'mask' => 1, | ||||
|         'metadata' => 1, | ||||
|         'missing-glyph' => 1, | ||||
|         'mpath' => 1, | ||||
|         'path' => 1, | ||||
|         'pattern' => 1, | ||||
|         'polygon' => 1, | ||||
|         'polyline' => 1, | ||||
|         'radialGradient' => 1, | ||||
|         'rect' => 1, | ||||
|         'script' => 3, // NORMAL | RAW_TEXT | ||||
|         'set' => 1, | ||||
|         'stop' => 1, | ||||
|         'style' => 3, // NORMAL | RAW_TEXT | ||||
|         'svg' => 1, | ||||
|         'switch' => 1, | ||||
|         'symbol' => 1, | ||||
|         'text' => 1, | ||||
|         'textPath' => 1, | ||||
|         'title' => 1, | ||||
|         'tref' => 1, | ||||
|         'tspan' => 1, | ||||
|         'use' => 1, | ||||
|         'view' => 1, | ||||
|         'vkern' => 1, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Some attributes in SVG are case sensitive. | ||||
|      * | ||||
|      * This map contains key/value pairs with the key as the lowercase attribute | ||||
|      * name and the value with the correct casing. | ||||
|      */ | ||||
|     public static $svgCaseSensitiveAttributeMap = array( | ||||
|         'attributename' => 'attributeName', | ||||
|         'attributetype' => 'attributeType', | ||||
|         'basefrequency' => 'baseFrequency', | ||||
|         'baseprofile' => 'baseProfile', | ||||
|         'calcmode' => 'calcMode', | ||||
|         'clippathunits' => 'clipPathUnits', | ||||
|         'contentscripttype' => 'contentScriptType', | ||||
|         'contentstyletype' => 'contentStyleType', | ||||
|         'diffuseconstant' => 'diffuseConstant', | ||||
|         'edgemode' => 'edgeMode', | ||||
|         'externalresourcesrequired' => 'externalResourcesRequired', | ||||
|         'filterres' => 'filterRes', | ||||
|         'filterunits' => 'filterUnits', | ||||
|         'glyphref' => 'glyphRef', | ||||
|         'gradienttransform' => 'gradientTransform', | ||||
|         'gradientunits' => 'gradientUnits', | ||||
|         'kernelmatrix' => 'kernelMatrix', | ||||
|         'kernelunitlength' => 'kernelUnitLength', | ||||
|         'keypoints' => 'keyPoints', | ||||
|         'keysplines' => 'keySplines', | ||||
|         'keytimes' => 'keyTimes', | ||||
|         'lengthadjust' => 'lengthAdjust', | ||||
|         'limitingconeangle' => 'limitingConeAngle', | ||||
|         'markerheight' => 'markerHeight', | ||||
|         'markerunits' => 'markerUnits', | ||||
|         'markerwidth' => 'markerWidth', | ||||
|         'maskcontentunits' => 'maskContentUnits', | ||||
|         'maskunits' => 'maskUnits', | ||||
|         'numoctaves' => 'numOctaves', | ||||
|         'pathlength' => 'pathLength', | ||||
|         'patterncontentunits' => 'patternContentUnits', | ||||
|         'patterntransform' => 'patternTransform', | ||||
|         'patternunits' => 'patternUnits', | ||||
|         'pointsatx' => 'pointsAtX', | ||||
|         'pointsaty' => 'pointsAtY', | ||||
|         'pointsatz' => 'pointsAtZ', | ||||
|         'preservealpha' => 'preserveAlpha', | ||||
|         'preserveaspectratio' => 'preserveAspectRatio', | ||||
|         'primitiveunits' => 'primitiveUnits', | ||||
|         'refx' => 'refX', | ||||
|         'refy' => 'refY', | ||||
|         'repeatcount' => 'repeatCount', | ||||
|         'repeatdur' => 'repeatDur', | ||||
|         'requiredextensions' => 'requiredExtensions', | ||||
|         'requiredfeatures' => 'requiredFeatures', | ||||
|         'specularconstant' => 'specularConstant', | ||||
|         'specularexponent' => 'specularExponent', | ||||
|         'spreadmethod' => 'spreadMethod', | ||||
|         'startoffset' => 'startOffset', | ||||
|         'stddeviation' => 'stdDeviation', | ||||
|         'stitchtiles' => 'stitchTiles', | ||||
|         'surfacescale' => 'surfaceScale', | ||||
|         'systemlanguage' => 'systemLanguage', | ||||
|         'tablevalues' => 'tableValues', | ||||
|         'targetx' => 'targetX', | ||||
|         'targety' => 'targetY', | ||||
|         'textlength' => 'textLength', | ||||
|         'viewbox' => 'viewBox', | ||||
|         'viewtarget' => 'viewTarget', | ||||
|         'xchannelselector' => 'xChannelSelector', | ||||
|         'ychannelselector' => 'yChannelSelector', | ||||
|         'zoomandpan' => 'zoomAndPan', | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Some SVG elements are case sensitive. | ||||
|      * This map contains these. | ||||
|      * | ||||
|      * The map contains key/value store of the name is lowercase as the keys and | ||||
|      * the correct casing as the value. | ||||
|      */ | ||||
|     public static $svgCaseSensitiveElementMap = array( | ||||
|         'altglyph' => 'altGlyph', | ||||
|         'altglyphdef' => 'altGlyphDef', | ||||
|         'altglyphitem' => 'altGlyphItem', | ||||
|         'animatecolor' => 'animateColor', | ||||
|         'animatemotion' => 'animateMotion', | ||||
|         'animatetransform' => 'animateTransform', | ||||
|         'clippath' => 'clipPath', | ||||
|         'feblend' => 'feBlend', | ||||
|         'fecolormatrix' => 'feColorMatrix', | ||||
|         'fecomponenttransfer' => 'feComponentTransfer', | ||||
|         'fecomposite' => 'feComposite', | ||||
|         'feconvolvematrix' => 'feConvolveMatrix', | ||||
|         'fediffuselighting' => 'feDiffuseLighting', | ||||
|         'fedisplacementmap' => 'feDisplacementMap', | ||||
|         'fedistantlight' => 'feDistantLight', | ||||
|         'feflood' => 'feFlood', | ||||
|         'fefunca' => 'feFuncA', | ||||
|         'fefuncb' => 'feFuncB', | ||||
|         'fefuncg' => 'feFuncG', | ||||
|         'fefuncr' => 'feFuncR', | ||||
|         'fegaussianblur' => 'feGaussianBlur', | ||||
|         'feimage' => 'feImage', | ||||
|         'femerge' => 'feMerge', | ||||
|         'femergenode' => 'feMergeNode', | ||||
|         'femorphology' => 'feMorphology', | ||||
|         'feoffset' => 'feOffset', | ||||
|         'fepointlight' => 'fePointLight', | ||||
|         'fespecularlighting' => 'feSpecularLighting', | ||||
|         'fespotlight' => 'feSpotLight', | ||||
|         'fetile' => 'feTile', | ||||
|         'feturbulence' => 'feTurbulence', | ||||
|         'foreignobject' => 'foreignObject', | ||||
|         'glyphref' => 'glyphRef', | ||||
|         'lineargradient' => 'linearGradient', | ||||
|         'radialgradient' => 'radialGradient', | ||||
|         'textpath' => 'textPath', | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Check whether the given element meets the given criterion. | ||||
|      * | ||||
|      * Example: | ||||
|      * | ||||
|      * Elements::isA('script', Elements::TEXT_RAW); // Returns true. | ||||
|      * | ||||
|      * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false. | ||||
|      * | ||||
|      * @param string $name The element name. | ||||
|      * @param int    $mask One of the constants on this class. | ||||
|      * | ||||
|      * @return bool true if the element matches the mask, false otherwise. | ||||
|      */ | ||||
|     public static function isA($name, $mask) | ||||
|     { | ||||
|         return (static::element($name) & $mask) === $mask; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test if an element is a valid html5 element. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return bool true if a html5 element and false otherwise. | ||||
|      */ | ||||
|     public static function isHtml5Element($name) | ||||
|     { | ||||
|         // html5 element names are case insensitive. Forcing lowercase for the check. | ||||
|         // Do we need this check or will all data passed here already be lowercase? | ||||
|         return isset(static::$html5[strtolower($name)]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test if an element name is a valid MathML presentation element. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return bool true if a MathML name and false otherwise. | ||||
|      */ | ||||
|     public static function isMathMLElement($name) | ||||
|     { | ||||
|         // MathML is case-sensitive unlike html5 elements. | ||||
|         return isset(static::$mathml[$name]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Test if an element is a valid SVG element. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return bool true if a SVG element and false otherise. | ||||
|      */ | ||||
|     public static function isSvgElement($name) | ||||
|     { | ||||
|         // SVG is case-sensitive unlike html5 elements. | ||||
|         return isset(static::$svg[$name]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is an element name valid in an html5 document. | ||||
|      * This includes html5 elements along with other allowed embedded content | ||||
|      * such as svg and mathml. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return bool true if valid and false otherwise. | ||||
|      */ | ||||
|     public static function isElement($name) | ||||
|     { | ||||
|         return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the element mask for the given element name. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return int the element mask. | ||||
|      */ | ||||
|     public static function element($name) | ||||
|     { | ||||
|         if (isset(static::$html5[$name])) { | ||||
|             return static::$html5[$name]; | ||||
|         } | ||||
|         if (isset(static::$svg[$name])) { | ||||
|             return static::$svg[$name]; | ||||
|         } | ||||
|         if (isset(static::$mathml[$name])) { | ||||
|             return static::$mathml[$name]; | ||||
|         } | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Normalize a SVG element name to its proper case and form. | ||||
|      * | ||||
|      * @param string $name The name of the element. | ||||
|      * | ||||
|      * @return string the normalized form of the element name. | ||||
|      */ | ||||
|     public static function normalizeSvgElement($name) | ||||
|     { | ||||
|         $name = strtolower($name); | ||||
|         if (isset(static::$svgCaseSensitiveElementMap[$name])) { | ||||
|             $name = static::$svgCaseSensitiveElementMap[$name]; | ||||
|         } | ||||
|  | ||||
|         return $name; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Normalize a SVG attribute name to its proper case and form. | ||||
|      * | ||||
|      * @param string $name The name of the attribute. | ||||
|      * | ||||
|      * @return string The normalized form of the attribute name. | ||||
|      */ | ||||
|     public static function normalizeSvgAttribute($name) | ||||
|     { | ||||
|         $name = strtolower($name); | ||||
|         if (isset(static::$svgCaseSensitiveAttributeMap[$name])) { | ||||
|             $name = static::$svgCaseSensitiveAttributeMap[$name]; | ||||
|         } | ||||
|  | ||||
|         return $name; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Normalize a MathML attribute name to its proper case and form. | ||||
|      * Note, all MathML element names are lowercase. | ||||
|      * | ||||
|      * @param string $name The name of the attribute. | ||||
|      * | ||||
|      * @return string The normalized form of the attribute name. | ||||
|      */ | ||||
|     public static function normalizeMathMlAttribute($name) | ||||
|     { | ||||
|         $name = strtolower($name); | ||||
|  | ||||
|         // Only one attribute has a mixed case form for MathML. | ||||
|         if ('definitionurl' === $name) { | ||||
|             $name = 'definitionURL'; | ||||
|         } | ||||
|  | ||||
|         return $name; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										2236
									
								
								vendor/masterminds/html5/src/HTML5/Entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2236
									
								
								vendor/masterminds/html5/src/HTML5/Entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								vendor/masterminds/html5/src/HTML5/Exception.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/masterminds/html5/src/HTML5/Exception.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5; | ||||
|  | ||||
| /** | ||||
|  * The base exception for the HTML5 project. | ||||
|  */ | ||||
| class Exception extends \Exception | ||||
| { | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/masterminds/html5/src/HTML5/InstructionProcessor.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/masterminds/html5/src/HTML5/InstructionProcessor.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
| /** | ||||
|  * A handler for processor instructions. | ||||
|  */ | ||||
|  | ||||
| namespace Masterminds\HTML5; | ||||
|  | ||||
| /** | ||||
|  * Provide an processor to handle embedded instructions. | ||||
|  * | ||||
|  * XML defines a mechanism for inserting instructions (like PHP) into a | ||||
|  * document. These are called "Processor Instructions." The HTML5 parser | ||||
|  * provides an opportunity to handle these processor instructions during | ||||
|  * the tree-building phase (before the DOM is constructed), which makes | ||||
|  * it possible to alter the document as it is being created. | ||||
|  * | ||||
|  * One could, for example, use this mechanism to execute well-formed PHP | ||||
|  * code embedded inside of an HTML5 document. | ||||
|  */ | ||||
| interface InstructionProcessor | ||||
| { | ||||
|     /** | ||||
|      * Process an individual processing instruction. | ||||
|      * | ||||
|      * The process() function is responsible for doing the following: | ||||
|      * - Determining whether $name is an instruction type it can handle. | ||||
|      * - Determining what to do with the data passed in. | ||||
|      * - Making any subsequent modifications to the DOM by modifying the | ||||
|      * DOMElement or its attached DOM tree. | ||||
|      * | ||||
|      * @param \DOMElement $element The parent element for the current processing instruction. | ||||
|      * @param string      $name    The instruction's name. E.g. `<?php` has the name `php`. | ||||
|      * @param string      $data    All of the data between the opening and closing PI marks. | ||||
|      * | ||||
|      * @return \DOMElement The element that should be considered "Current". This may just be | ||||
|      *                     the element passed in, but if the processor added more elements, | ||||
|      *                     it may choose to reset the current element to one of the elements | ||||
|      *                     it created. (When in doubt, return the element passed in.) | ||||
|      */ | ||||
|     public function process(\DOMElement $element, $name, $data); | ||||
| } | ||||
							
								
								
									
										61
									
								
								vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| use Masterminds\HTML5\Entities; | ||||
|  | ||||
| /** | ||||
|  * Manage entity references. | ||||
|  * | ||||
|  * This is a simple resolver for HTML5 character reference entitites. See Entities for the list of supported entities. | ||||
|  */ | ||||
| class CharacterReference | ||||
| { | ||||
|     protected static $numeric_mask = array( | ||||
|         0x0, | ||||
|         0x2FFFF, | ||||
|         0, | ||||
|         0xFFFF, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Given a name (e.g. 'amp'), lookup the UTF-8 character ('&'). | ||||
|      * | ||||
|      * @param string $name The name to look up. | ||||
|      * | ||||
|      * @return string The character sequence. In UTF-8 this may be more than one byte. | ||||
|      */ | ||||
|     public static function lookupName($name) | ||||
|     { | ||||
|         // Do we really want to return NULL here? or FFFD | ||||
|         return isset(Entities::$byName[$name]) ? Entities::$byName[$name] : null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Given a decimal number, return the UTF-8 character. | ||||
|      * | ||||
|      * @param $int | ||||
|      * | ||||
|      * @return false|string|string[]|null | ||||
|      */ | ||||
|     public static function lookupDecimal($int) | ||||
|     { | ||||
|         $entity = '&#' . $int . ';'; | ||||
|  | ||||
|         // UNTESTED: This may fail on some planes. Couldn't find full documentation | ||||
|         // on the value of the mask array. | ||||
|         return mb_decode_numericentity($entity, static::$numeric_mask, 'utf-8'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Given a hexidecimal number, return the UTF-8 character. | ||||
|      * | ||||
|      * @param $hexdec | ||||
|      * | ||||
|      * @return false|string|string[]|null | ||||
|      */ | ||||
|     public static function lookupHex($hexdec) | ||||
|     { | ||||
|         return static::lookupDecimal(hexdec($hexdec)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										705
									
								
								vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										705
									
								
								vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,705 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| use Masterminds\HTML5\Elements; | ||||
| use Masterminds\HTML5\InstructionProcessor; | ||||
|  | ||||
| /** | ||||
|  * Create an HTML5 DOM tree from events. | ||||
|  * | ||||
|  * This attempts to create a DOM from events emitted by a parser. This | ||||
|  * attempts (but does not guarantee) to up-convert older HTML documents | ||||
|  * to HTML5. It does this by applying HTML5's rules, but it will not | ||||
|  * change the architecture of the document itself. | ||||
|  * | ||||
|  * Many of the error correction and quirks features suggested in the specification | ||||
|  * are implemented herein; however, not all of them are. Since we do not | ||||
|  * assume a graphical user agent, no presentation-specific logic is conducted | ||||
|  * during tree building. | ||||
|  * | ||||
|  * FIXME: The present tree builder does not exactly follow the state machine rules | ||||
|  * for insert modes as outlined in the HTML5 spec. The processor needs to be | ||||
|  * re-written to accomodate this. See, for example, the Go language HTML5 | ||||
|  * parser. | ||||
|  */ | ||||
| class DOMTreeBuilder implements EventHandler | ||||
| { | ||||
|     /** | ||||
|      * Defined in http://www.w3.org/TR/html51/infrastructure.html#html-namespace-0. | ||||
|      */ | ||||
|     const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml'; | ||||
|  | ||||
|     const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML'; | ||||
|  | ||||
|     const NAMESPACE_SVG = 'http://www.w3.org/2000/svg'; | ||||
|  | ||||
|     const NAMESPACE_XLINK = 'http://www.w3.org/1999/xlink'; | ||||
|  | ||||
|     const NAMESPACE_XML = 'http://www.w3.org/XML/1998/namespace'; | ||||
|  | ||||
|     const NAMESPACE_XMLNS = 'http://www.w3.org/2000/xmlns/'; | ||||
|  | ||||
|     const OPT_DISABLE_HTML_NS = 'disable_html_ns'; | ||||
|  | ||||
|     const OPT_TARGET_DOC = 'target_document'; | ||||
|  | ||||
|     const OPT_IMPLICIT_NS = 'implicit_namespaces'; | ||||
|  | ||||
|     /** | ||||
|      * Holds the HTML5 element names that causes a namespace switch. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $nsRoots = array( | ||||
|         'html' => self::NAMESPACE_HTML, | ||||
|         'svg' => self::NAMESPACE_SVG, | ||||
|         'math' => self::NAMESPACE_MATHML, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Holds the always available namespaces (which does not require the XMLNS declaration). | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $implicitNamespaces = array( | ||||
|         'xml' => self::NAMESPACE_XML, | ||||
|         'xmlns' => self::NAMESPACE_XMLNS, | ||||
|         'xlink' => self::NAMESPACE_XLINK, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Holds a stack of currently active namespaces. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $nsStack = array(); | ||||
|  | ||||
|     /** | ||||
|      * Holds the number of namespaces declared by a node. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $pushes = array(); | ||||
|  | ||||
|     /** | ||||
|      * Defined in 8.2.5. | ||||
|      */ | ||||
|     const IM_INITIAL = 0; | ||||
|  | ||||
|     const IM_BEFORE_HTML = 1; | ||||
|  | ||||
|     const IM_BEFORE_HEAD = 2; | ||||
|  | ||||
|     const IM_IN_HEAD = 3; | ||||
|  | ||||
|     const IM_IN_HEAD_NOSCRIPT = 4; | ||||
|  | ||||
|     const IM_AFTER_HEAD = 5; | ||||
|  | ||||
|     const IM_IN_BODY = 6; | ||||
|  | ||||
|     const IM_TEXT = 7; | ||||
|  | ||||
|     const IM_IN_TABLE = 8; | ||||
|  | ||||
|     const IM_IN_TABLE_TEXT = 9; | ||||
|  | ||||
|     const IM_IN_CAPTION = 10; | ||||
|  | ||||
|     const IM_IN_COLUMN_GROUP = 11; | ||||
|  | ||||
|     const IM_IN_TABLE_BODY = 12; | ||||
|  | ||||
|     const IM_IN_ROW = 13; | ||||
|  | ||||
|     const IM_IN_CELL = 14; | ||||
|  | ||||
|     const IM_IN_SELECT = 15; | ||||
|  | ||||
|     const IM_IN_SELECT_IN_TABLE = 16; | ||||
|  | ||||
|     const IM_AFTER_BODY = 17; | ||||
|  | ||||
|     const IM_IN_FRAMESET = 18; | ||||
|  | ||||
|     const IM_AFTER_FRAMESET = 19; | ||||
|  | ||||
|     const IM_AFTER_AFTER_BODY = 20; | ||||
|  | ||||
|     const IM_AFTER_AFTER_FRAMESET = 21; | ||||
|  | ||||
|     const IM_IN_SVG = 22; | ||||
|  | ||||
|     const IM_IN_MATHML = 23; | ||||
|  | ||||
|     protected $options = array(); | ||||
|  | ||||
|     protected $stack = array(); | ||||
|  | ||||
|     protected $current; // Pointer in the tag hierarchy. | ||||
|     protected $rules; | ||||
|     protected $doc; | ||||
|  | ||||
|     protected $frag; | ||||
|  | ||||
|     protected $processor; | ||||
|  | ||||
|     protected $insertMode = 0; | ||||
|  | ||||
|     /** | ||||
|      * Track if we are in an element that allows only inline child nodes. | ||||
|      * | ||||
|      * @var string|null | ||||
|      */ | ||||
|     protected $onlyInline; | ||||
|  | ||||
|     /** | ||||
|      * Quirks mode is enabled by default. | ||||
|      * Any document that is missing the DT will be considered to be in quirks mode. | ||||
|      */ | ||||
|     protected $quirks = true; | ||||
|  | ||||
|     protected $errors = array(); | ||||
|  | ||||
|     public function __construct($isFragment = false, array $options = array()) | ||||
|     { | ||||
|         $this->options = $options; | ||||
|  | ||||
|         if (isset($options[self::OPT_TARGET_DOC])) { | ||||
|             $this->doc = $options[self::OPT_TARGET_DOC]; | ||||
|         } else { | ||||
|             $impl = new \DOMImplementation(); | ||||
|             // XXX: | ||||
|             // Create the doctype. For now, we are always creating HTML5 | ||||
|             // documents, and attempting to up-convert any older DTDs to HTML5. | ||||
|             $dt = $impl->createDocumentType('html'); | ||||
|             // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt); | ||||
|             $this->doc = $impl->createDocument(null, '', $dt); | ||||
|             $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'; | ||||
|         } | ||||
|  | ||||
|         $this->errors = array(); | ||||
|  | ||||
|         $this->current = $this->doc; // ->documentElement; | ||||
|  | ||||
|         // Create a rules engine for tags. | ||||
|         $this->rules = new TreeBuildingRules(); | ||||
|  | ||||
|         $implicitNS = array(); | ||||
|         if (isset($this->options[self::OPT_IMPLICIT_NS])) { | ||||
|             $implicitNS = $this->options[self::OPT_IMPLICIT_NS]; | ||||
|         } elseif (isset($this->options['implicitNamespaces'])) { | ||||
|             $implicitNS = $this->options['implicitNamespaces']; | ||||
|         } | ||||
|  | ||||
|         // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options | ||||
|         array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces); | ||||
|  | ||||
|         if ($isFragment) { | ||||
|             $this->insertMode = static::IM_IN_BODY; | ||||
|             $this->frag = $this->doc->createDocumentFragment(); | ||||
|             $this->current = $this->frag; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the document. | ||||
|      */ | ||||
|     public function document() | ||||
|     { | ||||
|         return $this->doc; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the DOM fragment for the body. | ||||
|      * | ||||
|      * This returns a DOMNodeList because a fragment may have zero or more | ||||
|      * DOMNodes at its root. | ||||
|      * | ||||
|      * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context | ||||
|      * | ||||
|      * @return \DOMDocumentFragment | ||||
|      */ | ||||
|     public function fragment() | ||||
|     { | ||||
|         return $this->frag; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Provide an instruction processor. | ||||
|      * | ||||
|      * This is used for handling Processor Instructions as they are | ||||
|      * inserted. If omitted, PI's are inserted directly into the DOM tree. | ||||
|      * | ||||
|      * @param InstructionProcessor $proc | ||||
|      */ | ||||
|     public function setInstructionProcessor(InstructionProcessor $proc) | ||||
|     { | ||||
|         $this->processor = $proc; | ||||
|     } | ||||
|  | ||||
|     public function doctype($name, $idType = 0, $id = null, $quirks = false) | ||||
|     { | ||||
|         // This is used solely for setting quirks mode. Currently we don't | ||||
|         // try to preserve the inbound DT. We convert it to HTML5. | ||||
|         $this->quirks = $quirks; | ||||
|  | ||||
|         if ($this->insertMode > static::IM_INITIAL) { | ||||
|             $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $this->insertMode = static::IM_BEFORE_HTML; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Process the start tag. | ||||
|      * | ||||
|      * @todo - XMLNS namespace handling (we need to parse, even if it's not valid) | ||||
|      *       - XLink, MathML and SVG namespace handling | ||||
|      *       - Omission rules: 8.1.2.4 Optional tags | ||||
|      * | ||||
|      * @param string $name | ||||
|      * @param array  $attributes | ||||
|      * @param bool   $selfClosing | ||||
|      * | ||||
|      * @return int | ||||
|      */ | ||||
|     public function startTag($name, $attributes = array(), $selfClosing = false) | ||||
|     { | ||||
|         $lname = $this->normalizeTagName($name); | ||||
|  | ||||
|         // Make sure we have an html element. | ||||
|         if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) { | ||||
|             $this->startTag('html'); | ||||
|         } | ||||
|  | ||||
|         // Set quirks mode if we're at IM_INITIAL with no doctype. | ||||
|         if ($this->insertMode === static::IM_INITIAL) { | ||||
|             $this->quirks = true; | ||||
|             $this->parseError('No DOCTYPE specified.'); | ||||
|         } | ||||
|  | ||||
|         // SPECIAL TAG HANDLING: | ||||
|         // Spec says do this, and "don't ask." | ||||
|         // find the spec where this is defined... looks problematic | ||||
|         if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) { | ||||
|             $name = 'img'; | ||||
|         } | ||||
|  | ||||
|         // Autoclose p tags where appropriate. | ||||
|         if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) { | ||||
|             $this->autoclose('p'); | ||||
|         } | ||||
|  | ||||
|         // Set insert mode: | ||||
|         switch ($name) { | ||||
|             case 'html': | ||||
|                 $this->insertMode = static::IM_BEFORE_HEAD; | ||||
|                 break; | ||||
|             case 'head': | ||||
|                 if ($this->insertMode > static::IM_BEFORE_HEAD) { | ||||
|                     $this->parseError('Unexpected head tag outside of head context.'); | ||||
|                 } else { | ||||
|                     $this->insertMode = static::IM_IN_HEAD; | ||||
|                 } | ||||
|                 break; | ||||
|             case 'body': | ||||
|                 $this->insertMode = static::IM_IN_BODY; | ||||
|                 break; | ||||
|             case 'svg': | ||||
|                 $this->insertMode = static::IM_IN_SVG; | ||||
|                 break; | ||||
|             case 'math': | ||||
|                 $this->insertMode = static::IM_IN_MATHML; | ||||
|                 break; | ||||
|             case 'noscript': | ||||
|                 if ($this->insertMode === static::IM_IN_HEAD) { | ||||
|                     $this->insertMode = static::IM_IN_HEAD_NOSCRIPT; | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         // Special case handling for SVG. | ||||
|         if ($this->insertMode === static::IM_IN_SVG) { | ||||
|             $lname = Elements::normalizeSvgElement($lname); | ||||
|         } | ||||
|  | ||||
|         $pushes = 0; | ||||
|         // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace | ||||
|         if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) { | ||||
|             array_unshift($this->nsStack, array( | ||||
|                 '' => $this->nsRoots[$lname], | ||||
|             ) + $this->nsStack[0]); | ||||
|             ++$pushes; | ||||
|         } | ||||
|         $needsWorkaround = false; | ||||
|         if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) { | ||||
|             // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack | ||||
|             foreach ($attributes as $aName => $aVal) { | ||||
|                 if ('xmlns' === $aName) { | ||||
|                     $needsWorkaround = $aVal; | ||||
|                     array_unshift($this->nsStack, array( | ||||
|                         '' => $aVal, | ||||
|                     ) + $this->nsStack[0]); | ||||
|                     ++$pushes; | ||||
|                 } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) { | ||||
|                     array_unshift($this->nsStack, array( | ||||
|                         substr($aName, $pos + 1) => $aVal, | ||||
|                     ) + $this->nsStack[0]); | ||||
|                     ++$pushes; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) { | ||||
|             $this->autoclose($this->onlyInline); | ||||
|             $this->onlyInline = null; | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : ''; | ||||
|  | ||||
|             if (false !== $needsWorkaround) { | ||||
|                 $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>'; | ||||
|  | ||||
|                 $frag = new \DOMDocument('1.0', 'UTF-8'); | ||||
|                 $frag->loadXML($xml); | ||||
|  | ||||
|                 $ele = $this->doc->importNode($frag->documentElement, true); | ||||
|             } else { | ||||
|                 if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) { | ||||
|                     $ele = $this->doc->createElement($lname); | ||||
|                 } else { | ||||
|                     $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname); | ||||
|                 } | ||||
|             } | ||||
|         } catch (\DOMException $e) { | ||||
|             $this->parseError("Illegal tag name: <$lname>. Replaced with <invalid>."); | ||||
|             $ele = $this->doc->createElement('invalid'); | ||||
|         } | ||||
|  | ||||
|         if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) { | ||||
|             $this->onlyInline = $lname; | ||||
|         } | ||||
|  | ||||
|         // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them. | ||||
|         // When we are on a void tag, we do not need to care about namesapce nesting. | ||||
|         if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) { | ||||
|             // PHP tends to free the memory used by DOM, | ||||
|             // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes | ||||
|             // see https://bugs.php.net/bug.php?id=67459 | ||||
|             $this->pushes[spl_object_hash($ele)] = array($pushes, $ele); | ||||
|         } | ||||
|  | ||||
|         foreach ($attributes as $aName => $aVal) { | ||||
|             // xmlns attributes can't be set | ||||
|             if ('xmlns' === $aName) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             if ($this->insertMode === static::IM_IN_SVG) { | ||||
|                 $aName = Elements::normalizeSvgAttribute($aName); | ||||
|             } elseif ($this->insertMode === static::IM_IN_MATHML) { | ||||
|                 $aName = Elements::normalizeMathMlAttribute($aName); | ||||
|             } | ||||
|  | ||||
|             $aVal = (string) $aVal; | ||||
|  | ||||
|             try { | ||||
|                 $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false; | ||||
|  | ||||
|                 if ('xmlns' === $prefix) { | ||||
|                     $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal); | ||||
|                 } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) { | ||||
|                     $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal); | ||||
|                 } else { | ||||
|                     $ele->setAttribute($aName, $aVal); | ||||
|                 } | ||||
|             } catch (\DOMException $e) { | ||||
|                 $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName"); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // This is necessary on a non-DTD schema, like HTML5. | ||||
|             if ('id' === $aName) { | ||||
|                 $ele->setIdAttribute('id', true); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ($this->frag !== $this->current && $this->rules->hasRules($name)) { | ||||
|             // Some elements have special processing rules. Handle those separately. | ||||
|             $this->current = $this->rules->evaluate($ele, $this->current); | ||||
|         } else { | ||||
|             // Otherwise, it's a standard element. | ||||
|             $this->current->appendChild($ele); | ||||
|  | ||||
|             if (!Elements::isA($name, Elements::VOID_TAG)) { | ||||
|                 $this->current = $ele; | ||||
|             } | ||||
|  | ||||
|             // Self-closing tags should only be respected on foreign elements | ||||
|             // (and are implied on void elements) | ||||
|             // See: https://www.w3.org/TR/html5/syntax.html#start-tags | ||||
|             if (Elements::isHtml5Element($name)) { | ||||
|                 $selfClosing = false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // This is sort of a last-ditch attempt to correct for cases where no head/body | ||||
|         // elements are provided. | ||||
|         if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) { | ||||
|             $this->insertMode = static::IM_IN_BODY; | ||||
|         } | ||||
|  | ||||
|         // When we are on a void tag, we do not need to care about namesapce nesting, | ||||
|         // but we have to remove the namespaces pushed to $nsStack. | ||||
|         if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) { | ||||
|             // remove the namespaced definded by current node | ||||
|             for ($i = 0; $i < $pushes; ++$i) { | ||||
|                 array_shift($this->nsStack); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ($selfClosing) { | ||||
|             $this->endTag($name); | ||||
|         } | ||||
|  | ||||
|         // Return the element mask, which the tokenizer can then use to set | ||||
|         // various processing rules. | ||||
|         return Elements::element($name); | ||||
|     } | ||||
|  | ||||
|     public function endTag($name) | ||||
|     { | ||||
|         $lname = $this->normalizeTagName($name); | ||||
|  | ||||
|         // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag | ||||
|         if ('br' === $name) { | ||||
|             $this->parseError('Closing tag encountered for void element br.'); | ||||
|  | ||||
|             $this->startTag('br'); | ||||
|         } | ||||
|         // Ignore closing tags for other unary elements. | ||||
|         elseif (Elements::isA($name, Elements::VOID_TAG)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if ($this->insertMode <= static::IM_BEFORE_HTML) { | ||||
|             // 8.2.5.4.2 | ||||
|             if (in_array($name, array( | ||||
|                 'html', | ||||
|                 'br', | ||||
|                 'head', | ||||
|                 'title', | ||||
|             ))) { | ||||
|                 $this->startTag('html'); | ||||
|                 $this->endTag($name); | ||||
|                 $this->insertMode = static::IM_BEFORE_HEAD; | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             // Ignore the tag. | ||||
|             $this->parseError('Illegal closing tag at global scope.'); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Special case handling for SVG. | ||||
|         if ($this->insertMode === static::IM_IN_SVG) { | ||||
|             $lname = Elements::normalizeSvgElement($lname); | ||||
|         } | ||||
|  | ||||
|         $cid = spl_object_hash($this->current); | ||||
|  | ||||
|         // XXX: HTML has no parent. What do we do, though, | ||||
|         // if this element appears in the wrong place? | ||||
|         if ('html' === $lname) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // remove the namespaced definded by current node | ||||
|         if (isset($this->pushes[$cid])) { | ||||
|             for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) { | ||||
|                 array_shift($this->nsStack); | ||||
|             } | ||||
|             unset($this->pushes[$cid]); | ||||
|         } | ||||
|  | ||||
|         if (!$this->autoclose($lname)) { | ||||
|             $this->parseError('Could not find closing tag for ' . $lname); | ||||
|         } | ||||
|  | ||||
|         switch ($lname) { | ||||
|             case 'head': | ||||
|                 $this->insertMode = static::IM_AFTER_HEAD; | ||||
|                 break; | ||||
|             case 'body': | ||||
|                 $this->insertMode = static::IM_AFTER_BODY; | ||||
|                 break; | ||||
|             case 'svg': | ||||
|             case 'mathml': | ||||
|                 $this->insertMode = static::IM_IN_BODY; | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function comment($cdata) | ||||
|     { | ||||
|         // TODO: Need to handle case where comment appears outside of the HTML tag. | ||||
|         $node = $this->doc->createComment($cdata); | ||||
|         $this->current->appendChild($node); | ||||
|     } | ||||
|  | ||||
|     public function text($data) | ||||
|     { | ||||
|         // XXX: Hmmm.... should we really be this strict? | ||||
|         if ($this->insertMode < static::IM_IN_HEAD) { | ||||
|             // Per '8.2.5.4.3 The "before head" insertion mode' the characters | ||||
|             // " \t\n\r\f" should be ignored but no mention of a parse error. This is | ||||
|             // practical as most documents contain these characters. Other text is not | ||||
|             // expected here so recording a parse error is necessary. | ||||
|             $dataTmp = trim($data, " \t\n\r\f"); | ||||
|             if (!empty($dataTmp)) { | ||||
|                 // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode); | ||||
|                 $this->parseError('Unexpected text. Ignoring: ' . $dataTmp); | ||||
|             } | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|         // fprintf(STDOUT, "Appending text %s.", $data); | ||||
|         $node = $this->doc->createTextNode($data); | ||||
|         $this->current->appendChild($node); | ||||
|     } | ||||
|  | ||||
|     public function eof() | ||||
|     { | ||||
|         // If the $current isn't the $root, do we need to do anything? | ||||
|     } | ||||
|  | ||||
|     public function parseError($msg, $line = 0, $col = 0) | ||||
|     { | ||||
|         $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg); | ||||
|     } | ||||
|  | ||||
|     public function getErrors() | ||||
|     { | ||||
|         return $this->errors; | ||||
|     } | ||||
|  | ||||
|     public function cdata($data) | ||||
|     { | ||||
|         $node = $this->doc->createCDATASection($data); | ||||
|         $this->current->appendChild($node); | ||||
|     } | ||||
|  | ||||
|     public function processingInstruction($name, $data = null) | ||||
|     { | ||||
|         // XXX: Ignore initial XML declaration, per the spec. | ||||
|         if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Important: The processor may modify the current DOM tree however it sees fit. | ||||
|         if ($this->processor instanceof InstructionProcessor) { | ||||
|             $res = $this->processor->process($this->current, $name, $data); | ||||
|             if (!empty($res)) { | ||||
|                 $this->current = $res; | ||||
|             } | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Otherwise, this is just a dumb PI element. | ||||
|         $node = $this->doc->createProcessingInstruction($name, $data); | ||||
|  | ||||
|         $this->current->appendChild($node); | ||||
|     } | ||||
|  | ||||
|     // ========================================================================== | ||||
|     // UTILITIES | ||||
|     // ========================================================================== | ||||
|  | ||||
|     /** | ||||
|      * Apply normalization rules to a tag name. | ||||
|      * See sections 2.9 and 8.1.2. | ||||
|      * | ||||
|      * @param string $tagName | ||||
|      * | ||||
|      * @return string The normalized tag name. | ||||
|      */ | ||||
|     protected function normalizeTagName($tagName) | ||||
|     { | ||||
|         /* | ||||
|          * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); } | ||||
|          */ | ||||
|         return $tagName; | ||||
|     } | ||||
|  | ||||
|     protected function quirksTreeResolver($name) | ||||
|     { | ||||
|         throw new \Exception('Not implemented.'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Automatically climb the tree and close the closest node with the matching $tag. | ||||
|      * | ||||
|      * @param string $tagName | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function autoclose($tagName) | ||||
|     { | ||||
|         $working = $this->current; | ||||
|         do { | ||||
|             if (XML_ELEMENT_NODE !== $working->nodeType) { | ||||
|                 return false; | ||||
|             } | ||||
|             if ($working->tagName === $tagName) { | ||||
|                 $this->current = $working->parentNode; | ||||
|  | ||||
|                 return true; | ||||
|             } | ||||
|         } while ($working = $working->parentNode); | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Checks if the given tagname is an ancestor of the present candidate. | ||||
|      * | ||||
|      * If $this->current or anything above $this->current matches the given tag | ||||
|      * name, this returns true. | ||||
|      * | ||||
|      * @param string $tagName | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function isAncestor($tagName) | ||||
|     { | ||||
|         $candidate = $this->current; | ||||
|         while (XML_ELEMENT_NODE === $candidate->nodeType) { | ||||
|             if ($candidate->tagName === $tagName) { | ||||
|                 return true; | ||||
|             } | ||||
|             $candidate = $candidate->parentNode; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns true if the immediate parent element is of the given tagname. | ||||
|      * | ||||
|      * @param string $tagName | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function isParent($tagName) | ||||
|     { | ||||
|         return $this->current->tagName === $tagName; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										114
									
								
								vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /** | ||||
|  * Standard events for HTML5. | ||||
|  * | ||||
|  * This is roughly analogous to a SAX2 or expat-style interface. | ||||
|  * However, it is tuned specifically for HTML5, according to section 8 | ||||
|  * of the HTML5 specification. | ||||
|  * | ||||
|  * An event handler receives parser events. For a concrete | ||||
|  * implementation, see DOMTreeBuilder. | ||||
|  * | ||||
|  * Quirks support in the parser is limited to close-in syntax (malformed | ||||
|  * tags or attributes). Higher order syntax and semantic issues with a | ||||
|  * document (e.g. mismatched tags, illegal nesting, etc.) are the | ||||
|  * responsibility of the event handler implementation. | ||||
|  * | ||||
|  * See HTML5 spec section 8.2.4 | ||||
|  */ | ||||
| interface EventHandler | ||||
| { | ||||
|     const DOCTYPE_NONE = 0; | ||||
|  | ||||
|     const DOCTYPE_PUBLIC = 1; | ||||
|  | ||||
|     const DOCTYPE_SYSTEM = 2; | ||||
|  | ||||
|     /** | ||||
|      * A doctype declaration. | ||||
|      * | ||||
|      * @param string $name   The name of the root element. | ||||
|      * @param int    $idType One of DOCTYPE_NONE, DOCTYPE_PUBLIC, or DOCTYPE_SYSTEM | ||||
|      * @param string $id     The identifier. For DOCTYPE_PUBLIC, this is the public ID. If DOCTYPE_SYSTEM, | ||||
|      *                       then this is a system ID. | ||||
|      * @param bool   $quirks Indicates whether the builder should enter quirks mode. | ||||
|      */ | ||||
|     public function doctype($name, $idType = 0, $id = null, $quirks = false); | ||||
|  | ||||
|     /** | ||||
|      * A start tag. | ||||
|      * | ||||
|      * IMPORTANT: The parser watches the return value of this event. If this returns | ||||
|      * an integer, the parser will switch TEXTMODE patters according to the int. | ||||
|      * | ||||
|      * This is how the Tree Builder can tell the Tokenizer when a certain tag should | ||||
|      * cause the parser to go into RAW text mode. | ||||
|      * | ||||
|      * The HTML5 standard requires that the builder is the one that initiates this | ||||
|      * step, and this is the only way short of a circular reference that we can | ||||
|      * do that. | ||||
|      * | ||||
|      * Example: if a startTag even for a `script` name is fired, and the startTag() | ||||
|      * implementation returns Tokenizer::TEXTMODE_RAW, then the tokenizer will | ||||
|      * switch into RAW text mode and consume data until it reaches a closing | ||||
|      * `script` tag. | ||||
|      * | ||||
|      * The textmode is automatically reset to Tokenizer::TEXTMODE_NORMAL when the | ||||
|      * closing tag is encounter. **This behavior may change.** | ||||
|      * | ||||
|      * @param string $name        The tag name. | ||||
|      * @param array  $attributes  An array with all of the tag's attributes. | ||||
|      * @param bool   $selfClosing An indicator of whether or not this tag is self-closing (<foo/>). | ||||
|      * | ||||
|      * @return int one of the Tokenizer::TEXTMODE_* constants | ||||
|      */ | ||||
|     public function startTag($name, $attributes = array(), $selfClosing = false); | ||||
|  | ||||
|     /** | ||||
|      * An end-tag. | ||||
|      */ | ||||
|     public function endTag($name); | ||||
|  | ||||
|     /** | ||||
|      * A comment section (unparsed character data). | ||||
|      */ | ||||
|     public function comment($cdata); | ||||
|  | ||||
|     /** | ||||
|      * A unit of parsed character data. | ||||
|      * | ||||
|      * Entities in this text are *already decoded*. | ||||
|      */ | ||||
|     public function text($cdata); | ||||
|  | ||||
|     /** | ||||
|      * Indicates that the document has been entirely processed. | ||||
|      */ | ||||
|     public function eof(); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the parser encounters an error condition. | ||||
|      */ | ||||
|     public function parseError($msg, $line, $col); | ||||
|  | ||||
|     /** | ||||
|      * A CDATA section. | ||||
|      * | ||||
|      * @param string $data | ||||
|      *                     The unparsed character data | ||||
|      */ | ||||
|     public function cdata($data); | ||||
|  | ||||
|     /** | ||||
|      * This is a holdover from the XML spec. | ||||
|      * | ||||
|      * While user agents don't get PIs, server-side does. | ||||
|      * | ||||
|      * @param string $name The name of the processor (e.g. 'php'). | ||||
|      * @param string $data The unparsed data. | ||||
|      */ | ||||
|     public function processingInstruction($name, $data = null); | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /** | ||||
|  * The FileInputStream loads a file to be parsed. | ||||
|  * | ||||
|  * So right now we read files into strings and then process the | ||||
|  * string. We chose to do this largely for the sake of expediency of | ||||
|  * development, and also because we could optimize toward processing | ||||
|  * arbitrarily large chunks of the input. But in the future, we'd | ||||
|  * really like to rewrite this class to efficiently handle lower level | ||||
|  * stream reads (and thus efficiently handle large documents). | ||||
|  * | ||||
|  * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. | ||||
|  */ | ||||
| class FileInputStream extends StringInputStream implements InputStream | ||||
| { | ||||
|     /** | ||||
|      * Load a file input stream. | ||||
|      * | ||||
|      * @param string $data     The file or url path to load. | ||||
|      * @param string $encoding The encoding to use for the data. | ||||
|      * @param string $debug    A fprintf format to use to echo the data on stdout. | ||||
|      */ | ||||
|     public function __construct($data, $encoding = 'UTF-8', $debug = '') | ||||
|     { | ||||
|         // Get the contents of the file. | ||||
|         $content = file_get_contents($data); | ||||
|  | ||||
|         parent::__construct($content, $encoding, $debug); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										87
									
								
								vendor/masterminds/html5/src/HTML5/Parser/InputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								vendor/masterminds/html5/src/HTML5/Parser/InputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /** | ||||
|  * Interface for stream readers. | ||||
|  * | ||||
|  * The parser only reads from streams. Various input sources can write | ||||
|  * an adapater to this InputStream. | ||||
|  * | ||||
|  * Currently provided InputStream implementations include | ||||
|  * FileInputStream and StringInputStream. | ||||
|  * | ||||
|  * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. | ||||
|  */ | ||||
| interface InputStream extends \Iterator | ||||
| { | ||||
|     /** | ||||
|      * Returns the current line that is being consumed. | ||||
|      * | ||||
|      * TODO: Move this to the scanner. | ||||
|      */ | ||||
|     public function currentLine(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the current column of the current line that the tokenizer is at. | ||||
|      * | ||||
|      * Newlines are column 0. The first char after a newline is column 1. | ||||
|      * | ||||
|      * @TODO Move this to the scanner. | ||||
|      * | ||||
|      * @return int The column number. | ||||
|      */ | ||||
|     public function columnOffset(); | ||||
|  | ||||
|     /** | ||||
|      * Get all characters until EOF. | ||||
|      * | ||||
|      * This consumes characters until the EOF. | ||||
|      */ | ||||
|     public function remainingChars(); | ||||
|  | ||||
|     /** | ||||
|      * Read to a particular match (or until $max bytes are consumed). | ||||
|      * | ||||
|      * This operates on byte sequences, not characters. | ||||
|      * | ||||
|      * Matches as far as possible until we reach a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @see strcspn | ||||
|      * | ||||
|      * @param string $bytes Bytes to match. | ||||
|      * @param int    $max   Maximum number of bytes to scan. | ||||
|      * | ||||
|      * @return mixed Index or false if no match is found. You should use strong | ||||
|      *               equality when checking the result, since index could be 0. | ||||
|      */ | ||||
|     public function charsUntil($bytes, $max = null); | ||||
|  | ||||
|     /** | ||||
|      * Returns the string so long as $bytes matches. | ||||
|      * | ||||
|      * Matches as far as possible with a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @see strspn | ||||
|      * | ||||
|      * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the | ||||
|      *                      current char, the pointer advances and the char is part of the | ||||
|      *                      substring. | ||||
|      * @param int    $max   The max number of chars to read. | ||||
|      */ | ||||
|     public function charsWhile($bytes, $max = null); | ||||
|  | ||||
|     /** | ||||
|      * Unconsume one character. | ||||
|      * | ||||
|      * @param int $howMany The number of characters to move the pointer back. | ||||
|      */ | ||||
|     public function unconsume($howMany = 1); | ||||
|  | ||||
|     /** | ||||
|      * Retrieve the next character without advancing the pointer. | ||||
|      */ | ||||
|     public function peek(); | ||||
| } | ||||
							
								
								
									
										10
									
								
								vendor/masterminds/html5/src/HTML5/Parser/ParseError.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/masterminds/html5/src/HTML5/Parser/ParseError.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /** | ||||
|  * Emit when the parser has an error. | ||||
|  */ | ||||
| class ParseError extends \Exception | ||||
| { | ||||
| } | ||||
							
								
								
									
										53
									
								
								vendor/masterminds/html5/src/HTML5/Parser/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/masterminds/html5/src/HTML5/Parser/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| # The Parser Model | ||||
|  | ||||
| The parser model here follows the model in section | ||||
| [8.2.1](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#parsing) | ||||
| of the HTML5 specification, though we do not assume a networking layer. | ||||
|  | ||||
|      [ InputStream ]    // Generic support for reading input. | ||||
|            || | ||||
|       [ Scanner ]       // Breaks down the stream into characters. | ||||
|            || | ||||
|      [ Tokenizer ]      // Groups characters into syntactic | ||||
|            || | ||||
|     [ Tree Builder ]    // Organizes units into a tree of objects | ||||
|            || | ||||
|      [ DOM Document ]     // The final state of the parsed document. | ||||
|  | ||||
|  | ||||
| ## InputStream | ||||
|  | ||||
| This is an interface with at least two concrete implementations: | ||||
|  | ||||
| - StringInputStream: Reads an HTML5 string. | ||||
| - FileInputStream: Reads an HTML5 file. | ||||
|  | ||||
| ## Scanner | ||||
|  | ||||
| This is a mechanical piece of the parser. | ||||
|  | ||||
| ## Tokenizer | ||||
|  | ||||
| This follows section 8.4 of the HTML5 spec. It is (roughly) a recursive | ||||
| descent parser. (Though there are plenty of optimizations that are less | ||||
| than purely functional. | ||||
|  | ||||
| ## EventHandler and DOMTree | ||||
|  | ||||
| EventHandler is the interface for tree builders. Since not all | ||||
| implementations will necessarily build trees, we've chosen a more | ||||
| generic name. | ||||
|  | ||||
| The event handler emits tokens during tokenization. | ||||
|  | ||||
| The DOMTree is an event handler that builds a DOM tree. The output of | ||||
| the DOMTree builder is a DOMDocument. | ||||
|  | ||||
| ## DOMDocument | ||||
|  | ||||
| PHP has a DOMDocument class built-in (technically, it's part of libxml.) | ||||
| We use that, thus rendering the output of this process compatible with | ||||
| SimpleXML, QueryPath, and many other XML/HTML processing tools. | ||||
|  | ||||
| For cases where the HTML5 is a fragment of a HTML5 document a | ||||
| DOMDocumentFragment is returned instead. This is another built-in class. | ||||
							
								
								
									
										416
									
								
								vendor/masterminds/html5/src/HTML5/Parser/Scanner.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								vendor/masterminds/html5/src/HTML5/Parser/Scanner.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,416 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| use Masterminds\HTML5\Exception; | ||||
|  | ||||
| /** | ||||
|  * The scanner scans over a given data input to react appropriately to characters. | ||||
|  */ | ||||
| class Scanner | ||||
| { | ||||
|     const CHARS_HEX = 'abcdefABCDEF01234567890'; | ||||
|     const CHARS_ALNUM = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890'; | ||||
|     const CHARS_ALPHA = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; | ||||
|  | ||||
|     /** | ||||
|      * The string data we're parsing. | ||||
|      */ | ||||
|     private $data; | ||||
|  | ||||
|     /** | ||||
|      * The current integer byte position we are in $data. | ||||
|      */ | ||||
|     private $char; | ||||
|  | ||||
|     /** | ||||
|      * Length of $data; when $char === $data, we are at the end-of-file. | ||||
|      */ | ||||
|     private $EOF; | ||||
|  | ||||
|     /** | ||||
|      * Parse errors. | ||||
|      */ | ||||
|     public $errors = array(); | ||||
|  | ||||
|     /** | ||||
|      * Create a new Scanner. | ||||
|      * | ||||
|      * @param string $data     Data to parse. | ||||
|      * @param string $encoding The encoding to use for the data. | ||||
|      * | ||||
|      * @throws Exception If the given data cannot be encoded to UTF-8. | ||||
|      */ | ||||
|     public function __construct($data, $encoding = 'UTF-8') | ||||
|     { | ||||
|         if ($data instanceof InputStream) { | ||||
|             @trigger_error('InputStream objects are deprecated since version 2.4 and will be removed in 3.0. Use strings instead.', E_USER_DEPRECATED); | ||||
|             $data = (string) $data; | ||||
|         } | ||||
|  | ||||
|         $data = UTF8Utils::convertToUTF8($data, $encoding); | ||||
|  | ||||
|         // There is good reason to question whether it makes sense to | ||||
|         // do this here, since most of these checks are done during | ||||
|         // parsing, and since this check doesn't actually *do* anything. | ||||
|         $this->errors = UTF8Utils::checkForIllegalCodepoints($data); | ||||
|  | ||||
|         $data = $this->replaceLinefeeds($data); | ||||
|  | ||||
|         $this->data = $data; | ||||
|         $this->char = 0; | ||||
|         $this->EOF = strlen($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if upcomming chars match the given sequence. | ||||
|      * | ||||
|      * This will read the stream for the $sequence. If it's | ||||
|      * found, this will return true. If not, return false. | ||||
|      * Since this unconsumes any chars it reads, the caller | ||||
|      * will still need to read the next sequence, even if | ||||
|      * this returns true. | ||||
|      * | ||||
|      * Example: $this->scanner->sequenceMatches('</script>') will | ||||
|      * see if the input stream is at the start of a | ||||
|      * '</script>' string. | ||||
|      * | ||||
|      * @param string $sequence | ||||
|      * @param bool   $caseSensitive | ||||
|      * | ||||
|      * @return bool | ||||
|      */ | ||||
|     public function sequenceMatches($sequence, $caseSensitive = true) | ||||
|     { | ||||
|         $portion = substr($this->data, $this->char, strlen($sequence)); | ||||
|  | ||||
|         return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the current position. | ||||
|      * | ||||
|      * @return int The current intiger byte position. | ||||
|      */ | ||||
|     public function position() | ||||
|     { | ||||
|         return $this->char; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Take a peek at the next character in the data. | ||||
|      * | ||||
|      * @return string The next character. | ||||
|      */ | ||||
|     public function peek() | ||||
|     { | ||||
|         if (($this->char + 1) < $this->EOF) { | ||||
|             return $this->data[$this->char + 1]; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next character. | ||||
|      * Note: This advances the pointer. | ||||
|      * | ||||
|      * @return string The next character. | ||||
|      */ | ||||
|     public function next() | ||||
|     { | ||||
|         ++$this->char; | ||||
|  | ||||
|         if ($this->char < $this->EOF) { | ||||
|             return $this->data[$this->char]; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the current character. | ||||
|      * Note, this does not advance the pointer. | ||||
|      * | ||||
|      * @return string The current character. | ||||
|      */ | ||||
|     public function current() | ||||
|     { | ||||
|         if ($this->char < $this->EOF) { | ||||
|             return $this->data[$this->char]; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Silently consume N chars. | ||||
|      * | ||||
|      * @param int $count | ||||
|      */ | ||||
|     public function consume($count = 1) | ||||
|     { | ||||
|         $this->char += $count; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Unconsume some of the data. | ||||
|      * This moves the data pointer backwards. | ||||
|      * | ||||
|      * @param int $howMany The number of characters to move the pointer back. | ||||
|      */ | ||||
|     public function unconsume($howMany = 1) | ||||
|     { | ||||
|         if (($this->char - $howMany) >= 0) { | ||||
|             $this->char -= $howMany; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next group of that contains hex characters. | ||||
|      * Note, along with getting the characters the pointer in the data will be | ||||
|      * moved as well. | ||||
|      * | ||||
|      * @return string The next group that is hex characters. | ||||
|      */ | ||||
|     public function getHex() | ||||
|     { | ||||
|         return $this->doCharsWhile(static::CHARS_HEX); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next group of characters that are ASCII Alpha characters. | ||||
|      * Note, along with getting the characters the pointer in the data will be | ||||
|      * moved as well. | ||||
|      * | ||||
|      * @return string The next group of ASCII alpha characters. | ||||
|      */ | ||||
|     public function getAsciiAlpha() | ||||
|     { | ||||
|         return $this->doCharsWhile(static::CHARS_ALPHA); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next group of characters that are ASCII Alpha characters and numbers. | ||||
|      * Note, along with getting the characters the pointer in the data will be | ||||
|      * moved as well. | ||||
|      * | ||||
|      * @return string The next group of ASCII alpha characters and numbers. | ||||
|      */ | ||||
|     public function getAsciiAlphaNum() | ||||
|     { | ||||
|         return $this->doCharsWhile(static::CHARS_ALNUM); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the next group of numbers. | ||||
|      * Note, along with getting the characters the pointer in the data will be | ||||
|      * moved as well. | ||||
|      * | ||||
|      * @return string The next group of numbers. | ||||
|      */ | ||||
|     public function getNumeric() | ||||
|     { | ||||
|         return $this->doCharsWhile('0123456789'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Consume whitespace. | ||||
|      * Whitespace in HTML5 is: formfeed, tab, newline, space. | ||||
|      * | ||||
|      * @return int The length of the matched whitespaces. | ||||
|      */ | ||||
|     public function whitespace() | ||||
|     { | ||||
|         if ($this->char >= $this->EOF) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $len = strspn($this->data, "\n\t\f ", $this->char); | ||||
|  | ||||
|         $this->char += $len; | ||||
|  | ||||
|         return $len; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the current line that is being consumed. | ||||
|      * | ||||
|      * @return int The current line number. | ||||
|      */ | ||||
|     public function currentLine() | ||||
|     { | ||||
|         if (empty($this->EOF) || 0 === $this->char) { | ||||
|             return 1; | ||||
|         } | ||||
|  | ||||
|         // Add one to $this->char because we want the number for the next | ||||
|         // byte to be processed. | ||||
|         return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Read chars until something in the mask is encountered. | ||||
|      * | ||||
|      * @param string $mask | ||||
|      * | ||||
|      * @return mixed | ||||
|      */ | ||||
|     public function charsUntil($mask) | ||||
|     { | ||||
|         return $this->doCharsUntil($mask); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Read chars as long as the mask matches. | ||||
|      * | ||||
|      * @param string $mask | ||||
|      * | ||||
|      * @return int | ||||
|      */ | ||||
|     public function charsWhile($mask) | ||||
|     { | ||||
|         return $this->doCharsWhile($mask); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the current column of the current line that the tokenizer is at. | ||||
|      * | ||||
|      * Newlines are column 0. The first char after a newline is column 1. | ||||
|      * | ||||
|      * @return int The column number. | ||||
|      */ | ||||
|     public function columnOffset() | ||||
|     { | ||||
|         // Short circuit for the first char. | ||||
|         if (0 === $this->char) { | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         // strrpos is weird, and the offset needs to be negative for what we | ||||
|         // want (i.e., the last \n before $this->char). This needs to not have | ||||
|         // one (to make it point to the next character, the one we want the | ||||
|         // position of) added to it because strrpos's behaviour includes the | ||||
|         // final offset byte. | ||||
|         $backwardFrom = $this->char - 1 - strlen($this->data); | ||||
|         $lastLine = strrpos($this->data, "\n", $backwardFrom); | ||||
|  | ||||
|         // However, for here we want the length up until the next byte to be | ||||
|         // processed, so add one to the current byte ($this->char). | ||||
|         if (false !== $lastLine) { | ||||
|             $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); | ||||
|         } else { | ||||
|             // After a newline. | ||||
|             $findLengthOf = substr($this->data, 0, $this->char); | ||||
|         } | ||||
|  | ||||
|         return UTF8Utils::countChars($findLengthOf); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get all characters until EOF. | ||||
|      * | ||||
|      * This consumes characters until the EOF. | ||||
|      * | ||||
|      * @return int The number of characters remaining. | ||||
|      */ | ||||
|     public function remainingChars() | ||||
|     { | ||||
|         if ($this->char < $this->EOF) { | ||||
|             $data = substr($this->data, $this->char); | ||||
|             $this->char = $this->EOF; | ||||
|  | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         return ''; // false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Replace linefeed characters according to the spec. | ||||
|      * | ||||
|      * @param $data | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     private function replaceLinefeeds($data) | ||||
|     { | ||||
|         /* | ||||
|          * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. | ||||
|          * Any CR characters that are followed by LF characters must be removed, and any CR characters not | ||||
|          * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are | ||||
|          * represented by LF characters, and there are never any CR characters in the input to the tokenization | ||||
|          * stage. | ||||
|          */ | ||||
|         $crlfTable = array( | ||||
|             "\0" => "\xEF\xBF\xBD", | ||||
|             "\r\n" => "\n", | ||||
|             "\r" => "\n", | ||||
|         ); | ||||
|  | ||||
|         return strtr($data, $crlfTable); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Read to a particular match (or until $max bytes are consumed). | ||||
|      * | ||||
|      * This operates on byte sequences, not characters. | ||||
|      * | ||||
|      * Matches as far as possible until we reach a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @param string $bytes Bytes to match. | ||||
|      * @param int    $max   Maximum number of bytes to scan. | ||||
|      * | ||||
|      * @return mixed Index or false if no match is found. You should use strong | ||||
|      *               equality when checking the result, since index could be 0. | ||||
|      */ | ||||
|     private function doCharsUntil($bytes, $max = null) | ||||
|     { | ||||
|         if ($this->char >= $this->EOF) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (0 === $max || $max) { | ||||
|             $len = strcspn($this->data, $bytes, $this->char, $max); | ||||
|         } else { | ||||
|             $len = strcspn($this->data, $bytes, $this->char); | ||||
|         } | ||||
|  | ||||
|         $string = (string) substr($this->data, $this->char, $len); | ||||
|         $this->char += $len; | ||||
|  | ||||
|         return $string; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the string so long as $bytes matches. | ||||
|      * | ||||
|      * Matches as far as possible with a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the | ||||
|      *                      current char, the pointer advances and the char is part of the | ||||
|      *                      substring. | ||||
|      * @param int    $max   The max number of chars to read. | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     private function doCharsWhile($bytes, $max = null) | ||||
|     { | ||||
|         if ($this->char >= $this->EOF) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (0 === $max || $max) { | ||||
|             $len = strspn($this->data, $bytes, $this->char, $max); | ||||
|         } else { | ||||
|             $len = strspn($this->data, $bytes, $this->char); | ||||
|         } | ||||
|  | ||||
|         $string = (string) substr($this->data, $this->char, $len); | ||||
|         $this->char += $len; | ||||
|  | ||||
|         return $string; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										331
									
								
								vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,331 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Loads a string to be parsed. | ||||
|  */ | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /* | ||||
|  * | ||||
| * Based on code from html5lib: | ||||
|  | ||||
| Copyright 2009 Geoffrey Sneddon <http://gsnedders.com/> | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a | ||||
| copy of this software and associated documentation files (the | ||||
|     "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included | ||||
| in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||||
| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| */ | ||||
|  | ||||
| // Some conventions: | ||||
| // - /* */ indicates verbatim text from the HTML 5 specification | ||||
| //   MPB: Not sure which version of the spec. Moving from HTML5lib to | ||||
| //   HTML5-PHP, I have been using this version: | ||||
| //   http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents | ||||
| // | ||||
| // - // indicates regular comments | ||||
|  | ||||
| /** | ||||
|  * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. | ||||
|  */ | ||||
| class StringInputStream implements InputStream | ||||
| { | ||||
|     /** | ||||
|      * The string data we're parsing. | ||||
|      */ | ||||
|     private $data; | ||||
|  | ||||
|     /** | ||||
|      * The current integer byte position we are in $data. | ||||
|      */ | ||||
|     private $char; | ||||
|  | ||||
|     /** | ||||
|      * Length of $data; when $char === $data, we are at the end-of-file. | ||||
|      */ | ||||
|     private $EOF; | ||||
|  | ||||
|     /** | ||||
|      * Parse errors. | ||||
|      */ | ||||
|     public $errors = array(); | ||||
|  | ||||
|     /** | ||||
|      * Create a new InputStream wrapper. | ||||
|      * | ||||
|      * @param string $data     Data to parse. | ||||
|      * @param string $encoding The encoding to use for the data. | ||||
|      * @param string $debug    A fprintf format to use to echo the data on stdout. | ||||
|      */ | ||||
|     public function __construct($data, $encoding = 'UTF-8', $debug = '') | ||||
|     { | ||||
|         $data = UTF8Utils::convertToUTF8($data, $encoding); | ||||
|         if ($debug) { | ||||
|             fprintf(STDOUT, $debug, $data, strlen($data)); | ||||
|         } | ||||
|  | ||||
|         // There is good reason to question whether it makes sense to | ||||
|         // do this here, since most of these checks are done during | ||||
|         // parsing, and since this check doesn't actually *do* anything. | ||||
|         $this->errors = UTF8Utils::checkForIllegalCodepoints($data); | ||||
|  | ||||
|         $data = $this->replaceLinefeeds($data); | ||||
|  | ||||
|         $this->data = $data; | ||||
|         $this->char = 0; | ||||
|         $this->EOF = strlen($data); | ||||
|     } | ||||
|  | ||||
|     public function __toString() | ||||
|     { | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Replace linefeed characters according to the spec. | ||||
|      */ | ||||
|     protected function replaceLinefeeds($data) | ||||
|     { | ||||
|         /* | ||||
|          * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. | ||||
|          * Any CR characters that are followed by LF characters must be removed, and any CR characters not | ||||
|          * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are | ||||
|          * represented by LF characters, and there are never any CR characters in the input to the tokenization | ||||
|          * stage. | ||||
|          */ | ||||
|         $crlfTable = array( | ||||
|             "\0" => "\xEF\xBF\xBD", | ||||
|             "\r\n" => "\n", | ||||
|             "\r" => "\n", | ||||
|         ); | ||||
|  | ||||
|         return strtr($data, $crlfTable); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the current line that the tokenizer is at. | ||||
|      */ | ||||
|     public function currentLine() | ||||
|     { | ||||
|         if (empty($this->EOF) || 0 === $this->char) { | ||||
|             return 1; | ||||
|         } | ||||
|         // Add one to $this->char because we want the number for the next | ||||
|         // byte to be processed. | ||||
|         return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @deprecated | ||||
|      */ | ||||
|     public function getCurrentLine() | ||||
|     { | ||||
|         return $this->currentLine(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the current column of the current line that the tokenizer is at. | ||||
|      * Newlines are column 0. The first char after a newline is column 1. | ||||
|      * | ||||
|      * @return int The column number. | ||||
|      */ | ||||
|     public function columnOffset() | ||||
|     { | ||||
|         // Short circuit for the first char. | ||||
|         if (0 === $this->char) { | ||||
|             return 0; | ||||
|         } | ||||
|         // strrpos is weird, and the offset needs to be negative for what we | ||||
|         // want (i.e., the last \n before $this->char). This needs to not have | ||||
|         // one (to make it point to the next character, the one we want the | ||||
|         // position of) added to it because strrpos's behaviour includes the | ||||
|         // final offset byte. | ||||
|         $backwardFrom = $this->char - 1 - strlen($this->data); | ||||
|         $lastLine = strrpos($this->data, "\n", $backwardFrom); | ||||
|  | ||||
|         // However, for here we want the length up until the next byte to be | ||||
|         // processed, so add one to the current byte ($this->char). | ||||
|         if (false !== $lastLine) { | ||||
|             $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); | ||||
|         } else { | ||||
|             // After a newline. | ||||
|             $findLengthOf = substr($this->data, 0, $this->char); | ||||
|         } | ||||
|  | ||||
|         return UTF8Utils::countChars($findLengthOf); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @deprecated | ||||
|      */ | ||||
|     public function getColumnOffset() | ||||
|     { | ||||
|         return $this->columnOffset(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the current character. | ||||
|      * | ||||
|      * @return string The current character. | ||||
|      */ | ||||
|     public function current() | ||||
|     { | ||||
|         return $this->data[$this->char]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Advance the pointer. | ||||
|      * This is part of the Iterator interface. | ||||
|      */ | ||||
|     public function next() | ||||
|     { | ||||
|         ++$this->char; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Rewind to the start of the string. | ||||
|      */ | ||||
|     public function rewind() | ||||
|     { | ||||
|         $this->char = 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is the current pointer location valid. | ||||
|      * | ||||
|      * @return bool Whether the current pointer location is valid. | ||||
|      */ | ||||
|     public function valid() | ||||
|     { | ||||
|         return $this->char < $this->EOF; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get all characters until EOF. | ||||
|      * | ||||
|      * This reads to the end of the file, and sets the read marker at the | ||||
|      * end of the file. | ||||
|      * | ||||
|      * Note this performs bounds checking. | ||||
|      * | ||||
|      * @return string Returns the remaining text. If called when the InputStream is | ||||
|      *                already exhausted, it returns an empty string. | ||||
|      */ | ||||
|     public function remainingChars() | ||||
|     { | ||||
|         if ($this->char < $this->EOF) { | ||||
|             $data = substr($this->data, $this->char); | ||||
|             $this->char = $this->EOF; | ||||
|  | ||||
|             return $data; | ||||
|         } | ||||
|  | ||||
|         return ''; // false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Read to a particular match (or until $max bytes are consumed). | ||||
|      * | ||||
|      * This operates on byte sequences, not characters. | ||||
|      * | ||||
|      * Matches as far as possible until we reach a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @param string $bytes Bytes to match. | ||||
|      * @param int    $max   Maximum number of bytes to scan. | ||||
|      * | ||||
|      * @return mixed Index or false if no match is found. You should use strong | ||||
|      *               equality when checking the result, since index could be 0. | ||||
|      */ | ||||
|     public function charsUntil($bytes, $max = null) | ||||
|     { | ||||
|         if ($this->char >= $this->EOF) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (0 === $max || $max) { | ||||
|             $len = strcspn($this->data, $bytes, $this->char, $max); | ||||
|         } else { | ||||
|             $len = strcspn($this->data, $bytes, $this->char); | ||||
|         } | ||||
|  | ||||
|         $string = (string) substr($this->data, $this->char, $len); | ||||
|         $this->char += $len; | ||||
|  | ||||
|         return $string; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the string so long as $bytes matches. | ||||
|      * | ||||
|      * Matches as far as possible with a certain set of bytes | ||||
|      * and returns the matched substring. | ||||
|      * | ||||
|      * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the | ||||
|      *                      current char, the pointer advances and the char is part of the | ||||
|      *                      substring. | ||||
|      * @param int    $max   The max number of chars to read. | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function charsWhile($bytes, $max = null) | ||||
|     { | ||||
|         if ($this->char >= $this->EOF) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (0 === $max || $max) { | ||||
|             $len = strspn($this->data, $bytes, $this->char, $max); | ||||
|         } else { | ||||
|             $len = strspn($this->data, $bytes, $this->char); | ||||
|         } | ||||
|         $string = (string) substr($this->data, $this->char, $len); | ||||
|         $this->char += $len; | ||||
|  | ||||
|         return $string; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Unconsume characters. | ||||
|      * | ||||
|      * @param int $howMany The number of characters to unconsume. | ||||
|      */ | ||||
|     public function unconsume($howMany = 1) | ||||
|     { | ||||
|         if (($this->char - $howMany) >= 0) { | ||||
|             $this->char -= $howMany; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Look ahead without moving cursor. | ||||
|      */ | ||||
|     public function peek() | ||||
|     { | ||||
|         if (($this->char + 1) <= $this->EOF) { | ||||
|             return $this->data[$this->char + 1]; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public function key() | ||||
|     { | ||||
|         return $this->char; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										1197
									
								
								vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1197
									
								
								vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										127
									
								
								vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /** | ||||
|  * Handles special-case rules for the DOM tree builder. | ||||
|  * | ||||
|  * Many tags have special rules that need to be accomodated on an | ||||
|  * individual basis. This class handles those rules. | ||||
|  * | ||||
|  * See section 8.1.2.4 of the spec. | ||||
|  * | ||||
|  * @todo - colgroup and col special behaviors | ||||
|  *       - body and head special behaviors | ||||
|  */ | ||||
| class TreeBuildingRules | ||||
| { | ||||
|     protected static $tags = array( | ||||
|         'li' => 1, | ||||
|         'dd' => 1, | ||||
|         'dt' => 1, | ||||
|         'rt' => 1, | ||||
|         'rp' => 1, | ||||
|         'tr' => 1, | ||||
|         'th' => 1, | ||||
|         'td' => 1, | ||||
|         'thead' => 1, | ||||
|         'tfoot' => 1, | ||||
|         'tbody' => 1, | ||||
|         'table' => 1, | ||||
|         'optgroup' => 1, | ||||
|         'option' => 1, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Returns true if the given tagname has special processing rules. | ||||
|      */ | ||||
|     public function hasRules($tagname) | ||||
|     { | ||||
|         return isset(static::$tags[$tagname]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Evaluate the rule for the current tag name. | ||||
|      * | ||||
|      * This may modify the existing DOM. | ||||
|      * | ||||
|      * @return \DOMElement The new Current DOM element. | ||||
|      */ | ||||
|     public function evaluate($new, $current) | ||||
|     { | ||||
|         switch ($new->tagName) { | ||||
|             case 'li': | ||||
|                 return $this->handleLI($new, $current); | ||||
|             case 'dt': | ||||
|             case 'dd': | ||||
|                 return $this->handleDT($new, $current); | ||||
|             case 'rt': | ||||
|             case 'rp': | ||||
|                 return $this->handleRT($new, $current); | ||||
|             case 'optgroup': | ||||
|                 return $this->closeIfCurrentMatches($new, $current, array( | ||||
|                     'optgroup', | ||||
|                 )); | ||||
|             case 'option': | ||||
|                 return $this->closeIfCurrentMatches($new, $current, array( | ||||
|                     'option', | ||||
|                 )); | ||||
|             case 'tr': | ||||
|                 return $this->closeIfCurrentMatches($new, $current, array( | ||||
|                     'tr', | ||||
|                 )); | ||||
|             case 'td': | ||||
|             case 'th': | ||||
|                 return $this->closeIfCurrentMatches($new, $current, array( | ||||
|                     'th', | ||||
|                     'td', | ||||
|                 )); | ||||
|             case 'tbody': | ||||
|             case 'thead': | ||||
|             case 'tfoot': | ||||
|             case 'table': // Spec isn't explicit about this, but it's necessary. | ||||
|  | ||||
|                 return $this->closeIfCurrentMatches($new, $current, array( | ||||
|                     'thead', | ||||
|                     'tfoot', | ||||
|                     'tbody', | ||||
|                 )); | ||||
|         } | ||||
|  | ||||
|         return $current; | ||||
|     } | ||||
|  | ||||
|     protected function handleLI($ele, $current) | ||||
|     { | ||||
|         return $this->closeIfCurrentMatches($ele, $current, array( | ||||
|             'li', | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     protected function handleDT($ele, $current) | ||||
|     { | ||||
|         return $this->closeIfCurrentMatches($ele, $current, array( | ||||
|             'dt', | ||||
|             'dd', | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     protected function handleRT($ele, $current) | ||||
|     { | ||||
|         return $this->closeIfCurrentMatches($ele, $current, array( | ||||
|             'rt', | ||||
|             'rp', | ||||
|         )); | ||||
|     } | ||||
|  | ||||
|     protected function closeIfCurrentMatches($ele, $current, $match) | ||||
|     { | ||||
|         if (in_array($current->tagName, $match, true)) { | ||||
|             $current->parentNode->appendChild($ele); | ||||
|         } else { | ||||
|             $current->appendChild($ele); | ||||
|         } | ||||
|  | ||||
|         return $ele; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										183
									
								
								vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Parser; | ||||
|  | ||||
| /* | ||||
| Portions based on code from html5lib files with the following copyright: | ||||
|  | ||||
| Copyright 2009 Geoffrey Sneddon <http://gsnedders.com/> | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a | ||||
| copy of this software and associated documentation files (the | ||||
|     "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included | ||||
| in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||||
| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| use Masterminds\HTML5\Exception; | ||||
|  | ||||
| class UTF8Utils | ||||
| { | ||||
|     /** | ||||
|      * The Unicode replacement character. | ||||
|      */ | ||||
|     const FFFD = "\xEF\xBF\xBD"; | ||||
|  | ||||
|     /** | ||||
|      * Count the number of characters in a string. | ||||
|      * UTF-8 aware. This will try (in order) iconv, MB, libxml, and finally a custom counter. | ||||
|      * | ||||
|      * @param string $string | ||||
|      * | ||||
|      * @return int | ||||
|      */ | ||||
|     public static function countChars($string) | ||||
|     { | ||||
|         // Get the length for the string we need. | ||||
|         if (function_exists('mb_strlen')) { | ||||
|             return mb_strlen($string, 'utf-8'); | ||||
|         } | ||||
|  | ||||
|         if (function_exists('iconv_strlen')) { | ||||
|             return iconv_strlen($string, 'utf-8'); | ||||
|         } | ||||
|  | ||||
|         if (function_exists('utf8_decode')) { | ||||
|             // MPB: Will this work? Won't certain decodes lead to two chars | ||||
|             // extrapolated out of 2-byte chars? | ||||
|             return strlen(utf8_decode($string)); | ||||
|         } | ||||
|  | ||||
|         $count = count_chars($string); | ||||
|  | ||||
|         // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) | ||||
|         // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) | ||||
|         return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Convert data from the given encoding to UTF-8. | ||||
|      * | ||||
|      * This has not yet been tested with charactersets other than UTF-8. | ||||
|      * It should work with ISO-8859-1/-13 and standard Latin Win charsets. | ||||
|      * | ||||
|      * @param string $data     The data to convert | ||||
|      * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public static function convertToUTF8($data, $encoding = 'UTF-8') | ||||
|     { | ||||
|         /* | ||||
|          * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted | ||||
|          * to Unicode characters for the tokeniser, as described by the rules for that encoding, | ||||
|          * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped | ||||
|          * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes | ||||
|          * in the original byte stream that could not be converted to Unicode characters must be | ||||
|          * converted to U+FFFD REPLACEMENT CHARACTER code points. | ||||
|          */ | ||||
|  | ||||
|         // mb_convert_encoding is chosen over iconv because of a bug. The best | ||||
|         // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643 | ||||
|         // which contains links to the actual but reports as well as work around | ||||
|         // details. | ||||
|         if (function_exists('mb_convert_encoding')) { | ||||
|             // mb library has the following behaviors: | ||||
|             // - UTF-16 surrogates result in false. | ||||
|             // - Overlongs and outside Plane 16 result in empty strings. | ||||
|  | ||||
|             // Before we run mb_convert_encoding we need to tell it what to do with | ||||
|             // characters it does not know. This could be different than the parent | ||||
|             // application executing this library so we store the value, change it | ||||
|             // to our needs, and then change it back when we are done. This feels | ||||
|             // a little excessive and it would be great if there was a better way. | ||||
|             $save = mb_substitute_character(); | ||||
|             mb_substitute_character('none'); | ||||
|             $data = mb_convert_encoding($data, 'UTF-8', $encoding); | ||||
|             mb_substitute_character($save); | ||||
|         } | ||||
|         // @todo Get iconv running in at least some environments if that is possible. | ||||
|         elseif (function_exists('iconv') && 'auto' !== $encoding) { | ||||
|             // fprintf(STDOUT, "iconv found\n"); | ||||
|             // iconv has the following behaviors: | ||||
|             // - Overlong representations are ignored. | ||||
|             // - Beyond Plane 16 is replaced with a lower char. | ||||
|             // - Incomplete sequences generate a warning. | ||||
|             $data = @iconv($encoding, 'UTF-8//IGNORE', $data); | ||||
|         } else { | ||||
|             throw new Exception('Not implemented, please install mbstring or iconv'); | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present. | ||||
|          */ | ||||
|         if ("\xEF\xBB\xBF" === substr($data, 0, 3)) { | ||||
|             $data = substr($data, 3); | ||||
|         } | ||||
|  | ||||
|         return $data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Checks for Unicode code points that are not valid in a document. | ||||
|      * | ||||
|      * @param string $data A string to analyze | ||||
|      * | ||||
|      * @return array An array of (string) error messages produced by the scanning | ||||
|      */ | ||||
|     public static function checkForIllegalCodepoints($data) | ||||
|     { | ||||
|         // Vestigal error handling. | ||||
|         $errors = array(); | ||||
|  | ||||
|         /* | ||||
|          * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs. | ||||
|          * Any occurrences of such characters is a parse error. | ||||
|          */ | ||||
|         for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) { | ||||
|             $errors[] = 'null-character'; | ||||
|         } | ||||
|  | ||||
|         /* | ||||
|          * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F | ||||
|          * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, | ||||
|          * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, | ||||
|          * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, | ||||
|          * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors. | ||||
|          * (These are all control characters or permanently undefined Unicode characters.) | ||||
|          */ | ||||
|         // Check PCRE is loaded. | ||||
|         $count = preg_match_all( | ||||
|             '/(?: | ||||
|         [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B,  U+000E to U+001F and U+007F | ||||
|       | | ||||
|         \xC2[\x80-\x9F] # U+0080 to U+009F | ||||
|       | | ||||
|         \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF | ||||
|       | | ||||
|         \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF | ||||
|       | | ||||
|         \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF | ||||
|       | | ||||
|         [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) | ||||
|       )/x', $data, $matches); | ||||
|         for ($i = 0; $i < $count; ++$i) { | ||||
|             $errors[] = 'invalid-codepoint'; | ||||
|         } | ||||
|  | ||||
|         return $errors; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										1533
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1533
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										553
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										553
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,553 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @file | ||||
|  * The rules for generating output in the serializer. | ||||
|  * | ||||
|  * These output rules are likely to generate output similar to the document that | ||||
|  * was parsed. It is not intended to output exactly the document that was parsed. | ||||
|  */ | ||||
|  | ||||
| namespace Masterminds\HTML5\Serializer; | ||||
|  | ||||
| use Masterminds\HTML5\Elements; | ||||
|  | ||||
| /** | ||||
|  * Generate the output html5 based on element rules. | ||||
|  */ | ||||
| class OutputRules implements RulesInterface | ||||
| { | ||||
|     /** | ||||
|      * Defined in http://www.w3.org/TR/html51/infrastructure.html#html-namespace-0. | ||||
|      */ | ||||
|     const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml'; | ||||
|  | ||||
|     const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML'; | ||||
|  | ||||
|     const NAMESPACE_SVG = 'http://www.w3.org/2000/svg'; | ||||
|  | ||||
|     const NAMESPACE_XLINK = 'http://www.w3.org/1999/xlink'; | ||||
|  | ||||
|     const NAMESPACE_XML = 'http://www.w3.org/XML/1998/namespace'; | ||||
|  | ||||
|     const NAMESPACE_XMLNS = 'http://www.w3.org/2000/xmlns/'; | ||||
|  | ||||
|     /** | ||||
|      * Holds the HTML5 element names that causes a namespace switch. | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $implicitNamespaces = array( | ||||
|         self::NAMESPACE_HTML, | ||||
|         self::NAMESPACE_SVG, | ||||
|         self::NAMESPACE_MATHML, | ||||
|         self::NAMESPACE_XML, | ||||
|         self::NAMESPACE_XMLNS, | ||||
|     ); | ||||
|  | ||||
|     const IM_IN_HTML = 1; | ||||
|  | ||||
|     const IM_IN_SVG = 2; | ||||
|  | ||||
|     const IM_IN_MATHML = 3; | ||||
|  | ||||
|     /** | ||||
|      * Used as cache to detect if is available ENT_HTML5. | ||||
|      * | ||||
|      * @var bool | ||||
|      */ | ||||
|     private $hasHTML5 = false; | ||||
|  | ||||
|     protected $traverser; | ||||
|  | ||||
|     protected $encode = false; | ||||
|  | ||||
|     protected $out; | ||||
|  | ||||
|     protected $outputMode; | ||||
|  | ||||
|     private $xpath; | ||||
|  | ||||
|     protected $nonBooleanAttributes = array( | ||||
|         /* | ||||
|         array( | ||||
|             'nodeNamespace'=>'http://www.w3.org/1999/xhtml', | ||||
|             'attrNamespace'=>'http://www.w3.org/1999/xhtml', | ||||
|  | ||||
|             'nodeName'=>'img', 'nodeName'=>array('img', 'a'), | ||||
|             'attrName'=>'alt', 'attrName'=>array('title', 'alt'), | ||||
|         ), | ||||
|         */ | ||||
|         array( | ||||
|             'nodeNamespace' => 'http://www.w3.org/1999/xhtml', | ||||
|             'attrName' => array('href', | ||||
|                 'hreflang', | ||||
|                 'http-equiv', | ||||
|                 'icon', | ||||
|                 'id', | ||||
|                 'keytype', | ||||
|                 'kind', | ||||
|                 'label', | ||||
|                 'lang', | ||||
|                 'language', | ||||
|                 'list', | ||||
|                 'maxlength', | ||||
|                 'media', | ||||
|                 'method', | ||||
|                 'name', | ||||
|                 'placeholder', | ||||
|                 'rel', | ||||
|                 'rows', | ||||
|                 'rowspan', | ||||
|                 'sandbox', | ||||
|                 'spellcheck', | ||||
|                 'scope', | ||||
|                 'seamless', | ||||
|                 'shape', | ||||
|                 'size', | ||||
|                 'sizes', | ||||
|                 'span', | ||||
|                 'src', | ||||
|                 'srcdoc', | ||||
|                 'srclang', | ||||
|                 'srcset', | ||||
|                 'start', | ||||
|                 'step', | ||||
|                 'style', | ||||
|                 'summary', | ||||
|                 'tabindex', | ||||
|                 'target', | ||||
|                 'title', | ||||
|                 'type', | ||||
|                 'value', | ||||
|                 'width', | ||||
|                 'border', | ||||
|                 'charset', | ||||
|                 'cite', | ||||
|                 'class', | ||||
|                 'code', | ||||
|                 'codebase', | ||||
|                 'color', | ||||
|                 'cols', | ||||
|                 'colspan', | ||||
|                 'content', | ||||
|                 'coords', | ||||
|                 'data', | ||||
|                 'datetime', | ||||
|                 'default', | ||||
|                 'dir', | ||||
|                 'dirname', | ||||
|                 'enctype', | ||||
|                 'for', | ||||
|                 'form', | ||||
|                 'formaction', | ||||
|                 'headers', | ||||
|                 'height', | ||||
|                 'accept', | ||||
|                 'accept-charset', | ||||
|                 'accesskey', | ||||
|                 'action', | ||||
|                 'align', | ||||
|                 'alt', | ||||
|                 'bgcolor', | ||||
|             ), | ||||
|         ), | ||||
|         array( | ||||
|             'nodeNamespace' => 'http://www.w3.org/1999/xhtml', | ||||
|             'xpath' => 'starts-with(local-name(), \'data-\')', | ||||
|         ), | ||||
|     ); | ||||
|  | ||||
|     const DOCTYPE = '<!DOCTYPE html>'; | ||||
|  | ||||
|     public function __construct($output, $options = array()) | ||||
|     { | ||||
|         if (isset($options['encode_entities'])) { | ||||
|             $this->encode = $options['encode_entities']; | ||||
|         } | ||||
|  | ||||
|         $this->outputMode = static::IM_IN_HTML; | ||||
|         $this->out = $output; | ||||
|         $this->hasHTML5 = defined('ENT_HTML5'); | ||||
|     } | ||||
|  | ||||
|     public function addRule(array $rule) | ||||
|     { | ||||
|         $this->nonBooleanAttributes[] = $rule; | ||||
|     } | ||||
|  | ||||
|     public function setTraverser(Traverser $traverser) | ||||
|     { | ||||
|         $this->traverser = $traverser; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function unsetTraverser() | ||||
|     { | ||||
|         $this->traverser = null; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function document($dom) | ||||
|     { | ||||
|         $this->doctype(); | ||||
|         if ($dom->documentElement) { | ||||
|             foreach ($dom->childNodes as $node) { | ||||
|                 $this->traverser->node($node); | ||||
|             } | ||||
|             $this->nl(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function doctype() | ||||
|     { | ||||
|         $this->wr(static::DOCTYPE); | ||||
|         $this->nl(); | ||||
|     } | ||||
|  | ||||
|     public function element($ele) | ||||
|     { | ||||
|         $name = $ele->tagName; | ||||
|  | ||||
|         // Per spec: | ||||
|         // If the element has a declared namespace in the HTML, MathML or | ||||
|         // SVG namespaces, we use the lname instead of the tagName. | ||||
|         if ($this->traverser->isLocalElement($ele)) { | ||||
|             $name = $ele->localName; | ||||
|         } | ||||
|  | ||||
|         // If we are in SVG or MathML there is special handling. | ||||
|         // Using if/elseif instead of switch because it's faster in PHP. | ||||
|         if ('svg' == $name) { | ||||
|             $this->outputMode = static::IM_IN_SVG; | ||||
|             $name = Elements::normalizeSvgElement($name); | ||||
|         } elseif ('math' == $name) { | ||||
|             $this->outputMode = static::IM_IN_MATHML; | ||||
|         } | ||||
|  | ||||
|         $this->openTag($ele); | ||||
|         if (Elements::isA($name, Elements::TEXT_RAW)) { | ||||
|             foreach ($ele->childNodes as $child) { | ||||
|                 if ($child instanceof \DOMCharacterData) { | ||||
|                     $this->wr($child->data); | ||||
|                 } elseif ($child instanceof \DOMElement) { | ||||
|                     $this->element($child); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             // Handle children. | ||||
|             if ($ele->hasChildNodes()) { | ||||
|                 $this->traverser->children($ele->childNodes); | ||||
|             } | ||||
|  | ||||
|             // Close out the SVG or MathML special handling. | ||||
|             if ('svg' == $name || 'math' == $name) { | ||||
|                 $this->outputMode = static::IM_IN_HTML; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // If not unary, add a closing tag. | ||||
|         if (!Elements::isA($name, Elements::VOID_TAG)) { | ||||
|             $this->closeTag($ele); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write a text node. | ||||
|      * | ||||
|      * @param \DOMText $ele The text node to write. | ||||
|      */ | ||||
|     public function text($ele) | ||||
|     { | ||||
|         if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) { | ||||
|             $this->wr($ele->data); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // FIXME: This probably needs some flags set. | ||||
|         $this->wr($this->enc($ele->data)); | ||||
|     } | ||||
|  | ||||
|     public function cdata($ele) | ||||
|     { | ||||
|         // This encodes CDATA. | ||||
|         $this->wr($ele->ownerDocument->saveXML($ele)); | ||||
|     } | ||||
|  | ||||
|     public function comment($ele) | ||||
|     { | ||||
|         // These produce identical output. | ||||
|         // $this->wr('<!--')->wr($ele->data)->wr('-->'); | ||||
|         $this->wr($ele->ownerDocument->saveXML($ele)); | ||||
|     } | ||||
|  | ||||
|     public function processorInstruction($ele) | ||||
|     { | ||||
|         $this->wr('<?') | ||||
|             ->wr($ele->target) | ||||
|             ->wr(' ') | ||||
|             ->wr($ele->data) | ||||
|             ->wr('?>'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write the namespace attributes. | ||||
|      * | ||||
|      * @param \DOMNode $ele The element being written. | ||||
|      */ | ||||
|     protected function namespaceAttrs($ele) | ||||
|     { | ||||
|         if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) { | ||||
|             $this->xpath = new \DOMXPath($ele->ownerDocument); | ||||
|         } | ||||
|  | ||||
|         foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) { | ||||
|             if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { | ||||
|                 $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write the opening tag. | ||||
|      * | ||||
|      * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the | ||||
|      * qualified name (8.3). | ||||
|      * | ||||
|      * @param \DOMNode $ele The element being written. | ||||
|      */ | ||||
|     protected function openTag($ele) | ||||
|     { | ||||
|         $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName); | ||||
|  | ||||
|         $this->attrs($ele); | ||||
|         $this->namespaceAttrs($ele); | ||||
|  | ||||
|         if ($this->outputMode == static::IM_IN_HTML) { | ||||
|             $this->wr('>'); | ||||
|         }         // If we are not in html mode we are in SVG, MathML, or XML embedded content. | ||||
|         else { | ||||
|             if ($ele->hasChildNodes()) { | ||||
|                 $this->wr('>'); | ||||
|             }             // If there are no children this is self closing. | ||||
|             else { | ||||
|                 $this->wr(' />'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function attrs($ele) | ||||
|     { | ||||
|         // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements. | ||||
|         if (!$ele->hasAttributes()) { | ||||
|             return $this; | ||||
|         } | ||||
|  | ||||
|         // TODO: Currently, this always writes name="value", and does not do | ||||
|         // value-less attributes. | ||||
|         $map = $ele->attributes; | ||||
|         $len = $map->length; | ||||
|         for ($i = 0; $i < $len; ++$i) { | ||||
|             $node = $map->item($i); | ||||
|             $val = $this->enc($node->value, true); | ||||
|  | ||||
|             // XXX: The spec says that we need to ensure that anything in | ||||
|             // the XML, XMLNS, or XLink NS's should use the canonical | ||||
|             // prefix. It seems that DOM does this for us already, but there | ||||
|             // may be exceptions. | ||||
|             $name = $node->nodeName; | ||||
|  | ||||
|             // Special handling for attributes in SVG and MathML. | ||||
|             // Using if/elseif instead of switch because it's faster in PHP. | ||||
|             if ($this->outputMode == static::IM_IN_SVG) { | ||||
|                 $name = Elements::normalizeSvgAttribute($name); | ||||
|             } elseif ($this->outputMode == static::IM_IN_MATHML) { | ||||
|                 $name = Elements::normalizeMathMlAttribute($name); | ||||
|             } | ||||
|  | ||||
|             $this->wr(' ')->wr($name); | ||||
|  | ||||
|             if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) { | ||||
|                 $this->wr('="')->wr($val)->wr('"'); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected function nonBooleanAttribute(\DOMAttr $attr) | ||||
|     { | ||||
|         $ele = $attr->ownerElement; | ||||
|         foreach ($this->nonBooleanAttributes as $rule) { | ||||
|             if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (isset($rule['xpath'])) { | ||||
|                 $xp = $this->getXPath($attr); | ||||
|                 if (isset($rule['prefixes'])) { | ||||
|                     foreach ($rule['prefixes'] as $nsPrefix => $ns) { | ||||
|                         $xp->registerNamespace($nsPrefix, $ns); | ||||
|                     } | ||||
|                 } | ||||
|                 if (!$xp->evaluate($rule['xpath'], $attr)) { | ||||
|                     continue; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     private function getXPath(\DOMNode $node) | ||||
|     { | ||||
|         if (!$this->xpath) { | ||||
|             $this->xpath = new \DOMXPath($node->ownerDocument); | ||||
|         } | ||||
|  | ||||
|         return $this->xpath; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write the closing tag. | ||||
|      * | ||||
|      * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the | ||||
|      * qualified name (8.3). | ||||
|      * | ||||
|      * @param \DOMNode $ele The element being written. | ||||
|      */ | ||||
|     protected function closeTag($ele) | ||||
|     { | ||||
|         if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) { | ||||
|             $this->wr('</')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write to the output. | ||||
|      * | ||||
|      * @param string $text The string to put into the output | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     protected function wr($text) | ||||
|     { | ||||
|         fwrite($this->out, $text); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Write a new line character. | ||||
|      * | ||||
|      * @return $this | ||||
|      */ | ||||
|     protected function nl() | ||||
|     { | ||||
|         fwrite($this->out, PHP_EOL); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Encode text. | ||||
|      * | ||||
|      * When encode is set to false, the default value, the text passed in is | ||||
|      * escaped per section 8.3 of the html5 spec. For details on how text is | ||||
|      * escaped see the escape() method. | ||||
|      * | ||||
|      * When encoding is set to true the text is converted to named character | ||||
|      * references where appropriate. Section 8.1.4 Character references of the | ||||
|      * html5 spec refers to using named character references. This is useful for | ||||
|      * characters that can't otherwise legally be used in the text. | ||||
|      * | ||||
|      * The named character references are listed in section 8.5. | ||||
|      * | ||||
|      * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities. | ||||
|      *      This includes such characters as +.# and many other common ones. By default | ||||
|      *      encoding here will just escape &'<>". | ||||
|      * | ||||
|      *      Note, PHP 5.4+ has better html5 encoding. | ||||
|      * | ||||
|      * @todo Use the Entities class in php 5.3 to have html5 entities. | ||||
|      * | ||||
|      * @param string $text      Text to encode. | ||||
|      * @param bool   $attribute True if we are encoding an attrubute, false otherwise. | ||||
|      * | ||||
|      * @return string The encoded text. | ||||
|      */ | ||||
|     protected function enc($text, $attribute = false) | ||||
|     { | ||||
|         // Escape the text rather than convert to named character references. | ||||
|         if (!$this->encode) { | ||||
|             return $this->escape($text, $attribute); | ||||
|         } | ||||
|  | ||||
|         // If we are in PHP 5.4+ we can use the native html5 entity functionality to | ||||
|         // convert the named character references. | ||||
|  | ||||
|         if ($this->hasHTML5) { | ||||
|             return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false); | ||||
|         }         // If a version earlier than 5.4 html5 entities are not entirely handled. | ||||
|         // This manually handles them. | ||||
|         else { | ||||
|             return strtr($text, HTML5Entities::$map); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Escape test. | ||||
|      * | ||||
|      * According to the html5 spec section 8.3 Serializing HTML fragments, text | ||||
|      * within tags that are not style, script, xmp, iframe, noembed, and noframes | ||||
|      * need to be properly escaped. | ||||
|      * | ||||
|      * The & should be converted to &, no breaking space unicode characters | ||||
|      * converted to  , when in attribute mode the " should be converted to | ||||
|      * ", and when not in attribute mode the < and > should be converted to | ||||
|      * < and >. | ||||
|      * | ||||
|      * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString | ||||
|      * | ||||
|      * @param string $text      Text to escape. | ||||
|      * @param bool   $attribute True if we are escaping an attrubute, false otherwise. | ||||
|      */ | ||||
|     protected function escape($text, $attribute = false) | ||||
|     { | ||||
|         // Not using htmlspecialchars because, while it does escaping, it doesn't | ||||
|         // match the requirements of section 8.5. For example, it doesn't handle | ||||
|         // non-breaking spaces. | ||||
|         if ($attribute) { | ||||
|             $replace = array( | ||||
|                 '"' => '"', | ||||
|                 '&' => '&', | ||||
|                 "\xc2\xa0" => ' ', | ||||
|             ); | ||||
|         } else { | ||||
|             $replace = array( | ||||
|                 '<' => '<', | ||||
|                 '>' => '>', | ||||
|                 '&' => '&', | ||||
|                 "\xc2\xa0" => ' ', | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         return strtr($text, $replace); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/README.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # The Serializer (Writer) Model | ||||
|  | ||||
| The serializer roughly follows sections _8.1 Writing HTML documents_ and section | ||||
| _8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment, | ||||
| and DOMNodeList into HTML5. | ||||
|  | ||||
|        [ HTML5 ]   // Interface for saving. | ||||
|           || | ||||
|      [ Traverser ]   // Walk the DOM | ||||
|           || | ||||
|        [ Rules ]     // Convert DOM elements into strings. | ||||
|           || | ||||
|        [ HTML5 ]     // HTML5 document or fragment in text. | ||||
|  | ||||
|  | ||||
| ## HTML5 Class | ||||
|  | ||||
| Provides the top level interface for saving. | ||||
|  | ||||
| ## The Traverser | ||||
|  | ||||
| Walks the DOM finding each element and passing it off to the output rules to | ||||
| convert to HTML5. | ||||
|  | ||||
| ## Output Rules | ||||
|  | ||||
| The output rules are defined in the RulesInterface which can have multiple | ||||
| implementations. Currently, the OutputRules is the default implementation that | ||||
| converts a DOM as is into HTML5. | ||||
|  | ||||
| ## HTML5 String | ||||
|  | ||||
| The output of the process it HTML5 as a string or saved to a file. | ||||
							
								
								
									
										99
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| <?php | ||||
| /** | ||||
|  * @file | ||||
|  * The interface definition for Rules to generate output. | ||||
|  */ | ||||
|  | ||||
| namespace Masterminds\HTML5\Serializer; | ||||
|  | ||||
| /** | ||||
|  * To create a new rule set for writing output the RulesInterface needs to be implemented. | ||||
|  * The resulting class can be specified in the options with the key of rules. | ||||
|  * | ||||
|  * For an example implementation see Serializer\OutputRules. | ||||
|  */ | ||||
| interface RulesInterface | ||||
| { | ||||
|     /** | ||||
|      * The class constructor. | ||||
|      * | ||||
|      * Note, before the rules can be used a traverser must be registered. | ||||
|      * | ||||
|      * @param mixed $output  The output stream to write output to. | ||||
|      * @param array $options An array of options. | ||||
|      */ | ||||
|     public function __construct($output, $options = array()); | ||||
|  | ||||
|     /** | ||||
|      * Register the traverser used in but the rules. | ||||
|      * | ||||
|      * Note, only one traverser can be used by the rules. | ||||
|      * | ||||
|      * @param Traverser $traverser The traverser used in the rules. | ||||
|      * | ||||
|      * @return RulesInterface $this for the current object. | ||||
|      */ | ||||
|     public function setTraverser(Traverser $traverser); | ||||
|  | ||||
|     /** | ||||
|      * Write a document element (\DOMDocument). | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param \DOMDocument $dom | ||||
|      */ | ||||
|     public function document($dom); | ||||
|  | ||||
|     /** | ||||
|      * Write an element. | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param mixed $ele | ||||
|      */ | ||||
|     public function element($ele); | ||||
|  | ||||
|     /** | ||||
|      * Write a text node. | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param mixed $ele | ||||
|      */ | ||||
|     public function text($ele); | ||||
|  | ||||
|     /** | ||||
|      * Write a CDATA node. | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param mixed $ele | ||||
|      */ | ||||
|     public function cdata($ele); | ||||
|  | ||||
|     /** | ||||
|      * Write a comment node. | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param mixed $ele | ||||
|      */ | ||||
|     public function comment($ele); | ||||
|  | ||||
|     /** | ||||
|      * Write a processor instruction. | ||||
|      * | ||||
|      * To learn about processor instructions see InstructionProcessor | ||||
|      * | ||||
|      * Instead of returning the result write it to the output stream ($output) | ||||
|      * that was passed into the constructor. | ||||
|      * | ||||
|      * @param mixed $ele | ||||
|      */ | ||||
|     public function processorInstruction($ele); | ||||
| } | ||||
							
								
								
									
										142
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Masterminds\HTML5\Serializer; | ||||
|  | ||||
| /** | ||||
|  * Traverser for walking a DOM tree. | ||||
|  * | ||||
|  * This is a concrete traverser designed to convert a DOM tree into an | ||||
|  * HTML5 document. It is not intended to be a generic DOMTreeWalker | ||||
|  * implementation. | ||||
|  * | ||||
|  * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments | ||||
|  */ | ||||
| class Traverser | ||||
| { | ||||
|     /** | ||||
|      * Namespaces that should be treated as "local" to HTML5. | ||||
|      */ | ||||
|     protected static $local_ns = array( | ||||
|         'http://www.w3.org/1999/xhtml' => 'html', | ||||
|         'http://www.w3.org/1998/Math/MathML' => 'math', | ||||
|         'http://www.w3.org/2000/svg' => 'svg', | ||||
|     ); | ||||
|  | ||||
|     protected $dom; | ||||
|  | ||||
|     protected $options; | ||||
|  | ||||
|     protected $encode = false; | ||||
|  | ||||
|     protected $rules; | ||||
|  | ||||
|     protected $out; | ||||
|  | ||||
|     /** | ||||
|      * Create a traverser. | ||||
|      * | ||||
|      * @param \DOMNode|\DOMNodeList $dom     The document or node to traverse. | ||||
|      * @param resource              $out     A stream that allows writing. The traverser will output into this | ||||
|      *                                       stream. | ||||
|      * @param array                 $options An array of options for the traverser as key/value pairs. These include: | ||||
|      *                                       - encode_entities: A bool to specify if full encding should happen for all named | ||||
|      *                                       charachter references. Defaults to false which escapes &'<>". | ||||
|      *                                       - output_rules: The path to the class handling the output rules. | ||||
|      */ | ||||
|     public function __construct($dom, $out, RulesInterface $rules, $options = array()) | ||||
|     { | ||||
|         $this->dom = $dom; | ||||
|         $this->out = $out; | ||||
|         $this->rules = $rules; | ||||
|         $this->options = $options; | ||||
|  | ||||
|         $this->rules->setTraverser($this); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Tell the traverser to walk the DOM. | ||||
|      * | ||||
|      * @return resource $out Returns the output stream. | ||||
|      */ | ||||
|     public function walk() | ||||
|     { | ||||
|         if ($this->dom instanceof \DOMDocument) { | ||||
|             $this->rules->document($this->dom); | ||||
|         } elseif ($this->dom instanceof \DOMDocumentFragment) { | ||||
|             // Document fragments are a special case. Only the children need to | ||||
|             // be serialized. | ||||
|             if ($this->dom->hasChildNodes()) { | ||||
|                 $this->children($this->dom->childNodes); | ||||
|             } | ||||
|         }        // If NodeList, loop | ||||
|         elseif ($this->dom instanceof \DOMNodeList) { | ||||
|             // If this is a NodeList of DOMDocuments this will not work. | ||||
|             $this->children($this->dom); | ||||
|         }         // Else assume this is a DOMNode-like datastructure. | ||||
|         else { | ||||
|             $this->node($this->dom); | ||||
|         } | ||||
|  | ||||
|         return $this->out; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Process a node in the DOM. | ||||
|      * | ||||
|      * @param mixed $node A node implementing \DOMNode. | ||||
|      */ | ||||
|     public function node($node) | ||||
|     { | ||||
|         // A listing of types is at http://php.net/manual/en/dom.constants.php | ||||
|         switch ($node->nodeType) { | ||||
|             case XML_ELEMENT_NODE: | ||||
|                 $this->rules->element($node); | ||||
|                 break; | ||||
|             case XML_TEXT_NODE: | ||||
|                 $this->rules->text($node); | ||||
|                 break; | ||||
|             case XML_CDATA_SECTION_NODE: | ||||
|                 $this->rules->cdata($node); | ||||
|                 break; | ||||
|             case XML_PI_NODE: | ||||
|                 $this->rules->processorInstruction($node); | ||||
|                 break; | ||||
|             case XML_COMMENT_NODE: | ||||
|                 $this->rules->comment($node); | ||||
|                 break; | ||||
|             // Currently we don't support embedding DTDs. | ||||
|             default: | ||||
|                 //print '<!-- Skipped -->'; | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Walk through all the nodes on a node list. | ||||
|      * | ||||
|      * @param \DOMNodeList $nl A list of child elements to walk through. | ||||
|      */ | ||||
|     public function children($nl) | ||||
|     { | ||||
|         foreach ($nl as $node) { | ||||
|             $this->node($node); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is an element local? | ||||
|      * | ||||
|      * @param mixed $ele An element that implement \DOMNode. | ||||
|      * | ||||
|      * @return bool true if local and false otherwise. | ||||
|      */ | ||||
|     public function isLocalElement($ele) | ||||
|     { | ||||
|         $uri = $ele->namespaceURI; | ||||
|         if (empty($uri)) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return isset(static::$local_ns[$uri]); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 RafficMohammed
					RafficMohammed