diff options
Diffstat (limited to 'inc/Ui/Media/Display.php')
-rw-r--r-- | inc/Ui/Media/Display.php | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/inc/Ui/Media/Display.php b/inc/Ui/Media/Display.php new file mode 100644 index 000000000..16f2137b1 --- /dev/null +++ b/inc/Ui/Media/Display.php @@ -0,0 +1,119 @@ +<?php + +namespace dokuwiki\Ui\Media; + +use dokuwiki\File\MediaFile; + +class Display +{ + /** @var MediaFile */ + protected $mediaFile; + + /** @var string should IDs be shown relative to this namespace? Used in search results */ + protected $relativeDisplay = null; + + /** @var bool scroll to this file on display? */ + protected $scrollIntoView = false; + + /** + * Display constructor. + * @param MediaFile $mediaFile + */ + public function __construct(MediaFile $mediaFile) + { + $this->mediaFile = $mediaFile; + } + + /** + * Get the HTML to display a preview image if possible, otherwise show an icon + * + * @param int $w bounding box width to resize pixel based images to + * @param int $h bounding box height to resize pixel based images to + * @return string + */ + public function getPreviewHtml($w, $h) + { + if ($this->mediaFile->isImage()) { + $src = ml($this->mediaFile->getId(), ['w' => $w, 'h' => $h]); + } else { + $src = $this->getIconUrl(); + } + + return '<img src="' . $src . '" alt="' . hsc($this->mediaFile->getDisplayName()) . '" loading="lazy" />'; + } + + /** + * Return the URL to the icon for this file + * + * @return string + */ + public function getIconUrl() + { + $link = 'lib/images/fileicons/svg/' . $this->mediaFile->getIcoClass() . '.svg'; + if (!file_exists(DOKU_INC . $link)) $link = 'lib/images/fileicons/svg/file.svg'; + return DOKU_BASE . $link; + } + + /** + * Show IDs relative to this namespace + * + * @param string|null $ns Use null to disable + */ + public function relativeDisplay($ns) + { + $this->relativeDisplay = $ns; + } + + /** + * Scroll to this file on display? + * + * @param bool $set + */ + public function scrollIntoView($set = true) + { + $this->scrollIntoView = $set; + } + + /** @return string */ + protected function formatDate() + { + return dformat($this->mediaFile->getLastModified()); + } + + /** + * Output the image dimension if any + * + * @param string $empty what to show when no dimensions are available + * @return string + */ + protected function formatDimensions($empty = ' ') + { + $w = $this->mediaFile->getWidth(); + $h = $this->mediaFile->getHeight(); + if ($w && $h) { + return $w . '×' . $h; + } else { + return $empty; + } + } + + /** @return string */ + protected function formatFileSize() + { + return filesize_h($this->mediaFile->getFileSize()); + } + + /** @return string */ + protected function formatDisplayName() + { + if ($this->relativeDisplay !== null) { + $id = $this->mediaFile->getId(); + if (substr($id, 0, strlen($this->relativeDisplay)) == $this->relativeDisplay) { + $id = substr($id, strlen($this->relativeDisplay)); + } + return ltrim($id, ':'); + } else { + return $this->mediaFile->getDisplayName(); + } + } +} |