]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - application/formatter/BookmarkFormatter.php
Bump lodash from 4.17.15 to 4.17.19
[github/shaarli/Shaarli.git] / application / formatter / BookmarkFormatter.php
1 <?php
2
3 namespace Shaarli\Formatter;
4
5 use DateTime;
6 use Shaarli\Config\ConfigManager;
7 use Shaarli\Bookmark\Bookmark;
8
9 /**
10 * Class BookmarkFormatter
11 *
12 * Abstract class processing all bookmark attributes through methods designed to be overridden.
13 *
14 * @package Shaarli\Formatter
15 */
16 abstract class BookmarkFormatter
17 {
18 /**
19 * @var ConfigManager
20 */
21 protected $conf;
22
23 /** @var bool */
24 protected $isLoggedIn;
25
26 /**
27 * @var array Additional parameters than can be used for specific formatting
28 * e.g. index_url for Feed formatting
29 */
30 protected $contextData = [];
31
32 /**
33 * LinkDefaultFormatter constructor.
34 * @param ConfigManager $conf
35 */
36 public function __construct(ConfigManager $conf, bool $isLoggedIn)
37 {
38 $this->conf = $conf;
39 $this->isLoggedIn = $isLoggedIn;
40 }
41
42 /**
43 * Convert a Bookmark into an array usable by templates and plugins.
44 *
45 * All Bookmark attributes are formatted through a format method
46 * that can be overridden in a formatter extending this class.
47 *
48 * @param Bookmark $bookmark instance
49 *
50 * @return array formatted representation of a Bookmark
51 */
52 public function format($bookmark)
53 {
54 $out['id'] = $this->formatId($bookmark);
55 $out['shorturl'] = $this->formatShortUrl($bookmark);
56 $out['url'] = $this->formatUrl($bookmark);
57 $out['real_url'] = $this->formatRealUrl($bookmark);
58 $out['title'] = $this->formatTitle($bookmark);
59 $out['description'] = $this->formatDescription($bookmark);
60 $out['thumbnail'] = $this->formatThumbnail($bookmark);
61 $out['taglist'] = $this->formatTagList($bookmark);
62 $out['tags'] = $this->formatTagString($bookmark);
63 $out['sticky'] = $bookmark->isSticky();
64 $out['private'] = $bookmark->isPrivate();
65 $out['class'] = $this->formatClass($bookmark);
66 $out['created'] = $this->formatCreated($bookmark);
67 $out['updated'] = $this->formatUpdated($bookmark);
68 $out['timestamp'] = $this->formatCreatedTimestamp($bookmark);
69 $out['updated_timestamp'] = $this->formatUpdatedTimestamp($bookmark);
70 return $out;
71 }
72
73 /**
74 * Add additional data available to formatters.
75 * This is used for example to add `index_url` in description's links.
76 *
77 * @param string $key Context data key
78 * @param string $value Context data value
79 */
80 public function addContextData($key, $value)
81 {
82 $this->contextData[$key] = $value;
83 }
84
85 /**
86 * Format ID
87 *
88 * @param Bookmark $bookmark instance
89 *
90 * @return int formatted ID
91 */
92 protected function formatId($bookmark)
93 {
94 return $bookmark->getId();
95 }
96
97 /**
98 * Format ShortUrl
99 *
100 * @param Bookmark $bookmark instance
101 *
102 * @return string formatted ShortUrl
103 */
104 protected function formatShortUrl($bookmark)
105 {
106 return $bookmark->getShortUrl();
107 }
108
109 /**
110 * Format Url
111 *
112 * @param Bookmark $bookmark instance
113 *
114 * @return string formatted Url
115 */
116 protected function formatUrl($bookmark)
117 {
118 return $bookmark->getUrl();
119 }
120
121 /**
122 * Format RealUrl
123 * Legacy: identical to Url
124 *
125 * @param Bookmark $bookmark instance
126 *
127 * @return string formatted RealUrl
128 */
129 protected function formatRealUrl($bookmark)
130 {
131 return $bookmark->getUrl();
132 }
133
134 /**
135 * Format Title
136 *
137 * @param Bookmark $bookmark instance
138 *
139 * @return string formatted Title
140 */
141 protected function formatTitle($bookmark)
142 {
143 return $bookmark->getTitle();
144 }
145
146 /**
147 * Format Description
148 *
149 * @param Bookmark $bookmark instance
150 *
151 * @return string formatted Description
152 */
153 protected function formatDescription($bookmark)
154 {
155 return $bookmark->getDescription();
156 }
157
158 /**
159 * Format Thumbnail
160 *
161 * @param Bookmark $bookmark instance
162 *
163 * @return string formatted Thumbnail
164 */
165 protected function formatThumbnail($bookmark)
166 {
167 return $bookmark->getThumbnail();
168 }
169
170 /**
171 * Format Tags
172 *
173 * @param Bookmark $bookmark instance
174 *
175 * @return array formatted Tags
176 */
177 protected function formatTagList($bookmark)
178 {
179 return $this->filterTagList($bookmark->getTags());
180 }
181
182 /**
183 * Format TagString
184 *
185 * @param Bookmark $bookmark instance
186 *
187 * @return string formatted TagString
188 */
189 protected function formatTagString($bookmark)
190 {
191 return implode(' ', $this->formatTagList($bookmark));
192 }
193
194 /**
195 * Format Class
196 * Used to add specific CSS class for a link
197 *
198 * @param Bookmark $bookmark instance
199 *
200 * @return string formatted Class
201 */
202 protected function formatClass($bookmark)
203 {
204 return $bookmark->isPrivate() ? 'private' : '';
205 }
206
207 /**
208 * Format Created
209 *
210 * @param Bookmark $bookmark instance
211 *
212 * @return DateTime instance
213 */
214 protected function formatCreated(Bookmark $bookmark)
215 {
216 return $bookmark->getCreated();
217 }
218
219 /**
220 * Format Updated
221 *
222 * @param Bookmark $bookmark instance
223 *
224 * @return DateTime instance
225 */
226 protected function formatUpdated(Bookmark $bookmark)
227 {
228 return $bookmark->getUpdated();
229 }
230
231 /**
232 * Format CreatedTimestamp
233 *
234 * @param Bookmark $bookmark instance
235 *
236 * @return int formatted CreatedTimestamp
237 */
238 protected function formatCreatedTimestamp(Bookmark $bookmark)
239 {
240 if (! empty($bookmark->getCreated())) {
241 return $bookmark->getCreated()->getTimestamp();
242 }
243 return 0;
244 }
245
246 /**
247 * Format UpdatedTimestamp
248 *
249 * @param Bookmark $bookmark instance
250 *
251 * @return int formatted UpdatedTimestamp
252 */
253 protected function formatUpdatedTimestamp(Bookmark $bookmark)
254 {
255 if (! empty($bookmark->getUpdated())) {
256 return $bookmark->getUpdated()->getTimestamp();
257 }
258 return 0;
259 }
260
261 /**
262 * Format tag list, e.g. remove private tags if the user is not logged in.
263 *
264 * @param array $tags
265 *
266 * @return array
267 */
268 protected function filterTagList(array $tags): array
269 {
270 if ($this->isLoggedIn === true) {
271 return $tags;
272 }
273
274 $out = [];
275 foreach ($tags as $tag) {
276 if (strpos($tag, '.') === 0) {
277 continue;
278 }
279
280 $out[] = $tag;
281 }
282
283 return $out;
284 }
285 }