X-Git-Url: https://git.cweiske.de/bdrem.git/blobdiff_plain/441c72bbf3d29be5c7f5eb0fd43ac267fe059c2f..90672c8a146c77a194cb774d8088ca4da534defe:/src/bdrem/Renderer/Console.php diff --git a/src/bdrem/Renderer/Console.php b/src/bdrem/Renderer/Console.php index 2cd185f..61fb67e 100644 --- a/src/bdrem/Renderer/Console.php +++ b/src/bdrem/Renderer/Console.php @@ -1,38 +1,140 @@ + * @copyright 2014 Christian Weiske + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3 + * @link http://cweiske.de/bdrem.htm + */ namespace bdrem; -class Renderer_Console +/** + * Render events on the terminal as ASCII table + * + * @category Tools + * @package Bdrem + * @author Christian Weiske + * @copyright 2014 Christian Weiske + * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3 + * @version Release: @package_version@ + * @link http://cweiske.de/bdrem.htm + */ +class Renderer_Console extends Renderer { + /** + * HTTP content type + * @var string + */ + protected $httpContentType = 'text/plain; charset=utf-8'; + + /** + * Use ANSI color codes for output coloring + * + * @var boolean + */ + public $ansi = false; + + /** + * @var \Console_Color2 + */ + protected $cc; + + /** + * Render events as console table + * + * @param array $arEvents Array of events to render + * + * @return string ASCII table + */ public function render($arEvents) { - $s = "Days Age Name Event Date\n"; - $s .= "---- --- ---------------------------------------- -------------------- ----------\n"; + $this->loadConfig(); + if ($this->ansi) { + $this->cc = new \Console_Color2(); + } + + $tbl = new \Console_Table( + CONSOLE_TABLE_ALIGN_LEFT, + array('intersection' => '', 'horizontal' => '-', 'vertical' => ''), + 1, null, $this->ansi + ); + $tbl->setAlign(0, CONSOLE_TABLE_ALIGN_RIGHT); + $tbl->setAlign(1, CONSOLE_TABLE_ALIGN_RIGHT); + + $tbl->setHeaders( + $this->ansiWrap( + array('Days', 'Age', 'Name', 'Event', 'Date', 'Day'), + '%_%9' + ) + ); + $tbl->setBorderVisibility( + array( + 'left' => false, + 'right' => false, + 'top' => true, + 'bottom' => false, + 'inner' => true, + ) + ); + foreach ($arEvents as $event) { - $s .= sprintf( - "%3d %4s %s %s %s\n", - $event->days, - $event->age, - $this->str_pad($event->title, 40), - $this->str_pad($event->type, 20), - $event->date + $colorCode = null; + if ($event->days == 0) { + $colorCode = '%R'; + } + $tbl->addRow( + $this->ansiWrap( + array( + $event->days, + $event->age, + wordwrap($event->title, 30, "\n", true), + wordwrap($event->type, 20, "\n", true), + $this->getLocalDate($event->date), + strftime('%a', strtotime($event->localDate)) + ), + $colorCode + ) ); } - return $s; + return $tbl->getTable(); } - public function str_pad( - $input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT - ) { - $l = mb_strlen($input, 'utf-8'); - if ($l >= $pad_length) { - return $input; + /** + * Wrap each string in an array in an ANSI color code + * + * @param array $data Array of strings + * @param string $colorCode ANSI color code or name + * + * @return array Wrapped data + */ + protected function ansiWrap($data, $colorCode = null) + { + if (!$this->ansi || $colorCode === null) { + return $data; + } + + foreach ($data as $k => &$value) { + $value = $this->cc->convert( + $colorCode . $value . '%n' + ); } + return $data; + } - $p = str_repeat($pad_string, $pad_length - $l); - if ($pad_type == STR_PAD_RIGHT) { - return $input . $p; - } else { - return $p . $input; + /** + * Load configuration values into the class + * + * @return void + */ + protected function loadConfig() + { + if (isset($this->config->ansi)) { + $this->ansi = $this->config->ansi; } } }