]>
Commit | Line | Data |
---|---|---|
336a28fa A |
1 | <?php |
2 | ||
3 | namespace Shaarli\Formatter; | |
4 | ||
5 | use DateTime; | |
336a28fa | 6 | use Shaarli\Bookmark\Bookmark; |
301c7ab1 | 7 | use 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 | */ | |
16 | abstract 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 | } |