Build a basic DiffusionPatternSearchView
Summary: Roughs this in a little, kinda basic. Allows for grouping results by page. A bit better on mobile. Would like more content return from conduit though.
Test Plan:
Test `CMS`, `cms`, and `OMGLOLWTFBBQ`, desktop and mobile
{F5099081}
Reviewers: epriestley
Reviewed By: epriestley
Subscribers: Korvin
Differential Revision: https://secure.phabricator.com/D18429
This commit is contained in:
@@ -447,136 +447,53 @@ final class DiffusionBrowseController extends DiffusionController {
|
||||
}
|
||||
$results = $pager->sliceResults($results);
|
||||
|
||||
$table = null;
|
||||
$header = null;
|
||||
if ($search_mode == 'grep') {
|
||||
$table = $this->renderGrepResults($results, $query_string);
|
||||
$header = pht(
|
||||
$title = pht(
|
||||
'File content matching "%s" under "%s"',
|
||||
$query_string,
|
||||
nonempty($drequest->getPath(), '/'));
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader($title)
|
||||
->addClass('diffusion-search-result-header');
|
||||
}
|
||||
|
||||
return id(new PHUIObjectBoxView())
|
||||
->setHeaderText($header)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->setTable($table)
|
||||
->setPager($pager);
|
||||
return array($header, $table, $pager);
|
||||
|
||||
}
|
||||
|
||||
private function renderGrepResults(array $results, $pattern) {
|
||||
$drequest = $this->getDiffusionRequest();
|
||||
|
||||
require_celerity_resource('phabricator-search-results-css');
|
||||
|
||||
$rows = array();
|
||||
foreach ($results as $result) {
|
||||
list($path, $line, $string) = $result;
|
||||
|
||||
$href = $drequest->generateURI(array(
|
||||
'action' => 'browse',
|
||||
'path' => $path,
|
||||
'line' => $line,
|
||||
));
|
||||
|
||||
$matches = null;
|
||||
$count = @preg_match_all(
|
||||
'('.$pattern.')u',
|
||||
$string,
|
||||
$matches,
|
||||
PREG_OFFSET_CAPTURE);
|
||||
|
||||
if (!$count) {
|
||||
$output = ltrim($string);
|
||||
} else {
|
||||
$output = array();
|
||||
$cursor = 0;
|
||||
$length = strlen($string);
|
||||
foreach ($matches[0] as $match) {
|
||||
$offset = $match[1];
|
||||
if ($cursor != $offset) {
|
||||
$output[] = array(
|
||||
'text' => substr($string, $cursor, $offset),
|
||||
'highlight' => false,
|
||||
);
|
||||
}
|
||||
$output[] = array(
|
||||
'text' => $match[0],
|
||||
'highlight' => true,
|
||||
);
|
||||
$cursor = $offset + strlen($match[0]);
|
||||
}
|
||||
if ($cursor != $length) {
|
||||
$output[] = array(
|
||||
'text' => substr($string, $cursor),
|
||||
'highlight' => false,
|
||||
);
|
||||
}
|
||||
|
||||
if ($output) {
|
||||
$output[0]['text'] = ltrim($output[0]['text']);
|
||||
}
|
||||
|
||||
foreach ($output as $key => $segment) {
|
||||
if ($segment['highlight']) {
|
||||
$output[$key] = phutil_tag('strong', array(), $segment['text']);
|
||||
} else {
|
||||
$output[$key] = $segment['text'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$string = phutil_tag(
|
||||
'pre',
|
||||
array('class' => 'PhabricatorMonospaced phui-source-fragment'),
|
||||
$output);
|
||||
|
||||
$path = Filesystem::readablePath($path, $drequest->getPath());
|
||||
|
||||
$rows[] = array(
|
||||
phutil_tag('a', array('href' => $href), $path),
|
||||
$line,
|
||||
$string,
|
||||
);
|
||||
if (!$results) {
|
||||
return id(new PHUIInfoView())
|
||||
->setSeverity(PHUIInfoView::SEVERITY_NODATA)
|
||||
->appendChild(
|
||||
pht(
|
||||
'The pattern you searched for was not found in the content of any '.
|
||||
'files.'));
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setClassName('remarkup-code')
|
||||
->setHeaders(array(pht('Path'), pht('Line'), pht('String')))
|
||||
->setColumnClasses(array('', 'n', 'wide'))
|
||||
->setNoDataString(
|
||||
pht(
|
||||
'The pattern you searched for was not found in the content of any '.
|
||||
'files.'));
|
||||
|
||||
return $table;
|
||||
}
|
||||
|
||||
private function renderFindResults(array $results) {
|
||||
$drequest = $this->getDiffusionRequest();
|
||||
|
||||
$rows = array();
|
||||
foreach ($results as $result) {
|
||||
$href = $drequest->generateURI(array(
|
||||
'action' => 'browse',
|
||||
'path' => $result,
|
||||
));
|
||||
|
||||
$readable = Filesystem::readablePath($result, $drequest->getPath());
|
||||
|
||||
$rows[] = array(
|
||||
phutil_tag('a', array('href' => $href), $readable),
|
||||
);
|
||||
$grouped = array();
|
||||
foreach ($results as $file) {
|
||||
list($path, $line, $string) = $file;
|
||||
$grouped[$path][] = array($line, $string);
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setHeaders(array(pht('Path')))
|
||||
->setColumnClasses(array('wide'))
|
||||
->setNoDataString(
|
||||
pht(
|
||||
'The pattern you searched for did not match the names of any '.
|
||||
'files.'));
|
||||
$view = array();
|
||||
foreach ($grouped as $path => $matches) {
|
||||
$view[] = id(new DiffusionPatternSearchView())
|
||||
->setPath($path)
|
||||
->setMatches($matches)
|
||||
->setPattern($pattern)
|
||||
->setDiffusionRequest($drequest)
|
||||
->render();
|
||||
}
|
||||
|
||||
return $table;
|
||||
return $view;
|
||||
}
|
||||
|
||||
private function loadLintMessages() {
|
||||
|
||||
Reference in New Issue
Block a user