2018-03-21 11:55:32 -04:00
|
|
|
<?php
|
2021-03-21 17:38:05 -04:00
|
|
|
/** @license MIT
|
|
|
|
* Copyright 2017 , Dustin Wilson, J. King et al.
|
|
|
|
* See LICENSE and AUTHORS files for details */
|
|
|
|
|
2018-03-21 11:55:32 -04:00
|
|
|
declare(strict_types=1);
|
2021-03-21 17:38:05 -04:00
|
|
|
namespace MensBeam\HTML;
|
2018-03-21 11:55:32 -04:00
|
|
|
|
|
|
|
abstract class Token {}
|
|
|
|
|
|
|
|
abstract class DataToken extends Token {
|
|
|
|
public $data;
|
|
|
|
|
2018-08-01 17:40:03 -04:00
|
|
|
public function __construct(string $data) {
|
|
|
|
$this->data = $data;
|
2018-03-21 11:55:32 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class DOCTYPEToken extends Token {
|
2021-02-13 10:29:07 -05:00
|
|
|
public const NAME = "DOCTYPE token";
|
|
|
|
|
2019-12-15 17:47:45 -05:00
|
|
|
# DOCTYPE tokens have a name, a public identifier,
|
|
|
|
# a system identifier, and a force-quirks flag.
|
|
|
|
# When a DOCTYPE token is created, its name,
|
|
|
|
# public identifier, and system identifier must
|
|
|
|
# be marked as missing (which is a distinct state
|
|
|
|
# from the empty string), and the force-quirks flag
|
|
|
|
# must be set to off (its other state is on).
|
2018-03-21 11:55:32 -04:00
|
|
|
public $forceQuirks = false;
|
2019-12-15 17:47:45 -05:00
|
|
|
public $name;
|
2018-03-21 11:55:32 -04:00
|
|
|
public $public;
|
|
|
|
public $system;
|
|
|
|
|
2021-02-14 19:33:23 -05:00
|
|
|
public function __construct(?string $name = null, ?string $public = null, ?string $system = null) {
|
2019-12-15 17:47:45 -05:00
|
|
|
// null stands in for the distinct "missing" state
|
2018-07-26 17:30:29 -04:00
|
|
|
$this->name = $name;
|
|
|
|
$this->public = $public;
|
|
|
|
$this->system = $system;
|
2018-03-21 11:55:32 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-13 10:29:07 -05:00
|
|
|
class CharacterToken extends DataToken {
|
|
|
|
public const NAME = "Character token";
|
|
|
|
}
|
2018-03-21 11:55:32 -04:00
|
|
|
|
2021-02-14 18:31:16 -05:00
|
|
|
class WhitespaceToken extends CharacterToken {}
|
|
|
|
|
2021-03-14 17:56:06 -04:00
|
|
|
class NullCharacterToken extends CharacterToken {}
|
|
|
|
|
2018-03-21 11:55:32 -04:00
|
|
|
class CommentToken extends DataToken {
|
2021-02-13 10:29:07 -05:00
|
|
|
public const NAME = "Comment token";
|
|
|
|
|
2018-08-01 17:40:03 -04:00
|
|
|
public function __construct(string $data = '') {
|
2018-03-21 11:55:32 -04:00
|
|
|
parent::__construct($data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-15 17:47:45 -05:00
|
|
|
abstract class TagToken extends Token {
|
|
|
|
# Start and end tag tokens have a tag name,
|
|
|
|
# a self-closing flag, and a list of attributes,
|
|
|
|
# each of which has a name and a value.
|
|
|
|
# When a start or end tag token is created, its
|
|
|
|
# self-closing flag must be unset (its other state
|
|
|
|
# is that it be set), and its attributes list must be empty.
|
|
|
|
public $name;
|
2018-03-21 11:55:32 -04:00
|
|
|
public $namespace;
|
|
|
|
public $selfClosing;
|
2021-02-14 15:09:00 -05:00
|
|
|
public $selfClosingAcknowledged = false;
|
2018-07-26 17:30:29 -04:00
|
|
|
public $attributes = [];
|
2018-03-21 11:55:32 -04:00
|
|
|
|
2021-03-06 21:41:12 -05:00
|
|
|
public function __construct(string $name, bool $selfClosing = false, ?string $namespace = null) {
|
2018-03-21 11:55:32 -04:00
|
|
|
$this->selfClosing = $selfClosing;
|
|
|
|
$this->namespace = $namespace;
|
2019-12-15 17:47:45 -05:00
|
|
|
$this->name = $name;
|
2018-03-21 11:55:32 -04:00
|
|
|
}
|
|
|
|
|
2021-03-18 12:40:54 -04:00
|
|
|
public function hasAttribute(string $name): bool {
|
2021-03-21 12:33:24 -04:00
|
|
|
return ($this->_getAttributeKey($name) !== null);
|
2021-03-18 12:40:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getAttribute(string $name) {
|
|
|
|
$key = $this->_getAttributeKey($name);
|
|
|
|
return (isset($this->attributes[$key])) ? $this->attributes[$key] : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function _getAttributeKey(string $name) {
|
|
|
|
foreach ($this->attributes as $key => $a) {
|
|
|
|
if ($a->name === $name) {
|
|
|
|
return $key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2018-03-21 11:55:32 -04:00
|
|
|
}
|
|
|
|
|
2021-02-13 10:29:07 -05:00
|
|
|
class StartTagToken extends TagToken {
|
|
|
|
public const NAME = "Start tag token";
|
|
|
|
}
|
2019-12-15 17:47:45 -05:00
|
|
|
|
2021-02-13 10:29:07 -05:00
|
|
|
class EndTagToken extends TagToken {
|
|
|
|
public const NAME = "End tag token";
|
|
|
|
}
|
2018-07-25 10:57:27 -04:00
|
|
|
|
2021-02-13 10:29:07 -05:00
|
|
|
class EOFToken extends Token {
|
|
|
|
public const NAME = "EOF token";
|
|
|
|
}
|
2019-12-15 17:47:45 -05:00
|
|
|
|
2018-07-25 10:57:27 -04:00
|
|
|
class TokenAttr {
|
2021-03-18 12:40:54 -04:00
|
|
|
/** @var string The name of the attribute */
|
2018-07-25 10:57:27 -04:00
|
|
|
public $name;
|
2021-03-18 12:40:54 -04:00
|
|
|
/** @var string The attribute's value */
|
2018-07-25 10:57:27 -04:00
|
|
|
public $value;
|
2021-03-18 12:40:54 -04:00
|
|
|
/** @var string|null The attribute's namespace. This is normally null but may be set during tree construction */
|
|
|
|
public $namespace = null;
|
2018-07-25 10:57:27 -04:00
|
|
|
|
2021-03-06 21:41:12 -05:00
|
|
|
public function __construct(string $name, string $value) {
|
2018-07-25 10:57:27 -04:00
|
|
|
$this->name = $name;
|
|
|
|
$this->value = $value;
|
|
|
|
}
|
2019-12-15 17:47:45 -05:00
|
|
|
}
|