mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 22:10:55 +01:00
Remarkup rule to embed images
Summary: Ref T4190. Added the remarkup rule to embed images: Syntax is as follows: `{image <IMAGE_URL>}` Parameters are also supported, like: `{image uri=<IMAGE_URI>, width=500px, height=200px, alt=picture of a moose, href=google.com}` URLs without a protocol are not supported. Test Plan: Tested with many of the syntax variations. If the provided URL doesn't point to an image, then a broken image icon will be shown. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin, epriestley, yelirekim Maniphest Tasks: T4190 Differential Revision: https://secure.phabricator.com/D16597
This commit is contained in:
parent
7d576c3f94
commit
26b29a60c0
3 changed files with 78 additions and 0 deletions
|
@ -2688,6 +2688,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorIconSetEditField' => 'applications/transactions/editfield/PhabricatorIconSetEditField.php',
|
'PhabricatorIconSetEditField' => 'applications/transactions/editfield/PhabricatorIconSetEditField.php',
|
||||||
'PhabricatorIconSetIcon' => 'applications/files/iconset/PhabricatorIconSetIcon.php',
|
'PhabricatorIconSetIcon' => 'applications/files/iconset/PhabricatorIconSetIcon.php',
|
||||||
'PhabricatorImageMacroRemarkupRule' => 'applications/macro/markup/PhabricatorImageMacroRemarkupRule.php',
|
'PhabricatorImageMacroRemarkupRule' => 'applications/macro/markup/PhabricatorImageMacroRemarkupRule.php',
|
||||||
|
'PhabricatorImageRemarkupRule' => 'applications/files/markup/PhabricatorImageRemarkupRule.php',
|
||||||
'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php',
|
'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php',
|
||||||
'PhabricatorImagemagickSetupCheck' => 'applications/config/check/PhabricatorImagemagickSetupCheck.php',
|
'PhabricatorImagemagickSetupCheck' => 'applications/config/check/PhabricatorImagemagickSetupCheck.php',
|
||||||
'PhabricatorInFlightErrorView' => 'applications/config/view/PhabricatorInFlightErrorView.php',
|
'PhabricatorInFlightErrorView' => 'applications/config/view/PhabricatorInFlightErrorView.php',
|
||||||
|
@ -7523,6 +7524,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorIconSetEditField' => 'PhabricatorEditField',
|
'PhabricatorIconSetEditField' => 'PhabricatorEditField',
|
||||||
'PhabricatorIconSetIcon' => 'Phobject',
|
'PhabricatorIconSetIcon' => 'Phobject',
|
||||||
'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule',
|
'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule',
|
||||||
|
'PhabricatorImageRemarkupRule' => 'PhutilRemarkupRule',
|
||||||
'PhabricatorImageTransformer' => 'Phobject',
|
'PhabricatorImageTransformer' => 'Phobject',
|
||||||
'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck',
|
'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck',
|
||||||
'PhabricatorInFlightErrorView' => 'AphrontView',
|
'PhabricatorInFlightErrorView' => 'AphrontView',
|
||||||
|
|
|
@ -37,6 +37,7 @@ final class PhabricatorFilesApplication extends PhabricatorApplication {
|
||||||
public function getRemarkupRules() {
|
public function getRemarkupRules() {
|
||||||
return array(
|
return array(
|
||||||
new PhabricatorEmbedFileRemarkupRule(),
|
new PhabricatorEmbedFileRemarkupRule(),
|
||||||
|
new PhabricatorImageRemarkupRule(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorImageRemarkupRule extends PhutilRemarkupRule {
|
||||||
|
public function getPriority() {
|
||||||
|
return 200.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function apply($text) {
|
||||||
|
return preg_replace_callback(
|
||||||
|
'@{(image|img) ((?:[^}\\\\]+|\\\\.)*)}@m',
|
||||||
|
array($this, 'markupImage'),
|
||||||
|
$text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function markupImage(array $matches) {
|
||||||
|
if (!$this->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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue