1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-26 23:40:57 +01:00

Specialize rendering of self-URIs in the form "/X123"

Summary:
Depends on D20510. Ref T5378. When remarkup includes a hyperlink to the current install in the form "/X123" (which is common), load the corresponding object and specialize the rendering.

This doesn't cover everything (notably, no handling for Diffusion paths yet), but does cover a lot of the most common cases.

The "uri" form preserves the URI as written, but adds an icon, tag, and hovercard.

The "{uri}" form is more similar to `{T123}` and shows the object name.

Test Plan: {F6440367}

Reviewers: amckinley, joshuaspence

Reviewed By: joshuaspence

Subscribers: joshuaspence

Maniphest Tasks: T5378

Differential Revision: https://secure.phabricator.com/D20512
This commit is contained in:
epriestley 2019-05-09 13:01:09 -07:00
parent 706826bf02
commit 23bfe0c0f6
2 changed files with 90 additions and 0 deletions

View file

@ -4548,6 +4548,7 @@ phutil_register_library_map(array(
'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 @@ phutil_register_library_map(array(
'PhabricatorSecuritySetupCheck' => 'PhabricatorSetupCheck',
'PhabricatorSelectEditField' => 'PhabricatorEditField',
'PhabricatorSelectSetting' => 'PhabricatorSetting',
'PhabricatorSelfHyperlinkEngineExtension' => 'PhutilRemarkupHyperlinkEngineExtension',
'PhabricatorSessionsSettingsPanel' => 'PhabricatorSettingsPanel',
'PhabricatorSetConfigType' => 'PhabricatorTextConfigType',
'PhabricatorSetting' => 'Phobject',

View file

@ -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]);
}
}
}