Organization

• Moved the ancestor and descendant methods into their own traits along with the compare method which they share.
• Made DocumentFragment use only the descendant methods and not the ancestor ones.
• Fixed error in README.
This commit is contained in:
Dustin Wilson 2018-09-11 09:54:46 -05:00
parent fd6003fb4e
commit dfda8d5f3a
12 changed files with 77 additions and 60 deletions

View file

@ -12,7 +12,7 @@ or:
```php ```php
<?php <?php
$dom = new dW\HTML\Document; $dom = new dW\HTML5\Document;
$dom->loadHTML('<!DOCTYPE html><html lang="en" charset="utf-8"><head><title>Ook!</title></head><body><h1>Ook!</h1><p>Ook-ook? Oooook. Ook ook oook ook oooooook ook ooook ook.</p><p>Eek!</p></body></html>'); $dom->loadHTML('<!DOCTYPE html><html lang="en" charset="utf-8"><head><title>Ook!</title></head><body><h1>Ook!</h1><p>Ook-ook? Oooook. Ook ook oook ook oooooook ook ooook ook.</p><p>Eek!</p></body></html>');
?> ?>
``` ```

View file

@ -20,7 +20,8 @@
"psr-4": { "psr-4": {
"dW\\HTML5\\": [ "dW\\HTML5\\": [
"lib/", "lib/",
"lib/DOM" "lib/DOM",
"lib/DOM/traits"
] ]
}, },
"classmap": ["lib/Token.php"] "classmap": ["lib/Token.php"]

View file

@ -3,5 +3,5 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class Comment extends \DOMComment { class Comment extends \DOMComment {
use Node; use Ancestor;
} }

View file

@ -3,7 +3,7 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class Document extends \DOMDocument { class Document extends \DOMDocument {
use Printer; use Descendant, Printing;
public function __construct() { public function __construct() {
parent::__construct(); parent::__construct();

View file

@ -3,5 +3,5 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class DocumentFragment extends \DOMDocumentFragment { class DocumentFragment extends \DOMDocumentFragment {
use Node; use Descendant;
} }

View file

@ -3,7 +3,9 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class Element extends \DOMElement { class Element extends \DOMElement {
use Node; use Ancestor, Descendant {
Ancestor::compare insteadof Descendant;
}
// Used for template elements // Used for template elements
public $content = null; public $content = null;
@ -39,34 +41,4 @@ class Element extends \DOMElement {
) )
); );
} }
public function getDescendant($needle): \DOMNode {
return static::descendant($needle, true);
}
public function hasDescendant($needle): bool {
return static::descendant($needle, false);
}
protected function descendant($needle, bool $returnNode = true): \DOMNode {
if ($this->hasChildNodes() === false) {
return ($returnNode === true) ? null : false;
}
$context = $this->firstChild;
do {
$result = $this->compare($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
$result = $this->descendant($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
} while ($context = $context->nextSibling);
return ($returnNode === true) ? null : false;
}
} }

View file

@ -3,5 +3,5 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class ProcessingInstruction extends \DOMProcessingInstruction { class ProcessingInstruction extends \DOMProcessingInstruction {
use Node; use Ancestor;
} }

View file

@ -3,5 +3,5 @@ declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
class Text extends \DOMText { class Text extends \DOMText {
use Node; use Ancestor;
} }

View file

@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace dW\HTML5;
trait Ancestor {
use Compare;
public function getAncestor($needle): Element {
return $this->ancestor($needle, true);
}
public static function hasAncestor($needle): bool {
return $this->ancestor($needle, false);
}
protected function ancestor($needle, bool $returnNode = true) {
$context = $this->parentNode;
do {
$result = static::compare($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
} while ($context = $context->parentNode);
return ($returnNode === true) ? null : false;
}
}

View file

@ -2,27 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
trait Node { trait Compare {
public function getAncestor($needle): Element {
return $this->ancestor($needle, true);
}
public static function hasAncestor($needle): bool {
return $this->ancestor($needle, false);
}
protected function ancestor($needle, bool $returnNode = true) {
$context = $this->parentNode;
do {
$result = static::compare($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
} while ($context = $context->parentNode);
return ($returnNode === true) ? null : false;
}
protected function compare($needle, Element $context): \DOMNode { protected function compare($needle, Element $context): \DOMNode {
if (is_string($needle)) { if (is_string($needle)) {
if ($context->nodeName == $needle) { if ($context->nodeName == $needle) {

View file

@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace dW\HTML5;
trait Descendant {
use Compare;
public function getDescendant($needle): \DOMNode {
return static::descendant($needle, true);
}
public function hasDescendant($needle): bool {
return static::descendant($needle, false);
}
protected function descendant($needle, bool $returnNode = true): \DOMNode {
if ($this->hasChildNodes() === false) {
return ($returnNode === true) ? null : false;
}
$context = $this->firstChild;
do {
$result = $this->compare($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
$result = $this->descendant($needle, $context);
if (!is_null($result)) {
return ($returnNode === true) ? $result : true;
}
} while ($context = $context->nextSibling);
return ($returnNode === true) ? null : false;
}
}

View file

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace dW\HTML5; namespace dW\HTML5;
trait Printer { trait Printing {
protected $selfClosingElements = ['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'embed', 'frame', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']; protected $selfClosingElements = ['area', 'base', 'basefont', 'bgsound', 'br', 'col', 'embed', 'frame', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
public function saveHTML(\DOMNode $node = null): string { public function saveHTML(\DOMNode $node = null): string {