2013-05-18 11:46:39 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class ProjectRemarkupRule
|
|
|
|
extends PhabricatorRemarkupRuleObject {
|
|
|
|
|
|
|
|
protected function getObjectNamePrefix() {
|
|
|
|
return '#';
|
|
|
|
}
|
|
|
|
|
2014-07-05 19:16:58 +02:00
|
|
|
protected function renderObjectRef($object, $handle, $anchor, $id) {
|
|
|
|
if ($this->getEngine()->isTextMode()) {
|
|
|
|
return '#'.$id;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $handle->renderTag();
|
|
|
|
}
|
|
|
|
|
2013-05-18 11:46:39 +02:00
|
|
|
protected function getObjectIDPattern() {
|
2014-04-04 20:13:06 +02:00
|
|
|
// NOTE: This explicitly does not match strings which contain only
|
|
|
|
// digits, because digit strings like "#123" are used to reference tasks at
|
|
|
|
// Facebook and are somewhat conventional in general.
|
|
|
|
|
|
|
|
// The latter half of this rule matches monograms with internal periods,
|
|
|
|
// like `#domain.com`, but does not match monograms with terminal periods,
|
|
|
|
// because they're probably just puncutation.
|
|
|
|
|
|
|
|
// Broadly, this will not match every possible project monogram, and we
|
|
|
|
// accept some false negatives -- like `#1` or `#dot.` -- in order to avoid
|
|
|
|
// a bunch of false positives on general use of the `#` character.
|
|
|
|
|
|
|
|
// In other contexts, the PhabricatorProjectPHIDTypeProject pattern is
|
|
|
|
// controlling and these names should parse correctly.
|
|
|
|
|
|
|
|
return '[^\s.!,:;{}#]*[^\s\d!,:;{}#]+(?:[^\s.!,:;{}#][^\s!,:;{}#]*)*';
|
2013-05-18 11:46:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function loadObjects(array $ids) {
|
|
|
|
$viewer = $this->getEngine()->getConfig('viewer');
|
|
|
|
|
2014-01-03 21:24:21 +01:00
|
|
|
// Put the "#" back on the front of these IDs.
|
|
|
|
$names = array();
|
|
|
|
foreach ($ids as $id) {
|
|
|
|
$names[] = '#'.$id;
|
2013-05-18 11:46:39 +02:00
|
|
|
}
|
|
|
|
|
2014-01-03 21:24:21 +01:00
|
|
|
// Issue a query by object name.
|
|
|
|
$query = id(new PhabricatorObjectQuery())
|
2013-05-18 11:46:39 +02:00
|
|
|
->setViewer($viewer)
|
2014-01-03 21:24:21 +01:00
|
|
|
->withNames($names);
|
|
|
|
|
|
|
|
$query->execute();
|
|
|
|
$projects = $query->getNamedResults();
|
2013-05-18 11:46:39 +02:00
|
|
|
|
2014-01-03 21:24:21 +01:00
|
|
|
// Slice the "#" off again.
|
2013-05-18 11:46:39 +02:00
|
|
|
$result = array();
|
2014-01-03 21:24:21 +01:00
|
|
|
foreach ($projects as $name => $project) {
|
|
|
|
$result[substr($name, 1)] = $project;
|
2013-05-18 11:46:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|