Browse Source

Added element interface algorithm to Inner\Document.

master
Dustin Wilson 2 years ago
parent
commit
6383971fcb
  1. 2
      README.md
  2. 2
      composer.json
  3. 201
      composer.lock
  4. 13
      lib/HTMLElement/HTMLPreElement.php
  5. 0
      lib/HTMLElement/HTMLTemplateElement.php
  6. 13
      lib/HTMLElement/HTMLUnknownElement.php
  7. 49
      lib/Inner/Document.php
  8. 13
      vendor-bin/phpunit/composer.lock
  9. 105
      vendor-bin/robo/composer.lock

2
README.md

@ -56,4 +56,4 @@ The primary aim of this library is accuracy. However, due either to limitations
10. This implementation will not implement the `NodeIterator` and `TreeWalker` APIs. They are horribly conceived and impractical APIs that few people actually use because it's literally easier and faster to write recursive loops to walk through the DOM than it is to use those APIs. Walking downward through the tree has been replaced with the `ParentNode::walk` generator, and walking through adjacent children and moonwalking up the DOM tree can be accomplished through simple while or do/while loops.
11. All of the `Range` APIs will also not be implemented due to the sheer complexity of creating them in userland and how it adds undue difficulty to node manipulation in the "core" DOM. Numerous operations reference in excrutiating detail what to do with Ranges when manipulating nodes and would have to be added here to be compliant or mostly so -- slowing everything else down in the process on an already extremely front-heavy library.
12. The `DOMParser` and `XMLSerializer` APIs will not be implemented because they are ridiculous and limited in their scope. For instance, `DOMParser::parseFromString` won't set a document's character set to anything but UTF-8. This library needs to be able to print to other encodings due to the nature of how it is used. `Document::__construct` will accept optional `$source` and `$charset` arguments, and there are both `Document::load` and `Document::loadFile` methods for loading DOM from a string or a file respectively.
13. Aside from `HTMLElement`, `HTMLTemplateElement`, `MathMLElement`, and `SVGElement` none of the specific derived element classes (such as `HTMLAnchorElement` or `SVGSVGElement`) are implemented. The focus on this library will be on the core DOM before moving onto those. They may or may not be implemented in the future.
13. Aside from `HTMLElement`, `HTMLPreElement`, `HTMLTemplateElement`, `HTMLUnknownElement`, `MathMLElement`, and `SVGElement` none of the specific derived element classes (such as `HTMLAnchorElement` or `SVGSVGElement`) are implemented. The ones listed before are required for the element interface algorithm. The focus on this library will be on the core DOM before moving onto those -- if ever.

2
composer.json

@ -36,7 +36,7 @@
"psr-4": {
"MensBeam\\HTML\\DOM\\": [
"lib/",
"lib/traits"
"lib/HTMLElement"
]
}
},

201
composer.lock

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "6ed06e9556bdcc4bbbb5f3f23958e33d",
"content-hash": "4b0a0f229fb9d31f3fc5023f247b9990",
"packages": [
{
"name": "mensbeam/framework",
@ -63,7 +63,7 @@
"source": {
"type": "git",
"url": "mensbeam-gitea:MensBeam/HTML-Parser.git",
"reference": "afaf10d602ee04d7eba437d3a08ef10ebef4f5b0"
"reference": "f33cc4344bf0138bed059af80cf896adcf4ee06d"
},
"require": {
"ext-dom": "*",
@ -130,7 +130,7 @@
"parsing",
"whatwg"
],
"time": "2021-11-22T01:55:09+00:00"
"time": "2021-11-29T18:54:16+00:00"
},
{
"name": "mensbeam/intl",
@ -293,16 +293,16 @@
},
{
"name": "symfony/css-selector",
"version": "v5.3.4",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
"reference": "7fb120adc7f600a59027775b224c13a33530dd90"
"reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90",
"reference": "7fb120adc7f600a59027775b224c13a33530dd90",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/44b933f98bb4b5220d10bed9ce5662f8c2d13dcc",
"reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc",
"shasum": ""
},
"require": {
@ -339,7 +339,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/css-selector/tree/v5.3.4"
"source": "https://github.com/symfony/css-selector/tree/v5.4.0"
},
"funding": [
{
@ -355,7 +355,7 @@
"type": "tidelift"
}
],
"time": "2021-07-21T12:38:00+00:00"
"time": "2021-09-09T08:06:01+00:00"
},
{
"name": "symfony/polyfill-php80",
@ -1107,16 +1107,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.13.1",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd"
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd",
"reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
@ -1157,28 +1157,33 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-03T20:52:16+00:00"
"time": "2021-11-30T19:35:32+00:00"
},
{
"name": "psr/container",
"version": "1.1.2",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"shasum": ""
},
"require": {
"php": ">=7.4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
@ -1205,9 +1210,9 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.2"
"source": "https://github.com/php-fig/container/tree/2.0.2"
},
"time": "2021-11-05T16:50:12+00:00"
"time": "2021-11-05T16:47:00+00:00"
},
{
"name": "psr/http-client",
@ -1440,28 +1445,29 @@
},
{
"name": "symfony/console",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "3e7ab8f5905058984899b05a4648096f558bfeba"
"reference": "ec3661faca1d110d6c307e124b44f99ac54179e3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/3e7ab8f5905058984899b05a4648096f558bfeba",
"reference": "3e7ab8f5905058984899b05a4648096f558bfeba",
"url": "https://api.github.com/repos/symfony/console/zipball/ec3661faca1d110d6c307e124b44f99ac54179e3",
"reference": "ec3661faca1d110d6c307e124b44f99ac54179e3",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php73": "^1.8",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1|^2",
"symfony/string": "^5.1"
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/string": "^5.1|^6.0"
},
"conflict": {
"psr/log": ">=3",
"symfony/dependency-injection": "<4.4",
"symfony/dotenv": "<5.1",
"symfony/event-dispatcher": "<4.4",
@ -1473,12 +1479,12 @@
},
"require-dev": {
"psr/log": "^1|^2",
"symfony/config": "^4.4|^5.0",
"symfony/dependency-injection": "^4.4|^5.0",
"symfony/event-dispatcher": "^4.4|^5.0",
"symfony/lock": "^4.4|^5.0",
"symfony/process": "^4.4|^5.0",
"symfony/var-dumper": "^4.4|^5.0"
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/event-dispatcher": "^4.4|^5.0|^6.0",
"symfony/lock": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
@ -1518,7 +1524,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.3.11"
"source": "https://github.com/symfony/console/tree/v5.4.0"
},
"funding": [
{
@ -1534,7 +1540,7 @@
"type": "tidelift"
}
],
"time": "2021-11-21T19:41:05+00:00"
"time": "2021-11-29T15:30:56+00:00"
},
{
"name": "symfony/deprecation-contracts",
@ -1605,29 +1611,29 @@
},
{
"name": "symfony/http-foundation",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc"
"reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc",
"reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/5ef86ac7927d2de08dc1e26eb91325f9ccbe6309",
"reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.1",
"symfony/polyfill-php80": "^1.16"
},
"require-dev": {
"predis/predis": "~1.0",
"symfony/cache": "^4.4|^5.0",
"symfony/expression-language": "^4.4|^5.0",
"symfony/mime": "^4.4|^5.0"
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/mime": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/mime": "To use the file extension guesser"
@ -1658,7 +1664,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.3.11"
"source": "https://github.com/symfony/http-foundation/tree/v5.4.0"
},
"funding": [
{
@ -1674,25 +1680,25 @@
"type": "tidelift"
}
],
"time": "2021-11-04T16:37:19+00:00"
"time": "2021-11-28T15:25:38+00:00"
},
{
"name": "symfony/mime",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "dffc0684f10526db12c52fcd6238c64695426d61"
"reference": "d4365000217b67c01acff407573906ff91bcfb34"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61",
"reference": "dffc0684f10526db12c52fcd6238c64695426d61",
"url": "https://api.github.com/repos/symfony/mime/zipball/d4365000217b67c01acff407573906ff91bcfb34",
"reference": "d4365000217b67c01acff407573906ff91bcfb34",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php80": "^1.16"
@ -1706,10 +1712,10 @@
"require-dev": {
"egulias/email-validator": "^2.1.10|^3.1",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^4.4|^5.0",
"symfony/property-access": "^4.4|^5.1",
"symfony/property-info": "^4.4|^5.1",
"symfony/serializer": "^5.2"
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/property-access": "^4.4|^5.1|^6.0",
"symfony/property-info": "^4.4|^5.1|^6.0",
"symfony/serializer": "^5.2|^6.0"
},
"type": "library",
"autoload": {
@ -1741,7 +1747,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v5.3.11"
"source": "https://github.com/symfony/mime/tree/v5.4.0"
},
"funding": [
{
@ -1757,7 +1763,7 @@
"type": "tidelift"
}
],
"time": "2021-11-20T16:42:42+00:00"
"time": "2021-11-23T10:19:22+00:00"
},
{
"name": "symfony/polyfill-ctype",
@ -2414,16 +2420,16 @@
},
{
"name": "symfony/process",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "6c99204de85d04ca17f16c466fc61896960b0636"
"reference": "5be20b3830f726e019162b26223110c8f47cf274"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/6c99204de85d04ca17f16c466fc61896960b0636",
"reference": "6c99204de85d04ca17f16c466fc61896960b0636",
"url": "https://api.github.com/repos/symfony/process/zipball/5be20b3830f726e019162b26223110c8f47cf274",
"reference": "5be20b3830f726e019162b26223110c8f47cf274",
"shasum": ""
},
"require": {
@ -2456,7 +2462,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v5.3.11"
"source": "https://github.com/symfony/process/tree/v5.4.0"
},
"funding": [
{
@ -2472,26 +2478,25 @@
"type": "tidelift"
}
],
"time": "2021-11-17T12:16:12+00:00"
"time": "2021-11-28T15:25:38+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v2.5.0",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc"
"reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
"reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/36715ebf9fb9db73db0cb24263c79077c6fe8603",
"reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/container": "^1.1",
"symfony/deprecation-contracts": "^2.1"
"php": ">=8.0.2",
"psr/container": "^2.0"
},
"conflict": {
"ext-psr": "<1.1|>=2"
@ -2502,7 +2507,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
"dev-main": "3.0-dev"
},
"thanks": {
"name": "symfony/contracts",
@ -2539,7 +2544,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.0"
"source": "https://github.com/symfony/service-contracts/tree/v3.0.0"
},
"funding": [
{
@ -2555,35 +2560,37 @@
"type": "tidelift"
}
],
"time": "2021-11-04T16:48:04+00:00"
"time": "2021-11-04T17:53:12+00:00"
},
{
"name": "symfony/string",
"version": "v5.3.10",
"version": "v6.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
"reference": "ba727797426af0f587f4800566300bdc0cda0777"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777",
"reference": "ba727797426af0f587f4800566300bdc0cda0777",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.0.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "~1.15"
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"symfony/translation-contracts": "<2.0"
},
"require-dev": {
"symfony/error-handler": "^4.4|^5.0",
"symfony/http-client": "^4.4|^5.0",
"symfony/translation-contracts": "^1.1|^2",
"symfony/var-exporter": "^4.4|^5.0"
"symfony/error-handler": "^5.4|^6.0",
"symfony/http-client": "^5.4|^6.0",
"symfony/translation-contracts": "^2.0|^3.0",
"symfony/var-exporter": "^5.4|^6.0"
},
"type": "library",
"autoload": {
@ -2622,7 +2629,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.3.10"
"source": "https://github.com/symfony/string/tree/v6.0.0"
},
"funding": [
{
@ -2638,32 +2645,32 @@
"type": "tidelift"
}
],
"time": "2021-10-27T18:21:46+00:00"
"time": "2021-10-29T07:35:21+00:00"
},
{
"name": "symfony/yaml",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "226638aa877bc4104e619a15f27d8141cd6b4e4a"
"reference": "034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/226638aa877bc4104e619a15f27d8141cd6b4e4a",
"reference": "226638aa877bc4104e619a15f27d8141cd6b4e4a",
"url": "https://api.github.com/repos/symfony/yaml/zipball/034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc",
"reference": "034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1",
"symfony/polyfill-ctype": "~1.8"
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"symfony/console": "<4.4"
"symfony/console": "<5.3"
},
"require-dev": {
"symfony/console": "^4.4|^5.0"
"symfony/console": "^5.3|^6.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
@ -2697,7 +2704,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/yaml/tree/v5.3.11"
"source": "https://github.com/symfony/yaml/tree/v5.4.0"
},
"funding": [
{
@ -2713,7 +2720,7 @@
"type": "tidelift"
}
],
"time": "2021-11-20T16:42:42+00:00"
"time": "2021-11-28T15:25:38+00:00"
},
{
"name": "webuni/front-matter",
@ -2797,7 +2804,7 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=8.0",
"php": ">=8.0.2",
"ext-dom": "*"
},
"platform-dev": [],

13
lib/HTMLElement/HTMLPreElement.php

@ -0,0 +1,13 @@
<?php
/**
* @license MIT
* Copyright 2017 Dustin Wilson, J. King, et al.
* See LICENSE and AUTHORS files for details
*/
declare(strict_types=1);
namespace MensBeam\HTML\DOM;
use MensBeam\HTML\DOM\Inner\Reflection;
class HTMLPreElement extends HTMLElement {}

0
lib/HTMLTemplateElement.php → lib/HTMLElement/HTMLTemplateElement.php

13
lib/HTMLElement/HTMLUnknownElement.php

@ -0,0 +1,13 @@
<?php
/**
* @license MIT
* Copyright 2017 Dustin Wilson, J. King, et al.
* See LICENSE and AUTHORS files for details
*/
declare(strict_types=1);
namespace MensBeam\HTML\DOM;
use MensBeam\HTML\DOM\Inner\Reflection;
class HTMLUnknownElement extends HTMLElement {}

49
lib/Inner/Document.php

@ -22,6 +22,7 @@ class Document extends \DOMDocument {
// Used for validation. Not sure where to put them where they wouldn't be
// exposed unnecessarily to the public API.
public const NAME_PRODUCTION_REGEX = '/^[:A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}][:A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*$/Su';
public const POTENTIAL_CUSTOM_ELEMENT_NAME_REGEX = '/^[a-z][a-z0-9-\._\x{B7}\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{203F}-\x{2040}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]*-[a-z0-9-\._\x{B7}\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{203F}-\x{2040}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]*$/Su';
public const QNAME_PRODUCTION_REGEX = '/^([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}][A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*:)?[A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}][A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*$/Su';
protected NodeCache $nodeCache;
@ -84,11 +85,55 @@ class Document extends \DOMDocument {
} elseif ($node instanceof \DOMElement) {
$namespace = $node->namespaceURI;
if ($namespace === null) {
if ($node->nodeName === 'template') {
# The element interface for an element with name name in the HTML namespace is
# determined as follows:
$name = $node->nodeName;
# If name is applet, bgsound, blink, isindex, keygen, multicol, nextid, or
# spacer, then return HTMLUnknownElement.
if (in_array($name, [ 'applet', 'bgsound', 'blink', 'isindex', 'keygen', 'multicol', 'nextid', 'spacer' ])) {
$className = 'HTMLUnknownElement';
}
# If name is acronym, basefont, big, center, nobr, noembed, noframes, plaintext, rb, rtc, strike, or tt, then return HTMLElement.
elseif (in_array($name, [ 'acronym', 'basefont', 'big', 'center', 'nobr', 'noembed', 'noframes', 'plaintext', 'rb', 'rtc', 'strike', 'tt' ])) {
$className = 'HTMLElement';
}
# If name is listing or xmp, then return HTMLPreElement.
elseif (in_array($name, [ 'listing', 'xmp' ])) {
$className = 'HTMLPreElement';
}
# Otherwise, if this specification defines an interface appropriate for the element type corresponding to the local name name, then return that interface.
# If other applicable specifications define an appropriate interface for name, then return the interface they define.
elseif ($name === 'pre') {
$className = 'HTMLPreElement';
} elseif ($name === 'template') {
$className = 'HTMLTemplateElement';
} else {
}
// This is done until we do element classes
elseif (in_array($name, [ 'a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'i', 'iframe', 'img', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'math', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'portal', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'svg', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr' ])) {
$className = 'HTMLElement';
}
# If name is a valid custom element name, then return HTMLElement.
# A valid custom element name is a sequence of characters name that meets all of
# the following requirements:
# • name must match the PotentialCustomElementName production:
# • name must not be any of the following:
# • annotation-xml
# • color-profile
# • font-face
# • font-face-src
# • font-face-uri
# • font-face-format
# • font-face-name
# • missing-glyph
elseif (preg_match(self::POTENTIAL_CUSTOM_ELEMENT_NAME_REGEX, $name) && !in_array($name, [ 'annotation-xml', 'color-profile', 'font-face', 'font-face-src', 'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph' ])) {
$className = 'HTMLElement';
}
# Return HTMLUnknownElement.
else {
$className = 'HTMLUnknownElement';
}
} elseif ($namespace === WrapperNode::SVG_NAMESPACE) {
$className = 'SVGElement';
} elseif ($namespace === WrapperNode::MATHML_NAMESPACE) {

13
vendor-bin/phpunit/composer.lock

@ -135,16 +135,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.13.1",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd"
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd",
"reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
@ -185,9 +185,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-03T20:52:16+00:00"
"time": "2021-11-30T19:35:32+00:00"
},
{
"name": "phar-io/manifest",
@ -1801,7 +1801,6 @@
"type": "github"
}
],
"abandoned": true,
"time": "2020-09-28T06:45:17+00:00"
},
{

105
vendor-bin/robo/composer.lock

@ -922,22 +922,22 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "661a7a6e085394f8513945669e31f7c1338a7e69"
"reference": "27d39ae126352b9fa3be5e196ccf4617897be3eb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69",
"reference": "661a7a6e085394f8513945669e31f7c1338a7e69",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/27d39ae126352b9fa3be5e196ccf4617897be3eb",
"reference": "27d39ae126352b9fa3be5e196ccf4617897be3eb",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1",
"symfony/event-dispatcher-contracts": "^2",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher-contracts": "^2|^3",
"symfony/polyfill-php80": "^1.16"
},
"conflict": {
@ -949,13 +949,13 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^4.4|^5.0",
"symfony/dependency-injection": "^4.4|^5.0",
"symfony/error-handler": "^4.4|^5.0",
"symfony/expression-language": "^4.4|^5.0",
"symfony/http-foundation": "^4.4|^5.0",
"symfony/service-contracts": "^1.1|^2",
"symfony/stopwatch": "^4.4|^5.0"
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
@ -987,7 +987,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11"
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.0"
},
"funding": [
{
@ -1003,24 +1003,24 @@
"type": "tidelift"
}
],
"time": "2021-11-17T12:16:12+00:00"
"time": "2021-11-23T10:19:22+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v2.5.0",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a"
"reference": "aa5422287b75594b90ee9cd807caf8f0df491385"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
"reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385",
"reference": "aa5422287b75594b90ee9cd807caf8f0df491385",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.0.2",
"psr/event-dispatcher": "^1"
},
"suggest": {
@ -1029,7 +1029,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
"dev-main": "3.0-dev"
},
"thanks": {
"name": "symfony/contracts",
@ -1066,7 +1066,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0"
},
"funding": [
{
@ -1082,25 +1082,26 @@
"type": "tidelift"
}
],
"time": "2021-07-12T14:48:14+00:00"
"time": "2021-07-15T12:33:35+00:00"
},
{
"name": "symfony/filesystem",
"version": "v5.3.4",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "343f4fe324383ca46792cae728a3b6e2f708fb32"
"reference": "731f917dc31edcffec2c6a777f3698c33bea8f01"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32",
"reference": "343f4fe324383ca46792cae728a3b6e2f708fb32",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/731f917dc31edcffec2c6a777f3698c33bea8f01",
"reference": "731f917dc31edcffec2c6a777f3698c33bea8f01",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8",
"symfony/polyfill-php80": "^1.16"
},
"type": "library",
@ -1129,7 +1130,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v5.3.4"
"source": "https://github.com/symfony/filesystem/tree/v5.4.0"
},
"funding": [
{
@ -1145,24 +1146,25 @@
"type": "tidelift"
}
],
"time": "2021-07-21T12:40:44+00:00"
"time": "2021-10-28T13:39:27+00:00"
},
{
"name": "symfony/finder",
"version": "v5.3.7",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93"
"reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
"reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93",
"url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590",
"reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
},
"type": "library",
@ -1191,7 +1193,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v5.3.7"
"source": "https://github.com/symfony/finder/tree/v5.4.0"
},
"funding": [
{
@ -1207,7 +1209,7 @@
"type": "tidelift"
}
],
"time": "2021-08-04T21:20:46+00:00"
"time": "2021-11-28T15:25:38+00:00"
},
{
"name": "symfony/polyfill-ctype",
@ -1697,16 +1699,16 @@
},
{
"name": "symfony/process",
"version": "v5.3.11",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "6c99204de85d04ca17f16c466fc61896960b0636"
"reference": "5be20b3830f726e019162b26223110c8f47cf274"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/6c99204de85d04ca17f16c466fc61896960b0636",
"reference": "6c99204de85d04ca17f16c466fc61896960b0636",
"url": "https://api.github.com/repos/symfony/process/zipball/5be20b3830f726e019162b26223110c8f47cf274",
"reference": "5be20b3830f726e019162b26223110c8f47cf274",
"shasum": ""
},
"require": {
@ -1739,7 +1741,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v5.3.11"
"source": "https://github.com/symfony/process/tree/v5.4.0"
},
"funding": [
{
@ -1755,7 +1757,7 @@
"type": "tidelift"
}
],
"time": "2021-11-17T12:16:12+00:00"
"time": "2021-11-28T15:25:38+00:00"
},
{
"name": "symfony/service-contracts",
@ -1842,16 +1844,16 @@
},
{
"name": "symfony/string",
"version": "v5.3.10",
"version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
"reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"url": "https://api.github.com/repos/symfony/string/zipball/9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d",
"reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d",
"shasum": ""
},
"require": {
@ -1862,11 +1864,14 @@
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "~1.15"
},
"conflict": {
"symfony/translation-contracts": ">=3.0"
},
"require-dev": {
"symfony/error-handler": "^4.4|^5.0",
"symfony/http-client": "^4.4|^5.0",
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2",
"symfony/var-exporter": "^4.4|^5.0"
"symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"type": "library",
"autoload": {
@ -1905,7 +1910,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.3.10"
"source": "https://github.com/symfony/string/tree/v5.4.0"
},
"funding": [
{
@ -1921,7 +1926,7 @@
"type": "tidelift"
}
],
"time": "2021-10-27T18:21:46+00:00"
"time": "2021-11-24T10:02:00+00:00"
},
{
"name": "symfony/yaml",

Loading…
Cancel
Save