]>
Commit | Line | Data |
---|---|---|
336a28fa A |
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 | ||
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; | |
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 | { | |
a39acb25 | 179 | return $this->filterTagList($bookmark->getTags()); |
336a28fa A |
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 | { | |
a39acb25 | 191 | return implode(' ', $this->formatTagList($bookmark)); |
336a28fa A |
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 | } | |
a39acb25 A |
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 | } | |
336a28fa | 285 | } |