Completed
Push — master ( 4661fc...d7178d )
by Colin
02:46
created

Html5Entities::fromDecimal()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4.0312

Importance

Changes 0
Metric Value
dl 0
loc 17
ccs 7
cts 8
cp 0.875
rs 9.7
c 0
b 0
f 0
cc 4
nc 3
nop 1
crap 4.0312
1
<?php
2
3
/*
4
 * This file is part of the league/commonmark package.
5
 *
6
 * (c) Colin O'Dell <[email protected]>
7
 *
8
 * Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
9
 *  - (c) John MacFarlane
10
 *
11
 * For the full copyright and license information, please view the LICENSE
12
 * file that was distributed with this source code.
13
 */
14
15
namespace League\CommonMark\Util;
16
17
final class Html5Entities
18
{
19
    /**
20
     * @param string $entity
21
     *
22
     * @return string
23
     */
24 63
    public static function decodeEntity(string $entity): string
25
    {
26 63
        if (\substr($entity, -1) !== ';') {
27 3
            return $entity;
28
        }
29
30 63
        if (\substr($entity, 0, 2) === '&#') {
31 30
            if (\strtolower(\substr($entity, 2, 1)) === 'x') {
32 3
                return self::fromHex(\substr($entity, 3, -1));
33
            }
34
35 27
            return self::fromDecimal(\substr($entity, 2, -1));
36
        }
37
38 45
        return \html_entity_decode($entity, \ENT_QUOTES | \ENT_HTML5, 'UTF-8');
39
    }
40
41
    /**
42
     * @param mixed $number
43
     *
44
     * @return string
45
     */
46 30
    public static function fromDecimal($number): string
47
    {
48
        // Only convert code points within planes 0-2, excluding NULL
49 30
        if (empty($number) || $number > 0x2FFFF) {
50 3
            return self::fromHex('fffd');
51
        }
52
53 30
        $entity = '&#' . $number . ';';
54
55 30
        $converted = \mb_decode_numericentity($entity, [0x0, 0x2FFFF, 0, 0xFFFF], 'UTF-8');
56
57 30
        if ($converted === $entity) {
58
            return self::fromHex('fffd');
59
        }
60
61 30
        return $converted;
62
    }
63
64
    /**
65
     * @param string $hexChars
66
     *
67
     * @return string
68
     */
69 6
    public static function fromHex(string $hexChars): string
70
    {
71 6
        return self::fromDecimal(\hexdec($hexChars));
72
    }
73
}
74