Changeset View
Changeset View
Standalone View
Standalone View
src/console/view/PhutilConsoleView.php
- This file was added.
<?php | |||||
abstract class PhutilConsoleView extends Phobject { | |||||
private $console; | |||||
abstract protected function drawView(); | |||||
final public function setConsole(PhutilConsole $console) { | |||||
$this->console = $console; | |||||
return $this; | |||||
} | |||||
final public function getConsole() { | |||||
if ($this->console) { | |||||
return $this->console; | |||||
} | |||||
return PhutilConsole::getConsole(); | |||||
} | |||||
/** | |||||
* Draw a view to the console. | |||||
* | |||||
* @return this | |||||
* @task draw | |||||
*/ | |||||
final public function draw() { | |||||
$string = $this->drawConsoleString(); | |||||
$console = $this->getConsole(); | |||||
$console->writeOut('%s', $string); | |||||
return $this; | |||||
} | |||||
/** | |||||
* Draw a view to a string and return it. | |||||
* | |||||
* @return string Console-printable string. | |||||
* @task draw | |||||
*/ | |||||
final public function drawConsoleString() { | |||||
$view = $this->drawView(); | |||||
$parts = $this->reduceView($view); | |||||
$out = array(); | |||||
foreach ($parts as $part) { | |||||
$out[] = PhutilTerminalString::escapeStringValue($part, true); | |||||
} | |||||
return implode('', $out); | |||||
} | |||||
/** | |||||
* Reduce a view to a list of simple, unnested parts. | |||||
* | |||||
* @param wild Any drawable view. | |||||
* @return list<wild> List of unnested drawables. | |||||
* @task draw | |||||
*/ | |||||
private function reduceView($view) { | |||||
if ($view instanceof PhutilConsoleView) { | |||||
$view = $view->drawView(); | |||||
return $this->reduceView($view); | |||||
} | |||||
if (is_array($view)) { | |||||
$parts = array(); | |||||
foreach ($view as $item) { | |||||
foreach ($this->reduceView($item) as $part) { | |||||
$parts[] = $part; | |||||
} | |||||
} | |||||
return $parts; | |||||
} | |||||
return array($view); | |||||
} | |||||
/* -( Drawing Utilities )-------------------------------------------------- */ | |||||
/** | |||||
* @param list<wild> List of views, one per line. | |||||
* @return wild Each view rendered on a separate line. | |||||
*/ | |||||
final protected function drawLines(array $parts) { | |||||
$result = array(); | |||||
foreach ($parts as $part) { | |||||
if ($part !== null) { | |||||
$result[] = $part; | |||||
$result[] = "\n"; | |||||
} | |||||
} | |||||
return $result; | |||||
} | |||||
final protected function implode($separator, array $items) { | |||||
$result = array(); | |||||
foreach ($items as $item) { | |||||
$result[] = $item; | |||||
$result[] = $separator; | |||||
} | |||||
array_pop($result); | |||||
return $result; | |||||
} | |||||
} |