[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/files/markup/ -> PhabricatorEmbedFileRemarkupRule.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1