Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15436567
D19192.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Referenced Files
None
Subscribers
None
D19192.diff
View Options
diff --git a/src/applications/files/markup/PhabricatorImageRemarkupRule.php b/src/applications/files/markup/PhabricatorImageRemarkupRule.php
--- a/src/applications/files/markup/PhabricatorImageRemarkupRule.php
+++ b/src/applications/files/markup/PhabricatorImageRemarkupRule.php
@@ -1,6 +1,9 @@
<?php
final class PhabricatorImageRemarkupRule extends PhutilRemarkupRule {
+
+ const KEY_RULE_EXTERNAL_IMAGE = 'rule.external-image';
+
public function getPriority() {
return 200.0;
}
@@ -16,6 +19,7 @@
if (!$this->isFlatText($matches[0])) {
return $matches[0];
}
+
$args = array();
$defaults = array(
'uri' => null,
@@ -23,9 +27,10 @@
'width' => null,
'height' => null,
);
+
$trimmed_match = trim($matches[2]);
if ($this->isURI($trimmed_match)) {
- $args['uri'] = new PhutilURI($trimmed_match);
+ $args['uri'] = $trimmed_match;
} else {
$parser = new PhutilSimpleOptions();
$keys = $parser->parse($trimmed_match);
@@ -37,16 +42,64 @@
}
}
if ($uri_key) {
- $args['uri'] = new PhutilURI($keys[$uri_key]);
+ $args['uri'] = $keys[$uri_key];
}
$args += $keys;
}
$args += $defaults;
- if ($args['uri']) {
+ if (!strlen($args['uri'])) {
+ return $matches[0];
+ }
+
+ // Make sure this is something that looks roughly like a real URI. We'll
+ // validate it more carefully before proxying it, but if whatever the user
+ // has typed isn't even close, just decline to activate the rule behavior.
+ try {
+ $uri = new PhutilURI($args['uri']);
+
+ if (!strlen($uri->getProtocol())) {
+ return $matches[0];
+ }
+
+ $args['uri'] = (string)$uri;
+ } catch (Exception $ex) {
+ return $matches[0];
+ }
+
+ $engine = $this->getEngine();
+ $metadata_key = self::KEY_RULE_EXTERNAL_IMAGE;
+ $metadata = $engine->getTextMetadata($metadata_key, array());
+
+ $token = $engine->storeText('<img>');
+
+ $metadata[] = array(
+ 'token' => $token,
+ 'args' => $args,
+ );
+
+ $engine->setTextMetadata($metadata_key, $metadata);
+
+ return $token;
+ }
+
+ public function didMarkupText() {
+ $engine = $this->getEngine();
+ $metadata_key = self::KEY_RULE_EXTERNAL_IMAGE;
+ $images = $engine->getTextMetadata($metadata_key, array());
+ $engine->setTextMetadata($metadata_key, array());
+
+ if (!$images) {
+ return;
+ }
+
+ foreach ($images as $image) {
+ $args = $image['args'];
+
$src_uri = id(new PhutilURI('/file/imageproxy/'))
- ->setQueryParam('uri', (string)$args['uri']);
+ ->setQueryParam('uri', $args['uri']);
+
$img = $this->newTag(
'img',
array(
@@ -55,9 +108,8 @@
'width' => $args['width'],
'height' => $args['height'],
));
- return $this->getEngine()->storeText($img);
- } else {
- return $matches[0];
+
+ $engine->overwriteStoredText($image['token'], $img);
}
}
@@ -66,4 +118,5 @@
// If it does, we'll try to treat it like a valid URI
return preg_match('~^https?\:\/\/.*\z~i', $uri_string);
}
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Mar 26, 3:15 PM (2 d, 23 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7720642
Default Alt Text
D19192.diff (3 KB)
Attached To
Mode
D19192: Separate the "{img ...}" remarkup rule into separate parse and markup phases
Attached
Detach File
Event Timeline
Log In to Comment