Differential D20528 Diff 48974 src/applications/doorkeeper/engineextension/DoorkeeperHyperlinkEngineExtension.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/doorkeeper/engineextension/DoorkeeperHyperlinkEngineExtension.php
- This file was added.
| <?php | |||||
| final class DoorkeeperHyperlinkEngineExtension | |||||
| extends PhutilRemarkupHyperlinkEngineExtension { | |||||
| const LINKENGINEKEY = 'doorkeeper'; | |||||
| public function processHyperlinks(array $hyperlinks) { | |||||
| $engine = $this->getEngine(); | |||||
| $viewer = $engine->getConfig('viewer'); | |||||
| if (!$viewer) { | |||||
| return; | |||||
| } | |||||
| $configs = id(new PhabricatorAuthProviderConfigQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withIsEnabled(true) | |||||
| ->execute(); | |||||
| $providers = array(); | |||||
| foreach ($configs as $key => $config) { | |||||
| $provider = $config->getProvider(); | |||||
| if (($provider instanceof DoorkeeperRemarkupURIInterface)) { | |||||
| $providers[] = $provider; | |||||
| } | |||||
| } | |||||
| if (!$providers) { | |||||
| return; | |||||
| } | |||||
| $refs = array(); | |||||
| foreach ($hyperlinks as $hyperlink) { | |||||
| $uri = $hyperlink->getURI(); | |||||
| $uri = new PhutilURI($uri); | |||||
| foreach ($providers as $provider) { | |||||
| $ref = $provider->getDoorkeeperURIRef($uri); | |||||
| if (($ref !== null) && !($ref instanceof DoorkeeperURIRef)) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Expected "getDoorkeeperURIRef()" to return "null" or an '. | |||||
| 'object of type "DoorkeeperURIRef", but got %s from provider '. | |||||
| '"%s".', | |||||
| phutil_describe_type($ref), | |||||
| get_class($provider))); | |||||
| } | |||||
| if ($ref === null) { | |||||
| continue; | |||||
| } | |||||
| $tag_id = celerity_generate_unique_node_id(); | |||||
| $href = phutil_string_cast($ref->getURI()); | |||||
| $refs[] = array( | |||||
| 'id' => $tag_id, | |||||
| 'href' => $href, | |||||
| 'ref' => array( | |||||
| $ref->getApplicationType(), | |||||
| $ref->getApplicationDomain(), | |||||
| $ref->getObjectType(), | |||||
| $ref->getObjectID(), | |||||
| ), | |||||
| 'view' => $ref->getDisplayMode(), | |||||
| ); | |||||
| $text = $ref->getText(); | |||||
| if ($text === null) { | |||||
| $text = $href; | |||||
| } | |||||
| $view = id(new PHUITagView()) | |||||
| ->setID($tag_id) | |||||
| ->setName($text) | |||||
| ->setHref($href) | |||||
| ->setType(PHUITagView::TYPE_OBJECT) | |||||
| ->setExternal(true); | |||||
| $hyperlink->setResult($view); | |||||
| break; | |||||
| } | |||||
| } | |||||
| if ($refs) { | |||||
| Javelin::initBehavior('doorkeeper-tag', array('tags' => $refs)); | |||||
| } | |||||
| } | |||||
| } | |||||