]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - application/formatter/BookmarkFormatter.php
Better support for notes permalink
[github/shaarli/Shaarli.git] / application / formatter / BookmarkFormatter.php
CommitLineData
336a28fa
A
1<?php
2
3namespace Shaarli\Formatter;
4
5use DateTime;
336a28fa 6use Shaarli\Bookmark\Bookmark;
301c7ab1 7use Shaarli\Config\ConfigManager;
336a28fa
A
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 */
16abstract class BookmarkFormatter
17{
18 /**
19 * @var ConfigManager
20 */
21 protected $conf;
22
a39acb25
A
23 /** @var bool */
24 protected $isLoggedIn;
25
336a28fa
A
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 */
a39acb25 36 public function __construct(ConfigManager $conf, bool $isLoggedIn)
336a28fa
A
37 {
38 $this->conf = $conf;
a39acb25 39 $this->isLoggedIn = $isLoggedIn;
336a28fa
A
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;
301c7ab1
A
83
84 return $this;
336a28fa
A
85 }
86
87 /**
88 * Format ID
89 *
90 * @param Bookmark $bookmark instance
91 *
92 * @return int formatted ID
93 */
94 protected function formatId($bookmark)
95 {
96 return $bookmark->getId();
97 }
98
99 /**
100 * Format ShortUrl
101 *
102 * @param Bookmark $bookmark instance
103 *
104 * @return string formatted ShortUrl
105 */
106 protected function formatShortUrl($bookmark)
107 {
108 return $bookmark->getShortUrl();
109 }
110
111 /**
112 * Format Url
113 *
114 * @param Bookmark $bookmark instance
115 *
116 * @return string formatted Url
117 */
118 protected function formatUrl($bookmark)
119 {
120 return $bookmark->getUrl();
121 }
122
123 /**
124 * Format RealUrl
125 * Legacy: identical to Url
126 *
127 * @param Bookmark $bookmark instance
128 *
129 * @return string formatted RealUrl
130 */
131 protected function formatRealUrl($bookmark)
132 {
301c7ab1 133 return $this->formatUrl($bookmark);
336a28fa
A
134 }
135
136 /**
137 * Format Title
138 *
139 * @param Bookmark $bookmark instance
140 *
141 * @return string formatted Title
142 */
143 protected function formatTitle($bookmark)
144 {
145 return $bookmark->getTitle();
146 }
147
148 /**
149 * Format Description
150 *
151 * @param Bookmark $bookmark instance
152 *
153 * @return string formatted Description
154 */
155 protected function formatDescription($bookmark)
156 {
157 return $bookmark->getDescription();
158 }
159
160 /**
161 * Format Thumbnail
162 *
163 * @param Bookmark $bookmark instance
164 *
165 * @return string formatted Thumbnail
166 */
167 protected function formatThumbnail($bookmark)
168 {
169 return $bookmark->getThumbnail();
170 }
171
172 /**
173 * Format Tags
174 *
175 * @param Bookmark $bookmark instance
176 *
177 * @return array formatted Tags
178 */
179 protected function formatTagList($bookmark)
180 {
a39acb25 181 return $this->filterTagList($bookmark->getTags());
336a28fa
A
182 }
183
184 /**
185 * Format TagString
186 *
187 * @param Bookmark $bookmark instance
188 *
189 * @return string formatted TagString
190 */
191 protected function formatTagString($bookmark)
192 {
a39acb25 193 return implode(' ', $this->formatTagList($bookmark));
336a28fa
A
194 }
195
196 /**
197 * Format Class
198 * Used to add specific CSS class for a link
199 *
200 * @param Bookmark $bookmark instance
201 *
202 * @return string formatted Class
203 */
204 protected function formatClass($bookmark)
205 {
206 return $bookmark->isPrivate() ? 'private' : '';
207 }
208
209 /**
210 * Format Created
211 *
212 * @param Bookmark $bookmark instance
213 *
214 * @return DateTime instance
215 */
216 protected function formatCreated(Bookmark $bookmark)
217 {
218 return $bookmark->getCreated();
219 }
220
221 /**
222 * Format Updated
223 *
224 * @param Bookmark $bookmark instance
225 *
226 * @return DateTime instance
227 */
228 protected function formatUpdated(Bookmark $bookmark)
229 {
230 return $bookmark->getUpdated();
231 }
232
233 /**
234 * Format CreatedTimestamp
235 *
236 * @param Bookmark $bookmark instance
237 *
238 * @return int formatted CreatedTimestamp
239 */
240 protected function formatCreatedTimestamp(Bookmark $bookmark)
241 {
242 if (! empty($bookmark->getCreated())) {
243 return $bookmark->getCreated()->getTimestamp();
244 }
245 return 0;
246 }
247
248 /**
249 * Format UpdatedTimestamp
250 *
251 * @param Bookmark $bookmark instance
252 *
253 * @return int formatted UpdatedTimestamp
254 */
255 protected function formatUpdatedTimestamp(Bookmark $bookmark)
256 {
257 if (! empty($bookmark->getUpdated())) {
258 return $bookmark->getUpdated()->getTimestamp();
259 }
260 return 0;
261 }
a39acb25
A
262
263 /**
264 * Format tag list, e.g. remove private tags if the user is not logged in.
265 *
266 * @param array $tags
267 *
268 * @return array
269 */
270 protected function filterTagList(array $tags): array
271 {
272 if ($this->isLoggedIn === true) {
273 return $tags;
274 }
275
276 $out = [];
277 foreach ($tags as $tag) {
278 if (strpos($tag, '.') === 0) {
279 continue;
280 }
281
282 $out[] = $tag;
283 }
284
285 return $out;
286 }
336a28fa 287}