Page MenuHomePhabricator

D20512.diff
No OneTemporary

D20512.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -4548,6 +4548,7 @@
'PhabricatorSecuritySetupCheck' => 'applications/config/check/PhabricatorSecuritySetupCheck.php',
'PhabricatorSelectEditField' => 'applications/transactions/editfield/PhabricatorSelectEditField.php',
'PhabricatorSelectSetting' => 'applications/settings/setting/PhabricatorSelectSetting.php',
+ 'PhabricatorSelfHyperlinkEngineExtension' => 'applications/meta/engineextension/PhabricatorSelfHyperlinkEngineExtension.php',
'PhabricatorSessionsSettingsPanel' => 'applications/settings/panel/PhabricatorSessionsSettingsPanel.php',
'PhabricatorSetConfigType' => 'applications/config/type/PhabricatorSetConfigType.php',
'PhabricatorSetting' => 'applications/settings/setting/PhabricatorSetting.php',
@@ -10858,6 +10859,7 @@
'PhabricatorSecuritySetupCheck' => 'PhabricatorSetupCheck',
'PhabricatorSelectEditField' => 'PhabricatorEditField',
'PhabricatorSelectSetting' => 'PhabricatorSetting',
+ 'PhabricatorSelfHyperlinkEngineExtension' => 'PhutilRemarkupHyperlinkEngineExtension',
'PhabricatorSessionsSettingsPanel' => 'PhabricatorSettingsPanel',
'PhabricatorSetConfigType' => 'PhabricatorTextConfigType',
'PhabricatorSetting' => 'Phobject',
diff --git a/src/applications/meta/engineextension/PhabricatorSelfHyperlinkEngineExtension.php b/src/applications/meta/engineextension/PhabricatorSelfHyperlinkEngineExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/engineextension/PhabricatorSelfHyperlinkEngineExtension.php
@@ -0,0 +1,88 @@
+<?php
+
+final class PhabricatorSelfHyperlinkEngineExtension
+ extends PhutilRemarkupHyperlinkEngineExtension {
+
+ const LINKENGINEKEY = 'phabricator-self';
+
+ public function processHyperlinks(array $hyperlinks) {
+ $engine = $this->getEngine();
+ $viewer = $engine->getConfig('viewer');
+
+ // If we don't have a valid viewer, just bail out. We aren't going to be
+ // able to do very much.
+ if (!$viewer) {
+ return;
+ }
+
+ // Find links which point to resources on the Phabricator install itself.
+ // We're going to try to enhance these.
+ $self_links = array();
+ foreach ($hyperlinks as $link) {
+ $uri = $link->getURI();
+ if (PhabricatorEnv::isSelfURI($uri)) {
+ $self_links[] = $link;
+ }
+ }
+
+ // For links in the form "/X123", we can reasonably guess that they are
+ // fairly likely to be object names. Try to look them up.
+ $object_names = array();
+ foreach ($self_links as $key => $link) {
+ $uri = new PhutilURI($link->getURI());
+
+ $matches = null;
+ $path = $uri->getPath();
+ if (!preg_match('(^/([^/]+)\z)', $path, $matches)) {
+ continue;
+ }
+
+ $object_names[$key] = $matches[1];
+ }
+
+ if ($object_names) {
+ $object_query = id(new PhabricatorObjectQuery())
+ ->setViewer($viewer)
+ ->withNames($object_names);
+
+ $object_query->execute();
+
+ $object_map = $object_query->getNamedResults();
+ } else {
+ $object_map = array();
+ }
+
+ if ($object_map) {
+ $handles = $viewer->loadHandles(mpull($object_map, 'getPHID'));
+ } else {
+ $handles = array();
+ }
+
+ foreach ($object_names as $key => $object_name) {
+ $object = idx($object_map, $object_name);
+ if (!$object) {
+ continue;
+ }
+
+ $phid = $object->getPHID();
+ $handle = $handles[$phid];
+
+ $link = $self_links[$key];
+ $raw_uri = $link->getURI();
+ $is_embed = $link->isEmbed();
+
+ $tag = $handle->renderTag()
+ ->setPHID($phid)
+ ->setHref($raw_uri);
+
+ if (!$is_embed) {
+ $tag->setName($raw_uri);
+ }
+
+ $link->setResult($tag);
+
+ unset($self_links[$key]);
+ }
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Sun, May 12, 2:58 AM (3 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6285476
Default Alt Text
D20512.diff (3 KB)

Event Timeline