Completed
Push — master ( 84ee67...48a23c )
by Stefan
02:40
created

SizeCalculator::getCellWidth()   B

Complexity

Conditions 5
Paths 8

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5.2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 14
ccs 8
cts 10
cp 0.8
rs 8.8571
cc 5
eloc 8
nc 8
nop 2
crap 5.2
1
<?php
2
3
namespace OneSheet\Size;
4
5
use OneSheet\Style\Font;
6
7
/**
8
 * Class SizeCalculator to calculate the approximate width
9
 * and height of cells based on the font and content.
10
 *
11
 * @package OneSheet\Size
12
 */
13
class SizeCalculator
14
{
15
    /**
16
     * @var SizeCollection
17
     */
18
    private $sizeCollection;
19
20
    /**
21
     * @var array
22
     */
23
    private $characterSizes;
24
25
    /**
26
     * SizeCalculator constructor.
27
     *
28
     * @param SizeCollection $sizeCollection
29
     */
30 16
    public function __construct(SizeCollection $sizeCollection)
31
    {
32 16
        $this->sizeCollection = $sizeCollection;
33 16
    }
34
35
    /**
36
     * Return the estimated width of a cell value.
37
     *
38
     * @param mixed $value
39
     * @param Font  $font
40
     * @return float
41
     */
42 5
    public function getCellWidth($value, Font $font)
43
    {
44 5
        $width = 0.3 + (0.05 * $font->getSize());
45
46 5
        foreach ($this->getSingleCharacterArray($value) as $character) {
47 5
            if (isset($this->characterSizes[$character])) {
48 5
                $width += $this->characterSizes[$character];
49 5
            } elseif (strlen($character)) {
50
                $width += 0.06 * $font->getSize();
51
            }
52 5
        }
53
54 5
        return $font->isBold() ? $width * $this->characterSizes['bold'] : $width;
55
    }
56
57
    /**
58
     * Return the font height, but no smaller than 14pt.
59
     *
60
     * @return number
61
     */
62 1
    public function getRowHeight()
63
    {
64 1
        if (14 > $this->characterSizes['height']) {
65
            return 14;
66
        }
67 1
        return floor($this->characterSizes['height']);
68
    }
69
70
    /**
71
     * Set proper font sizes by font.
72
     *
73
     * @param Font $font
74
     */
75 6
    public function setFont(Font $font)
76
    {
77 6
        $this->characterSizes = $this->sizeCollection->get($font->getName(), $font->getSize());
78 6
    }
79
80
    /**
81
     * Split value into individual characters.
82
     *
83
     * @param mixed $value
84
     * @return array
85
     */
86 5
    private function getSingleCharacterArray($value)
87
    {
88 5
        if (mb_strlen($value) == strlen($value)) {
89 4
            return str_split($value);
90
        }
91 1
        return preg_split('~~u', $value, -1, PREG_SPLIT_NO_EMPTY);
92
    }
93
}
94