-
Notifications
You must be signed in to change notification settings - Fork 0
/
TimelineBuilder.php
114 lines (98 loc) · 3.26 KB
/
TimelineBuilder.php
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
<?php
/*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
namespace TwitterWidgets\Timeline;
use InvalidArgumentException;
use TwitterWidgets\Options\WidgetOptionsInterface;
use Zend\Filter\FilterChain;
use Zend\Filter\StringToLower;
use Zend\Filter\Word\SeparatorToSeparator;
class TimelineBuilder implements TimelineBuilderInterface
{
protected $options;
protected $addJs;
protected $filteredAttr;
/**
* @param WidgetOptionsInterface $options
*/
public function __construct(WidgetOptionsInterface $options)
{
$this->options = $options;
}
/**
* @return string
*/
protected function buildWidget()
{
$attributesList = $this->filteredAttr;
$widget = '<a';
foreach ($attributesList as $attrKey => $attrValue) {
$widget .= ' ' . $attrKey . '="' . $attrValue . '"';
}
$widget .= '>';
$widget .= $this->options['href_text'];
$widget .= '</a>';
if ($this->addJs) {
return $widget . "\n<script>" . $this->getSingleWidgetJs() . "</script>";
}
return $widget;
}
/**
* @param bool $addJs
* @return string
* @throws InvalidArgumentException
*/
public function renderWidget($addJs = true)
{
if (!is_bool($addJs)) {
throw new InvalidArgumentException('TimelineBuilder#renderWidget expects a boolean as parameter');
}
$this->addJs = $addJs;
$this->filteredAttr = $this->filterAttr();
return $this->buildWidget();
}
/**
* @return string
*
* Add the necessary code for a single widget
*/
protected function getSingleWidgetJs()
{
return '!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? \'http\' : \'https\';
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = p + "://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");';
}
/**
* @return array
*/
protected function filterAttr()
{
if (!is_array($this->options)) {
$this->options = $this->options->toArray();
}
$filterChain = new FilterChain();
$filterChain
->attach(new SeparatorToSeparator('_', '-'))
->attach(new StringToLower());
$filteredAttr = [];
foreach ($this->options as $attribute => $value) {
if (null !== $value) {
$filteredAttr[$filterChain->filter($attribute)] = $value;
}
}
unset($filteredAttr['href-text']);
return $filteredAttr;
}
}