summaryrefslogtreecommitdiffstats
path: root/library/Icinga/Chart/Primitive/Text.php
blob: f6bf36563d3b31e12d4df4469a8660460656047f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */


namespace Icinga\Chart\Primitive;

use DOMDocument;
use DOMElement;
use DOMText;
use Icinga\Chart\Render\RenderContext;
use Icinga\Chart\Format;
use ipl\Html\HtmlDocument;

/**
 *  Wrapper for the SVG text element
 */
class Text extends Styleable implements Drawable
{
    /**
     * Align the text to end at the x and y position
     */
    const ALIGN_END     = 'end';

    /**
     * Align the text to start at the x and y position
     */
    const ALIGN_START   = 'start';

    /**
     * Align the text to be centered at the x and y position
     */
    const ALIGN_MIDDLE  = 'middle';

    /**
     * The x position of the Text
     *
     * @var int
     */
    private $x;

    /**
     * The y position of the Text
     *
     * @var int
     */
    private $y;

    /**
     * The text content
     *
     * @var string
     */
    private $text;

    /**
     * The size of the font
     *
     * @var string
     */
    private $fontSize = '1.5em';

    /**
     * The weight of the font
     *
     * @var string
     */
    private $fontWeight = 'normal';

    /**
     * The default fill color
     *
     * @var string
     */
    public $fill = '#000';

    /**
     * The alignment of the text
     *
     * @var string
     */
    private $alignment = self::ALIGN_START;

    /**
     * Set the font-stretch property of the text
     */
    private $fontStretch = 'semi-condensed';

    /**
     * Construct a new text drawable
     *
     * @param int $x            The x position of the text
     * @param int $y            The y position of the text
     * @param string $text      The text this component should contain
     * @param string $fontSize  The font size of the text
     */
    public function __construct($x, $y, $text, $fontSize = '1.5em')
    {
        $this->x = $x;
        $this->y = $y;
        $this->text = $text;
        $this->fontSize = $fontSize;

        $this->setAdditionalStyle([
            'font-size'    => $this->fontSize,
            'font-family'  => 'Ubuntu, Calibri, Trebuchet MS, Helvetica, Verdana, sans-serif',
            'font-weight'  => $this->fontWeight,
            'font-stretch' => $this->fontStretch,
            'font-style'   => 'normal',
            'text-anchor'  => $this->alignment
        ]);
    }

    /**
     * Set the font size of the svg text element
     *
     * @param   string $size    The font size including a unit
     *
     * @return  $this            Fluid interface
     */
    public function setFontSize($size)
    {
        $this->fontSize = $size;
        return $this;
    }

    /**
     * Set the text alignment with one of the ALIGN_* constants
     *
     * @param   String $align   Value how to align
     *
     * @return  $this            Fluid interface
     */
    public function setAlignment($align)
    {
        $this->alignment = $align;
        return $this;
    }

    /**
     * Set the weight of the current font
     *
     * @param string $weight    The weight of the string
     *
     * @return $this             Fluid interface
     */
    public function setFontWeight($weight)
    {
        $this->fontWeight = $weight;
        return $this;
    }

    /**
     * Create the SVG representation from this Drawable
     *
     * @param   RenderContext $ctx  The context to use for rendering
     *
     * @return  DOMElement          The SVG Element
     */
    public function toSvg(RenderContext $ctx)
    {
        list($x, $y) = $ctx->toAbsolute($this->x, $this->y);
        $text = $ctx->getDocument()->createElement('text');
        $text->setAttribute('x', Format::formatSVGNumber($x - 15));

        $id = $this->id ?? uniqid('text-');
        $text->setAttribute('id', $id);
        $this->setId($id);

        $text->setAttribute('y', Format::formatSVGNumber($y));
        $text->appendChild(new DOMText($this->text));

        $style = new DOMDocument();
        $style->loadHTML($this->getStyle());

        $text->appendChild(
            $text->ownerDocument->importNode(
                $style->getElementsByTagName('style')->item(0),
                true
            )
        );

        return $text;
    }
}