Replace some hsprintf() with phutil_tag() and phutil_tag_div() Depends on D7545.

Test Plan: This is one of the rare moments where unit tests for views would be useful.

Reviewers: epriestley

Reviewed By: epriestley

CC: Korvin, epriestley, aran

Differential Revision: https://secure.phabricator.com/D7547
This commit is contained in:
Jakub Vrana
2013-11-09 10:48:19 -08:00
parent 56c65e33ef
commit fd8d9ff0d6
18 changed files with 151 additions and 201 deletions

View File

@@ -42,18 +42,20 @@ class AphrontRedirectResponse extends AphrontResponse {
$error->setSeverity(AphrontErrorView::SEVERITY_NOTICE); $error->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
$error->setTitle('Stopped on Redirect'); $error->setTitle('Stopped on Redirect');
$error->appendChild(phutil_tag('p', array(), pht(
'You were stopped here because %s is set in your configuration.',
phutil_tag('tt', array(), 'debug.stop-on-redirect'))));
$link = phutil_tag( $link = phutil_tag(
'a', 'a',
array( array(
'href' => $this->getURI(), 'href' => $this->getURI(),
), ),
'Continue to: '.$this->getURI()); $this->getURI());
$error->appendChild(hsprintf( $error->appendChild(phutil_tag('p', array(), pht(
'<p>You were stopped here because <tt>debug.stop-on-redirect</tt> '. 'Continue to: %s',
'is set in your configuration.</p>'. $link)));
'<p>%s</p>',
$link));
$view->appendChild($error); $view->appendChild($error);

View File

@@ -196,10 +196,11 @@ final class CelerityStaticResourceResponse {
if (strpos($data, '<!') !== false) { if (strpos($data, '<!') !== false) {
throw new Exception('Literal <! is not allowed inside inline script.'); throw new Exception('Literal <! is not allowed inside inline script.');
} }
return hsprintf(
// We don't use <![CDATA[ ]]> because it is ignored by HTML parsers. We // We don't use <![CDATA[ ]]> because it is ignored by HTML parsers. We
// would need to send the document with XHTML content type. // would need to send the document with XHTML content type.
'<script type="text/javascript">%s</script>', return phutil_tag(
'script',
array('type' => 'text/javascript'),
phutil_safe_html($data)); phutil_safe_html($data));
} }

View File

@@ -71,7 +71,8 @@ abstract class PhabricatorInlineCommentController
$dialog->setTitle('Really delete this comment?'); $dialog->setTitle('Really delete this comment?');
$dialog->addHiddenInput('id', $this->getCommentID()); $dialog->addHiddenInput('id', $this->getCommentID());
$dialog->addHiddenInput('op', 'delete'); $dialog->addHiddenInput('op', 'delete');
$dialog->appendChild(hsprintf('<p>Delete this inline comment?</p>')); $dialog->appendChild(
phutil_tag('p', array(), pht('Delete this inline comment?')));
$dialog->addCancelButton('#'); $dialog->addCancelButton('#');
$dialog->addSubmitButton('Delete'); $dialog->addSubmitButton('Delete');

View File

@@ -19,12 +19,7 @@ final class PhabricatorInlineSummaryView extends AphrontView {
} }
private function renderHeader() { private function renderHeader() {
return phutil_tag( return phutil_tag_div('phabricator-inline-summary', pht('Inline Comments'));
'div',
array(
'class' => 'phabricator-inline-summary',
),
'Inline Comments');
} }
private function renderTable() { private function renderTable() {
@@ -39,7 +34,10 @@ final class PhabricatorInlineSummaryView extends AphrontView {
} }
} }
$rows[] = hsprintf('<tr><th colspan="3">%s</th></tr>', $group); $rows[] = phutil_tag(
'tr',
array(),
phutil_tag('th', array('colspan' => 3), $group));
foreach ($items as $item) { foreach ($items as $item) {
@@ -80,15 +78,13 @@ final class PhabricatorInlineSummaryView extends AphrontView {
$where = idx($item, 'where'); $where = idx($item, 'where');
$colspan = ($has_where ? null : 2); $colspan = ($has_where ? null : 2);
$rows[] = hsprintf( $rows[] = phutil_tag(
'<tr>'. 'tr',
'<td class="inline-line-number">%s</td>'. array(),
'%s'. array(
'%s'. phutil_tag('td', array('class' => 'inline-line-number'), $lines),
'</tr>',
$lines,
($has_where ($has_where
? hsprintf('<td class="inline-which-diff">%s</td>', $where) ? phutil_tag('td', array('class' => 'inline-which-diff'), $where)
: null), : null),
phutil_tag( phutil_tag(
'td', 'td',
@@ -96,9 +92,7 @@ final class PhabricatorInlineSummaryView extends AphrontView {
'class' => 'inline-summary-content', 'class' => 'inline-summary-content',
'colspan' => $colspan, 'colspan' => $colspan,
), ),
hsprintf( phutil_tag_div('phabricator-remarkup', $item['content']))));
'<div class="phabricator-remarkup">%s</div>',
$item['content'])));
} }
} }

View File

@@ -30,8 +30,8 @@ final class PhabricatorRemarkupRuleYoutube
} }
$youtube_src = 'https://www.youtube.com/embed/'.$v; $youtube_src = 'https://www.youtube.com/embed/'.$v;
$iframe = hsprintf( $iframe = phutil_tag_div(
'<div class="embedded-youtube-video">%s</div>', 'embedded-youtube-video',
phutil_tag( phutil_tag(
'iframe', 'iframe',
array( array(

View File

@@ -272,10 +272,13 @@ final class AphrontTableView extends AphrontView {
} }
} else { } else {
$colspan = max(count(array_filter($visibility)), 1); $colspan = max(count(array_filter($visibility)), 1);
$table[] = hsprintf( $table[] = phutil_tag(
'<tr class="no-data"><td colspan="%s">%s</td></tr>', 'tr',
$colspan, array('class' => 'no-data'),
coalesce($this->noDataString, pht('No data available.'))); phutil_tag(
'td',
array('colspan' => $colspan),
coalesce($this->noDataString, pht('No data available.'))));
} }
$table_class = 'aphront-table-view'; $table_class = 'aphront-table-view';
@@ -287,7 +290,7 @@ final class AphrontTableView extends AphrontView {
} }
$html = phutil_tag('table', array('class' => $table_class), $table); $html = phutil_tag('table', array('class' => $table_class), $table);
return hsprintf('<div class="aphront-table-wrap">%s</div>', $html); return phutil_tag_div('aphront-table-wrap', $html);
} }
public static function renderSingleDisplayLine($line) { public static function renderSingleDisplayLine($line) {

View File

@@ -117,22 +117,19 @@ final class PhabricatorObjectSelectorDialog {
'action' => $this->submitURI, 'action' => $this->submitURI,
'id' => $search_id, 'id' => $search_id,
), ),
hsprintf(
'<table class="phabricator-object-selector-search">
<tr>
<td class="phabricator-object-selector-search-filter">%s</td>
<td class="phabricator-object-selector-search-text">%s</td>
</tr>
</table>',
phutil_tag( phutil_tag(
'select', 'table',
array('id' => $filter_id), array('class' => 'phabricator-object-selector-search'),
$options), phutil_tag('tr', array(), array(
phutil_tag( phutil_tag(
'input', 'td',
array( array('class' => 'phabricator-object-selector-search-filter'),
'id' => $query_id, phutil_tag('select', array('id' => $filter_id), $options)),
'type' => 'text')))); phutil_tag(
'td',
array('class' => 'phabricator-object-selector-search-text'),
phutil_tag('input', array('id' => $query_id, 'type' => 'text'))),
))));
$result_box = phutil_tag( $result_box = phutil_tag(
'div', 'div',
@@ -142,17 +139,15 @@ final class PhabricatorObjectSelectorDialog {
), ),
''); '');
$attached_box = hsprintf( $attached_box = phutil_tag_div(
'<div class="phabricator-object-selector-current">'. 'phabricator-object-selector-current',
'<div class="phabricator-object-selector-currently-attached">'. phutil_tag_div(
'<div class="phabricator-object-selector-header">%s</div>'. 'phabricator-object-selector-currently-attached',
'<div id="%s"></div>'. array(
'%s'. phutil_tag_div('phabricator-object-selector-header', $this->header),
'</div>'. phutil_tag('div', array('id' => $current_id)),
'</div>', $instructions,
$this->header, )));
$current_id,
$instructions);
$dialog = new AphrontDialogView(); $dialog = new AphrontDialogView();
$dialog $dialog

View File

@@ -38,10 +38,10 @@ final class AphrontFormCheckboxControl extends AphrontFormControl {
'for' => $id, 'for' => $id,
), ),
$box['label']); $box['label']);
$rows[] = hsprintf( $rows[] = phutil_tag('tr', array(), array(
'<tr><td>%s</td><th>%s</th></tr>', phutil_tag('td', array(), $checkbox),
$checkbox, phutil_tag('th', array(), $label)
$label); ));
} }
return phutil_tag( return phutil_tag(
'table', 'table',

View File

@@ -51,15 +51,15 @@ final class AphrontFormRadioButtonControl extends AphrontFormControl {
$button['label']); $button['label']);
if ($button['caption']) { if ($button['caption']) {
$label = hsprintf( $label = array(
'%s<div class="aphront-form-radio-caption">%s</div>',
$label, $label,
$button['caption']); phutil_tag_div('aphront-form-radio-caption', $button['caption']),
);
} }
$rows[] = hsprintf( $rows[] = phutil_tag('tr', array(), array(
'<tr><td>%s</td><th>%s</th></tr>', phutil_tag('td', array(), $radio),
$radio, phutil_tag('th', array(), $label),
$label); ));
} }
return phutil_tag( return phutil_tag(

View File

@@ -15,16 +15,15 @@ final class AphrontContextBarView extends AphrontView {
require_celerity_resource('aphront-contextbar-view-css'); require_celerity_resource('aphront-contextbar-view-css');
return hsprintf( return phutil_tag_div(
'<div class="aphront-contextbar-view">'. 'aphront-contextbar-view',
'<div class="aphront-contextbar-core">'. array(
'<div class="aphront-contextbar-buttons">%s</div>'. phutil_tag_div('aphront-contextbar-core', array(
'<div class="aphront-contextbar-content">%s</div>'. phutil_tag_div('aphront-contextbar-buttons', $view->render()),
'</div>'. phutil_tag_div('aphront-contextbar-content', $this->renderChildren()),
'<div style="clear: both;"></div>'. )),
'</div>', phutil_tag('div', array('style' => 'clear: both;')),
$view->render(), ));
$this->renderChildren());
} }
} }

View File

@@ -69,25 +69,20 @@ final class AphrontPanelView extends AphrontView {
} }
if ($this->caption !== null) { if ($this->caption !== null) {
$caption = phutil_tag( $caption = phutil_tag_div('aphront-panel-view-caption', $this->caption);
'div',
array('class' => 'aphront-panel-view-caption'),
$this->caption);
} else { } else {
$caption = null; $caption = null;
} }
$buttons = null; $buttons = null;
if ($this->buttons) { if ($this->buttons) {
$buttons = hsprintf( $buttons = phutil_tag_div(
'<div class="aphront-panel-view-buttons">%s</div>', 'aphront-panel-view-buttons',
phutil_implode_html(" ", $this->buttons)); phutil_implode_html(" ", $this->buttons));
} }
$header_elements = hsprintf( $header_elements = phutil_tag_div(
'<div class="aphront-panel-header">%s%s%s</div>', 'aphront-panel-header',
$buttons, array($buttons, $header, $caption));
$header,
$caption);
$table = phutil_implode_html('', $this->renderChildren()); $table = phutil_implode_html('', $this->renderChildren());

View File

@@ -116,11 +116,8 @@ final class PhabricatorSourceCodeView extends AphrontView {
$classes[] = 'remarkup-code'; $classes[] = 'remarkup-code';
$classes[] = 'PhabricatorMonospaced'; $classes[] = 'PhabricatorMonospaced';
return phutil_tag( return phutil_tag_div(
'div', 'phabricator-source-code-container',
array(
'class' => 'phabricator-source-code-container',
),
javelin_tag( javelin_tag(
'table', 'table',
array( array(

View File

@@ -62,6 +62,10 @@ final class PhabricatorTransactionView extends AphrontView {
$transaction_id = $this->anchorName ? 'anchor-'.$this->anchorName : null; $transaction_id = $this->anchorName ? 'anchor-'.$this->anchorName : null;
$header = phutil_tag_div(
'phabricator-transaction-header',
array($info, $actions));
return phutil_tag( return phutil_tag(
'div', 'div',
array( array(
@@ -69,15 +73,9 @@ final class PhabricatorTransactionView extends AphrontView {
'id' => $transaction_id, 'id' => $transaction_id,
'style' => $style, 'style' => $style,
), ),
hsprintf( phutil_tag_div(
'<div class="phabricator-transaction-detail %s">'. 'phabricator-transaction-detail '.$classes,
'<div class="phabricator-transaction-header">%s%s</div>'. array($header, $content)));
'%s'.
'</div>',
$classes,
$info,
$actions,
$content));
} }
@@ -118,8 +116,9 @@ final class PhabricatorTransactionView extends AphrontView {
$info = phutil_implode_html(" \xC2\xB7 ", $info); $info = phutil_implode_html(" \xC2\xB7 ", $info);
return hsprintf( return phutil_tag(
'<span class="phabricator-transaction-info">%s</span>', 'span',
array('class' => 'phabricator-transaction-info'),
$info); $info);
} }
@@ -139,9 +138,8 @@ final class PhabricatorTransactionView extends AphrontView {
if (!$this->hasChildren()) { if (!$this->hasChildren()) {
return null; return null;
} }
return phutil_tag( return phutil_tag_div(
'div', 'phabricator-transaction-content',
array('class' => 'phabricator-transaction-content'),
$this->renderChildren()); $this->renderChildren());
} }

View File

@@ -13,15 +13,15 @@ final class AphrontRequestFailureView extends AphrontView {
final public function render() { final public function render() {
require_celerity_resource('aphront-request-failure-view-css'); require_celerity_resource('aphront-request-failure-view-css');
return hsprintf( $head = phutil_tag_div(
'<div class="aphront-request-failure-view">'. 'aphront-request-failure-head',
'<div class="aphront-request-failure-head">'. phutil_tag('h1', array(), $this->header));
'<h1>%s</h1>'.
'</div>'. $body = phutil_tag_div(
'<div class="aphront-request-failure-body">%s</div>'. 'aphront-request-failure-body',
'</div>',
$this->header,
$this->renderChildren()); $this->renderChildren());
return phutil_tag_div('aphront-request-failure-view', array($head, $body));
} }
} }

View File

@@ -298,11 +298,8 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
$developer_warning = null; $developer_warning = null;
if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') && if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') &&
DarkConsoleErrorLogPluginAPI::getErrors()) { DarkConsoleErrorLogPluginAPI::getErrors()) {
$developer_warning = phutil_tag( $developer_warning = phutil_tag_div(
'div', 'aphront-developer-error-callout',
array(
'class' => 'aphront-developer-error-callout',
),
pht( pht(
'This page raised PHP errors. Find them in DarkConsole '. 'This page raised PHP errors. Find them in DarkConsole '.
'or the error log.')); 'or the error log.'));
@@ -313,11 +310,8 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
if ($user && $user->getIsAdmin()) { if ($user && $user->getIsAdmin()) {
$open = PhabricatorSetupCheck::getOpenSetupIssueCount(); $open = PhabricatorSetupCheck::getOpenSetupIssueCount();
if ($open) { if ($open) {
$setup_warning = phutil_tag( $setup_warning = phutil_tag_div(
'div', 'setup-warning-callout',
array(
'class' => 'setup-warning-callout',
),
phutil_tag( phutil_tag(
'a', 'a',
array( array(
@@ -334,16 +328,16 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
'id' => 'base-page', 'id' => 'base-page',
'class' => 'phabricator-standard-page', 'class' => 'phabricator-standard-page',
), ),
hsprintf( array(
'%s%s%s'.
'<div class="phabricator-standard-page-body">'.
'%s%s<div style="clear: both;"></div>'.
'</div>',
$developer_warning, $developer_warning,
$setup_warning, $setup_warning,
$header_chrome, $header_chrome,
phutil_tag_div('phabricator-standard-page-body', array(
($console ? hsprintf('<darkconsole />') : null), ($console ? hsprintf('<darkconsole />') : null),
parent::getBody())); parent::getBody(),
phutil_tag('div', array('style' => 'clear: both;')),
)),
));
} }
protected function getTail() { protected function getTail() {

View File

@@ -66,13 +66,12 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
'action' => '/search/', 'action' => '/search/',
'method' => 'POST', 'method' => 'POST',
), ),
hsprintf( phutil_tag_div('phabricator-main-menu-search-container', array(
'<div class="phabricator-main-menu-search-container">'.
'%s<button>Search</button>%s%s'.
'</div>',
$input, $input,
phutil_tag('button', array(), pht('Search')),
$scope_input, $scope_input,
$target)); $target,
)));
return $form; return $form;
} }

View File

@@ -38,18 +38,15 @@ final class AphrontProgressBarView extends AphrontBarView {
$color = $this->getColor(); $color = $this->getColor();
return phutil_tag( return phutil_tag_div(
'div', "aphront-bar progress color-{$color}",
array(
'class' => "aphront-bar progress color-{$color}",
),
array( array(
phutil_tag( phutil_tag(
'div', 'div',
array('title' => $this->alt), array('title' => $this->alt),
phutil_tag( phutil_tag(
'div', 'div',
array('style' => hsprintf("width: %dpx;", $width)), array('style' => "width: {$width}px;"),
'')), '')),
phutil_tag( phutil_tag(
'span', 'span',

View File

@@ -92,22 +92,15 @@ final class PhabricatorHovercardView extends AphrontView {
$body_title = $handle->getFullName(); $body_title = $handle->getFullName();
} }
$body[] = phutil_tag( $body[] = phutil_tag_div('phabricator-hovercard-body-header', $body_title);
'div',
array(
'class' => 'phabricator-hovercard-body-header'
),
$body_title);
foreach ($this->fields as $field) { foreach ($this->fields as $field) {
$item = hsprintf('<strong>%s:</strong> <span>%s</span>', $item = array(
$field['label'], $field['value']); phutil_tag('strong', array(), $field['label']),
$body[] = phutil_tag( ' ',
'div', phutil_tag('span', array(), $field['value']),
array( );
'class' => 'phabricator-hovercard-body-item' $body[] = phutil_tag_div('phabricator-hovercard-body-item', $item);
),
$item);
} }
if ($handle->getImageURI()) { if ($handle->getImageURI()) {
@@ -147,40 +140,22 @@ final class PhabricatorHovercardView extends AphrontView {
$tail = null; $tail = null;
if ($buttons) { if ($buttons) {
$tail = phutil_tag('div', $tail = phutil_tag_div('phabricator-hovercard-tail', $buttons);
array('class' => 'phabricator-hovercard-tail'),
$buttons);
} }
// Assemble container // Assemble container
// TODO: Add color support // TODO: Add color support
$content = hsprintf( $hovercard = phutil_tag_div(
'%s%s%s', 'phabricator-hovercard-container',
phutil_tag('div',
array( array(
'class' => 'phabricator-hovercard-head' phutil_tag_div('phabricator-hovercard-head', $header),
), phutil_tag_div('phabricator-hovercard-body', $body),
$header), $tail,
phutil_tag('div', ));
array(
'class' => 'phabricator-hovercard-body'
),
$body),
$tail);
$hovercard = phutil_tag("div",
array(
"class" => "phabricator-hovercard-container",
),
$content);
// Wrap for thick border // Wrap for thick border
// and later the tip at the bottom // and later the tip at the bottom
return phutil_tag('div', return phutil_tag_div('phabricator-hovercard-wrapper', $hovercard);
array(
'class' => 'phabricator-hovercard-wrapper',
),
$hovercard);
} }
} }