Passed
Push — master ( f223f6...5c92ad )
by Sebastian
02:43
created

StringBuilder::display()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
/**
3
 * File containing the {@link StringBuilder} class.
4
 *
5
 * @package Application Utils
6
 * @subpackage StringBuilder
7
 * @see StringBuilder
8
 */
9
10
declare(strict_types=1);
11
12
namespace AppUtils;
13
14
use DateTime;
15
use AppLocalize;
16
17
/**
18
 * Utility class used to easily concatenate strings
19
 * with a chainable interface. 
20
 * 
21
 * Each bit of text that is added is automatically 
22
 * separated by spaces, making it easy to write
23
 * texts without handling this separately.
24
 * 
25
 * Specialized methods help in quickly formatting 
26
 * text, or adding common HTML-based contents.
27
 *
28
 * @package Application Utils
29
 * @subpackage StringBuilder
30
 * @author Sebastian Mordziol <[email protected]>
31
 *
32
 * @see StringBuilder
33
 */
34
class StringBuilder implements StringBuilder_Interface
35
{
36
   /**
37
    * @var string
38
    */
39
    protected $separator = ' ';
40
41
   /**
42
    * @var string[]
43
    */
44
    protected $strings = array();
45
46
   /**
47
    * @var string
48
    */
49
    protected $mode = 'html';
50
51
   /**
52
    * @var string
53
    */
54
    protected $noSpace = '§!§';
55
    
56
    public function __construct()
57
    {
58
        
59
    }
60
    
61
   /**
62
    * Adds a subject as a string. Is ignored if empty.
63
    * 
64
    * @param string|number|StringBuilder_Interface $string
65
    * @return $this
66
    */
67
    public function add($string) : StringBuilder
68
    {
69
        $string = strval($string);
70
        
71
        if(!empty($string)) 
72
        {
73
            $this->strings[] = $string;
74
        }
75
        
76
        return $this;
77
    }
78
    
79
   /**
80
    * Adds a string without appending an automatic space.
81
    * 
82
    * @param string|number|StringBuilder_Interface $string
83
    * @return $this
84
    */
85
    public function nospace($string) : StringBuilder
86
    {
87
        return $this->add($this->noSpace.strval($string));
88
    }
89
    
90
   /**
91
    * Adds raw HTML code. Does not add an automatic space.
92
    * 
93
    * @param string|number|StringBuilder_Interface $html
94
    * @return $this
95
    */
96
    public function html($html) : StringBuilder
97
    {
98
        return $this->nospace($html);
99
    }
100
    
101
   /**
102
    * Adds an unordered list with the specified items.
103
    * 
104
    * @param array<int,string|number|StringBuilder_Interface> $items
105
    * @return $this
106
    */
107
    public function ul(array $items) : StringBuilder
108
    {
109
        return $this->list('ul', $items);
110
    }
111
    
112
   /**
113
    * Adds an ordered list with the specified items.
114
    * 
115
    * @param array<int,string|number|StringBuilder_Interface> $items
116
    * @return $this
117
    */
118
    public function ol(array $items) : StringBuilder
119
    {
120
        return $this->list('ol', $items);
121
    }
122
    
123
   /**
124
    * Creates a list tag with the items list.
125
    * 
126
    * @param string $type The list type, `ol` or `ul`.
127
    * @param array<int,string|number|StringBuilder_Interface> $items
128
    * @return $this
129
    */
130
    protected function list(string $type, array $items) : StringBuilder
131
    {
132
        return $this->html(sprintf(
133
            '<%1$s><li>%2$s</li></%1$s>',
134
            $type,
135
            implode('</li><li>', $items)
136
        ));
137
    }
138
    
139
   /**
140
    * Add a translated string.
141
    * 
142
    * @param string $format The native string to translate.
143
    * @param array<int,mixed> $arguments The variables to inject into the translated string, if any.
144
    * @return $this
145
    */
146
    public function t(string $format, ...$arguments) : StringBuilder
147
    {
148
        array_unshift($arguments, $format);
149
        
150
        if(!class_exists('\AppLocalize\Localization'))
151
        {
152
            return $this->sf(...$arguments);
153
        }
154
        
155
        return $this->add(call_user_func_array(
156
            array(AppLocalize\Localization::getTranslator(), 'translate'),
157
            $arguments
158
        ));
159
    }
160
    
161
   /**
162
    * Adds a "5 months ago" age since the specified date.
163
    * 
164
    * @param DateTime $since
165
    * @return $this
166
    */
167
    public function age(DateTime $since) : StringBuilder
168
    {
169
        return $this->add(ConvertHelper::duration2string($since));
170
    }
171
    
172
   /**
173
    * Adds HTML quotes around the string.
174
    * 
175
    * @param string|number|StringBuilder_Interface $string
176
    * @return $this
177
    */
178
    public function quote($string)
179
    {
180
        return $this->sf('&quot;%s&quot;', strval($string));
181
    }
182
    
183
   /**
184
    * Adds a text that is meant as a reference to an UI element,
185
    * like a menu item, button, etc.
186
    * 
187
    * @param string|number|StringBuilder_Interface
188
    * @return $this
189
    */
190
    public function reference($string) : StringBuilder
191
    {
192
        return $this->sf('"%s"', $string);
193
    }
194
195
   /**
196
    * Add a string using the `sprintf` method.
197
    * 
198
    * @param string $format The format string
199
    * @param string|number|StringBuilder_Interface $arguments The variables to inject
200
    * @return $this
201
    */
202
    public function sf(string $format, ...$arguments) : StringBuilder
203
    {
204
        array_unshift($arguments, $format);
205
        
206
        return $this->add(call_user_func_array('sprintf', $arguments));
207
    }
208
    
209
   /**
210
    * Adds a bold string.
211
    * 
212
    * @param string|number|StringBuilder_Interface $string
213
    * @return $this
214
    */
215
    public function bold($string) : StringBuilder
216
    {
217
        return $this->sf(
218
            '<b>%s</b>', 
219
            strval($string)
220
        );
221
    }
222
    
223
   /**
224
    * Adds a HTML `br` tag.
225
    * 
226
    * @return $this
227
    */
228
    public function nl() : StringBuilder
229
    {
230
        return $this->html('<br>');
231
    }
232
    
233
   /**
234
    * Adds the current time, in the format <code>H:i:s</code>.
235
    * 
236
    * @return $this
237
    */
238
    public function time() : StringBuilder
239
    {
240
        return $this->add(date('H:i:s'));
241
    }
242
    
243
   /**
244
    * Adds the "Note:" text.
245
    * 
246
    * @return $this
247
    */
248
    public function note() : StringBuilder
249
    {
250
        return $this->t('Note:');
251
    }
252
    
253
   /**
254
    * Like `note()`, but as bold text.
255
    * 
256
    * @return $this
257
    */
258
    public function noteBold() : StringBuilder
259
    {
260
        return $this->bold(sb()->note());
261
    }
262
    
263
   /**
264
    * Adds the "Hint:" text.
265
    * 
266
    * @return $this
267
    */
268
    public function hint() : StringBuilder
269
    {
270
        return $this->t('Hint:');
271
    }
272
    
273
   /**
274
    * Adds two linebreaks.
275
    * 
276
    * @return $this
277
    */
278
    public function para() : StringBuilder
279
    {
280
        return $this->nl()->nl();
281
    }
282
    
283
   /**
284
    * Adds an anchor HTML tag.
285
    * 
286
    * @param string $label
287
    * @param string $url
288
    * @param bool $newTab
289
    * @return $this
290
    */
291
    public function link(string $label, string $url, bool $newTab=false) : StringBuilder
292
    {
293
        $target = '';
294
        if($newTab) {
295
            $target = ' target="_blank"';
296
        }
297
       
298
        return $this->sf(
299
            '<a href="%s"%s>%s</a>',
300
            $url,
301
            $target,
302
            $label
303
        );
304
    }
305
    
306
   /**
307
    * Wraps the string in a `code` tag.
308
    * 
309
    * @param string|number|StringBuilder_Interface $string
310
    * @return $this
311
    */
312
    public function code($string) : StringBuilder
313
    {
314
        return $this->sf(
315
            '<code>%s</code>',
316
            strval($string)
317
        );
318
    }
319
    
320
   /**
321
    * Wraps the string in a `pre` tag.
322
    * 
323
    * @param string|number|StringBuilder_Interface $string
324
    * @return $this
325
    */
326
    public function pre($string) : StringBuilder
327
    {
328
        return $this->sf('<pre>%s</pre>', strval($string));
329
    }
330
    
331
   /**
332
    * Wraps the text in a `span` tag with the specified classes.
333
    * 
334
    * @param string|number|StringBuilder_Interface $string
335
    * @param string|string[] $classes
336
    * @return $this
337
    */
338
    protected function spanned($string, $classes) : StringBuilder
339
    {
340
        if(!is_array($classes)) 
341
        {
342
            $classes = array(strval($classes));
343
        }
344
        
345
        return $this->sf(
346
            '<span class="%s">%s</span>',
347
            implode(' ', $classes),
348
            strval($string)
349
        );
350
    }
351
    
352
    public function render() : string
353
    {
354
        $result = implode($this->separator, $this->strings);
355
        
356
        return str_replace(array(' '.$this->noSpace, $this->noSpace), '', $result);
357
    }
358
    
359
    public function __toString()
360
    {
361
        return $this->render();
362
    }
363
    
364
    public function display() : void
365
    {
366
        echo $this->render();
367
    }
368
}
369