1<?php 2 3namespace dokuwiki\Ui\Media; 4 5use dokuwiki\File\MediaFile; 6 7class Display 8{ 9 /** @var MediaFile */ 10 protected $mediaFile; 11 12 /** @var string should IDs be shown relative to this namespace? Used in search results */ 13 protected $relativeDisplay = null; 14 15 /** @var bool scroll to this file on display? */ 16 protected $scrollIntoView = false; 17 18 /** 19 * Display constructor. 20 * @param MediaFile $mediaFile 21 */ 22 public function __construct(MediaFile $mediaFile) 23 { 24 $this->mediaFile = $mediaFile; 25 } 26 27 /** 28 * Get the HTML to display a preview image if possible, otherwise show an icon 29 * 30 * @param int $w bounding box width to resize pixel based images to 31 * @param int $h bounding box height to resize pixel based images to 32 * @return string 33 */ 34 public function getPreviewHtml($w, $h) 35 { 36 if ($this->mediaFile->isImage()) { 37 $src = ml($this->mediaFile->getId(), ['w' => $w, 'h' => $h]); 38 } else { 39 $src = $this->getIconUrl(); 40 } 41 42 return '<img src="' . $src . '" alt="' . hsc($this->mediaFile->getDisplayName()) . '" loading="lazy" />'; 43 } 44 45 /** 46 * Return the URL to the icon for this file 47 * 48 * @return string 49 */ 50 public function getIconUrl() 51 { 52 $link = 'lib/images/fileicons/svg/' . $this->mediaFile->getIcoClass() . '.svg'; 53 if (!file_exists(DOKU_INC . $link)) $link = 'lib/images/fileicons/svg/file.svg'; 54 return DOKU_BASE . $link; 55 } 56 57 /** 58 * Show IDs relative to this namespace 59 * 60 * @param string|null $ns Use null to disable 61 */ 62 public function relativeDisplay($ns) 63 { 64 $this->relativeDisplay = $ns; 65 } 66 67 /** 68 * Scroll to this file on display? 69 * 70 * @param bool $set 71 */ 72 public function scrollIntoView($set = true) 73 { 74 $this->scrollIntoView = $set; 75 } 76 77 /** @return string */ 78 protected function formatDate() 79 { 80 return dformat($this->mediaFile->getLastModified()); 81 } 82 83 /** 84 * Output the image dimension if any 85 * 86 * @param string $empty what to show when no dimensions are available 87 * @return string 88 */ 89 protected function formatDimensions($empty = ' ') 90 { 91 $w = $this->mediaFile->getWidth(); 92 $h = $this->mediaFile->getHeight(); 93 if ($w && $h) { 94 return $w . '×' . $h; 95 } else { 96 return $empty; 97 } 98 } 99 100 /** @return string */ 101 protected function formatFileSize() 102 { 103 return filesize_h($this->mediaFile->getFileSize()); 104 } 105 106 /** @return string */ 107 protected function formatDisplayName() 108 { 109 if ($this->relativeDisplay !== null) { 110 $id = $this->mediaFile->getId(); 111 if (substr($id, 0, strlen($this->relativeDisplay)) == $this->relativeDisplay) { 112 $id = substr($id, strlen($this->relativeDisplay)); 113 } 114 return ltrim($id, ':'); 115 } else { 116 return $this->mediaFile->getDisplayName(); 117 } 118 } 119} 120