Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
Attribute
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
4 / 4
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setName
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 isValidAttributeIdName
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 render
n/a
0 / 0
n/a
0 / 0
0
1<?php
2
3/**
4 * @author: Doug Wilbourne (dougwilbourne@gmail.com)
5 */
6
7declare(strict_types=1);
8
9namespace pvc\html\attribute;
10
11use pvc\html\err\InvalidAttributeIdNameException;
12use pvc\interfaces\html\attribute\AttributeInterface;
13
14/**
15 * Class Attribute
16 *
17 */
18abstract class Attribute implements AttributeInterface
19{
20
21    public function __construct(
22        protected(set) string $name,
23    )
24    {
25        $this->setName($name);
26    }
27
28    /**
29     * getName
30     * @return string
31     */
32    public function getName(): string
33    {
34        return $this->name;
35    }
36
37    /**
38     * setName
39     * @param string $name
40     * @throws InvalidAttributeIdNameException
41     *
42     */
43    protected function setName(string $name): void
44    {
45        if (!$this->isValidAttributeIdName($name)) {
46            throw new InvalidAttributeIdNameException($name);
47        }
48        $this->name = $name;
49    }
50
51    /**
52     * isValidAttributeName
53     * @param string $name
54     * @return bool
55     *
56     * This regex restricts the name to start with a lower case letter and then can be followed by lower case letters
57     * and numbers and hyphens.
58     *
59     *  As a practical matter, pre-defined html attribute names are purely alphabetic with a couple that are
60     *  hyphenated.  And since the usual manner of
61     *  creating an attribute is in a htmlBuilder / container, most times the attribute names come right from the
62     *  html specification.  However, you can create an attribute using an arbitrary name and at least in some browsers,
63     *  you can get at the value using javascript even if the id is not prefixed with 'data-'.  So this
64     *  validation tries to find the middle ground between what the language spec says and how browsers
65     *  actually work.
66     *
67     *  Moreover, according to various online sources, the data attribute id (i.e. custom attribute names that
68     *  are prefixed with 'data-') must be at least one character long, must be prefixed with 'data-', and
69     *  should not contain any uppercase letters.  This method is inherited and used by the AttributeCustomData
70     *  class.
71     */
72    protected function isValidAttributeIdName(string $name): bool
73    {
74        $pattern = '/^[a-z]+[a-z0-9\-]*$/';
75        return (bool) preg_match($pattern, $name);
76    }
77
78    abstract public function render(): string;
79}