2013-05-18 11:46:39 +02:00
|
|
|
<?php
|
|
|
|
|
2014-08-04 16:55:43 +02:00
|
|
|
final class ProjectRemarkupRule extends PhabricatorObjectRemarkupRule {
|
2013-05-18 11:46:39 +02:00
|
|
|
|
|
|
|
protected function getObjectNamePrefix() {
|
|
|
|
return '#';
|
|
|
|
}
|
|
|
|
|
2015-05-04 23:33:00 +02:00
|
|
|
protected function renderObjectRef(
|
|
|
|
$object,
|
|
|
|
PhabricatorObjectHandle $handle,
|
|
|
|
$anchor,
|
|
|
|
$id) {
|
|
|
|
|
2014-07-05 19:16:58 +02:00
|
|
|
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.
|
|
|
|
|
2014-07-24 00:05:46 +02:00
|
|
|
// In other contexts, the PhabricatorProjectProjectPHIDType pattern is
|
2014-04-04 20:13:06 +02:00
|
|
|
// controlling and these names should parse correctly.
|
|
|
|
|
2015-04-04 01:38:19 +02:00
|
|
|
// These characters may never appear anywhere in a hashtag.
|
|
|
|
$never = '\s?!,:;{}#\\(\\)"\'';
|
|
|
|
|
|
|
|
// These characters may not appear at the beginning.
|
|
|
|
$never_first = '.\d';
|
|
|
|
|
|
|
|
// These characters may not appear at the end.
|
|
|
|
$never_last = '.';
|
|
|
|
|
|
|
|
return
|
|
|
|
'[^'.$never_first.$never.']+'.
|
|
|
|
'(?:'.
|
|
|
|
'[^'.$never.']*'.
|
|
|
|
'[^'.$never_last.$never.']+'.
|
|
|
|
')*';
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|