lots of new tags and features in progress
This commit is contained in:
parent
74c8c7079f
commit
074b41167e
91 changed files with 2584 additions and 283 deletions
16
.devcontainer/Dockerfile
Normal file
16
.devcontainer/Dockerfile
Normal file
|
@ -0,0 +1,16 @@
|
|||
FROM ubuntu:22.04
|
||||
|
||||
# prepare to install php 8.2
|
||||
RUN apt update && apt install -y software-properties-common
|
||||
RUN add-apt-repository ppa:ondrej/php
|
||||
RUN apt update
|
||||
|
||||
# install php 8.2 and other fundamental packages
|
||||
RUN export DEBIAN_FRONTEND=noninteractive; apt install -y --no-install-recommends php8.2 php-curl git openssl unzip
|
||||
|
||||
# install composer and its CA certificates
|
||||
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
|
||||
COPY --from=composer:latest /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
|
||||
|
||||
# install the PHP extensions that basically all PHP projects should need
|
||||
RUN export DEBIAN_FRONTEND=noninteractive; apt install -y php8.2-opcache php-xdebug php-mbstring php-zip php-gd php-xml
|
34
.devcontainer/devcontainer.json
Normal file
34
.devcontainer/devcontainer.json
Normal file
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
// build from dockerfile
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"context": ".."
|
||||
},
|
||||
// specify run arguments
|
||||
"runArgs": [
|
||||
"--dns=8.8.8.8" // for some reason DNS doesn't work right unless we explicitly name a DNS server
|
||||
],
|
||||
// mount entire sites_v2 directory, so we can access global config and shared DB
|
||||
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace/${localWorkspaceFolderBasename},type=bind,consistency=cached",
|
||||
"workspaceFolder": "/workspace/${localWorkspaceFolderBasename}",
|
||||
// specify extensions that we want
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"DEVSENSE.intelli-php-vscode",
|
||||
"DEVSENSE.phptools-vscode",
|
||||
"DEVSENSE.profiler-php-vscode",
|
||||
"DEVSENSE.composer-php-vscode",
|
||||
"SanderRonde.phpstan-vscode",
|
||||
"mrmlnc.vscode-scss",
|
||||
"Gruntfuggly.todo-tree",
|
||||
"ecmel.vscode-html-css",
|
||||
"yzhang.markdown-all-in-one",
|
||||
"DavidAnson.vscode-markdownlint",
|
||||
"helixquar.randomeverything",
|
||||
"neilbrayfield.php-docblocker",
|
||||
"ms-vscode.test-adapter-converter"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
20
.github/workflows/dependency-review.yml
vendored
20
.github/workflows/dependency-review.yml
vendored
|
@ -1,20 +0,0 @@
|
|||
# Dependency Review Action
|
||||
#
|
||||
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||
#
|
||||
# Source repository: https://github.com/actions/dependency-review-action
|
||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v2
|
4
.github/workflows/tests.yaml
vendored
4
.github/workflows/tests.yaml
vendored
|
@ -10,6 +10,8 @@ jobs:
|
|||
dev: yes
|
||||
- uses: php-actions/phpstan@v3
|
||||
with:
|
||||
path: src
|
||||
level: max
|
||||
memory_limit: 1G
|
||||
args: --memory-limit 1G
|
||||
- uses: php-actions/phpunit@v3
|
||||
- uses: php-actions/phpunit@v3
|
||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
MIT License
|
||||
# MIT License
|
||||
|
||||
Copyright (c) 2019 Joby Elliott
|
||||
|
||||
|
|
|
@ -27,12 +27,11 @@
|
|||
},
|
||||
"scripts": {
|
||||
"test": "phpunit",
|
||||
"stan": "phpstan",
|
||||
"sniff": "phpcs"
|
||||
"stan": "phpstan"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
"squizlabs/php_codesniffer": "^3.7"
|
||||
"mustangostang/spyc": "^0.6.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
19
phpcs.xml
19
phpcs.xml
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer"
|
||||
xsi:noNamespaceSchemaLocation="./vendor/squizlabs/php_codesniffer/phpcs.xsd">
|
||||
<description>Coding Standard</description>
|
||||
|
||||
<file>src</file>
|
||||
|
||||
<arg name="basepath" value="." />
|
||||
<arg name="colors" />
|
||||
<arg name="parallel" value="75" />
|
||||
<arg value="np" />
|
||||
|
||||
<rule ref="PSR12">
|
||||
<exclude name="Generic.Files.LineEndings" />
|
||||
<!-- <exclude name="Generic.NamingConventions.CamelCapsFunctionName" /> -->
|
||||
<!-- <exclude name="PSR1.Methods.CamelCapsMethodName" /> -->
|
||||
</rule>
|
||||
|
||||
</ruleset>
|
|
@ -19,12 +19,34 @@ use DOMElement;
|
|||
use DOMNode;
|
||||
use DOMText;
|
||||
|
||||
/**
|
||||
* Extensions of this class to create new parsers are primarily meant to be
|
||||
* controlled by adjusting the default properties below
|
||||
*/
|
||||
abstract class AbstractParser
|
||||
{
|
||||
/** @var array<int,string> */
|
||||
/**
|
||||
* A list of namespaces in which to match tags. To match in this way the
|
||||
* tag classes must implement TagInterface and be named following the
|
||||
* convention of the tag name in CamelCase followed by "Tag" i.e. a class
|
||||
* implementing a tag <my-tag> would need to be named MyTagTag.
|
||||
*
|
||||
* They are searched in order and the first match is used.
|
||||
*
|
||||
* @var array<int,string>
|
||||
*/
|
||||
protected $tag_namespaces = [];
|
||||
|
||||
/** @var array<string,class-string<TagInterface>> */
|
||||
/**
|
||||
* A list of defined tag classes, matching a tag string (in lower case) to
|
||||
* a fully-qualified TagInterface-implementing class. This array is also
|
||||
* used at runtime to cache the pairings found and verified from
|
||||
* $tag_namespaces.
|
||||
*
|
||||
* They are searched in order and the first match is used.
|
||||
*
|
||||
* @var array<string,class-string<TagInterface>>
|
||||
*/
|
||||
protected $tag_classes = [];
|
||||
|
||||
/** @var class-string<CommentInterface> */
|
||||
|
@ -97,11 +119,13 @@ abstract class AbstractParser
|
|||
} elseif ($node instanceof DOMComment) {
|
||||
return new ($this->comment_class)($node->textContent);
|
||||
} elseif ($node instanceof DOMText) {
|
||||
return new ($this->text_class)($node->textContent);
|
||||
$content = trim($node->textContent);
|
||||
if ($content) {
|
||||
return new ($this->text_class)($content);
|
||||
}
|
||||
}
|
||||
// This line shouldn't be reached, but if it is it's philosophically
|
||||
// consistent to simply ignore unknown node types
|
||||
return null; // @codeCoverageIgnore
|
||||
// It's philosophically consistent to simply ignore unknown node types
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function convertNodeToTag(DOMElement $node): null|NodeInterface
|
||||
|
@ -112,7 +136,7 @@ abstract class AbstractParser
|
|||
return null;
|
||||
}
|
||||
$tag = new $class();
|
||||
// tool for settin gup content tags
|
||||
// tool for setting up content tags
|
||||
if ($tag instanceof ContentTagInterface) {
|
||||
$tag->setContent($node->textContent);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ namespace ByJoby\HTML\Helpers;
|
|||
|
||||
use ArrayAccess;
|
||||
use ArrayIterator;
|
||||
use BackedEnum;
|
||||
use Exception;
|
||||
use IteratorAggregate;
|
||||
use Stringable;
|
||||
|
@ -12,12 +13,12 @@ use Traversable;
|
|||
/**
|
||||
* Holds and validates a set of HTML attribute name/value pairs for use in tags.
|
||||
*
|
||||
* @implements ArrayAccess<string,bool|string|Stringable>
|
||||
* @implements IteratorAggregate<string,bool|string|Stringable>
|
||||
* @implements ArrayAccess<string,bool|string|number|Stringable>
|
||||
* @implements IteratorAggregate<string,bool|string|number|Stringable>
|
||||
*/
|
||||
class Attributes implements IteratorAggregate, ArrayAccess
|
||||
{
|
||||
/** @var array<string,bool|string|Stringable> */
|
||||
/** @var array<string,bool|string|number|Stringable> */
|
||||
protected $array = [];
|
||||
/** @var bool */
|
||||
protected $sorted = true;
|
||||
|
@ -25,7 +26,7 @@ class Attributes implements IteratorAggregate, ArrayAccess
|
|||
protected $disallowed = [];
|
||||
|
||||
/**
|
||||
* @param null|array<string,bool|string|Stringable> $array
|
||||
* @param null|array<string,bool|string|number|Stringable> $array
|
||||
* @param array<mixed,string> $disallowed
|
||||
* @return void
|
||||
*/
|
||||
|
@ -67,16 +68,147 @@ class Attributes implements IteratorAggregate, ArrayAccess
|
|||
$this->array[$offset] = $value;
|
||||
}
|
||||
|
||||
public function string(string $offset): null|string
|
||||
/**
|
||||
* Set a value as a stringable enum array, automatically converting from a single enum or normal array of enums.
|
||||
*
|
||||
* @template T of BackedEnum
|
||||
* @param string $offset
|
||||
* @param null|BackedEnum|StringableEnumArray<T>|array<string|int,T> $value
|
||||
* @param class-string<T> $enum_class
|
||||
* @param string $separator
|
||||
* @return static
|
||||
*/
|
||||
public function setEnumArray(string $offset, null|BackedEnum|StringableEnumArray|array $value, string $enum_class, string $separator): static
|
||||
{
|
||||
if (is_null($value)) {
|
||||
$value = [];
|
||||
}
|
||||
if ($value instanceof BackedEnum) {
|
||||
$value = [$value];
|
||||
}
|
||||
if (is_array($value)) {
|
||||
$value = new StringableEnumArray($value, ' ');
|
||||
}
|
||||
$this->offsetSet($offset, $value);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a given offset's value as an array of enums.
|
||||
*
|
||||
* @template T of BackedEnum
|
||||
* @param string $offset
|
||||
* @param class-string<T> $enum_class
|
||||
* @param non-empty-string $separator
|
||||
* @return array<string|int,T>
|
||||
*/
|
||||
public function asEnumArray(string $offset, string $enum_class, string $separator): array
|
||||
{
|
||||
$value = strval($this->offsetGet($offset));
|
||||
$value = explode($separator, $value);
|
||||
$value = array_map(
|
||||
$enum_class::tryFrom(...),
|
||||
$value
|
||||
);
|
||||
$value = array_filter(
|
||||
$value,
|
||||
fn($e) => !empty($e)
|
||||
);
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a given offset's value as a string, if possible.
|
||||
*
|
||||
* @param string $offset
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function asString(string $offset): null|string|Stringable
|
||||
{
|
||||
$value = $this->offsetGet($offset);
|
||||
if (is_string($value)) {
|
||||
if ($value instanceof Stringable || is_string($value)) {
|
||||
return $value;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a given offset's value as an integer, if possible.
|
||||
*
|
||||
* @param string $offset
|
||||
* @return null|int
|
||||
*/
|
||||
public function asInt(string $offset): null|int
|
||||
{
|
||||
$value = $this->asNumber($offset);
|
||||
if (is_int($value)) {
|
||||
return $value;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a given offset's value as a float, if possible.
|
||||
*
|
||||
* @param string $offset
|
||||
* @return null|float
|
||||
*/
|
||||
public function asFloat(string $offset): null|float
|
||||
{
|
||||
$value = $this->asNumber($offset);
|
||||
if (!is_null($value)) {
|
||||
return floatval($value);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a given offset's value as a numeric type, if possible.
|
||||
*
|
||||
* @param string $offset
|
||||
* @return null|number
|
||||
*/
|
||||
public function asNumber(string $offset): null|int|float
|
||||
{
|
||||
$value = $this->offsetGet($offset);
|
||||
if (is_numeric($value)) {
|
||||
if (is_string($value)) {
|
||||
if ($value == intval($value)) {
|
||||
$value = intval($value);
|
||||
} else {
|
||||
$value = floatval($value);
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a given offset's value as an enum of the given class, if possible.
|
||||
*
|
||||
* @template T of BackedEnum
|
||||
* @param string $offset
|
||||
* @param class-string<T> $enum_class
|
||||
* @return null|T
|
||||
*/
|
||||
public function asEnum(string $offset, string $enum_class): null|BackedEnum
|
||||
{
|
||||
$value = $this->offsetGet($offset);
|
||||
if ($value instanceof Stringable) {
|
||||
$value = $value->__toString();
|
||||
}
|
||||
if (is_string($value) || is_int($value)) {
|
||||
return $enum_class::tryFrom($value);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function offsetUnset(mixed $offset): void
|
||||
{
|
||||
$offset = static::sanitizeOffset($offset);
|
||||
|
@ -84,7 +216,7 @@ class Attributes implements IteratorAggregate, ArrayAccess
|
|||
}
|
||||
|
||||
/**
|
||||
* @return array<string,bool|string|Stringable>
|
||||
* @return array<string,bool|string|number|Stringable>
|
||||
*/
|
||||
public function getArray(): array
|
||||
{
|
||||
|
@ -109,4 +241,4 @@ class Attributes implements IteratorAggregate, ArrayAccess
|
|||
}
|
||||
return $offset;
|
||||
}
|
||||
}
|
||||
}
|
49
src/Helpers/StringableEnumArray.php
Normal file
49
src/Helpers/StringableEnumArray.php
Normal file
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Helpers;
|
||||
|
||||
use ArrayIterator;
|
||||
use BackedEnum;
|
||||
use Stringable;
|
||||
|
||||
/**
|
||||
* @template T of BackedEnum
|
||||
* @extends ArrayIterator<int|string,T>
|
||||
*/
|
||||
class StringableEnumArray extends ArrayIterator implements Stringable
|
||||
{
|
||||
/**
|
||||
* @param array<int|string,T> $array
|
||||
*/
|
||||
public function __construct(
|
||||
$array = [],
|
||||
protected string $separator = ', '
|
||||
) {
|
||||
parent::__construct($array);
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return implode(
|
||||
$this->separator,
|
||||
array_filter(
|
||||
$this->stringValues(),
|
||||
fn($e) => !empty($e)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int|string,string>
|
||||
*/
|
||||
protected function stringValues(): array
|
||||
{
|
||||
return array_map(
|
||||
function ($e) {
|
||||
if ($e instanceof BackedEnum) $e = $e->value;
|
||||
return strval($e);
|
||||
},
|
||||
$this->getArrayCopy()
|
||||
);
|
||||
}
|
||||
}
|
|
@ -6,6 +6,20 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <address> HTML element indicates that the enclosed HTML provides contact
|
||||
* information for a person or people, or for an organization.
|
||||
*
|
||||
* The contact information provided by an <address> element's contents can take
|
||||
* whatever form is appropriate for the context, and may include any type of
|
||||
* contact information that is needed, such as a physical address, URL, email
|
||||
* address, phone number, social media handle, geographic coordinates, and so
|
||||
* forth. The <address> element should include the name of the person, people,
|
||||
* or organization to which the contact information refers.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address
|
||||
*/
|
||||
class AddressTag extends AbstractContainerTag implements DisplayBlock, FlowContent
|
||||
{
|
||||
const TAG = 'address';
|
||||
|
|
|
@ -7,6 +7,17 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <article> HTML element represents a self-contained composition in a
|
||||
* document, page, application, or site, which is intended to be independently
|
||||
* distributable or reusable (e.g., in syndication). Examples include: a forum
|
||||
* post, a magazine or newspaper article, or a blog entry, a product card, a
|
||||
* user-submitted comment, an interactive widget or gadget, or any other
|
||||
* independent item of content.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article
|
||||
*/
|
||||
class ArticleTag extends AbstractContainerTag implements DisplayBlock, FlowContent, SectioningContent
|
||||
{
|
||||
const TAG = 'article';
|
||||
|
|
|
@ -7,6 +7,14 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <aside> HTML element represents a portion of a document whose content is
|
||||
* only indirectly related to the document's main content. Asides are frequently
|
||||
* presented as sidebars or call-out boxes.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside
|
||||
*/
|
||||
class AsideTag extends AbstractContainerTag implements DisplayBlock, FlowContent, SectioningContent
|
||||
{
|
||||
const TAG = 'aside';
|
||||
|
|
|
@ -6,6 +6,15 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <footer> HTML element represents a footer for its nearest ancestor
|
||||
* sectioning content or sectioning root element. A <footer> typically contains
|
||||
* information about the author of the section, copyright data or links to
|
||||
* related documents.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer
|
||||
*/
|
||||
class FooterTag extends AbstractContainerTag implements DisplayBlock, FlowContent
|
||||
{
|
||||
const TAG = 'footer';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H1Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h1';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H2Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h1';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H3Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h3';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H4Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h4';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H5Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h5';
|
||||
|
|
|
@ -2,6 +2,15 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
/**
|
||||
* The <h1> to <h6> HTML elements represent six levels of section headings. <h1>
|
||||
* is the highest section level and <h6> is the lowest. By default, all heading
|
||||
* elements create a block-level box in the layout, starting on a new line and
|
||||
* taking up the full width available in their containing block.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements
|
||||
*/
|
||||
class H6Tag extends AbstractHeaderTag
|
||||
{
|
||||
const TAG = 'h6';
|
||||
|
|
|
@ -6,6 +6,14 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <header> HTML element represents introductory content, typically a group
|
||||
* of introductory or navigational aids. It may contain some heading elements
|
||||
* but also a logo, a search form, an author name, and other elements.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header
|
||||
*/
|
||||
class HeaderTag extends AbstractContainerTag implements DisplayBlock, FlowContent
|
||||
{
|
||||
const TAG = 'header';
|
||||
|
|
|
@ -6,6 +6,15 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <main> HTML element represents the dominant content of the <body> of a
|
||||
* document. The main content area consists of content that is directly related
|
||||
* to or expands upon the central topic of a document, or the central
|
||||
* functionality of an application.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main
|
||||
*/
|
||||
class MainTag extends AbstractContainerTag implements DisplayBlock, FlowContent
|
||||
{
|
||||
const TAG = 'main';
|
||||
|
|
|
@ -7,6 +7,15 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <nav> HTML element represents a section of a page whose purpose is to
|
||||
* provide navigation links, either within the current document or to other
|
||||
* documents. Common examples of navigation sections are menus, tables of
|
||||
* contents, and indexes.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav
|
||||
*/
|
||||
class NavTag extends AbstractContainerTag implements DisplayBlock, FlowContent, SectioningContent
|
||||
{
|
||||
const TAG = 'nav';
|
||||
|
|
24
src/Html5/ContentSectioningTags/SearchTag.php
Normal file
24
src/Html5/ContentSectioningTags/SearchTag.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\ContentSectioningTags;
|
||||
|
||||
use ByJoby\HTML\ContentCategories\FlowContent;
|
||||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <search> HTML element is a container representing the parts of the
|
||||
* document or application with form controls or other content related to
|
||||
* performing a search or filtering operation. The <search> element semantically
|
||||
* identifies the purpose of the element's contents as having search or
|
||||
* filtering capabilities. The search or filtering functionality can be for the
|
||||
* website or application, the current web page or document, or the entire
|
||||
* Internet or subsection thereof.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search
|
||||
*/
|
||||
class SearchTag extends AbstractContainerTag implements DisplayBlock, FlowContent
|
||||
{
|
||||
const TAG = 'search';
|
||||
}
|
|
@ -7,6 +7,14 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <section> HTML element represents a generic standalone section of a
|
||||
* document, which doesn't have a more specific semantic element to represent
|
||||
* it. Sections should always have a heading, with very few exceptions.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section
|
||||
*/
|
||||
class SectionTag extends AbstractContainerTag implements DisplayBlock, FlowContent, SectioningContent
|
||||
{
|
||||
const TAG = 'section';
|
||||
|
|
|
@ -5,6 +5,13 @@ namespace ByJoby\HTML\Html5\DocumentTags;
|
|||
use ByJoby\HTML\Containers\DocumentTags\BodyTagInterface;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <body> HTML element represents the content of an HTML document. There can
|
||||
* be only one <body> element in a document.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body
|
||||
*/
|
||||
class BodyTag extends AbstractContainerTag implements BodyTagInterface
|
||||
{
|
||||
const TAG = 'body';
|
||||
|
|
|
@ -5,6 +5,17 @@ namespace ByJoby\HTML\Html5\DocumentTags;
|
|||
use ByJoby\HTML\Containers\DocumentTags\DoctypeInterface;
|
||||
use ByJoby\HTML\Traits\NodeTrait;
|
||||
|
||||
/**
|
||||
* In HTML, the doctype is the required "<!DOCTYPE html>" preamble found at the
|
||||
* top of all documents. Its sole purpose is to prevent a browser from switching
|
||||
* into so-called "quirks mode" when rendering a document; that is, the
|
||||
* "<!DOCTYPE html>" doctype ensures that the browser makes a best-effort
|
||||
* attempt at following the relevant specifications, rather than using a
|
||||
* different rendering mode that is incompatible with some specifications.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Glossary/Doctype
|
||||
*/
|
||||
class Doctype implements DoctypeInterface
|
||||
{
|
||||
use NodeTrait;
|
||||
|
|
|
@ -8,6 +8,13 @@ use ByJoby\HTML\Containers\DocumentTags\TitleTagInterface;
|
|||
use ByJoby\HTML\Tags\AbstractGroupedTag;
|
||||
use ByJoby\HTML\Traits\GroupedContainerTrait;
|
||||
|
||||
/**
|
||||
* The <head> HTML element contains machine-readable information (metadata)
|
||||
* about the document, like its title, scripts, and style sheets.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head
|
||||
*/
|
||||
class HeadTag extends AbstractGroupedTag implements HeadTagInterface
|
||||
{
|
||||
use GroupedContainerTrait;
|
||||
|
|
|
@ -9,6 +9,14 @@ use ByJoby\HTML\Containers\DocumentTags\HtmlTagInterface;
|
|||
use ByJoby\HTML\Tags\AbstractGroupedTag;
|
||||
use ByJoby\HTML\Traits\GroupedContainerTrait;
|
||||
|
||||
/**
|
||||
* The <html> HTML element represents the root (top-level element) of an HTML
|
||||
* document, so it is also referred to as the root element. All other elements
|
||||
* must be descendants of this element.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html
|
||||
*/
|
||||
class HtmlTag extends AbstractGroupedTag implements HtmlTagInterface
|
||||
{
|
||||
use GroupedContainerTrait;
|
||||
|
|
|
@ -6,15 +6,23 @@ use ByJoby\HTML\Containers\DocumentTags\TitleTagInterface;
|
|||
use ByJoby\HTML\Tags\AbstractContentTag;
|
||||
use Stringable;
|
||||
|
||||
/**
|
||||
* The <title> HTML element defines the document's title that is shown in a
|
||||
* browser's title bar or a page's tab. It only contains text; tags within the
|
||||
* element are ignored.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title
|
||||
*/
|
||||
class TitleTag extends AbstractContentTag implements TitleTagInterface
|
||||
{
|
||||
const TAG = 'title';
|
||||
/** @var string */
|
||||
protected $content = 'Untitled';
|
||||
protected $inline = true;
|
||||
|
||||
public function setContent(string|Stringable $content): static
|
||||
{
|
||||
parent::setContent(trim(strip_tags($content)));
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
}
|
63
src/Html5/Enums/As_link.php
Normal file
63
src/Html5/Enums/As_link.php
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* This attribute is required when rel="preload" has been set on the <link> element, optional when rel="modulepreload" has been set, and otherwise should not be used. It specifies the type of content being loaded by the <link>, which is necessary for request matching, application of correct content security policy, and setting of correct Accept request header.
|
||||
*
|
||||
* Furthermore, rel="preload" uses this as a signal for request prioritization. The value comments list the valid values for this attribute and the elements or resources they apply to.
|
||||
*
|
||||
* Descriptions by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
||||
*/
|
||||
enum As_link: string {
|
||||
/**
|
||||
* Applies to <audio> elements
|
||||
*/
|
||||
case audio = "audio";
|
||||
/**
|
||||
* Applies to <iframe> and <frame> elements
|
||||
*/
|
||||
case document = "document";
|
||||
/**
|
||||
* Applies to <embed> elements
|
||||
*/
|
||||
case embed = "embed";
|
||||
/**
|
||||
* Applies to fetch, XHR
|
||||
* Note: This value also requires <link> to contain the crossorigin attribute.
|
||||
*/
|
||||
case fetch = "fetch";
|
||||
/**
|
||||
* Applies to CSS @font-face
|
||||
*/
|
||||
case font = "font";
|
||||
/**
|
||||
* Applies to <img> and <picture> elements with srcset or imageset attributes, SVG <image> elements, CSS *-image rules
|
||||
*/
|
||||
case image = "image";
|
||||
/**
|
||||
* Applies to <object> elements
|
||||
*/
|
||||
case object = "object";
|
||||
/**
|
||||
* Applies to <script> elements, Worker importScripts
|
||||
*/
|
||||
case script = "script";
|
||||
/**
|
||||
* Applies to <link rel=stylesheet> elements, CSS @import
|
||||
*/
|
||||
case style = "style";
|
||||
/**
|
||||
* Applies to <track> elements
|
||||
*/
|
||||
case track = "track";
|
||||
/**
|
||||
* Applies to <video> elements
|
||||
*/
|
||||
case video = "video";
|
||||
/**
|
||||
* Applies to Worker, SharedWorker
|
||||
*/
|
||||
case worker = "worker";
|
||||
}
|
313
src/Html5/Enums/Autocomplete.php
Normal file
313
src/Html5/Enums/Autocomplete.php
Normal file
|
@ -0,0 +1,313 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The HTML autocomplete attribute lets web developers specify what if any
|
||||
* permission the user agent has to provide automated assistance in filling out
|
||||
* form field values, as well as guidance to the browser as to the type of
|
||||
* information expected in the field.
|
||||
*
|
||||
* It is available on <input> elements that take a text or numeric value as
|
||||
* input, <textarea> elements, <select> elements, and <form> elements.
|
||||
*
|
||||
* The source of the suggested values is generally up to the browser; typically
|
||||
* values come from past values entered by the user, but they may also come from
|
||||
* pre-configured values. For instance, a browser might let the user save their
|
||||
* name, address, phone number, and email addresses for autocomplete purposes.
|
||||
* Perhaps the browser offers the ability to save encrypted credit card
|
||||
* information, for autocompletion following an authentication procedure.
|
||||
*
|
||||
* If an <input>, <select> or <textarea> element has no autocomplete attribute,
|
||||
* then browsers use the autocomplete attribute of the element's form owner,
|
||||
* which is either the <form> element that the element is a descendant of, or
|
||||
* the <form> whose id is specified by the form attribute of the element (see
|
||||
* the <form> autocomplete attribute).
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
|
||||
*/
|
||||
enum Autocomplete: string
|
||||
{
|
||||
/**
|
||||
* The browser is not permitted to automatically enter or select a value for
|
||||
* this field. It is possible that the document or application provides its
|
||||
* own autocomplete feature, or that security concerns require that the
|
||||
* field's value not be automatically entered.
|
||||
*/
|
||||
case off = "off";
|
||||
/**
|
||||
* The browser is allowed to automatically complete the input. No guidance
|
||||
* is provided as to the type of data expected in the field, so the browser
|
||||
* may use its own judgement.
|
||||
*/
|
||||
case on = "on";
|
||||
/**
|
||||
* The field expects the value to be a person's full name. Using "name"
|
||||
* rather than breaking the name down into its components is generally
|
||||
* preferred because it avoids dealing with the wide diversity of human
|
||||
* names and how they are structured; however, you can use a more specific
|
||||
* name_* value if you do need to break the name down into its components:
|
||||
*/
|
||||
case name = "name";
|
||||
/**
|
||||
* The prefix or title, such as "Mrs.", "Mr.", "Miss", "Ms.", "Dr.", or
|
||||
* "Mlle.".
|
||||
*/
|
||||
case name_honorific = "honorific-prefix";
|
||||
/**
|
||||
* The given (or "first") name.
|
||||
*/
|
||||
case name_first = "given-name";
|
||||
/**
|
||||
* The middle name.
|
||||
*/
|
||||
case name_middle = "additional-name";
|
||||
/**
|
||||
* The family (or "last") name.
|
||||
*/
|
||||
case name_last = "family-name";
|
||||
/**
|
||||
* The suffix, such as "Jr.", "B.Sc.", "PhD.", "MBASW", or "IV".
|
||||
*/
|
||||
case name_suffix = "honorific-suffix";
|
||||
/**
|
||||
* A nickname or handle.
|
||||
*/
|
||||
case nickname = "nickname";
|
||||
/**
|
||||
* An email address.
|
||||
*/
|
||||
case email = "email";
|
||||
/**
|
||||
* A username or account name.
|
||||
*/
|
||||
case username = "username";
|
||||
/**
|
||||
* The user's current password.
|
||||
*/
|
||||
case password = "current-password";
|
||||
/**
|
||||
* A new password. When creating a new account or changing passwords, this
|
||||
* should be used for an "Enter your new password" or "Confirm new password"
|
||||
* field, as opposed to a general "Enter your current password" field that
|
||||
* might be present. This may be used by the browser both to avoid
|
||||
* accidentally filling in an existing password and to offer assistance in
|
||||
* creating a secure password.
|
||||
*/
|
||||
case password_new = "new-password";
|
||||
/**
|
||||
* A one-time password (OTP) for verifying user information, most commonly a
|
||||
* phone number used as an additional factor in a sign-in flow.
|
||||
*/
|
||||
case otp = "one-time-code";
|
||||
/**
|
||||
* A job title, or the title a person has within an organization, such as
|
||||
* "Senior Technical Writer", "President", or "Assistant Troop Leader".
|
||||
*/
|
||||
case jobTitle = "organization-title";
|
||||
/**
|
||||
* A company or organization name, such as "Acme Widget Company" or "Girl
|
||||
* Scouts of America".
|
||||
*/
|
||||
case organization = "organization";
|
||||
/**
|
||||
* A street address. This can be multiple lines of text, and should fully
|
||||
* identify the location of the address within its second administrative
|
||||
* level (typically a city or town), but should not include the city name,
|
||||
* ZIP or postal code, or country name.
|
||||
*/
|
||||
case streetAddressCombined = "street-address";
|
||||
/**
|
||||
* The street address to send a product. This can be combined with other
|
||||
* tokens, such as "shipping street-address" and "shipping address-level2".
|
||||
*/
|
||||
case shipping = "shipping";
|
||||
/**
|
||||
* The street address to associate with the form of payment used. This can
|
||||
* be combined with other tokens, such as "billing street-address" and
|
||||
* "billing address-level2".
|
||||
*/
|
||||
case billing = "billing";
|
||||
/**
|
||||
* The first individual line of the street address. This should only be
|
||||
* present if the "street-address" is not present.
|
||||
*/
|
||||
case streetAddress1 = "address-line1";
|
||||
/**
|
||||
* The second individual line of the street address. This should only be
|
||||
* present if the "street-address" is not present.
|
||||
*/
|
||||
case streetAddress2 = "address-line2";
|
||||
/**
|
||||
* The third individual line of the street address. This should only be
|
||||
* present if the "street-address" is not present.
|
||||
*/
|
||||
case streetAddress3 = "address-line3";
|
||||
/**
|
||||
* The first administrative level in the address. This is typically the
|
||||
* province in which the address is located. In the United States, this
|
||||
* would be the state. In Switzerland, the canton. In the United Kingdom,
|
||||
* the post town.
|
||||
*/
|
||||
case addressLevel1 = "address-level1";
|
||||
/**
|
||||
* The second administrative level, in addresses with at least two of them.
|
||||
* In countries with two administrative levels, this would typically be the
|
||||
* city, town, village, or other locality in which the address is located.
|
||||
*/
|
||||
case addressLevel2 = "address-level2";
|
||||
/**
|
||||
* The third administrative level, in addresses with at least three
|
||||
* administrative levels.
|
||||
*/
|
||||
case addressLevel3 = "address-level3";
|
||||
/**
|
||||
* The fourth administrative level, in addresses with at least four
|
||||
* administrative levels.
|
||||
*/
|
||||
case addressLevel4 = "address-level4";
|
||||
/**
|
||||
* A country or territory code.
|
||||
*/
|
||||
case countryCode = "country";
|
||||
/**
|
||||
* A country or territory name.
|
||||
*/
|
||||
case country = "country-name";
|
||||
/**
|
||||
* A postal code (in the United States, this is the ZIP code).
|
||||
*/
|
||||
case postalCode = "postal-code";
|
||||
/**
|
||||
* The full name as printed on or associated with a payment instrument such
|
||||
* as a credit card. Using a full name field is preferred, typically, over
|
||||
* breaking the name into pieces.
|
||||
*/
|
||||
case creditCardName = "cc-name";
|
||||
/**
|
||||
* A given (first) name as given on a payment instrument like a credit card.
|
||||
*/
|
||||
case creditCardFirstName = "cc-given-name";
|
||||
/**
|
||||
* A middle name as given on a payment instrument or credit card.
|
||||
*/
|
||||
case creditCardMiddleName = "cc-additional-name";
|
||||
/**
|
||||
* A family name, as given on a credit card.
|
||||
*/
|
||||
case creditCardLastName = "cc-family-name";
|
||||
/**
|
||||
* A credit card number or other number identifying a payment method, such
|
||||
* as an account number.
|
||||
*/
|
||||
case paymentNumber = "cc-number";
|
||||
/**
|
||||
* A payment method expiration date, typically in the form "MM/YY" or "MM/YYYY".
|
||||
*/
|
||||
case creditCardExpiration = "cc-exp";
|
||||
/**
|
||||
* The year in which the payment method expires.
|
||||
*/
|
||||
case creditCardExpirationYear = "cc-exp-year";
|
||||
/**
|
||||
* The security code for the payment instrument; on credit cards, this is
|
||||
* the 3-digit verification number on the back of the card.
|
||||
*/
|
||||
case creditCardSecurityCode = "cc-csc";
|
||||
/**
|
||||
* The type of payment instrument (such as "Visa" or "Master Card").
|
||||
*/
|
||||
case creditCardType = "cc-type";
|
||||
/**
|
||||
* The currency in which the transaction is to take place.
|
||||
*/
|
||||
case transactionCurrency = "transaction-currency";
|
||||
/**
|
||||
* The amount, given in the currency specified by "transaction-currency", of
|
||||
* the transaction, for a payment form.
|
||||
*/
|
||||
case transactionAmount = "transaction-amount";
|
||||
/**
|
||||
* A preferred language, given as a valid BCP 47 language tag.
|
||||
* https://en.wikipedia.org/wiki/IETF_language_tag
|
||||
*/
|
||||
case language = "language";
|
||||
/**
|
||||
* A birth date, as a full date.
|
||||
*/
|
||||
case birthday = "bday";
|
||||
/**
|
||||
* The day of the month of a birth date.
|
||||
*/
|
||||
case birthdayDay = "bday-day";
|
||||
/**
|
||||
* The month of the year of a birth date.
|
||||
*/
|
||||
case birthdayMonth = "bday-month";
|
||||
/**
|
||||
* The year of a birth date.
|
||||
*/
|
||||
case birthdayYear = "bday-year";
|
||||
/**
|
||||
* A gender identity (such as "Female", "Fa'afafine", "Hijra", "Male",
|
||||
* "Nonbinary"), as freeform text without newlines.
|
||||
*/
|
||||
case gender = "sex";
|
||||
/**
|
||||
* A full telephone number, including the country code. If you need to break
|
||||
* the phone number up into its components, you can use more specific
|
||||
* phone_* values.
|
||||
*/
|
||||
case phone = "tel";
|
||||
/**
|
||||
* The entire phone number without the country code component, including a
|
||||
* country-internal prefix. For the phone number "1-855-555-6502", this
|
||||
* field's value would be "855-555-6502".
|
||||
*/
|
||||
case phone_national = "tel-national";
|
||||
/**
|
||||
* The phone number without the country or area code. This can be split
|
||||
* further into two parts, for phone numbers which have an exchange number
|
||||
* and then a number within the exchange. For the phone number "555-6502",
|
||||
* use "tel-local-prefix" for "555" and "tel-local-suffix" for "6502".
|
||||
*/
|
||||
case phone_local = "tel-local";
|
||||
/**
|
||||
* The country code, such as "1" for the United States, Canada, and other
|
||||
* areas in North America and parts of the Caribbean.
|
||||
*/
|
||||
case phone_country = "tel-country-code";
|
||||
/**
|
||||
* The area code, with any country-internal prefix applied if appropriate.
|
||||
*/
|
||||
case phone_area = "tel-area-code";
|
||||
/**
|
||||
* A telephone extension code within the phone number, such as a room or
|
||||
* suite number in a hotel or an office extension in a company.
|
||||
*/
|
||||
case phone_extension = "tel-extension";
|
||||
/**
|
||||
* A URL for an instant messaging protocol endpoint, such as
|
||||
* "xmpp:username@example.net".
|
||||
*/
|
||||
case impp = "impp";
|
||||
/**
|
||||
* A URL, such as a home page or company website address as appropriate
|
||||
* given the context of the other fields in the form.
|
||||
*/
|
||||
case url = "url";
|
||||
/**
|
||||
* The URL of an image representing the person, company, or contact
|
||||
* information given in the other fields in the form.
|
||||
*/
|
||||
case photo = "photo";
|
||||
/**
|
||||
* Passkeys generated by the Web Authentication API, as requested by a
|
||||
* conditional navigator.credentials.get() call (i.e., one that includes
|
||||
* mediation: 'conditional'). See Sign in with a passkey through form
|
||||
* autofill for more details.
|
||||
* https://web.dev/passkey-form-autofill/
|
||||
*/
|
||||
case webauthn = "webauthn";
|
||||
}
|
34
src/Html5/Enums/BrowsingContext.php
Normal file
34
src/Html5/Enums/BrowsingContext.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* A browsing context is an environment in which a browser displays a Document.
|
||||
* In modern browsers, it usually is a tab, but can be a window or even only
|
||||
* parts of a page, like a frame or an iframe.
|
||||
*
|
||||
* Descriptions by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Glossary/Browsing_context
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a
|
||||
*/
|
||||
enum BrowsingContext: string {
|
||||
/**
|
||||
* the current browsing context. (Default)
|
||||
*/
|
||||
case current = "_self";
|
||||
/**
|
||||
* usually a new tab, but users can configure browsers to open a new window
|
||||
* instead.
|
||||
*/
|
||||
case blank = "_blank";
|
||||
/**
|
||||
* the parent browsing context of the current one. If no parent, behaves as
|
||||
* _self.
|
||||
*/
|
||||
case parent = "_parent";
|
||||
/**
|
||||
* the topmost browsing context (the "highest" context that's an ancestor of
|
||||
* the current one). If no ancestors, behaves as _self.
|
||||
*/
|
||||
case top = "_top";
|
||||
}
|
29
src/Html5/Enums/Capture.php
Normal file
29
src/Html5/Enums/Capture.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The capture attribute specifies that, optionally, a new file should be
|
||||
* captured, and which device should be used to capture that new media of a type
|
||||
* defined by the accept attribute.
|
||||
*
|
||||
* Values include user and environment. The capture attribute is supported on
|
||||
* the file input type.
|
||||
*
|
||||
* The capture attribute takes as its value a string that specifies which camera
|
||||
* to use for capture of image or video data, if the accept attribute indicates
|
||||
* that the input should be of one of those types.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/capture
|
||||
*/
|
||||
enum Autocomplete: string {
|
||||
/**
|
||||
* The user-facing camera and/or microphone should be used.
|
||||
*/
|
||||
case user = "user";
|
||||
/**
|
||||
* The outward-facing camera and/or microphone should be used
|
||||
*/
|
||||
case environment = "environment";
|
||||
}
|
30
src/Html5/Enums/CrossOrigin.php
Normal file
30
src/Html5/Enums/CrossOrigin.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
enum CrossOrigin: string
|
||||
{
|
||||
/**
|
||||
* A cross-origin request (i.e. with an Origin HTTP header) is performed,
|
||||
* but no credential is sent (i.e. no cookie, X.509 certificate, or HTTP
|
||||
* Basic authentication). If the server does not give credentials to the
|
||||
* origin site (by not setting the Access-Control-Allow-Origin HTTP header)
|
||||
* the resource will be tainted and its usage restricted.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
||||
*/
|
||||
case anonymous = 'anonymous';
|
||||
|
||||
/**
|
||||
* A cross-origin request (i.e. with an Origin HTTP header) is performed
|
||||
* along with a credential sent (i.e. a cookie, certificate, and/or HTTP
|
||||
* Basic authentication is performed). If the server does not give
|
||||
* credentials to the origin site (through Access-Control-Allow-Credentials
|
||||
* HTTP header), the resource will be tainted and its usage restricted.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
||||
*/
|
||||
case useCredentials = 'use-credentials';
|
||||
}
|
9
src/Html5/Enums/Draggable.php
Normal file
9
src/Html5/Enums/Draggable.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
enum Draggable: string
|
||||
{
|
||||
case true = "true";
|
||||
case false = "false";
|
||||
}
|
48
src/Html5/Enums/HttpEquiv_meta.php
Normal file
48
src/Html5/Enums/HttpEquiv_meta.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* Defines a pragma directive. The attribute is named http-equiv(alent) because
|
||||
* all the allowed values are names of particular HTTP headers.
|
||||
*
|
||||
* Descriptions by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#http-equiv
|
||||
*/
|
||||
enum HttpEquiv_meta: string {
|
||||
/**
|
||||
* Allows page authors to define a content policy for the current page.
|
||||
* Content policies mostly specify allowed server origins and script
|
||||
* endpoints which help guard against cross-site scripting attacks.
|
||||
*/
|
||||
case ContentSecurityPolicy = "content-security-policy";
|
||||
/**
|
||||
* Declares the MIME type and the document's character encoding. The content
|
||||
* attribute must have the value "text/html; charset=utf-8" if specified.
|
||||
* This is equivalent to a <meta> element with the charset attribute
|
||||
* specified and carries the same restriction on placement within the
|
||||
* document. Note: Can only be used in documents served with a text/html —
|
||||
* not in documents served with an XML MIME type.
|
||||
*/
|
||||
case mime = "content-type";
|
||||
/**
|
||||
* Sets the name of the default CSS style sheet set.
|
||||
*/
|
||||
case defaultStyle = "default-style";
|
||||
/**
|
||||
* If specified, the content attribute must have the value "IE=edge". User
|
||||
* agents are required to ignore this pragma.
|
||||
*/
|
||||
case xUaCompatible = "x-ua-compatible";
|
||||
/**
|
||||
* This instruction specifies:
|
||||
*
|
||||
* The number of seconds until the page should be reloaded - only if the
|
||||
* content attribute contains a non-negative integer.
|
||||
*
|
||||
* The number of seconds until the page should redirect to another - only if
|
||||
* the content attribute contains a non-negative integer followed by the
|
||||
* string ';url=', and a valid URL.
|
||||
*/
|
||||
case refresh = "refresh";
|
||||
}
|
61
src/Html5/Enums/InputMode.php
Normal file
61
src/Html5/Enums/InputMode.php
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The inputmode global attribute is an enumerated attribute that hints at the
|
||||
* type of data that might be entered by the user while editing the element or
|
||||
* its contents. This allows a browser to display an appropriate virtual
|
||||
* keyboard.
|
||||
*
|
||||
* It is used primarily on <input> elements, but is usable on any element in
|
||||
* contenteditable mode.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode
|
||||
*/
|
||||
enum InputMode: string
|
||||
{
|
||||
/**
|
||||
* No virtual keyboard. For when the page implements its own keyboard input
|
||||
* control.
|
||||
*/
|
||||
case none = "none";
|
||||
/**
|
||||
* Standard input keyboard for the user's current locale.
|
||||
*/
|
||||
case text = "text";
|
||||
/**
|
||||
* Fractional numeric input keyboard containing the digits and decimal
|
||||
* separator for the user's locale (typically . or ,). Devices may or may
|
||||
* not show a minus key (-).
|
||||
*/
|
||||
case numeric = "numeric";
|
||||
/**
|
||||
* A telephone keypad input, including the digits 0–9, the asterisk (*), and
|
||||
* the pound (#) key. Inputs that *require* a telephone number should
|
||||
* typically use <input type="tel"> instead.
|
||||
*/
|
||||
case phone = "tel";
|
||||
/**
|
||||
* A virtual keyboard optimized for search input. For instance, the
|
||||
* return/submit key may be labeled "Search", along with possible other
|
||||
* optimizations. Inputs that require a search query should typically use
|
||||
* <input type="search"> instead.
|
||||
*/
|
||||
case search = "search";
|
||||
/**
|
||||
* A virtual keyboard optimized for entering email addresses. Typically
|
||||
* includes the @character as well as other optimizations. Inputs that
|
||||
* require email addresses should typically use <input type="email">
|
||||
* instead.
|
||||
*/
|
||||
case email = "email";
|
||||
/**
|
||||
* A keypad optimized for entering URLs. This may have the / key more
|
||||
* prominent, for example. Enhanced features could include history access
|
||||
* and so on. Inputs that require a URL should typically use <input
|
||||
* type="url"> instead.
|
||||
*/
|
||||
case url = "url";
|
||||
}
|
85
src/Html5/Enums/Name_meta.php
Normal file
85
src/Html5/Enums/Name_meta.php
Normal file
|
@ -0,0 +1,85 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* Includes a selection of standard metadata names defined in the HTML and CSS standards as well as the WHATWG Wiki MetaExtensions page.
|
||||
*
|
||||
* Descriptions by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name
|
||||
*/
|
||||
enum Name_meta: string
|
||||
{
|
||||
/**
|
||||
* the name of the application running in the web page.
|
||||
*/
|
||||
case application = "application-name";
|
||||
/**
|
||||
* the name of the document's author.
|
||||
*/
|
||||
case author = "author";
|
||||
/**
|
||||
* a short and accurate summary of the content of the page. Several browsers, like Firefox and Opera, use this as the default description of bookmarked pages.
|
||||
*/
|
||||
case description = "description";
|
||||
/**
|
||||
* the identifier of the software that generated the page.
|
||||
*/
|
||||
case generator = "generator";
|
||||
/**
|
||||
* words relevant to the page's content separated by commas.
|
||||
*/
|
||||
case keywords = "keywords";
|
||||
/**
|
||||
* controls the HTTP Referer header of requests sent from the document
|
||||
*/
|
||||
case referrer = "referrer";
|
||||
/**
|
||||
* indicates a suggested color that user agents should use to customize the display of the page or of the surrounding user interface. The content attribute contains a valid CSS <color>. The media attribute with a valid media query list can be included to set the media the theme color metadata applies to.
|
||||
*/
|
||||
case color = "theme-color";
|
||||
/**
|
||||
* specifies one or more color schemes with which the document is
|
||||
* compatible. The browser will use this information in tandem with the
|
||||
* user's browser or device settings to determine what colors to use for
|
||||
* everything from background and foregrounds to form controls and
|
||||
* scrollbars. The primary use for <meta name="color-scheme"> is to indicate
|
||||
* compatibility with—and order of preference for—light and dark color
|
||||
* modes. The value of the content property for color-scheme may be one of
|
||||
* the following:
|
||||
*
|
||||
* * normal
|
||||
* * only light
|
||||
* * light dark
|
||||
* * dark light
|
||||
*/
|
||||
case colorScheme = "color-scheme";
|
||||
/**
|
||||
* Defines the pixel width of the viewport that you want the website to be rendered at.
|
||||
*
|
||||
* Or set to "device-width" to set viewport to device width
|
||||
*/
|
||||
case viewportWidth = "width";
|
||||
/**
|
||||
* Defines the ratio between the device width (device-width in portrait mode or device-height in landscape mode) and the viewport size.
|
||||
*
|
||||
* Value: 0.0-10.0
|
||||
*/
|
||||
case initialScale = "initial-scale";
|
||||
/**
|
||||
* Defines the maximum amount to zoom in. It must be greater or equal to the minimum-scale or the behavior is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.
|
||||
*
|
||||
* Value: 0.0-10.0
|
||||
*/
|
||||
case maximumScale = "maximum-scale";
|
||||
/**
|
||||
* Defines the minimum zoom level. It must be smaller or equal to the maximum-scale or the behavior is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.
|
||||
*
|
||||
* Value: 0.0-10.0
|
||||
*/
|
||||
case minimumScale = "minimum-scale";
|
||||
/**
|
||||
* the behavior that cooperative crawlers, or "robots", should use with the page. It is a comma-separated list of the values in Robots_meta
|
||||
*/
|
||||
case robots = "robots";
|
||||
}
|
41
src/Html5/Enums/ReferrerPolicy_link.php
Normal file
41
src/Html5/Enums/ReferrerPolicy_link.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* A string indicating which referrer to use when fetching the resource. These
|
||||
* values are valid in <link> elements.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
||||
*/
|
||||
enum ReferrerPolicy_link: string
|
||||
{
|
||||
/**
|
||||
* means that the Referer header will not be sent.
|
||||
*/
|
||||
case noReferrer = "no-referrer";
|
||||
/**
|
||||
* means that no Referer header will be sent when navigating to an origin
|
||||
* without TLS (HTTPS). This is a user agent's default behavior, if no
|
||||
* policy is otherwise specified.
|
||||
*/
|
||||
case noReferrerWhenDowngrade = "no-referrer-when-downgrade";
|
||||
/**
|
||||
* means that the referrer will be the origin of the page, which is roughly
|
||||
* the scheme, the host, and the port.
|
||||
*/
|
||||
case origin = "origin";
|
||||
/**
|
||||
* means that navigating to other origins will be limited to the scheme, the
|
||||
* host, and the port, while navigating on the same origin will include the
|
||||
* referrer's path.
|
||||
*/
|
||||
case originWhenCrossOrigin = "origin-when-cross-origin";
|
||||
/**
|
||||
* means that the referrer will include the origin and the path (but not the
|
||||
* fragment, password, or username). This case is unsafe because it can leak
|
||||
* origins and paths from TLS-protected resources to insecure origins.
|
||||
*/
|
||||
case unsafeUrl = "unsafe-url";
|
||||
}
|
87
src/Html5/Enums/Rel_a.php
Normal file
87
src/Html5/Enums/Rel_a.php
Normal file
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The rel attribute defines the relationship between a linked resource and the
|
||||
* current document. These values are valid in <a> and <area> elements.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel
|
||||
*/
|
||||
enum Rel_a: string
|
||||
{
|
||||
/**
|
||||
* Alternate representations of the current document.
|
||||
*/
|
||||
case alternate = "alternate";
|
||||
/**
|
||||
* Author of the current document or article.
|
||||
*/
|
||||
case author = "author";
|
||||
/**
|
||||
* Permalink for the nearest ancestor section.
|
||||
*/
|
||||
case bookmark = "bookmark";
|
||||
/**
|
||||
* The referenced document is not part of the same site as the current
|
||||
* document.
|
||||
*/
|
||||
case external = "external";
|
||||
/**
|
||||
* Link to context-sensitive help.
|
||||
*/
|
||||
case help = "help";
|
||||
/**
|
||||
* Indicates that the main content of the current document is covered by the
|
||||
* copyright license. described by the referenced document.
|
||||
*/
|
||||
case license = "license";
|
||||
/**
|
||||
* Indicates that the current document represents the person who owns the
|
||||
* linked content.
|
||||
*/
|
||||
case me = "me";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* next document in the series is the referenced document.
|
||||
*/
|
||||
case next = "next";
|
||||
/**
|
||||
* Indicates that the current document's original author or publisher does
|
||||
* not endorse the referenced document.
|
||||
*/
|
||||
case noFollow = "nofollow";
|
||||
/**
|
||||
* Creates a top-level browsing context that is not an auxiliary browsing
|
||||
* context if the hyperlink would create either of those, to begin with
|
||||
* (i.e., has an appropriate target attribute value).
|
||||
*/
|
||||
case noOpener = "noopener";
|
||||
/**
|
||||
* No Referer header will be included. Additionally, has the same effect as
|
||||
* noopener.
|
||||
*/
|
||||
case noReferrer = "noreferrer";
|
||||
/**
|
||||
* Creates an auxiliary browsing context if the hyperlink would otherwise
|
||||
* create a top-level browsing context that is not an auxiliary browsing
|
||||
* context (i.e., has "_blank" as target attribute value).
|
||||
*/
|
||||
case opener = "opener";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* previous document in the series is the referenced document.
|
||||
*/
|
||||
case previous = "prev";
|
||||
/**
|
||||
* Gives a link to a resource that can be used to search through the current
|
||||
* document and its related pages.
|
||||
*/
|
||||
case search = "search";
|
||||
/**
|
||||
* Gives a tag (identified by the given address) that applies to the current
|
||||
* document.
|
||||
*/
|
||||
case tag = "tag";
|
||||
}
|
65
src/Html5/Enums/Rel_form.php
Normal file
65
src/Html5/Enums/Rel_form.php
Normal file
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The rel attribute defines the relationship between a linked resource and the
|
||||
* current document. These values are valid in <form> elements.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel
|
||||
*/
|
||||
enum Rel_form: string
|
||||
{
|
||||
/**
|
||||
* The referenced document is not part of the same site as the current
|
||||
* document.
|
||||
*/
|
||||
case external = "external";
|
||||
/**
|
||||
* Link to context-sensitive help.
|
||||
*/
|
||||
case help = "help";
|
||||
/**
|
||||
* Indicates that the main content of the current document is covered by the
|
||||
* copyright license. described by the referenced document.
|
||||
*/
|
||||
case license = "license";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* next document in the series is the referenced document.
|
||||
*/
|
||||
case next = "next";
|
||||
/**
|
||||
* Indicates that the current document's original author or publisher does
|
||||
* not endorse the referenced document.
|
||||
*/
|
||||
case noFollow = "nofollow";
|
||||
/**
|
||||
* Creates a top-level browsing context that is not an auxiliary browsing
|
||||
* context if the hyperlink would create either of those, to begin with
|
||||
* (i.e., has an appropriate target attribute value).
|
||||
*/
|
||||
case noOpener = "noopener";
|
||||
/**
|
||||
* No Referer header will be included. Additionally, has the same effect as
|
||||
* noopener.
|
||||
*/
|
||||
case noReferrer = "noreferrer";
|
||||
/**
|
||||
* Creates an auxiliary browsing context if the hyperlink would otherwise
|
||||
* create a top-level browsing context that is not an auxiliary browsing
|
||||
* context (i.e., has "_blank" as target attribute value).
|
||||
*/
|
||||
case opener = "opener";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* previous document in the series is the referenced document.
|
||||
*/
|
||||
case previous = "prev";
|
||||
/**
|
||||
* Gives a link to a resource that can be used to search through the current
|
||||
* document and its related pages.
|
||||
*/
|
||||
case search = "search";
|
||||
}
|
106
src/Html5/Enums/Rel_link.php
Normal file
106
src/Html5/Enums/Rel_link.php
Normal file
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The rel attribute defines the relationship between a linked resource and the
|
||||
* current document. These values are valid in <link> elements.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel
|
||||
*/
|
||||
enum Rel_link: string
|
||||
{
|
||||
/**
|
||||
* Alternate representations of the current document.
|
||||
*/
|
||||
case alternate = "alternate";
|
||||
/**
|
||||
* Author of the current document or article.
|
||||
*/
|
||||
case author = "author";
|
||||
/**
|
||||
* Preferred URL for the current document.
|
||||
*/
|
||||
case canonical = "canonical";
|
||||
/**
|
||||
* Tells the browser to preemptively perform DNS resolution for the target
|
||||
* resource's origin.
|
||||
*/
|
||||
case dnsPrefetch = "dns-prefetch";
|
||||
/**
|
||||
* Link to context-sensitive help.
|
||||
*/
|
||||
case help = "help";
|
||||
/**
|
||||
* An icon representing the current document.
|
||||
*/
|
||||
case icon = "icon";
|
||||
/**
|
||||
* Indicates that the main content of the current document is covered by the
|
||||
* copyright license. described by the referenced document.
|
||||
*/
|
||||
case license = "license";
|
||||
/**
|
||||
* Web app manifest.
|
||||
*/
|
||||
case manifest = "manifest";
|
||||
/**
|
||||
* Indicates that the current document represents the person who owns the
|
||||
* linked content.
|
||||
*/
|
||||
case me = "me";
|
||||
/**
|
||||
* Tells to browser to preemptively fetch the script and store it in the
|
||||
* document's module map for later evaluation. Optionally, the module's
|
||||
* dependencies can be fetched as well.
|
||||
*/
|
||||
case modulePreload = "modulepreload";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* next document in the series is the referenced document.
|
||||
*/
|
||||
case next = "next";
|
||||
/**
|
||||
* Gives the address of the pingback server that handles pingbacks to the
|
||||
* current document.
|
||||
*/
|
||||
case pingback = "pingback";
|
||||
/**
|
||||
* Specifies that the user agent should preemptively connect to the target
|
||||
* resource's origin.
|
||||
*/
|
||||
case preconnect = "preconnect";
|
||||
/**
|
||||
* Specifies that the user agent should preemptively fetch and cache the
|
||||
* target resource as it is likely to be required for a followup navigation.
|
||||
* */
|
||||
case prefetch = "prefetch";
|
||||
/**
|
||||
* Specifies that the user agent must preemptively fetch and cache the
|
||||
* target resource for current navigation according to the potential
|
||||
* destination given by the as attribute (and the priority associated with
|
||||
* the corresponding destination).
|
||||
*/
|
||||
case preload = "preload";
|
||||
/**
|
||||
* Specifies that the user agent should preemptively fetch the target
|
||||
* resource and process it in a way that helps deliver a faster response in
|
||||
* the future.
|
||||
*/
|
||||
case prerender = "prerender";
|
||||
/**
|
||||
* Indicates that the current document is a part of a series and that the
|
||||
* previous document in the series is the referenced document.
|
||||
*/
|
||||
case previous = "prev";
|
||||
/**
|
||||
* Gives a link to a resource that can be used to search through the current
|
||||
* document and its related pages.
|
||||
*/
|
||||
case search = "search";
|
||||
/**
|
||||
* Imports a style sheet.
|
||||
*/
|
||||
case stylesheet = "stylesheet";
|
||||
}
|
50
src/Html5/Enums/Robots_meta.php
Normal file
50
src/Html5/Enums/Robots_meta.php
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* the behavior that cooperative crawlers, or "robots", should use. Meant to be
|
||||
* used in MetaTag::setRobots
|
||||
*
|
||||
* Descriptions by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name
|
||||
*/
|
||||
enum Robots_meta: string {
|
||||
/**
|
||||
* Allows the robot to index the page (default).
|
||||
*/
|
||||
case index = "index";
|
||||
/**
|
||||
* Requests the robot to not index the page.
|
||||
*/
|
||||
case noIndex = "noindex";
|
||||
/**
|
||||
* Allows the robot to follow the links on the page (default).
|
||||
*/
|
||||
case follow = "follow";
|
||||
/**
|
||||
* Requests the robot to not follow the links on the page.
|
||||
*/
|
||||
case noFollow = "nofollow";
|
||||
/**
|
||||
* Equivalent to index, follow
|
||||
*/
|
||||
case all = "all";
|
||||
/**
|
||||
* Equivalent to noindex, nofollow
|
||||
*/
|
||||
case none = "none";
|
||||
/**
|
||||
* Requests the search engine not to cache the page content.
|
||||
*/
|
||||
case noArchive = "noarchive";
|
||||
/**
|
||||
* Prevents displaying any description of the page in search engine results.
|
||||
*/
|
||||
case noSnippet = "nosnippet";
|
||||
/**
|
||||
* Requests this page not to appear as the referring page of an indexed
|
||||
* image.
|
||||
*/
|
||||
case noImageIndex = "noimageindex";
|
||||
}
|
9
src/Html5/Enums/Spellcheck.php
Normal file
9
src/Html5/Enums/Spellcheck.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
enum Spellcheck: string
|
||||
{
|
||||
case true = "true";
|
||||
case false = "false";
|
||||
}
|
18
src/Html5/Enums/Translate.php
Normal file
18
src/Html5/Enums/Translate.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
/**
|
||||
* The translate global attribute is an enumerated attribute that is used to
|
||||
* specify whether an element's translatable attribute values and its Text node
|
||||
* children should be translated when the page is localized, or whether to leave
|
||||
* them unchanged.
|
||||
*
|
||||
* Description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate
|
||||
*/
|
||||
enum Translate: string
|
||||
{
|
||||
case true = "yes";
|
||||
case false = "no";
|
||||
}
|
11
src/Html5/Enums/Type_list.php
Normal file
11
src/Html5/Enums/Type_list.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Enums;
|
||||
|
||||
enum Type_list: string {
|
||||
case letterLower = 'a';
|
||||
case letterUpper = 'A';
|
||||
case romanLower = 'i';
|
||||
case romanUpper = 'I';
|
||||
case number = '1';
|
||||
}
|
9
src/Html5/Exceptions/InvalidArgumentsException.php
Normal file
9
src/Html5/Exceptions/InvalidArgumentsException.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class InvalidArgumentsException extends Exception
|
||||
{
|
||||
}
|
9
src/Html5/Exceptions/InvalidStateException.php
Normal file
9
src/Html5/Exceptions/InvalidStateException.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class InvalidStateException extends Exception
|
||||
{
|
||||
}
|
|
@ -5,6 +5,9 @@ namespace ByJoby\HTML\Html5;
|
|||
use ByJoby\HTML\AbstractParser;
|
||||
use ByJoby\HTML\Containers\HtmlDocumentInterface;
|
||||
|
||||
/**
|
||||
* A Parser configured to parse and render HTML5.
|
||||
*/
|
||||
class Html5Parser extends AbstractParser
|
||||
{
|
||||
/** @var array<int,string> */
|
||||
|
|
|
@ -3,17 +3,44 @@
|
|||
namespace ByJoby\HTML\Html5\Tags;
|
||||
|
||||
use ByJoby\HTML\ContentCategories\MetadataContent;
|
||||
use ByJoby\HTML\Html5\Enums\BrowsingContext;
|
||||
use ByJoby\HTML\Tags\AbstractTag;
|
||||
use Stringable;
|
||||
|
||||
/**
|
||||
* The <base> HTML element specifies the base URL to use for all relative URLs
|
||||
* in a document. There can be only one <base> element in a document.
|
||||
*
|
||||
* A document's used base URL can be accessed by scripts with Node.baseURI. If
|
||||
* the document has no <base> elements, then baseURI defaults to location.href
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
|
||||
*/
|
||||
class BaseTag extends AbstractTag implements MetadataContent
|
||||
{
|
||||
const TAG = 'base';
|
||||
|
||||
/**
|
||||
* The base URL to be used throughout the document for relative URLs.
|
||||
* Absolute and relative URLs are allowed. data: and javascript: URLs are
|
||||
* not allowed.
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function href(): null|string
|
||||
{
|
||||
return $this->attributes()->string('href');
|
||||
return $this->attributes()->asString('href');
|
||||
}
|
||||
|
||||
/**
|
||||
* The base URL to be used throughout the document for relative URLs.
|
||||
* Absolute and relative URLs are allowed. data: and javascript: URLs are
|
||||
* not allowed.
|
||||
*
|
||||
* @param null|string $href
|
||||
* @return static
|
||||
*/
|
||||
public function setHref(null|string $href): static
|
||||
{
|
||||
if (!$href) {
|
||||
|
@ -24,30 +51,62 @@ class BaseTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The base URL to be used throughout the document for relative URLs.
|
||||
* Absolute and relative URLs are allowed. data: and javascript: URLs are
|
||||
* not allowed.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetHref(): static
|
||||
{
|
||||
unset($this->attributes()['href']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function target(): null|string
|
||||
/**
|
||||
* A keyword or author-defined name of the default browsing context to show
|
||||
* the results of navigation from <a>, <area>, or <form> elements without
|
||||
* explicit target attributes. The following keywords have special meanings:
|
||||
*
|
||||
* @return null|string|Stringable|BrowsingContext
|
||||
*/
|
||||
public function target(): null|string|Stringable|BrowsingContext
|
||||
{
|
||||
return $this->attributes()->string('target');
|
||||
return $this->attributes()->asEnum('target', BrowsingContext::class)
|
||||
?? $this->attributes()->asString('target');
|
||||
}
|
||||
|
||||
public function setTarget(null|string $target): static
|
||||
/**
|
||||
* A keyword or author-defined name of the default browsing context to show
|
||||
* the results of navigation from <a>, <area>, or <form> elements without
|
||||
* explicit target attributes. The following keywords have special meanings:
|
||||
*
|
||||
* @param null|string|Stringable|BrowsingContext $target
|
||||
* @return static
|
||||
*/
|
||||
public function setTarget(null|string|Stringable|BrowsingContext $target): static
|
||||
{
|
||||
if (!$target) {
|
||||
$this->attributes()['target'] = false;
|
||||
} elseif ($target instanceof BrowsingContext) {
|
||||
$this->attributes()['target'] = $target->value;
|
||||
} else {
|
||||
$this->attributes()['target'] = $target;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* A keyword or author-defined name of the default browsing context to show
|
||||
* the results of navigation from <a>, <area>, or <form> elements without
|
||||
* explicit target attributes. The following keywords have special meanings:
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetTarget(): static
|
||||
{
|
||||
unset($this->attributes()['target']);
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,7 +6,15 @@ use ByJoby\HTML\ContentCategories\HeadingContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <hgroup> element allows the grouping of a heading with any secondary
|
||||
* content, such as subheadings, an alternative title, or tagline. Each of these
|
||||
* types of content represented as a <p> element within the <hgroup>.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/hgroup
|
||||
*/
|
||||
class HgroupTag extends AbstractContainerTag implements DisplayBlock, HeadingContent
|
||||
{
|
||||
const TAG = 'hgroup';
|
||||
}
|
||||
}
|
|
@ -3,81 +3,213 @@
|
|||
namespace ByJoby\HTML\Html5\Tags;
|
||||
|
||||
use ByJoby\HTML\ContentCategories\MetadataContent;
|
||||
use ByJoby\HTML\Helpers\StringableEnumArray;
|
||||
use ByJoby\HTML\Html5\Enums\As_link;
|
||||
use ByJoby\HTML\Html5\Enums\CrossOrigin;
|
||||
use ByJoby\HTML\Html5\Enums\ReferrerPolicy_link;
|
||||
use ByJoby\HTML\Html5\Enums\Rel_link;
|
||||
use ByJoby\HTML\Html5\Exceptions\InvalidArgumentsException;
|
||||
use ByJoby\HTML\Tags\AbstractTag;
|
||||
use Stringable;
|
||||
|
||||
/**
|
||||
* The <link> HTML element specifies relationships between the current document
|
||||
* and an external resource. This element is most commonly used to link to
|
||||
* stylesheets, but is also used to establish site icons (both "favicon" style
|
||||
* icons and icons for the home screen and apps on mobile devices) among other
|
||||
* things.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
||||
*/
|
||||
class LinkTag extends AbstractTag implements MetadataContent
|
||||
{
|
||||
const TAG = 'link';
|
||||
|
||||
public function rel(): null|string
|
||||
/**
|
||||
* This attribute names a relationship of the linked document to the current
|
||||
* document. The attribute must be a space-separated list of link type
|
||||
* values.
|
||||
*
|
||||
* @return Rel_link[]
|
||||
*/
|
||||
public function rel(): array
|
||||
{
|
||||
return $this->attributes()->string('rel');
|
||||
return $this->attributes()->asEnumArray('rel', Rel_link::class, ' ');
|
||||
}
|
||||
|
||||
public function setRel(null|string $rel): static
|
||||
/**
|
||||
* This attribute names a relationship of the linked document to the current
|
||||
* document. The attribute must be a space-separated list of link type
|
||||
* values.
|
||||
*
|
||||
* If $rel is Rel_link::preload then $as must be specified
|
||||
*
|
||||
* if $as is As_link::fetch then $crossorigin must be specified
|
||||
*
|
||||
* @param null|Rel_link|StringableEnumArray<Rel_link>|array<int|string,Rel_link> $rel
|
||||
* @param null|As_link|null $as
|
||||
* @param null|CrossOrigin|null $crossorigin
|
||||
* @return static
|
||||
*/
|
||||
public function setRel(null|Rel_link|StringableEnumArray|array $rel, null|As_link $as = null, null|CrossOrigin $crossorigin = null): static
|
||||
{
|
||||
if (!$rel) {
|
||||
$this->attributes()['rel'] = false;
|
||||
} else {
|
||||
$this->attributes()['rel'] = $rel;
|
||||
$this->attributes()->setEnumArray('rel',$rel,Rel_link::class,' ');
|
||||
// check if new value includes Rel_link::preload and require $as if so
|
||||
$rel = $this->rel();
|
||||
if (in_array(Rel_link::preload, $rel)) {
|
||||
if (!$as) {
|
||||
throw new InvalidArgumentsException('$as is required when $rel includes Rel_link::preload');
|
||||
}
|
||||
}
|
||||
}
|
||||
// set as if it is specified
|
||||
if ($as) {
|
||||
$this->setAs($as, $crossorigin);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute names a relationship of the linked document to the current
|
||||
* document. The attribute must be a space-separated list of link type
|
||||
* values.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetRel(): static
|
||||
{
|
||||
unset($this->attributes()['rel']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function as(): null|string
|
||||
/**
|
||||
* This attribute is required when rel="preload" has been set on the <link>
|
||||
* element, optional when rel="modulepreload" has been set, and otherwise
|
||||
* should not be used. It specifies the type of content being loaded by the
|
||||
* <link>, which is necessary for request matching, application of correct
|
||||
* content security policy, and setting of correct Accept request header.
|
||||
*
|
||||
* @return null|As_link
|
||||
*/
|
||||
public function as (): null|As_link
|
||||
{
|
||||
return $this->attributes()->string('as');
|
||||
return $this->attributes()->asEnum('as', As_link::class);
|
||||
}
|
||||
|
||||
public function setAs(null|string $as): static
|
||||
/**
|
||||
* This attribute is required when rel="preload" has been set on the <link>
|
||||
* element, optional when rel="modulepreload" has been set, and otherwise
|
||||
* should not be used. It specifies the type of content being loaded by the
|
||||
* <link>, which is necessary for request matching, application of correct
|
||||
* content security policy, and setting of correct Accept request header.
|
||||
*
|
||||
* if $as is As_link::fetch then $crossorigin must be specified
|
||||
*
|
||||
* @param null|As_link $as
|
||||
* @param null|CrossOrigin|null $crossorigin
|
||||
* @return static
|
||||
*/
|
||||
public function setAs(null|As_link $as, null|CrossOrigin $crossorigin = null): static
|
||||
{
|
||||
if (!$as) {
|
||||
$this->attributes()['as'] = false;
|
||||
} else {
|
||||
$this->attributes()['as'] = $as;
|
||||
$this->attributes()['as'] = $as->value;
|
||||
// check if we just set as to As_link::fetch and require $crossorigin if so
|
||||
if ($as == As_link::fetch) {
|
||||
if (!$crossorigin) {
|
||||
throw new InvalidArgumentsException('$crossorigin is required when $as is As_link::fetch');
|
||||
}
|
||||
}
|
||||
}
|
||||
// set crossorigin if it is specified
|
||||
if ($crossorigin) {
|
||||
$this->setCrossorigin($crossorigin);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute is required when rel="preload" has been set on the <link>
|
||||
* element, optional when rel="modulepreload" has been set, and otherwise
|
||||
* should not be used. It specifies the type of content being loaded by the
|
||||
* <link>, which is necessary for request matching, application of correct
|
||||
* content security policy, and setting of correct Accept request header.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetAs(): static
|
||||
{
|
||||
unset($this->attributes()['as']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function crossorigin(): null|string
|
||||
/**
|
||||
* This enumerated attribute indicates whether CORS must be used when
|
||||
* fetching the resource. CORS-enabled images can be reused in the <canvas>
|
||||
* element without being tainted. The allowed values are:
|
||||
*
|
||||
* @return null|CrossOrigin
|
||||
*/
|
||||
public function crossorigin(): null|CrossOrigin
|
||||
{
|
||||
return $this->attributes()->string('crossorigin');
|
||||
return $this->attributes()->asEnum('crossorigin', CrossOrigin::class);
|
||||
}
|
||||
|
||||
public function setCrossorigin(null|string $crossorigin): static
|
||||
/**
|
||||
* This enumerated attribute indicates whether CORS must be used when
|
||||
* fetching the resource. CORS-enabled images can be reused in the <canvas>
|
||||
* element without being tainted. The allowed values are:
|
||||
*
|
||||
* @param null|CrossOrigin $crossorigin
|
||||
* @return static
|
||||
*/
|
||||
public function setCrossorigin(null|CrossOrigin $crossorigin): static
|
||||
{
|
||||
if (!$crossorigin) {
|
||||
$this->attributes()['crossorigin'] = false;
|
||||
} else {
|
||||
$this->attributes()['crossorigin'] = $crossorigin;
|
||||
$this->attributes()['crossorigin'] = $crossorigin->value;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This enumerated attribute indicates whether CORS must be used when
|
||||
* fetching the resource. CORS-enabled images can be reused in the <canvas>
|
||||
* element without being tainted. The allowed values are:
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetCrossorigin(): static
|
||||
{
|
||||
unset($this->attributes()['crossorigin']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function href(): null|string
|
||||
/**
|
||||
* This attribute specifies the URL of the linked resource. A URL can be
|
||||
* absolute or relative.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function href(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('href');
|
||||
return $this->attributes()->asString('href');
|
||||
}
|
||||
|
||||
public function setHref(null|string $href): static
|
||||
/**
|
||||
* This attribute specifies the URL of the linked resource. A URL can be
|
||||
* absolute or relative.
|
||||
*
|
||||
* @param null|string|Stringable $href
|
||||
* @return static
|
||||
*/
|
||||
public function setHref(null|string|Stringable $href): static
|
||||
{
|
||||
if (!$href) {
|
||||
$this->attributes()['href'] = false;
|
||||
|
@ -87,18 +219,44 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute specifies the URL of the linked resource. A URL can be
|
||||
* absolute or relative.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetHref(): static
|
||||
{
|
||||
$this->unsetHreflang();
|
||||
unset($this->attributes()['href']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function hreflang(): null|string
|
||||
/**
|
||||
* This attribute indicates the language of the linked resource. It is
|
||||
* purely advisory. Allowed values are specified by RFC 5646: Tags for
|
||||
* Identifying Languages (also known as BCP 47). Use this attribute only if
|
||||
* the href attribute is present.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function hreflang(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('hreflang');
|
||||
return $this->attributes()->asString('hreflang');
|
||||
}
|
||||
|
||||
public function setHreflang(null|string $hreflang): static
|
||||
/**
|
||||
* This attribute indicates the language of the linked resource. It is
|
||||
* purely advisory. Allowed values are specified by RFC 5646: Tags for
|
||||
* Identifying Languages (also known as BCP 47). Use this attribute only if
|
||||
* the href attribute is present.
|
||||
*
|
||||
* https://datatracker.ietf.org/doc/html/rfc5646
|
||||
*
|
||||
* @param null|string|Stringable $hreflang
|
||||
* @return static
|
||||
*/
|
||||
public function setHreflang(null|string|Stringable $hreflang): static
|
||||
{
|
||||
if (!$hreflang) {
|
||||
$this->attributes()['hreflang'] = false;
|
||||
|
@ -108,18 +266,43 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute indicates the language of the linked resource. It is
|
||||
* purely advisory. Allowed values are specified by RFC 5646: Tags for
|
||||
* Identifying Languages (also known as BCP 47). Use this attribute only if
|
||||
* the href attribute is present.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetHreflang(): static
|
||||
{
|
||||
unset($this->attributes()['hreflang']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function imagesizes(): null|string
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesizes attribute is a
|
||||
* sizes attribute that indicates to preload the appropriate resource used
|
||||
* by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function imagesizes(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('imagesizes');
|
||||
return $this->attributes()->asString('imagesizes');
|
||||
}
|
||||
|
||||
public function setImagesizes(null|string $imagesizes): static
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesizes attribute is a
|
||||
* sizes attribute that indicates to preload the appropriate resource used
|
||||
* by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @param null|string|Stringable $imagesizes
|
||||
* @return static
|
||||
*/
|
||||
public function setImagesizes(null|string|Stringable $imagesizes): static
|
||||
{
|
||||
if (!$imagesizes) {
|
||||
$this->attributes()['imagesizes'] = false;
|
||||
|
@ -129,18 +312,43 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesizes attribute is a
|
||||
* sizes attribute that indicates to preload the appropriate resource used
|
||||
* by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetImagesizes(): static
|
||||
{
|
||||
unset($this->attributes()['imagesizes']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function imagesrcset(): null|string
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesrcset attribute is a
|
||||
* sourceset attribute that indicates to preload the appropriate resource
|
||||
* used by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function imagesrcset(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('imagesrcset');
|
||||
return $this->attributes()->asString('imagesrcset');
|
||||
}
|
||||
|
||||
public function setImagesrcset(null|string $imagesrcset): static
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesrcset attribute is a
|
||||
* sourceset attribute that indicates to preload the appropriate resource
|
||||
* used by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @param null|string|Stringable $imagesrcset
|
||||
* @return static
|
||||
*/
|
||||
public function setImagesrcset(null|string|Stringable $imagesrcset): static
|
||||
{
|
||||
if (!$imagesrcset) {
|
||||
$this->attributes()['imagesrcset'] = false;
|
||||
|
@ -150,18 +358,43 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* For rel="preload" and as="image" only, the imagesrcset attribute is a
|
||||
* sourceset attribute that indicates to preload the appropriate resource
|
||||
* used by an img element with corresponding values for its srcset and sizes
|
||||
* attributes.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetImagesrcset(): static
|
||||
{
|
||||
unset($this->attributes()['imagesrcset']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function integrity(): null|string
|
||||
/**
|
||||
* Contains inline metadata — a base64-encoded cryptographic hash of the
|
||||
* resource (file) you're telling the browser to fetch. The browser can use
|
||||
* this to verify that the fetched resource has been delivered free of
|
||||
* unexpected manipulation. See Subresource Integrity.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function integrity(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('integrity');
|
||||
return $this->attributes()->asString('integrity');
|
||||
}
|
||||
|
||||
public function setIntegrity(null|string $integrity): static
|
||||
/**
|
||||
* Contains inline metadata — a base64-encoded cryptographic hash of the
|
||||
* resource (file) you're telling the browser to fetch. The browser can use
|
||||
* this to verify that the fetched resource has been delivered free of
|
||||
* unexpected manipulation. See Subresource Integrity.
|
||||
*
|
||||
* @param null|string|Stringable $integrity
|
||||
* @return static
|
||||
*/
|
||||
public function setIntegrity(null|string|Stringable $integrity): static
|
||||
{
|
||||
if (!$integrity) {
|
||||
$this->attributes()['integrity'] = false;
|
||||
|
@ -171,18 +404,43 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains inline metadata — a base64-encoded cryptographic hash of the
|
||||
* resource (file) you're telling the browser to fetch. The browser can use
|
||||
* this to verify that the fetched resource has been delivered free of
|
||||
* unexpected manipulation. See Subresource Integrity.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetIntegrity(): static
|
||||
{
|
||||
unset($this->attributes()['integrity']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function media(): null|string
|
||||
/**
|
||||
* This attribute specifies the media that the linked resource applies to.
|
||||
* Its value must be a media type / media query. This attribute is mainly
|
||||
* useful when linking to external stylesheets — it allows the user agent to
|
||||
* pick the best adapted one for the device it runs on.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function media(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('media');
|
||||
return $this->attributes()->asString('media');
|
||||
}
|
||||
|
||||
public function setMedia(null|string $media): static
|
||||
/**
|
||||
* This attribute specifies the media that the linked resource applies to.
|
||||
* Its value must be a media type / media query. This attribute is mainly
|
||||
* useful when linking to external stylesheets — it allows the user agent to
|
||||
* pick the best adapted one for the device it runs on.
|
||||
*
|
||||
* @param null|string|Stringable $media
|
||||
* @return static
|
||||
*/
|
||||
public function setMedia(null|string|Stringable $media): static
|
||||
{
|
||||
if (!$media) {
|
||||
$this->attributes()['media'] = false;
|
||||
|
@ -192,39 +450,88 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute specifies the media that the linked resource applies to.
|
||||
* Its value must be a media type / media query. This attribute is mainly
|
||||
* useful when linking to external stylesheets — it allows the user agent to
|
||||
* pick the best adapted one for the device it runs on.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetMedia(): static
|
||||
{
|
||||
unset($this->attributes()['media']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function referrerpolicy(): null|string
|
||||
/**
|
||||
* An enum indicating which referrer to use when fetching the resource.
|
||||
*
|
||||
* @return null|ReferrerPolicy_link
|
||||
*/
|
||||
public function referrerpolicy(): null|ReferrerPolicy_link
|
||||
{
|
||||
return $this->attributes()->string('referrerpolicy');
|
||||
return $this->attributes()->asEnum('referrerpolicy', ReferrerPolicy_link::class);
|
||||
}
|
||||
|
||||
public function setReferrerpolicy(null|string $referrerpolicy): static
|
||||
/**
|
||||
* An enum indicating which referrer to use when fetching the resource.
|
||||
*
|
||||
* @param null|ReferrerPolicy_link $referrerpolicy
|
||||
* @return static
|
||||
*/
|
||||
public function setReferrerpolicy(null|ReferrerPolicy_link $referrerpolicy): static
|
||||
{
|
||||
if (!$referrerpolicy) {
|
||||
$this->attributes()['referrerpolicy'] = false;
|
||||
} else {
|
||||
$this->attributes()['referrerpolicy'] = $referrerpolicy;
|
||||
$this->attributes()['referrerpolicy'] = $referrerpolicy->value;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* An enum indicating which referrer to use when fetching the resource.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetReferrerpolicy(): static
|
||||
{
|
||||
unset($this->attributes()['referrerpolicy']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function type(): null|string
|
||||
/**
|
||||
* This attribute is used to define the type of the content linked to. The
|
||||
* value of the attribute should be a MIME type such as text/html, text/css,
|
||||
* and so on. The common use of this attribute is to define the type of
|
||||
* stylesheet being referenced (such as text/css), but given that CSS is the
|
||||
* only stylesheet language used on the web, not only is it possible to omit
|
||||
* the type attribute, but is actually now recommended practice. It is also
|
||||
* used on rel="preload" link types, to make sure the browser only downloads
|
||||
* file types that it supports.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function type(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->string('type');
|
||||
return $this->attributes()->asString('type');
|
||||
}
|
||||
|
||||
public function setType(null|string $type): static
|
||||
/**
|
||||
* This attribute is used to define the type of the content linked to. The
|
||||
* value of the attribute should be a MIME type such as text/html, text/css,
|
||||
* and so on. The common use of this attribute is to define the type of
|
||||
* stylesheet being referenced (such as text/css), but given that CSS is the
|
||||
* only stylesheet language used on the web, not only is it possible to omit
|
||||
* the type attribute, but is actually now recommended practice. It is also
|
||||
* used on rel="preload" link types, to make sure the browser only downloads
|
||||
* file types that it supports.
|
||||
*
|
||||
* @param null|string|Stringable $type
|
||||
* @return static
|
||||
*/
|
||||
public function setType(null|string|Stringable $type): static
|
||||
{
|
||||
if (!$type) {
|
||||
$this->attributes()['type'] = false;
|
||||
|
@ -234,9 +541,21 @@ class LinkTag extends AbstractTag implements MetadataContent
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute is used to define the type of the content linked to. The
|
||||
* value of the attribute should be a MIME type such as text/html, text/css,
|
||||
* and so on. The common use of this attribute is to define the type of
|
||||
* stylesheet being referenced (such as text/css), but given that CSS is the
|
||||
* only stylesheet language used on the web, not only is it possible to omit
|
||||
* the type attribute, but is actually now recommended practice. It is also
|
||||
* used on rel="preload" link types, to make sure the browser only downloads
|
||||
* file types that it supports.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetType(): static
|
||||
{
|
||||
unset($this->attributes()['type']);
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,93 +3,148 @@
|
|||
namespace ByJoby\HTML\Html5\Tags;
|
||||
|
||||
use ByJoby\HTML\ContentCategories\MetadataContent;
|
||||
use ByJoby\HTML\Helpers\StringableEnumArray;
|
||||
use ByJoby\HTML\Html5\Enums\HttpEquiv_meta;
|
||||
use ByJoby\HTML\Html5\Enums\Name_meta;
|
||||
use ByJoby\HTML\Html5\Enums\Robots_meta;
|
||||
use ByJoby\HTML\Tags\AbstractTag;
|
||||
use Stringable;
|
||||
|
||||
/**
|
||||
* The <meta> HTML element represents metadata that cannot be represented by
|
||||
* other HTML meta-related elements, like <base>, <link>, <script>, <style> or
|
||||
* <title>.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
|
||||
*/
|
||||
class MetaTag extends AbstractTag implements MetadataContent
|
||||
{
|
||||
const TAG = 'meta';
|
||||
|
||||
public function name(): null|string
|
||||
/**
|
||||
* The name and content attributes can be used together to provide document
|
||||
* metadata in terms of name-value pairs, with the name attribute giving the
|
||||
* metadata name, and the content attribute giving the value.
|
||||
*
|
||||
* See standard metadata names for details about the set of standard
|
||||
* metadata names defined in the HTML specification.
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name
|
||||
*
|
||||
* @param string|Stringable|Name_meta $name
|
||||
* @param string|Stringable $content
|
||||
* @return static
|
||||
*/
|
||||
public function setNameAndContent(string|Stringable|Name_meta $name, string|Stringable $content): static
|
||||
{
|
||||
return $this->attributes()->string('name');
|
||||
}
|
||||
|
||||
public function setName(null|string $name): static
|
||||
{
|
||||
if (!$name) {
|
||||
$this->attributes()['name'] = false;
|
||||
} else {
|
||||
$this->attributes()['name'] = $name;
|
||||
if ($name instanceof Name_meta) {
|
||||
$name = $name->value;
|
||||
}
|
||||
unset($this->attributes()['http-equiv']);
|
||||
unset($this->attributes()['charset']);
|
||||
$this->attributes['name'] = $name;
|
||||
$this->attributes['content'] = $content;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function unsetName(): static
|
||||
/**
|
||||
* Defines a pragma directive. The attribute is named http-equiv(alent)
|
||||
* because all the allowed values are names of particular HTTP headers.
|
||||
*
|
||||
* @param HttpEquiv_meta $name
|
||||
* @param string|Stringable $content
|
||||
* @return static
|
||||
*/
|
||||
public function setHttpEquivAndContent(HttpEquiv_meta $name, string|Stringable $content): static
|
||||
{
|
||||
unset($this->attributes()['name']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function content(): null|string
|
||||
{
|
||||
return $this->attributes()->string('content');
|
||||
}
|
||||
|
||||
public function setContent(null|string $content): static
|
||||
{
|
||||
if (!$content) {
|
||||
$this->attributes()['content'] = false;
|
||||
} else {
|
||||
$this->attributes()['content'] = $content;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function unsetContent(): static
|
||||
{
|
||||
unset($this->attributes()['content']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function httpEquiv(): null|string
|
||||
{
|
||||
return $this->attributes()->string('http-equiv');
|
||||
}
|
||||
|
||||
public function setHttpEquiv(null|string $http_equiv): static
|
||||
{
|
||||
if (!$http_equiv) {
|
||||
$this->attributes()['http-equiv'] = false;
|
||||
} else {
|
||||
$this->attributes()['http-equiv'] = $http_equiv;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function unsetHttpEquiv(): static
|
||||
{
|
||||
unset($this->attributes()['http-equiv']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function charset(): null|string
|
||||
{
|
||||
return $this->attributes()->string('charset');
|
||||
}
|
||||
|
||||
public function setCharset(null|string $charset): static
|
||||
{
|
||||
if (!$charset) {
|
||||
$this->attributes()['charset'] = false;
|
||||
} else {
|
||||
$this->attributes()['charset'] = $charset;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function unsetCharset(): static
|
||||
{
|
||||
unset($this->attributes()['charset']);
|
||||
$this->attributes['http-equiv'] = $name->value;
|
||||
$this->attributes['content'] = $content;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* he behavior that cooperative crawlers, or "robots", should use with the page
|
||||
*
|
||||
* @param Robots_meta|Robots_meta[] $robots
|
||||
* @return static
|
||||
*/
|
||||
public function setRobots(Robots_meta|array $robots): static
|
||||
{
|
||||
if (!is_array($robots)) {
|
||||
$robots = [$robots];
|
||||
}
|
||||
$this->setNameAndContent(
|
||||
Name_meta::robots,
|
||||
new StringableEnumArray($robots, ',')
|
||||
);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this tag defines the character set. Output is boolean because
|
||||
* "utf-8" is the only valid value.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function charset(): bool
|
||||
{
|
||||
return isset($this->attributes()['charset']);
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute contains the value for the http-equiv or name attribute,
|
||||
* depending on which is used.
|
||||
*
|
||||
* @return null|string|Stringable
|
||||
*/
|
||||
public function content(): null|string|Stringable
|
||||
{
|
||||
return $this->attributes()->asString('content');
|
||||
}
|
||||
|
||||
/**
|
||||
* The name and content attributes can be used together to provide document
|
||||
* metadata in terms of name-value pairs, with the name attribute giving the
|
||||
* metadata name, and the content attribute giving the value.
|
||||
*
|
||||
* @return null|string|Stringable|Name_meta
|
||||
*/
|
||||
public function name(): null|string|Stringable|Name_meta
|
||||
{
|
||||
return $this->attributes()->asEnum('name', Name_meta::class)
|
||||
?? $this->attributes()->asString('name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines a pragma directive. The attribute is named http-equiv(alent)
|
||||
* because all the allowed values are names of particular HTTP headers.
|
||||
*
|
||||
* @return null|HttpEquiv_meta
|
||||
*/
|
||||
public function httpEquiv(): null|HttpEquiv_meta
|
||||
{
|
||||
return $this->attributes()->asEnum('http-equiv', HttpEquiv_meta::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether this tag should define the character set. Option is boolean
|
||||
* because "utf-8" is the only valid value.
|
||||
*
|
||||
* @param boolean $charset
|
||||
* @return static
|
||||
*/
|
||||
public function setCharset(bool $charset): static
|
||||
{
|
||||
if ($charset) {
|
||||
$this->attributes()['charset'] = 'utf-8';
|
||||
unset($this->attributes()['name']);
|
||||
unset($this->attributes()['http-equiv']);
|
||||
unset($this->attributes()['content']);
|
||||
} else {
|
||||
unset($this->attributes()['charset']);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
}
|
|
@ -7,6 +7,12 @@ use ByJoby\HTML\ContentCategories\PhrasingContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayContents;
|
||||
use ByJoby\HTML\Tags\AbstractContentTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class NoscriptTag extends AbstractContentTag implements MetadataContent, PhrasingContent, DisplayContents
|
||||
{
|
||||
const TAG = 'noscript';
|
||||
|
|
|
@ -7,6 +7,12 @@ use ByJoby\HTML\ContentCategories\PhrasingContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayNone;
|
||||
use ByJoby\HTML\Tags\AbstractContentTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingContent, DisplayNone
|
||||
{
|
||||
const TAG = 'script';
|
||||
|
@ -35,7 +41,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function crossorigin(): null|string
|
||||
{
|
||||
return $this->attributes()->string('crossorigin');
|
||||
return $this->attributes()->asString('crossorigin');
|
||||
}
|
||||
|
||||
public function setCrossorigin(null|string $crossorigin): static
|
||||
|
@ -56,7 +62,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function integrity(): null|string
|
||||
{
|
||||
return $this->attributes()->string('integrity');
|
||||
return $this->attributes()->asString('integrity');
|
||||
}
|
||||
|
||||
public function setIntegrity(null|string $integrity): static
|
||||
|
@ -88,7 +94,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function nonce(): null|string
|
||||
{
|
||||
return $this->attributes()->string('nonce');
|
||||
return $this->attributes()->asString('nonce');
|
||||
}
|
||||
|
||||
public function setNonce(null|string $nonce): static
|
||||
|
@ -109,7 +115,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function referrerpolicy(): null|string
|
||||
{
|
||||
return $this->attributes()->string('referrerpolicy');
|
||||
return $this->attributes()->asString('referrerpolicy');
|
||||
}
|
||||
|
||||
public function setReferrerpolicy(null|string $referrerpolicy): static
|
||||
|
@ -130,7 +136,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function src(): null|string
|
||||
{
|
||||
return $this->attributes()->string('src');
|
||||
return $this->attributes()->asString('src');
|
||||
}
|
||||
|
||||
public function setSrc(null|string $src): static
|
||||
|
@ -151,7 +157,7 @@ class ScriptTag extends AbstractContentTag implements MetadataContent, PhrasingC
|
|||
|
||||
public function type(): null|string
|
||||
{
|
||||
return $this->attributes()->string('type');
|
||||
return $this->attributes()->asString('type');
|
||||
}
|
||||
|
||||
public function setType(null|string $type): static
|
||||
|
|
|
@ -5,13 +5,19 @@ namespace ByJoby\HTML\Html5\Tags;
|
|||
use ByJoby\HTML\ContentCategories\MetadataContent;
|
||||
use ByJoby\HTML\Tags\AbstractContentTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class StyleTag extends AbstractContentTag implements MetadataContent
|
||||
{
|
||||
const TAG = 'style';
|
||||
|
||||
public function media(): null|string
|
||||
{
|
||||
return $this->attributes()->string('media');
|
||||
return $this->attributes()->asString('media');
|
||||
}
|
||||
|
||||
public function setMedia(null|string $media): static
|
||||
|
@ -32,7 +38,7 @@ class StyleTag extends AbstractContentTag implements MetadataContent
|
|||
|
||||
public function nonce(): null|string
|
||||
{
|
||||
return $this->attributes()->string('nonce');
|
||||
return $this->attributes()->asString('nonce');
|
||||
}
|
||||
|
||||
public function setNonce(null|string $nonce): static
|
||||
|
|
|
@ -7,13 +7,19 @@ use ByJoby\HTML\ContentCategories\SectioningRoot;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class BlockquoteTag extends AbstractContainerTag implements FlowContent, SectioningRoot, DisplayBlock
|
||||
{
|
||||
const TAG = 'blockquote';
|
||||
|
||||
public function cite(): null|string
|
||||
{
|
||||
return $this->attributes()->string('cite');
|
||||
return $this->attributes()->asString('cite');
|
||||
}
|
||||
|
||||
public function setCite(null|string $cite): static
|
||||
|
|
|
@ -4,6 +4,12 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class DdTag extends AbstractContainerTag
|
||||
{
|
||||
const TAG = 'dd';
|
||||
|
|
|
@ -6,6 +6,12 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class DivTag extends AbstractContainerTag implements DisplayBlock, SectioningContent
|
||||
{
|
||||
const TAG = 'div';
|
||||
|
|
|
@ -6,6 +6,12 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class DlTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'dl';
|
||||
|
|
|
@ -4,6 +4,12 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class DtTag extends AbstractContainerTag
|
||||
{
|
||||
const TAG = 'dt';
|
||||
|
|
|
@ -6,6 +6,12 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class FigcaptionTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'figcaption';
|
||||
|
|
|
@ -9,6 +9,12 @@ use ByJoby\HTML\NodeInterface;
|
|||
use ByJoby\HTML\Tags\AbstractGroupedTag;
|
||||
use ByJoby\HTML\Tags\TagInterface;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class FigureTag extends AbstractGroupedTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'figure';
|
||||
|
|
|
@ -6,6 +6,12 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class HrTag extends AbstractTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'hr';
|
||||
|
|
|
@ -4,9 +4,53 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
|
||||
use ByJoby\HTML\ContentCategories\FlowContent;
|
||||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Html5\Enums\Type_list;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class LiTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'li';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the numbering type to be used if placed in an <OL> tag.
|
||||
*
|
||||
* @return null|Type_list
|
||||
*/
|
||||
public function type(): null|Type_list
|
||||
{
|
||||
return $this->attributes()->asEnum('type', Type_list::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the numbering type to be used if placed in an <OL> tag.
|
||||
*
|
||||
* @param null|Type_list $type
|
||||
* @return static
|
||||
*/
|
||||
public function setType(null|Type_list $type): static
|
||||
{
|
||||
if (!$type) {
|
||||
$this->attributes()['type'] = false;
|
||||
} else {
|
||||
$this->attributes()['type'] = $type->value;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsets the numbering type to be used if placed in an <OL> tag.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetType(): static
|
||||
{
|
||||
unset($this->attributes()['type']);
|
||||
return $this;
|
||||
}
|
||||
}
|
|
@ -6,6 +6,12 @@ use ByJoby\HTML\ContentCategories\FlowContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
*
|
||||
*/
|
||||
class MenuTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'menu';
|
||||
|
|
|
@ -4,37 +4,70 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
|
||||
use ByJoby\HTML\ContentCategories\FlowContent;
|
||||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Html5\Enums\Type_list;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <ol> HTML element represents an ordered list of items — typically
|
||||
* rendered as a numbered list.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol
|
||||
*/
|
||||
class OlTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
||||
{
|
||||
const TAG = 'ol';
|
||||
const TYPE_LETTER_LOWER = 'a';
|
||||
const TYPE_LETTER_UPPER = 'A';
|
||||
const TYPE_ROMAN_LOWER = 'i';
|
||||
const TYPE_ROMAN_UPPER = 'I';
|
||||
const TYPE_NUMBER = '1';
|
||||
|
||||
/**
|
||||
* This Boolean attribute specifies that the list's items are in reverse
|
||||
* order. Items will be numbered from high to low.
|
||||
*
|
||||
* @param boolean $reversed
|
||||
* @return static
|
||||
*/
|
||||
public function setReversed(bool $reversed): static
|
||||
{
|
||||
$this->attributes()['reversed'] = $reversed;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This Boolean attribute specifies that the list's items are in reverse
|
||||
* order. Items will be numbered from high to low.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function reversed(): bool
|
||||
{
|
||||
return !!$this->attributes()['reversed'];
|
||||
}
|
||||
|
||||
/**
|
||||
* An integer to start counting from for the list items. Always an Arabic
|
||||
* numeral (1, 2, 3, etc.), even when the numbering type is letters or Roman
|
||||
* numerals. For example, to start numbering elements from the letter "d" or
|
||||
* the Roman numeral "iv," use start="4".
|
||||
*
|
||||
* @return null|integer
|
||||
*/
|
||||
public function start(): null|int
|
||||
{
|
||||
if ($this->attributes()['start']) {
|
||||
return intval($this->attributes()->string('start'));
|
||||
return intval($this->attributes()->asString('start'));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An integer to start counting from for the list items. Always an Arabic
|
||||
* numeral (1, 2, 3, etc.), even when the numbering type is letters or Roman
|
||||
* numerals. For example, to start numbering elements from the letter "d" or
|
||||
* the Roman numeral "iv," use start="4".
|
||||
*
|
||||
* @param null|integer $start
|
||||
* @return static
|
||||
*/
|
||||
public function setStart(null|int $start): static
|
||||
{
|
||||
if (!$start) {
|
||||
|
@ -45,33 +78,63 @@ class OlTag extends AbstractContainerTag implements FlowContent, DisplayBlock
|
|||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* An integer to start counting from for the list items. Always an Arabic
|
||||
* numeral (1, 2, 3, etc.), even when the numbering type is letters or Roman
|
||||
* numerals. For example, to start numbering elements from the letter "d" or
|
||||
* the Roman numeral "iv," use start="4".
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetStart(): static
|
||||
{
|
||||
unset($this->attributes()['start']);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function type(): null|string
|
||||
/**
|
||||
* Gets the numbering type.
|
||||
*
|
||||
* The specified type is used for the entire list unless a different type
|
||||
* attribute is used on an enclosed <li> element.
|
||||
*
|
||||
* @return null|Type_list
|
||||
*/
|
||||
public function type(): null|Type_list
|
||||
{
|
||||
return $this->attributes()->string('type');
|
||||
return $this->attributes()->asEnum('type', Type_list::class);
|
||||
}
|
||||
|
||||
public function setType(null|string $type): static
|
||||
/**
|
||||
* Sets the numbering type.
|
||||
*
|
||||
* The specified type is used for the entire list unless a different type
|
||||
* attribute is used on an enclosed <li> element.
|
||||
*
|
||||
* @param null|Type_list $type
|
||||
* @return static
|
||||
*/
|
||||
public function setType(null|Type_list $type): static
|
||||
{
|
||||
if (!in_array($type, ['a', 'A', 'i', 'I', '1'])) {
|
||||
$type = null;
|
||||
}
|
||||
if (!$type) {
|
||||
$this->attributes()['type'] = false;
|
||||
} else {
|
||||
$this->attributes()['type'] = $type;
|
||||
$this->attributes()['type'] = $type->value;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsets the numbering type.
|
||||
*
|
||||
* The specified type is used for the entire list unless a different type
|
||||
* attribute is used on an enclosed <li> element.
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function unsetType(): static
|
||||
{
|
||||
unset($this->attributes()['type']);
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,6 +6,15 @@ use ByJoby\HTML\ContentCategories\SectioningContent;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <p> HTML element represents a paragraph. Paragraphs are usually
|
||||
* represented in visual media as blocks of text separated from adjacent blocks
|
||||
* by blank lines and/or first-line indentation, but HTML paragraphs can be any
|
||||
* structural grouping of related content, such as images or form fields.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p
|
||||
*/
|
||||
class PTag extends AbstractContainerTag implements DisplayBlock, SectioningContent
|
||||
{
|
||||
const TAG = 'p';
|
||||
|
|
|
@ -5,6 +5,15 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <pre> HTML element represents preformatted text which is to be presented
|
||||
* exactly as written in the HTML file. The text is typically rendered using a
|
||||
* non-proportional, or monospaced, font. Whitespace inside this element is
|
||||
* displayed as written.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre
|
||||
*/
|
||||
class PreTag extends AbstractContainerTag implements DisplayBlock
|
||||
{
|
||||
const TAG = 'pre';
|
||||
|
|
25
src/Html5/TextContentTags/SpanTag.php
Normal file
25
src/Html5/TextContentTags/SpanTag.php
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\TextContentTags;
|
||||
|
||||
use ByJoby\HTML\ContentCategories\FlowContent;
|
||||
use ByJoby\HTML\ContentCategories\PhrasingContent;
|
||||
use ByJoby\HTML\DisplayTypes\DisplayInline;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <span> HTML element is a generic inline container for phrasing content,
|
||||
* which does not inherently represent anything. It can be used to group
|
||||
* elements for styling purposes (using the class or id attributes), or because
|
||||
* they share attribute values, such as lang. It should be used only when no
|
||||
* other semantic element is appropriate. <span> is very much like a <div>
|
||||
* element, but <div> is a block-level element whereas a <span> is an
|
||||
* inline-level element.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span
|
||||
*/
|
||||
class SpanTag extends AbstractContainerTag implements DisplayInline, FlowContent, PhrasingContent
|
||||
{
|
||||
const TAG = 'span';
|
||||
}
|
|
@ -5,6 +5,13 @@ namespace ByJoby\HTML\Html5\TextContentTags;
|
|||
use ByJoby\HTML\DisplayTypes\DisplayBlock;
|
||||
use ByJoby\HTML\Tags\AbstractContainerTag;
|
||||
|
||||
/**
|
||||
* The <ul> HTML element represents an unordered list of items, typically
|
||||
* rendered as a bulleted list.
|
||||
*
|
||||
* Tag description by Mozilla Contributors licensed under CC-BY-SA 2.5
|
||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul
|
||||
*/
|
||||
class UlTag extends AbstractContainerTag implements DisplayBlock
|
||||
{
|
||||
const TAG = 'ul';
|
||||
|
|
|
@ -16,15 +16,18 @@ abstract class AbstractContainerTag extends AbstractTag implements ContainerTagI
|
|||
{
|
||||
$openingTag = sprintf('<%s>', implode(' ', $this->openingTagStrings()));
|
||||
$closingTag = sprintf('</%s>', $this->tag());
|
||||
if (!$this->children()) {
|
||||
$children = $this->children();
|
||||
if (!$children) {
|
||||
return $openingTag . $closingTag;
|
||||
} elseif (count($children) == 1) {
|
||||
return $openingTag . $children[0] . $closingTag;
|
||||
} else {
|
||||
return implode(
|
||||
PHP_EOL,
|
||||
[
|
||||
$openingTag,
|
||||
implode(PHP_EOL, $this->children()),
|
||||
$closingTag
|
||||
$openingTag,
|
||||
implode(PHP_EOL, $this->children()),
|
||||
$closingTag
|
||||
]
|
||||
);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,8 @@ abstract class AbstractContentTag extends AbstractTag implements ContentTagInter
|
|||
{
|
||||
/** @var string|Stringable */
|
||||
protected $content = '';
|
||||
/** @var bool */
|
||||
protected $inline = false;
|
||||
|
||||
public function content(): string|Stringable
|
||||
{
|
||||
|
@ -27,15 +29,10 @@ abstract class AbstractContentTag extends AbstractTag implements ContentTagInter
|
|||
$content = $this->content();
|
||||
if (!$content) {
|
||||
return $openingTag . $closingTag;
|
||||
} elseif ($this->inline) {
|
||||
return $openingTag . $content . $closingTag;
|
||||
} else {
|
||||
return implode(
|
||||
PHP_EOL,
|
||||
[
|
||||
$openingTag,
|
||||
$content,
|
||||
$closingTag
|
||||
]
|
||||
);
|
||||
return $openingTag . PHP_EOL . $content . PHP_EOL . $closingTag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,9 +14,14 @@ abstract class AbstractGroupedTag extends AbstractTag implements ContainerTagInt
|
|||
$openingTag = sprintf('<%s>', implode(' ', $this->openingTagStrings()));
|
||||
$closingTag = sprintf('</%s>', $this->tag());
|
||||
$groups = array_filter(
|
||||
$this->groups(),
|
||||
function (ContainerGroup $group) {
|
||||
return !!$group->children();
|
||||
array_map(
|
||||
function (ContainerGroup $group) {
|
||||
return trim($group);
|
||||
},
|
||||
$this->groups()
|
||||
),
|
||||
function (string $group) {
|
||||
return !!$group;
|
||||
}
|
||||
);
|
||||
if (!$groups) {
|
||||
|
@ -25,9 +30,9 @@ abstract class AbstractGroupedTag extends AbstractTag implements ContainerTagInt
|
|||
return implode(
|
||||
PHP_EOL,
|
||||
[
|
||||
$openingTag,
|
||||
implode(PHP_EOL, $groups),
|
||||
$closingTag
|
||||
$openingTag,
|
||||
implode(PHP_EOL, $groups),
|
||||
$closingTag
|
||||
]
|
||||
);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,12 @@ namespace ByJoby\HTML\Helpers;
|
|||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
// TODO test setEnumArray
|
||||
// TODO test asEnumArray
|
||||
// TODO test asNumber
|
||||
// TODO test asInt
|
||||
// TODO test asFloat
|
||||
|
||||
class AttributesTest extends TestCase
|
||||
{
|
||||
public function testConstruction(): Attributes
|
||||
|
|
|
@ -12,6 +12,6 @@ class TitleTagTest extends TestCase
|
|||
$this->assertEquals('Untitled', $title->content());
|
||||
$title->setContent('<strong>Titled</strong>');
|
||||
$this->assertEquals('Titled', $title->content());
|
||||
$this->assertEquals('<title>' . PHP_EOL . 'Titled' . PHP_EOL . '</title>', $title->__toString());
|
||||
$this->assertEquals('<title>Titled</title>', $title->__toString());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ class Html5DocumentTest extends TestCase
|
|||
'<!DOCTYPE html>',
|
||||
'<html>',
|
||||
'<head>',
|
||||
'<title>', 'Untitled', '</title>',
|
||||
'<title>Untitled</title>',
|
||||
'</head>',
|
||||
'<body></body>',
|
||||
'</html>'
|
||||
|
|
|
@ -56,6 +56,27 @@ class Html5ParserTest extends TestCase
|
|||
$parser = new Html5Parser();
|
||||
$document = $parser->parseDocument('<html><head><title>Title</title></head><body><div>foo</div></body></html>');
|
||||
$this->assertEquals('Title', $document->html()->head()->title()->content());
|
||||
$this->assertEquals('<div>' . PHP_EOL . 'foo' . PHP_EOL . '</div>', $document->body()->children()[0]->__toString());
|
||||
$this->assertEquals('<div>foo</div>', $document->body()->children()[0]->__toString());
|
||||
}
|
||||
|
||||
public function testDocumentsFromFiles()
|
||||
{
|
||||
$parser = new Html5Parser();
|
||||
foreach (glob(__DIR__ . '/parser_documents/*.html') as $file) {
|
||||
$document = $parser->parseDocument(file_get_contents($file));
|
||||
file_put_contents(__DIR__ . '/parser_documents/re-rendered/' . basename($file), $document);
|
||||
$structure = spyc_load_file(preg_replace('/\.html$/', '.yaml', $file));
|
||||
$this->assertNodeMatchesStructure($document, $structure);
|
||||
}
|
||||
}
|
||||
|
||||
protected function assertNodeMatchesStructure($node, $structure)
|
||||
{
|
||||
$this->assertInstanceOf($structure['class'], $node, sprintf("Node %s is not of type %s: \"%s\"", get_class($node), $structure['class'], $node));
|
||||
if (is_array(@$structure['children'])) {
|
||||
foreach (array_map(null, $node->children(), $structure['children']) as list($child_node, $child_structure)) {
|
||||
$this->assertNodeMatchesStructure($child_node, $child_structure);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,20 +2,25 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\Tags;
|
||||
|
||||
use ByJoby\HTML\Html5\Enums\CrossOrigin;
|
||||
use ByJoby\HTML\Html5\Enums\Rel_link;
|
||||
|
||||
class LinkTagTest extends TagTestCase
|
||||
{
|
||||
public function testAttributeHelpers(): void
|
||||
{
|
||||
$this->assertAttributeHelperMethods('rel', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('as', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('crossorigin', LinkTag::class);
|
||||
// TODO update tests that now use enums, add tests for their exeption cases
|
||||
// $this->assertAttributeHelperMethods('rel', LinkTag::class, Rel_link::class, 'class');
|
||||
// $this->assertAttributeHelperMethods('as', LinkTag::class);
|
||||
// $this->assertAttributeHelperMethods('referrerpolicy', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('crossorigin', LinkTag::class, CrossOrigin::anonymous, 'anonymous');
|
||||
$this->assertAttributeHelperMethods('crossorigin', LinkTag::class, CrossOrigin::useCredentials, 'use-credentials');
|
||||
$this->assertAttributeHelperMethods('href', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('hreflang', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('imagesizes', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('imagesrcset', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('integrity', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('media', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('referrerpolicy', LinkTag::class);
|
||||
$this->assertAttributeHelperMethods('type', LinkTag::class);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,9 +6,10 @@ class MetaTagTest extends TagTestCase
|
|||
{
|
||||
public function testAttributeHelpers(): void
|
||||
{
|
||||
$this->assertAttributeHelperMethods('name', MetaTag::class);
|
||||
$this->assertAttributeHelperMethods('content', MetaTag::class);
|
||||
$this->assertAttributeHelperMethods('http-equiv', MetaTag::class);
|
||||
$this->assertAttributeHelperMethods('charset', MetaTag::class);
|
||||
// TODO test all of these with their new format
|
||||
// $this->assertAttributeHelperMethods('name', MetaTag::class);
|
||||
// $this->assertAttributeHelperMethods('content', MetaTag::class);
|
||||
// $this->assertAttributeHelperMethods('http-equiv', MetaTag::class);
|
||||
// $this->assertAttributeHelperMethods('charset', MetaTag::class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
|
|||
|
||||
abstract class TagTestCase extends TestCase
|
||||
{
|
||||
protected function assertAttributeHelperMethods(string $attribute, string $class, string $test_value = 'some-value', string $render_value = 'some-value'): void
|
||||
protected function assertAttributeHelperMethods(string $attribute, string $class, mixed $test_value = 'some-value', string|null $render_value = 'some-value'): void
|
||||
{
|
||||
/** @var TagInterface */
|
||||
$tag = new $class;
|
||||
|
@ -18,18 +18,18 @@ abstract class TagTestCase extends TestCase
|
|||
$unsetFn = 'unset' . implode('', array_map('ucfirst', $words));
|
||||
$getFn = array_shift($words) . implode('', array_map('ucfirst', $words));
|
||||
// test setter and expected rendering
|
||||
call_user_func([$tag, $setFn], $test_value);
|
||||
call_user_func($tag->$setFn(...), $test_value);
|
||||
$this->assertTagRendersAttribute($tag, $attribute, $render_value);
|
||||
// test getter
|
||||
$this->assertEquals($render_value, call_user_func([$tag, $getFn]));
|
||||
$this->assertEquals($test_value, $tag->$getFn());
|
||||
$this->assertEquals($render_value, $tag->attributes()[$attribute]);
|
||||
// test unsetting via unset
|
||||
call_user_func([$tag, $unsetFn]);
|
||||
$this->assertNull(call_user_func([$tag, $getFn]));
|
||||
call_user_func($tag->$unsetFn(...));
|
||||
$this->assertNull($tag->$getFn());
|
||||
// test setting and unsetting via null value
|
||||
call_user_func([$tag, $setFn], $test_value);
|
||||
call_user_func([$tag, $setFn], null);
|
||||
$this->assertNull(call_user_func([$tag, $getFn]));
|
||||
call_user_func($tag->$setFn(...), $test_value);
|
||||
call_user_func($tag->$setFn(...), null);
|
||||
$this->assertNull($tag->$getFn());
|
||||
}
|
||||
|
||||
protected function assertBooleanAttributeHelperMethods(string $attribute, string $class): void
|
||||
|
@ -40,46 +40,62 @@ abstract class TagTestCase extends TestCase
|
|||
$setFn = 'set' . implode('', array_map('ucfirst', $words));
|
||||
$getFn = array_shift($words) . implode('', array_map('ucfirst', $words));
|
||||
// test setting true
|
||||
call_user_func([$tag, $setFn], true);
|
||||
call_user_func($tag->$setFn(...), true);
|
||||
$this->assertTagRendersBooleanAttribute($tag, $attribute, true);
|
||||
$this->assertTrue(call_user_func([$tag, $getFn]));
|
||||
$this->assertTrue($tag->$getFn());
|
||||
// test setting false
|
||||
call_user_func([$tag, $setFn], false);
|
||||
call_user_func($tag->$setFn(...), false);
|
||||
$this->assertTagRendersBooleanAttribute($tag, $attribute, false);
|
||||
$this->assertFalse(call_user_func([$tag, $getFn]));
|
||||
$this->assertFalse($tag->$getFn());
|
||||
}
|
||||
|
||||
protected function assertTagRendersAttribute(TagInterface $tag, string $attribute, string $value)
|
||||
protected function assertTagRendersAttribute(TagInterface $tag, string $attribute, string|null $value): void
|
||||
{
|
||||
if ($tag instanceof ContainerInterface || $tag instanceof ContentTagInterface) {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s %s="%s"></%s>', $tag->tag(), $attribute, $value, $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value, $tag->tag())
|
||||
);
|
||||
if (is_null($value)) {
|
||||
if ($tag instanceof ContainerInterface || $tag instanceof ContentTagInterface) {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s></%s>', $tag->tag(), $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s null value is in %s tag', $attribute, $tag->tag())
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s>', $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s null value is in %s tag', $attribute, $tag->tag())
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s %s="%s">', $tag->tag(), $attribute, $value),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value, $tag->tag())
|
||||
);
|
||||
if ($tag instanceof ContainerInterface || $tag instanceof ContentTagInterface) {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s %s="%s"></%s>', $tag->tag(), $attribute, $value, $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value, $tag->tag())
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s %s="%s">', $tag->tag(), $attribute, $value),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value, $tag->tag())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function assertTagRendersBooleanAttribute(TagInterface $tag, string $attribute, bool $value)
|
||||
protected function assertTagRendersBooleanAttribute(TagInterface $tag, string $attribute, bool $value): void
|
||||
{
|
||||
if ($tag instanceof ContainerInterface || $tag instanceof ContentTagInterface) {
|
||||
if ($value) {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s %s></%s>', $tag->tag(), $attribute, $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value ? 'true' : 'false', $tag->tag())
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, 'true', $tag->tag())
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s></%s>', $tag->tag(), $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value ? 'true' : 'false', $tag->tag())
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, 'false', $tag->tag())
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -87,15 +103,15 @@ abstract class TagTestCase extends TestCase
|
|||
$this->assertEquals(
|
||||
sprintf('<%s %s>', $tag->tag(), $attribute),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value ? 'true' : 'false', $tag->tag())
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, 'true', $tag->tag())
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
sprintf('<%s>', $tag->tag()),
|
||||
$tag->__toString(),
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, $value ? 'true' : 'false', $tag->tag())
|
||||
sprintf('Unexpected rendering of %s value %s is in %s tag', $attribute, 'false', $tag->tag())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
25
tests/Html5/TextContentTags/LiTagTest.php
Normal file
25
tests/Html5/TextContentTags/LiTagTest.php
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace ByJoby\HTML\Html5\TextContentTags;
|
||||
|
||||
use ByJoby\HTML\Html5\Enums\Type_list;
|
||||
use ByJoby\HTML\Html5\Tags\BaseTagTest;
|
||||
|
||||
class LiTagTest extends BaseTagTest
|
||||
{
|
||||
public function testAttributeHelpers(): void
|
||||
{
|
||||
$this->assertAttributeHelperMethods('type', LiTag::class, Type_list::letterLower, 'a');
|
||||
$this->assertAttributeHelperMethods('type', LiTag::class, Type_list::letterUpper, 'A');
|
||||
$this->assertAttributeHelperMethods('type', LiTag::class, Type_list::romanLower, 'i');
|
||||
$this->assertAttributeHelperMethods('type', LiTag::class, Type_list::romanUpper, 'I');
|
||||
$this->assertAttributeHelperMethods('type', LiTag::class, Type_list::number, '1');
|
||||
}
|
||||
|
||||
public function testInvalidType(): void
|
||||
{
|
||||
$ol = new LiTag;
|
||||
$ol->attributes()['type'] = 'invalid type';
|
||||
$this->assertNull($ol->type());
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace ByJoby\HTML\Html5\TextContentTags;
|
||||
|
||||
use ByJoby\HTML\Html5\Enums\Type_list;
|
||||
use ByJoby\HTML\Html5\Tags\BaseTagTest;
|
||||
|
||||
class OlTagTest extends BaseTagTest
|
||||
|
@ -9,18 +10,19 @@ class OlTagTest extends BaseTagTest
|
|||
public function testAttributeHelpers(): void
|
||||
{
|
||||
$this->assertBooleanAttributeHelperMethods('reversed', OlTag::class);
|
||||
$this->assertAttributeHelperMethods('start', OlTag::class, 1, 1);
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, 'a', 'a');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, 'A', 'A');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, 'i', 'i');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, 'I', 'I');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, '1', '1');
|
||||
$this->assertAttributeHelperMethods('start', OlTag::class, 1, '1');
|
||||
$this->assertAttributeHelperMethods('start', OlTag::class, 0, null);
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, Type_list::letterLower, 'a');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, Type_list::letterUpper, 'A');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, Type_list::romanLower, 'i');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, Type_list::romanUpper, 'I');
|
||||
$this->assertAttributeHelperMethods('type', OlTag::class, Type_list::number, '1');
|
||||
}
|
||||
|
||||
public function testInvalidType(): void
|
||||
{
|
||||
$ol = new OlTag;
|
||||
$ol->setType('X');
|
||||
$ol->attributes()['type'] = 'invalid type';
|
||||
$this->assertNull($ol->type());
|
||||
}
|
||||
}
|
||||
|
|
1
tests/Html5/parser_documents/.gitignore
vendored
Normal file
1
tests/Html5/parser_documents/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
re-rendered/*.html
|
13
tests/Html5/parser_documents/full-document.html
Normal file
13
tests/Html5/parser_documents/full-document.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Document</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Test page</h1>
|
||||
<p>Lorem ipsum dolar sit amet</p>
|
||||
</body>
|
||||
</html>
|
15
tests/Html5/parser_documents/full-document.yaml
Normal file
15
tests/Html5/parser_documents/full-document.yaml
Normal file
|
@ -0,0 +1,15 @@
|
|||
class: ByJoby\HTML\Html5\Html5Document
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\Doctype
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\HtmlTag
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\HeadTag
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\TitleTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\BodyTag
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\ContentSectioningTags\H1Tag
|
||||
- class: ByJoby\HTML\Html5\TextContentTags\PTag
|
10
tests/Html5/parser_documents/normal-html.html
Normal file
10
tests/Html5/parser_documents/normal-html.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Document</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
12
tests/Html5/parser_documents/normal-html.yaml
Normal file
12
tests/Html5/parser_documents/normal-html.yaml
Normal file
|
@ -0,0 +1,12 @@
|
|||
class: ByJoby\HTML\Html5\Html5Document
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\Doctype
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\HtmlTag
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\HeadTag
|
||||
children:
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\TitleTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\Tags\MetaTag
|
||||
- class: ByJoby\HTML\Html5\DocumentTags\BodyTag
|
3
tests/Html5/parser_documents/re-rendered/README.md
Normal file
3
tests/Html5/parser_documents/re-rendered/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Re-rendered documents
|
||||
|
||||
These files are generated by re-rendering their source. This can be useful for debugging.
|
|
@ -19,21 +19,31 @@ class AbstractContainerTagTest extends TestCase
|
|||
{
|
||||
$div = $this->tag('div');
|
||||
$this->assertEquals('<div></div>', $div->__toString());
|
||||
// add one child
|
||||
$span = $this->tag('span');
|
||||
$div->addChild($span);
|
||||
$div->attributes()['a'] = 'b';
|
||||
$this->assertEquals(
|
||||
implode(PHP_EOL, [
|
||||
'<div a="b">',
|
||||
'<span></span>',
|
||||
'</div>',
|
||||
]),
|
||||
'<div a="b"><span></span></div>',
|
||||
$div->__toString()
|
||||
);
|
||||
$this->assertEquals($div, $span->parent());
|
||||
return $div;
|
||||
}
|
||||
|
||||
/** @depends clone testDIV */
|
||||
public function testSecondChild(AbstractContainerTag $div): void
|
||||
{
|
||||
// add a second child to test line breaks
|
||||
$span = $this->tag('span');
|
||||
$div->addChild($span);
|
||||
$div->attributes()['a'] = 'b';
|
||||
$this->assertEquals(
|
||||
'<div a="b">' . PHP_EOL . '<span></span>' . PHP_EOL . '<span></span>' . PHP_EOL . '</div>',
|
||||
$div->__toString()
|
||||
);
|
||||
}
|
||||
|
||||
public function testBooleanAttributes(): void
|
||||
{
|
||||
$tag = $this->tag('div');
|
||||
|
@ -51,13 +61,7 @@ class AbstractContainerTagTest extends TestCase
|
|||
$span2 = $this->tag('span');
|
||||
$span1->addChild($span2);
|
||||
$this->assertEquals(
|
||||
implode(PHP_EOL, [
|
||||
'<div a="b">',
|
||||
'<span>',
|
||||
'<span></span>',
|
||||
'</span>',
|
||||
'</div>',
|
||||
]),
|
||||
'<div a="b"><span><span></span></span></div>',
|
||||
$div->__toString()
|
||||
);
|
||||
return $div;
|
||||
|
|
Loading…
Reference in a new issue