[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorEmbedFileRemarkupRule 4 extends PhabricatorObjectRemarkupRule { 5 6 const KEY_EMBED_FILE_PHIDS = 'phabricator.embedded-file-phids'; 7 8 protected function getObjectNamePrefix() { 9 return 'F'; 10 } 11 12 protected function loadObjects(array $ids) { 13 $engine = $this->getEngine(); 14 15 $viewer = $engine->getConfig('viewer'); 16 $objects = id(new PhabricatorFileQuery()) 17 ->setViewer($viewer) 18 ->withIDs($ids) 19 ->execute(); 20 21 $phids_key = self::KEY_EMBED_FILE_PHIDS; 22 $phids = $engine->getTextMetadata($phids_key, array()); 23 foreach (mpull($objects, 'getPHID') as $phid) { 24 $phids[] = $phid; 25 } 26 $engine->setTextMetadata($phids_key, $phids); 27 28 return $objects; 29 } 30 31 protected function renderObjectEmbed($object, $handle, $options) { 32 $options = $this->getFileOptions($options) + array( 33 'name' => $object->getName(), 34 ); 35 36 $is_viewable_image = $object->isViewableImage(); 37 $is_audio = $object->isAudio(); 38 $force_link = ($options['layout'] == 'link'); 39 40 $options['viewable'] = ($is_viewable_image || $is_audio); 41 42 if ($is_viewable_image && !$force_link) { 43 return $this->renderImageFile($object, $handle, $options); 44 } else if ($is_audio && !$force_link) { 45 return $this->renderAudioFile($object, $handle, $options); 46 } else { 47 return $this->renderFileLink($object, $handle, $options); 48 } 49 } 50 51 private function getFileOptions($option_string) { 52 $options = array( 53 'size' => null, 54 'layout' => 'left', 55 'float' => false, 56 'width' => null, 57 'height' => null, 58 'alt' => null, 59 ); 60 61 if ($option_string) { 62 $option_string = trim($option_string, ', '); 63 $parser = new PhutilSimpleOptions(); 64 $options = $parser->parse($option_string) + $options; 65 } 66 67 return $options; 68 } 69 70 private function renderImageFile( 71 PhabricatorFile $file, 72 PhabricatorObjectHandle $handle, 73 array $options) { 74 75 require_celerity_resource('lightbox-attachment-css'); 76 77 $attrs = array(); 78 $image_class = null; 79 80 $use_size = true; 81 if (!$options['size']) { 82 $width = $this->parseDimension($options['width']); 83 $height = $this->parseDimension($options['height']); 84 if ($width || $height) { 85 $use_size = false; 86 $attrs += array( 87 'src' => $file->getBestURI(), 88 'width' => $width, 89 'height' => $height, 90 ); 91 } 92 } 93 94 if ($use_size) { 95 switch ((string)$options['size']) { 96 case 'full': 97 $attrs += array( 98 'src' => $file->getBestURI(), 99 ); 100 $image_class = 'phabricator-remarkup-embed-image-full'; 101 break; 102 case 'thumb': 103 default: 104 $attrs['src'] = $file->getPreview220URI(); 105 $dimensions = 106 PhabricatorImageTransformer::getPreviewDimensions($file, 220); 107 $attrs['width'] = $dimensions['sdx']; 108 $attrs['height'] = $dimensions['sdy']; 109 $image_class = 'phabricator-remarkup-embed-image'; 110 break; 111 } 112 } 113 114 if (isset($options['alt'])) { 115 $attrs['alt'] = $options['alt']; 116 } 117 118 $img = phutil_tag('img', $attrs); 119 120 $embed = javelin_tag( 121 'a', 122 array( 123 'href' => $file->getBestURI(), 124 'class' => $image_class, 125 'sigil' => 'lightboxable', 126 'meta' => array( 127 'phid' => $file->getPHID(), 128 'uri' => $file->getBestURI(), 129 'dUri' => $file->getDownloadURI(), 130 'viewable' => true, 131 ), 132 ), 133 $img); 134 135 switch ($options['layout']) { 136 case 'right': 137 case 'center': 138 case 'inline': 139 case 'left': 140 $layout_class = 'phabricator-remarkup-embed-layout-'.$options['layout']; 141 break; 142 default: 143 $layout_class = 'phabricator-remarkup-embed-layout-left'; 144 break; 145 } 146 147 if ($options['float']) { 148 switch ($options['layout']) { 149 case 'center': 150 case 'inline': 151 break; 152 case 'right': 153 $layout_class .= ' phabricator-remarkup-embed-float-right'; 154 break; 155 case 'left': 156 default: 157 $layout_class .= ' phabricator-remarkup-embed-float-left'; 158 break; 159 } 160 } 161 162 return phutil_tag( 163 'div', 164 array( 165 'class' => $layout_class, 166 ), 167 $embed); 168 } 169 170 private function renderAudioFile( 171 PhabricatorFile $file, 172 PhabricatorObjectHandle $handle, 173 array $options) { 174 175 if (idx($options, 'autoplay')) { 176 $preload = 'auto'; 177 $autoplay = 'autoplay'; 178 } else { 179 $preload = 'none'; 180 $autoplay = null; 181 } 182 183 return $this->newTag( 184 'audio', 185 array( 186 'controls' => 'controls', 187 'preload' => $preload, 188 'autoplay' => $autoplay, 189 'loop' => idx($options, 'loop') ? 'loop' : null, 190 ), 191 $this->newTag( 192 'source', 193 array( 194 'src' => $file->getBestURI(), 195 'type' => $file->getMimeType(), 196 ))); 197 } 198 199 private function renderFileLink( 200 PhabricatorFile $file, 201 PhabricatorObjectHandle $handle, 202 array $options) { 203 204 return id(new PhabricatorFileLinkView()) 205 ->setFilePHID($file->getPHID()) 206 ->setFileName($this->assertFlatText($options['name'])) 207 ->setFileDownloadURI($file->getDownloadURI()) 208 ->setFileViewURI($file->getBestURI()) 209 ->setFileViewable((bool)$options['viewable']); 210 } 211 212 private function parseDimension($string) { 213 $string = trim($string); 214 215 if (preg_match('/^(?:\d*\\.)?\d+%?$/', $string)) { 216 return $string; 217 } 218 219 return null; 220 } 221 222 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |