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:
@@ -776,6 +776,7 @@ phutil_register_library_map(array(
|
||||
'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php',
|
||||
'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php',
|
||||
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
||||
'DiffusionPatternSearchView' => 'applications/diffusion/view/DiffusionPatternSearchView.php',
|
||||
'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php',
|
||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php',
|
||||
'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php',
|
||||
@@ -5776,6 +5777,7 @@ phutil_register_library_map(array(
|
||||
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
||||
'DiffusionPathTreeController' => 'DiffusionController',
|
||||
'DiffusionPathValidateController' => 'DiffusionController',
|
||||
'DiffusionPatternSearchView' => 'DiffusionView',
|
||||
'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||
'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||
|
||||
@@ -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() {
|
||||
|
||||
124
src/applications/diffusion/view/DiffusionPatternSearchView.php
Normal file
124
src/applications/diffusion/view/DiffusionPatternSearchView.php
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
final class DiffusionPatternSearchView extends DiffusionView {
|
||||
|
||||
private $path;
|
||||
private $matches;
|
||||
private $pattern;
|
||||
|
||||
public function setPath($path) {
|
||||
$this->path = $path;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setMatches(array $matches) {
|
||||
$this->matches = $matches;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setPattern($pattern) {
|
||||
$this->pattern = $pattern;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$drequest = $this->getDiffusionRequest();
|
||||
$path = $this->path;
|
||||
$pattern = $this->pattern;
|
||||
$rows = array();
|
||||
|
||||
foreach ($this->matches as $result) {
|
||||
list($line, $string) = $result;
|
||||
|
||||
$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);
|
||||
|
||||
$href = $drequest->generateURI(array(
|
||||
'action' => 'browse',
|
||||
'path' => $path,
|
||||
'line' => $line,
|
||||
));
|
||||
|
||||
$rows[] = array(
|
||||
phutil_tag('a', array('href' => $href), $line),
|
||||
$string,
|
||||
);
|
||||
}
|
||||
|
||||
$path_title = Filesystem::readablePath($this->path, $drequest->getPath());
|
||||
|
||||
$href = $drequest->generateURI(array(
|
||||
'action' => 'browse',
|
||||
'path' => $path_title,
|
||||
));
|
||||
|
||||
$title = phutil_tag('a', array('href' => $href), $path_title);
|
||||
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setClassName('remarkup-code')
|
||||
->setHeaders(array(pht('Line'), pht('String')))
|
||||
->setColumnClasses(array('n', 'wide'));
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader($title);
|
||||
|
||||
$box = id(new PHUIObjectBoxView())
|
||||
->setHeader($header)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->setTable($table);
|
||||
|
||||
return $box->render();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user