diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 8e67eea1b9..eb8c71e31d 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2688,6 +2688,7 @@ phutil_register_library_map(array( 'PhabricatorIconSetEditField' => 'applications/transactions/editfield/PhabricatorIconSetEditField.php', 'PhabricatorIconSetIcon' => 'applications/files/iconset/PhabricatorIconSetIcon.php', 'PhabricatorImageMacroRemarkupRule' => 'applications/macro/markup/PhabricatorImageMacroRemarkupRule.php', + 'PhabricatorImageRemarkupRule' => 'applications/files/markup/PhabricatorImageRemarkupRule.php', 'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php', 'PhabricatorImagemagickSetupCheck' => 'applications/config/check/PhabricatorImagemagickSetupCheck.php', 'PhabricatorInFlightErrorView' => 'applications/config/view/PhabricatorInFlightErrorView.php', @@ -7523,6 +7524,7 @@ phutil_register_library_map(array( 'PhabricatorIconSetEditField' => 'PhabricatorEditField', 'PhabricatorIconSetIcon' => 'Phobject', 'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorImageRemarkupRule' => 'PhutilRemarkupRule', 'PhabricatorImageTransformer' => 'Phobject', 'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck', 'PhabricatorInFlightErrorView' => 'AphrontView', diff --git a/src/applications/files/application/PhabricatorFilesApplication.php b/src/applications/files/application/PhabricatorFilesApplication.php index 4247de5bd4..4b1cb253bb 100644 --- a/src/applications/files/application/PhabricatorFilesApplication.php +++ b/src/applications/files/application/PhabricatorFilesApplication.php @@ -37,6 +37,7 @@ final class PhabricatorFilesApplication extends PhabricatorApplication { public function getRemarkupRules() { return array( new PhabricatorEmbedFileRemarkupRule(), + new PhabricatorImageRemarkupRule(), ); } diff --git a/src/applications/files/markup/PhabricatorImageRemarkupRule.php b/src/applications/files/markup/PhabricatorImageRemarkupRule.php new file mode 100644 index 0000000000..9e91bdc096 --- /dev/null +++ b/src/applications/files/markup/PhabricatorImageRemarkupRule.php @@ -0,0 +1,75 @@ +isFlatText($matches[0])) { + return $matches[0]; + } + $args = array(); + $defaults = array( + 'uri' => null, + 'alt' => null, + 'href' => null, + 'width' => null, + 'height' => null, + ); + $trimmed_match = trim($matches[2]); + if ($this->isURI($trimmed_match)) { + $args['uri'] = new PhutilURI($trimmed_match); + } else { + $parser = new PhutilSimpleOptions(); + $keys = $parser->parse($trimmed_match); + + $uri_key = ''; + foreach (array('src', 'uri', 'url') as $key) { + if (array_key_exists($key, $keys)) { + $uri_key = $key; + } + } + if ($uri_key) { + $args['uri'] = new PhutilURI($keys[$uri_key]); + } + $args += $keys; + } + + $args += $defaults; + + if ($args['href'] && !PhabricatorEnv::isValidURIForLink($args['href'])) { + $args['href'] = null; + } + + if ($args['uri']) { + $src_uri = id(new PhutilURI('/file/imageproxy/')) + ->setQueryParam('uri', (string)$args['uri']); + $img = $this->newTag( + 'img', + array( + 'src' => $src_uri, + 'alt' => $args['alt'], + 'href' => $args['href'], + 'width' => $args['width'], + 'height' => $args['height'], + )); + return $this->getEngine()->storeText($img); + } else { + return $matches[0]; + } + } + + private function isURI($uri_string) { + // Very simple check to make sure it starts with either http or https. + // If it does, we'll try to treat it like a valid URI + return preg_match('~^https?\:\/\/.*\z~i', $uri_string); + } +}