mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-22 05:20:56 +01:00
Don't syntax highlight codebase pattern search results
Summary: Ref T5644. Ref T7472. Currently, we highlight each line of pattern search results in Diffusion. - This is incredibly slow for non-PHP languages which need to shell out to Pygments. - A lot of this highlighting isn't very useful anyway, because it doesn't have any context. Instead, try to highlight pattern matches but don't highlight the source itself. Test Plan: {F349637} Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7472, T5644 Differential Revision: https://secure.phabricator.com/D12141
This commit is contained in:
parent
21826ed7b3
commit
0efae2858e
2 changed files with 61 additions and 26 deletions
|
@ -88,7 +88,7 @@ final class DiffusionBrowseSearchController extends DiffusionBrowseController {
|
|||
$results = $pager->sliceResults($results);
|
||||
|
||||
if ($search_mode == 'grep') {
|
||||
$table = $this->renderGrepResults($results);
|
||||
$table = $this->renderGrepResults($results, $query_string);
|
||||
$header = pht(
|
||||
'File content matching "%s" under "%s"',
|
||||
$query_string,
|
||||
|
@ -112,28 +112,10 @@ final class DiffusionBrowseSearchController extends DiffusionBrowseController {
|
|||
return array($box, $pager_box);
|
||||
}
|
||||
|
||||
private function renderGrepResults(array $results) {
|
||||
private function renderGrepResults(array $results, $pattern) {
|
||||
$drequest = $this->getDiffusionRequest();
|
||||
|
||||
require_celerity_resource('syntax-highlighting-css');
|
||||
|
||||
// NOTE: This can be wrong because we may find the string inside the
|
||||
// comment. But it's correct in most cases and highlighting the whole file
|
||||
// would be too expensive.
|
||||
$futures = array();
|
||||
$engine = PhabricatorSyntaxHighlighter::newEngine();
|
||||
foreach ($results as $result) {
|
||||
list($path, $line, $string) = $result;
|
||||
$futures["{$path}:{$line}"] = $engine->getHighlightFuture(
|
||||
$engine->getLanguageFromFilename($path),
|
||||
ltrim($string));
|
||||
}
|
||||
|
||||
try {
|
||||
id(new FutureIterator($futures))
|
||||
->limit(8)
|
||||
->resolveAll();
|
||||
} catch (PhutilSyntaxHighlighterException $ex) {}
|
||||
require_celerity_resource('phabricator-search-results-css');
|
||||
|
||||
$rows = array();
|
||||
foreach ($results as $result) {
|
||||
|
@ -145,14 +127,57 @@ final class DiffusionBrowseSearchController extends DiffusionBrowseController {
|
|||
'line' => $line,
|
||||
));
|
||||
|
||||
try {
|
||||
$string = $futures["{$path}:{$line}"]->resolve();
|
||||
} catch (PhutilSyntaxHighlighterException $ex) {}
|
||||
$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'),
|
||||
$string);
|
||||
array('class' => 'PhabricatorMonospaced phui-source-fragment'),
|
||||
$output);
|
||||
|
||||
$path = Filesystem::readablePath($path, $drequest->getPath());
|
||||
|
||||
|
|
|
@ -8,3 +8,13 @@
|
|||
padding: 0 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.phui-source-fragment {
|
||||
color: {$darkgreytext};
|
||||
}
|
||||
|
||||
.phui-source-fragment strong {
|
||||
background-color: {$lightyellow};
|
||||
font-weight: normal;
|
||||
color: #000000;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue