3 namespace Shaarli\Formatter
;
6 use Shaarli\Bookmark\Bookmark
;
7 use Shaarli\Config\ConfigManager
;
10 * Class BookmarkFormatter
12 * Abstract class processing all bookmark attributes through methods designed to be overridden.
14 * @package Shaarli\Formatter
16 abstract class BookmarkFormatter
24 protected $isLoggedIn;
27 * @var array Additional parameters than can be used for specific formatting
28 * e.g. index_url for Feed formatting
30 protected $contextData = [];
33 * LinkDefaultFormatter constructor.
34 * @param ConfigManager $conf
36 public function __construct(ConfigManager
$conf, bool $isLoggedIn)
39 $this->isLoggedIn
= $isLoggedIn;
43 * Convert a Bookmark into an array usable by templates and plugins.
45 * All Bookmark attributes are formatted through a format method
46 * that can be overridden in a formatter extending this class.
48 * @param Bookmark $bookmark instance
50 * @return array formatted representation of a Bookmark
52 public function format($bookmark)
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['urlencoded_taglist'] = $this->formatUrlEncodedTagList($bookmark);
62 $out['taglist'] = $this->formatTagList($bookmark);
63 $out['urlencoded_tags'] = $this->formatUrlEncodedTagString($bookmark);
64 $out['tags'] = $this->formatTagString($bookmark);
65 $out['sticky'] = $bookmark->isSticky();
66 $out['private'] = $bookmark->isPrivate();
67 $out['class'] = $this->formatClass($bookmark);
68 $out['created'] = $this->formatCreated($bookmark);
69 $out['updated'] = $this->formatUpdated($bookmark);
70 $out['timestamp'] = $this->formatCreatedTimestamp($bookmark);
71 $out['updated_timestamp'] = $this->formatUpdatedTimestamp($bookmark);
76 * Add additional data available to formatters.
77 * This is used for example to add `index_url` in description's links.
79 * @param string $key Context data key
80 * @param string $value Context data value
82 public function addContextData($key, $value)
84 $this->contextData
[$key] = $value;
92 * @param Bookmark $bookmark instance
94 * @return int formatted ID
96 protected function formatId($bookmark)
98 return $bookmark->getId();
104 * @param Bookmark $bookmark instance
106 * @return string formatted ShortUrl
108 protected function formatShortUrl($bookmark)
110 return $bookmark->getShortUrl();
116 * @param Bookmark $bookmark instance
118 * @return string formatted Url
120 protected function formatUrl($bookmark)
122 return $bookmark->getUrl();
127 * Legacy: identical to Url
129 * @param Bookmark $bookmark instance
131 * @return string formatted RealUrl
133 protected function formatRealUrl($bookmark)
135 return $this->formatUrl($bookmark);
141 * @param Bookmark $bookmark instance
143 * @return string formatted Title
145 protected function formatTitle($bookmark)
147 return $bookmark->getTitle();
153 * @param Bookmark $bookmark instance
155 * @return string formatted Description
157 protected function formatDescription($bookmark)
159 return $bookmark->getDescription();
165 * @param Bookmark $bookmark instance
167 * @return string formatted Thumbnail
169 protected function formatThumbnail($bookmark)
171 return $bookmark->getThumbnail();
177 * @param Bookmark $bookmark instance
179 * @return array formatted Tags
181 protected function formatTagList($bookmark)
183 return $this->filterTagList($bookmark->getTags());
187 * Format Url Encoded Tags
189 * @param Bookmark $bookmark instance
191 * @return array formatted Tags
193 protected function formatUrlEncodedTagList($bookmark)
195 return array_map('urlencode', $this->filterTagList($bookmark->getTags()));
201 * @param Bookmark $bookmark instance
203 * @return string formatted TagString
205 protected function formatTagString($bookmark)
207 return implode(' ', $this->formatTagList($bookmark));
213 * @param Bookmark $bookmark instance
215 * @return string formatted TagString
217 protected function formatUrlEncodedTagString($bookmark)
219 return implode(' ', $this->formatUrlEncodedTagList($bookmark));
224 * Used to add specific CSS class for a link
226 * @param Bookmark $bookmark instance
228 * @return string formatted Class
230 protected function formatClass($bookmark)
232 return $bookmark->isPrivate() ? 'private' : '';
238 * @param Bookmark $bookmark instance
240 * @return DateTime instance
242 protected function formatCreated(Bookmark
$bookmark)
244 return $bookmark->getCreated();
250 * @param Bookmark $bookmark instance
252 * @return DateTime instance
254 protected function formatUpdated(Bookmark
$bookmark)
256 return $bookmark->getUpdated();
260 * Format CreatedTimestamp
262 * @param Bookmark $bookmark instance
264 * @return int formatted CreatedTimestamp
266 protected function formatCreatedTimestamp(Bookmark
$bookmark)
268 if (! empty($bookmark->getCreated())) {
269 return $bookmark->getCreated()->getTimestamp();
275 * Format UpdatedTimestamp
277 * @param Bookmark $bookmark instance
279 * @return int formatted UpdatedTimestamp
281 protected function formatUpdatedTimestamp(Bookmark
$bookmark)
283 if (! empty($bookmark->getUpdated())) {
284 return $bookmark->getUpdated()->getTimestamp();
290 * Format tag list, e.g. remove private tags if the user is not logged in.
296 protected function filterTagList(array $tags): array
298 if ($this->isLoggedIn
=== true) {
303 foreach ($tags as $tag) {
304 if (strpos($tag, '.') === 0) {