Changeset View
Changeset View
Standalone View
Standalone View
src/view/layout/PhabricatorSourceCodeView.php
<?php | <?php | ||||
final class PhabricatorSourceCodeView extends AphrontView { | final class PhabricatorSourceCodeView extends AphrontView { | ||||
private $lines; | private $lines; | ||||
private $uri; | private $uri; | ||||
private $highlights = array(); | private $highlights = array(); | ||||
private $canClickHighlight = true; | private $canClickHighlight = true; | ||||
private $truncatedFirstBytes = false; | private $truncatedFirstBytes = false; | ||||
private $truncatedFirstLines = false; | private $truncatedFirstLines = false; | ||||
private $symbolMetadata; | private $symbolMetadata; | ||||
private $blameMap; | private $blameMap; | ||||
private $coverage = array(); | |||||
public function setLines(array $lines) { | public function setLines(array $lines) { | ||||
$this->lines = $lines; | $this->lines = $lines; | ||||
return $this; | return $this; | ||||
} | } | ||||
public function setURI(PhutilURI $uri) { | public function setURI(PhutilURI $uri) { | ||||
$this->uri = $uri; | $this->uri = $uri; | ||||
Show All 33 Lines | public function setBlameMap(array $map) { | ||||
$this->blameMap = $map; | $this->blameMap = $map; | ||||
return $this; | return $this; | ||||
} | } | ||||
public function getBlameMap() { | public function getBlameMap() { | ||||
return $this->blameMap; | return $this->blameMap; | ||||
} | } | ||||
public function setCoverage(array $coverage) { | |||||
$this->coverage = $coverage; | |||||
return $this; | |||||
} | |||||
public function getCoverage() { | |||||
return $this->coverage; | |||||
} | |||||
public function render() { | public function render() { | ||||
$blame_map = $this->getBlameMap(); | $blame_map = $this->getBlameMap(); | ||||
$has_blame = ($blame_map !== null); | $has_blame = ($blame_map !== null); | ||||
require_celerity_resource('phabricator-source-code-view-css'); | require_celerity_resource('phabricator-source-code-view-css'); | ||||
require_celerity_resource('syntax-highlighting-css'); | require_celerity_resource('syntax-highlighting-css'); | ||||
if ($this->canClickHighlight) { | if ($this->canClickHighlight) { | ||||
Show All 22 Lines | if ($this->truncatedFirstLines) { | ||||
array( | array( | ||||
'class' => 'c', | 'class' => 'c', | ||||
), | ), | ||||
pht('...'))); | pht('...'))); | ||||
} | } | ||||
$base_uri = (string)$this->uri; | $base_uri = (string)$this->uri; | ||||
$wrote_anchor = false; | $wrote_anchor = false; | ||||
$coverage = $this->getCoverage(); | |||||
$coverage_count = count($coverage); | |||||
$coverage_data = ipull($coverage, 'data'); | |||||
// TODO: Modularize this properly, see T13125. | |||||
$coverage_map = array( | |||||
'C' => 'background: #66bbff;', | |||||
'U' => 'background: #dd8866;', | |||||
'N' => 'background: #ddeeff;', | |||||
'X' => 'background: #aa00aa;', | |||||
); | |||||
foreach ($lines as $line) { | foreach ($lines as $line) { | ||||
$row_attributes = array(); | $row_attributes = array(); | ||||
if (isset($this->highlights[$line_number])) { | if (isset($this->highlights[$line_number])) { | ||||
$row_attributes['class'] = 'phabricator-source-highlight'; | $row_attributes['class'] = 'phabricator-source-highlight'; | ||||
if (!$wrote_anchor) { | if (!$wrote_anchor) { | ||||
$row_attributes['id'] = 'phabricator-line-linker-anchor'; | $row_attributes['id'] = 'phabricator-line-linker-anchor'; | ||||
$wrote_anchor = true; | $wrote_anchor = true; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | foreach ($lines as $line) { | ||||
'data-blame' => $info_blame, | 'data-blame' => $info_blame, | ||||
'data-blame-lines' => $lines, | 'data-blame-lines' => $lines, | ||||
)), | )), | ||||
); | ); | ||||
} else { | } else { | ||||
$blame_cells = null; | $blame_cells = null; | ||||
} | } | ||||
$coverage_cells = array(); | |||||
foreach ($coverage as $coverage_idx => $coverage_spec) { | |||||
if (isset($coverage_spec['data'][$line_number - 1])) { | |||||
$coverage_char = $coverage_spec['data'][$line_number - 1]; | |||||
} else { | |||||
$coverage_char = null; | |||||
} | |||||
$coverage_style = idx($coverage_map, $coverage_char, null); | |||||
$coverage_cells[] = phutil_tag( | |||||
'th', | |||||
array( | |||||
'class' => 'phabricator-source-coverage', | |||||
'style' => $coverage_style, | |||||
'data-coverage' => $coverage_idx.'/'.$coverage_char, | |||||
)); | |||||
} | |||||
$rows[] = phutil_tag( | $rows[] = phutil_tag( | ||||
'tr', | 'tr', | ||||
$row_attributes, | $row_attributes, | ||||
array( | array( | ||||
$blame_cells, | $blame_cells, | ||||
phutil_tag( | phutil_tag( | ||||
'th', | 'th', | ||||
array( | array( | ||||
'class' => 'phabricator-source-line', | 'class' => 'phabricator-source-line', | ||||
), | ), | ||||
$tag_number), | $tag_number), | ||||
phutil_tag( | phutil_tag( | ||||
'td', | 'td', | ||||
array( | array( | ||||
'class' => 'phabricator-source-code', | 'class' => 'phabricator-source-code', | ||||
), | ), | ||||
$line), | $line), | ||||
$coverage_cells, | |||||
)); | )); | ||||
$line_number++; | $line_number++; | ||||
} | } | ||||
$classes = array(); | $classes = array(); | ||||
$classes[] = 'phabricator-source-code-view'; | $classes[] = 'phabricator-source-code-view'; | ||||
$classes[] = 'remarkup-code'; | $classes[] = 'remarkup-code'; | ||||
$classes[] = 'PhabricatorMonospaced'; | $classes[] = 'PhabricatorMonospaced'; | ||||
Show All 25 Lines |