mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-01 19:22:42 +01:00
Move Paste line range reading code into AphrontRequest
Summary: Ref T13088. This lifts the code for parsing "$x-y" line ranges in URIs into AphrontRequest so Diffusion, Paste, Harbormaster, etc., can share it. Test Plan: Viewed lines, line ranges, no lines, negative line ranges, line ranges with 0, and extremely long line ranges in Paste. Maniphest Tasks: T13088 Differential Revision: https://secure.phabricator.com/D19162
This commit is contained in:
parent
94d340fcff
commit
4466402c5a
2 changed files with 56 additions and 21 deletions
|
@ -49,6 +49,54 @@ final class AphrontRequest extends Phobject {
|
||||||
return idx($this->uriData, $key, $default);
|
return idx($this->uriData, $key, $default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read line range parameter data from the request.
|
||||||
|
*
|
||||||
|
* Applications like Paste, Diffusion, and Harbormaster use "$12-14" in the
|
||||||
|
* URI to allow users to link to particular lines.
|
||||||
|
*
|
||||||
|
* @param string URI data key to pull line range information from.
|
||||||
|
* @param int|null Maximum length of the range.
|
||||||
|
* @return null|pair<int, int> Null, or beginning and end of the range.
|
||||||
|
*/
|
||||||
|
public function getURILineRange($key, $limit) {
|
||||||
|
$range = $this->getURIData($key);
|
||||||
|
if (!strlen($range)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$range = explode('-', $range, 2);
|
||||||
|
|
||||||
|
foreach ($range as $key => $value) {
|
||||||
|
$value = (int)$value;
|
||||||
|
if (!$value) {
|
||||||
|
// If either value is "0", discard the range.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$range[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the range is like "$10", treat it like "$10-10".
|
||||||
|
if (count($range) == 1) {
|
||||||
|
$range[] = head($range);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the range is "$7-5", treat it like "$5-7".
|
||||||
|
if ($range[1] < $range[0]) {
|
||||||
|
$range = array_reverse($range);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user specified something like "$1-999999999" and we have a limit,
|
||||||
|
// clamp it to a more reasonable range.
|
||||||
|
if ($limit !== null) {
|
||||||
|
if ($range[1] - $range[0] > $limit) {
|
||||||
|
$range[1] = $range[0] + $limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $range;
|
||||||
|
}
|
||||||
|
|
||||||
public function setApplicationConfiguration(
|
public function setApplicationConfiguration(
|
||||||
$application_configuration) {
|
$application_configuration) {
|
||||||
$this->applicationConfiguration = $application_configuration;
|
$this->applicationConfiguration = $application_configuration;
|
||||||
|
|
|
@ -2,30 +2,10 @@
|
||||||
|
|
||||||
final class PhabricatorPasteViewController extends PhabricatorPasteController {
|
final class PhabricatorPasteViewController extends PhabricatorPasteController {
|
||||||
|
|
||||||
private $highlightMap;
|
|
||||||
|
|
||||||
public function shouldAllowPublic() {
|
public function shouldAllowPublic() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function willProcessRequest(array $data) {
|
|
||||||
$raw_lines = idx($data, 'lines');
|
|
||||||
$map = array();
|
|
||||||
if ($raw_lines) {
|
|
||||||
$lines = explode('-', $raw_lines);
|
|
||||||
$first = idx($lines, 0, 0);
|
|
||||||
$last = idx($lines, 1);
|
|
||||||
if ($last) {
|
|
||||||
$min = min($first, $last);
|
|
||||||
$max = max($first, $last);
|
|
||||||
$map = array_fuse(range($min, $max));
|
|
||||||
} else {
|
|
||||||
$map[$first] = $first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->highlightMap = $map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
public function handleRequest(AphrontRequest $request) {
|
||||||
$viewer = $request->getViewer();
|
$viewer = $request->getViewer();
|
||||||
$id = $request->getURIData('id');
|
$id = $request->getURIData('id');
|
||||||
|
@ -40,11 +20,18 @@ final class PhabricatorPasteViewController extends PhabricatorPasteController {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$lines = $request->getURILineRange('lines', 1000);
|
||||||
|
if ($lines) {
|
||||||
|
$map = range($lines[0], $lines[1]);
|
||||||
|
} else {
|
||||||
|
$map = array();
|
||||||
|
}
|
||||||
|
|
||||||
$header = $this->buildHeaderView($paste);
|
$header = $this->buildHeaderView($paste);
|
||||||
$curtain = $this->buildCurtain($paste);
|
$curtain = $this->buildCurtain($paste);
|
||||||
|
|
||||||
$subheader = $this->buildSubheaderView($paste);
|
$subheader = $this->buildSubheaderView($paste);
|
||||||
$source_code = $this->buildSourceCodeView($paste, $this->highlightMap);
|
$source_code = $this->buildSourceCodeView($paste, $map);
|
||||||
|
|
||||||
require_celerity_resource('paste-css');
|
require_celerity_resource('paste-css');
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue