Passed
Push — master ( 684bcb...2808dd )
by Sebastian
09:28
created

StringBuilder   A

Complexity

Total Complexity 32

Size/Duplication

Total Lines 350
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 32
eloc 63
c 3
b 0
f 0
dl 0
loc 350
rs 9.84

27 Methods

Rating   Name   Duplication   Size   Complexity  
A html() 0 3 1
A sf() 0 5 1
A add() 0 10 2
A __construct() 0 2 1
A age() 0 3 1
A nospace() 0 3 1
A ol() 0 3 1
A list() 0 6 1
A reference() 0 3 1
A quote() 0 3 1
A bold() 0 5 1
A t() 0 12 2
A ul() 0 3 1
A link() 0 12 2
A noteBold() 0 3 1
A display() 0 3 1
A eol() 0 3 1
A render() 0 5 1
A note() 0 3 1
A hint() 0 3 1
A nl() 0 3 1
A time() 0 3 1
A __toString() 0 3 1
A code() 0 5 1
A pre() 0 3 1
A spanned() 0 11 2
A para() 0 7 2
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 $string 
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
    * @see StringBuilder::eol()
228
    */
229
    public function nl() : StringBuilder
230
    {
231
        return $this->html('<br>');
232
    }
233
234
    /**
235
     * Adds an EOL character, without space.
236
     *
237
     * @return $this
238
     * @see StringBuilder::nl()
239
     */
240
    public function eol() : StringBuilder
241
    {
242
        return $this->nospace(PHP_EOL);
243
    }
244
    
245
   /**
246
    * Adds the current time, in the format <code>H:i:s</code>.
247
    * 
248
    * @return $this
249
    */
250
    public function time() : StringBuilder
251
    {
252
        return $this->add(date('H:i:s'));
253
    }
254
    
255
   /**
256
    * Adds the "Note:" text.
257
    * 
258
    * @return $this
259
    */
260
    public function note() : StringBuilder
261
    {
262
        return $this->t('Note:');
263
    }
264
    
265
   /**
266
    * Like `note()`, but as bold text.
267
    * 
268
    * @return $this
269
    */
270
    public function noteBold() : StringBuilder
271
    {
272
        return $this->bold(sb()->note());
273
    }
274
    
275
   /**
276
    * Adds the "Hint:" text.
277
    * 
278
    * @return $this
279
    */
280
    public function hint() : StringBuilder
281
    {
282
        return $this->t('Hint:');
283
    }
284
    
285
   /**
286
    * Adds two linebreaks.
287
    *
288
    * @param StringBuilder_Interface|string|NULL
289
    * @return $this
290
    */
291
    public function para($content=null) : StringBuilder
292
    {
293
        if($content !== null) {
294
            return $this->html('<p>')->nospace($content)->html('</p>');
295
        }
296
297
        return $this->nl()->nl();
298
    }
299
    
300
   /**
301
    * Adds an anchor HTML tag.
302
    * 
303
    * @param string $label
304
    * @param string $url
305
    * @param bool $newTab
306
    * @return $this
307
    */
308
    public function link(string $label, string $url, bool $newTab=false) : StringBuilder
309
    {
310
        $target = '';
311
        if($newTab) {
312
            $target = ' target="_blank"';
313
        }
314
       
315
        return $this->sf(
316
            '<a href="%s"%s>%s</a>',
317
            $url,
318
            $target,
319
            $label
320
        );
321
    }
322
    
323
   /**
324
    * Wraps the string in a `code` tag.
325
    * 
326
    * @param string|number|StringBuilder_Interface $string
327
    * @return $this
328
    */
329
    public function code($string) : StringBuilder
330
    {
331
        return $this->sf(
332
            '<code>%s</code>',
333
            strval($string)
334
        );
335
    }
336
    
337
   /**
338
    * Wraps the string in a `pre` tag.
339
    * 
340
    * @param string|number|StringBuilder_Interface $string
341
    * @return $this
342
    */
343
    public function pre($string) : StringBuilder
344
    {
345
        return $this->sf('<pre>%s</pre>', strval($string));
346
    }
347
    
348
   /**
349
    * Wraps the text in a `span` tag with the specified classes.
350
    * 
351
    * @param string|number|StringBuilder_Interface $string
352
    * @param string|string[] $classes
353
    * @return $this
354
    */
355
    protected function spanned($string, $classes) : StringBuilder
356
    {
357
        if(!is_array($classes)) 
358
        {
359
            $classes = array(strval($classes));
360
        }
361
        
362
        return $this->sf(
363
            '<span class="%s">%s</span>',
364
            implode(' ', $classes),
365
            strval($string)
366
        );
367
    }
368
    
369
    public function render() : string
370
    {
371
        $result = implode($this->separator, $this->strings);
372
        
373
        return str_replace(array(' '.$this->noSpace, $this->noSpace), '', $result);
374
    }
375
    
376
    public function __toString()
377
    {
378
        return $this->render();
379
    }
380
    
381
    public function display() : void
382
    {
383
        echo $this->render();
384
    }
385
}
386