Differential D20538 Diff 48982 src/applications/diffusion/engineextension/DiffusionSourceHyperlinkEngineExtension.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/diffusion/engineextension/DiffusionSourceHyperlinkEngineExtension.php
- This file was added.
<?php | |||||
final class DiffusionSourceHyperlinkEngineExtension | |||||
extends PhabricatorRemarkupHyperlinkEngineExtension { | |||||
const LINKENGINEKEY = 'diffusion-src'; | |||||
public function processHyperlinks(array $hyperlinks) { | |||||
$engine = $this->getEngine(); | |||||
$viewer = $engine->getConfig('viewer'); | |||||
if (!$viewer) { | |||||
return; | |||||
} | |||||
$hyperlinks = $this->getSelfLinks($hyperlinks); | |||||
$links = array(); | |||||
foreach ($hyperlinks as $link) { | |||||
$uri = $link->getURI(); | |||||
$uri = new PhutilURI($uri); | |||||
$path = $uri->getPath(); | |||||
$pattern = | |||||
'(^'. | |||||
'/(?:diffusion|source)'. | |||||
'/(?P<identifier>[^/]+)'. | |||||
'/browse'. | |||||
'/(?P<blob>.*)'. | |||||
'\z)'; | |||||
$matches = null; | |||||
if (!preg_match($pattern, $path, $matches)) { | |||||
continue; | |||||
} | |||||
$links[] = array( | |||||
'ref' => $link, | |||||
'identifier' => $matches['identifier'], | |||||
'blob' => $matches['blob'], | |||||
); | |||||
} | |||||
if (!$links) { | |||||
return; | |||||
} | |||||
$identifiers = ipull($links, 'identifier'); | |||||
$query = id(new PhabricatorRepositoryQuery()) | |||||
->setViewer($viewer) | |||||
->withIdentifiers($identifiers); | |||||
$query->execute(); | |||||
$repository_map = $query->getIdentifierMap(); | |||||
foreach ($links as $link) { | |||||
$identifier = $link['identifier']; | |||||
$repository = idx($repository_map, $identifier); | |||||
if (!$repository) { | |||||
continue; | |||||
} | |||||
$ref = $link['ref']; | |||||
$uri = $ref->getURI(); | |||||
$tag = id(new DiffusionSourceLinkView()) | |||||
->setViewer($viewer) | |||||
->setRepository($repository) | |||||
->setURI($uri) | |||||
->setBlob($link['blob']); | |||||
if (!$ref->isEmbed()) { | |||||
$tag->setText($uri); | |||||
} | |||||
$ref->setResult($tag); | |||||
} | |||||
} | |||||
} |