Text4Shell
Publicado por EVERTON DA ROSA (última atualização em 17/08/2012)
[ Hits: 4.269 ]
Homepage: http://everton3x.github.io
Download PHP4Console (Text4Shell) v1.1.zip (versão 2)
Text4Shell é uma classe para exibição de texto em um shell, prompt de comando. Ela foi escrita para utilização principalmente com o php-cli (PHP Command Line Interface). Text4Shell possui três métodos principais:
* Text4Shell::paragraf(): Quebra uma string de texto para ser exibida na tela.
* Text4Shell::box(): Monta uma string de texto para ser exibida dentro de um Box (caixa), com título ou não.
* Text4Shell::table(): Monta um array com dados (texto) para ser exibido em uma tabela, com título ou não.
Para ver a classe funcionando, execute php.exe -f teste.php ou execute teste.bat (atente para a linha 4 que executa o arquivo teste.php).
O arquivo da classe text4shell.class.php está todo documentado no formato Phpdocumentor e o arquivo teste.php tem instruções de como utilizar Text4Shell::table().
Versão 2 - Enviado por EVERTON DA ROSA em 16/08/2012
Changelog: CHANGELOG
VERSION 1.1
* Adicionado arquivo CHANGELOG
* Adicionada documentação via PhpDocumentor2
* Adicionado parâmetro $align no método box()
* Método paragraph() corrigido para trabalhar com parâmetro $align
* Método write() atualizado para trabalhar com $align
* Nome da classe alterado para Php4Console.
* Alteração dos nomes de métodos de underline_splited para CammelCase. Arquivo principal da classe renomeado para php4console.class.php. Arquivo text4shell.class.php mantido com nomes de classe e métodos antigos para compatibilidade.
* Inclusão dos métodos openLoadLine(), closeLoadLine(), openLoadStepLine(), closeLoadStepLine(), closeLoadGroupLine(), initProgressBar() e runProgressBar().
* Inclusão do método prompt().
* Criada interface de exemplos.
VERSION 1.0
* $cols
* __construct()
* set_cols()
* get_cols
* paragraph()
* write()
* box()
* table()
* get_align()
* tblline()
* hline()
Download PHP4Console (Text4Shell) v1.1.zip
<?php
/**
* text4shell.class.php
* Arquivo da classe Text4Shell
*/
/**
* Classe para exibição de texto em ambiente Shell (modo texto)
* @author Everton da Rosa everton3x@gmail.com
* @version 1.0
* @license GPL
* @package Text4Shell
*/
class Text4Shell {
protected $cols;//{@var} int $cols Número de colunas do Shell
/**
* Construtor da classe
* @method __construct(int $cols) Cosntrutor da classe
* @param int $cols Número de colunas do Shell. O valor informado aqui ficará armazenado em Text4Shell::cols.
* @return object Text4Shell Retorna um objeto que representa a classe
*/
public function __construct($cols) {
$this->set_cols($cols);
return $this;
}
/**
* Setter do número de colunas
* @method set_cols(int $cols) Define o número de colunas que a classe utilizará para criação das telas
* @param int $cols Número de colunas
* @return boolean Retorna TRUE em caso de sucesso ou FALSE em caso de falha.
*/
public function set_cols($cols){
if(!is_int($cols) || $cols <= 0){
trigger_error("Número de colunas inválido!\n", E_USER_ERROR);
return false;
}else{
$this->cols = $cols;
return true;
}
}
/**
* Getter do número de colunas
* @method get_cols() Retorna o número de colunas armazenado em Text4shell::cols
* @return int Retorna o número de colunas.
*/
public function get_cols(){
return $this->cols;
}
/**
* Prepara o texto para a exibição
* @method paragraph(string $text, int $cols) Quebra o texto em linhas com o tamanho máximo do número de colunas especificado em $cols.
* @param string $text O texto a ser exibido
* @param int $cols Número de colunas de quada linha
* @return boolean|array Retorna FALSE em caso de falha ou um array contendo as linhas do texto.
*/
protected function paragraph($text, $cols = 0, $align = 'left'){
if($cols == 0){
$cols = $this->get_cols();
}
if(!is_string($text)){
trigger_error("Texto inválido!\n", E_USER_ERROR);
return false;
}else{
return str_split($text, $cols);
}
}
/**
* Quebra um texto em linhas.
* @method write(string $text) Quebra um texto em linhas de acordo com o número de colunas em Text4Shell::cols.
* @param string $text O texto a ser escrito.
* @return string Texto quebrado em linhas.
*/
public function write($text){
$str = '';
foreach($this->paragraph($text) as $lines){
$str .= "$lines".PHP_EOL;
}
return $str;
}
/**
* Quebra um texto em linhas e coloca dentro de um Box.
* @method box(string $box, string $title) Quebra um texto em linhas de acordo com o número de colunas em Text4Shell::cols e coloca dentro de um Box.
* @param string $text O texto a ser exibido
* @param string $title [Opcional] Se definido, exibe um título para a caixa.
* @return string O Box com o texto quebrado em linhas;
*/
public function box($text, $title = ''){
$box = '';
$cols = $this->cols - 4;
if(strlen($title) > 0){
$box .= $this->hline();
$title = str_pad($title, $cols, ' ', STR_PAD_BOTH );
$box .= "| $title |".PHP_EOL;
}
$box .= $this->hline();
$lines = $this->paragraph($text, $cols);
foreach($lines as $ln){
if(strlen($ln) < $cols){
$ln = str_pad($ln, $cols, ' ');
}
$box .= "| $ln |".PHP_EOL;
}
$box .= $this->hline();
return $box;
}
/**
* Cria uma linha divisória horizontal.
* @method hline() Método auxiliar que cria uma linha divisória horizontal.
* @return string Retorna a linha criada.
*/
protected function hline(){
$line = '';
$pad_length = $this->get_cols() - 2;
$line .= '+';
$line .= str_pad('-', $pad_length, '-');
$line .= '+'.PHP_EOL;
return $line;
}
/**
* Cria uma linha divisória horizontal para tabelas.
* @method tblline() Método auxiliar que cria uma linha divisória horizontal para tabela.
* @param array $colmodel O modelo de coluna da tabela.
* @return string Retorna a linha criada.
*/
protected function tblline($colmodel){
$line = '';
foreach($colmodel as $col){
$len = $col['len'];
if($len <= 0){
trigger_error('Falha no modelo de coluna', E_USER_ERROR);
return false;
}else{
$pad_length = $len;
$line .= str_pad('+', $pad_length, '-');
}
}
$minus = $this->get_cols() - 1;
$line = substr($line, 0, $minus);
$line .= '+'.PHP_EOL;
return $line;
}
/**
* Cria uma tabela com os dados recebidos.
* @method table(array $data, array $colmodel, string $title) Cria uma tabela os dados contidos em $data. $data precisa estar no formato:
* $data = array(
* 0 => array('coluna1' => 'valor1', 'coluna2' => 'valor2')
* ,1 => array('coluna1' => 'valor1', 'coluna2' => 'valor2')
* ,2 => array('coluna1' => 'valor1', 'coluna2' => 'valor2')
* );
* @param array $data Um array multidimensional com os dados de linhas e colunas par exibir.
* @param array $colmodel Um array especificando os rótulos das colunas, a largura de cada coluna e o alinhamento de cada coluna. Observe que a soma das larguras das colunas deve ser igual ao valor de Text4Shell::cols. Se um rótulo não for especificado, o id da coluna será utilizado. Os alinhamentos válidos são LEFT, RIGHT e CENTER (em maiúsculas ou minúsculas). Se nenhum for especificado, LEFT é adotado. O array segue a estrutura: array( 'campo1' => array('label' => 'Rótulo', 'len' => 10, 'align' => 'LEFT'), 'campo2' => array([...]), [...])
* @param string $title [Opcional] Se definido, mostra o texto com título da tabela.
* @return string Retorna a tabela criada.
*/
public function table($data, $colmodel, $title = ''){
if(count($data) == 0){
trigger_error('Dados para tabela inválidos!\n', E_USER_ERROR);
return false;
}
if(count($colmodel) == 0){
trigger_error('Modelo de coluna da tabela inválido!\n', E_USER_ERROR);
return false;
}
//configurando colmodel
foreach($data[0] as $k => $v){
if(!isset($colmodel[$k]['label'])){
$colmodel[$k]['label'] = $k;
}
if(!isset($colmodel[$k]['align'])){
$colmodel[$k]['align'] = 'left';
}
}
unset($k, $v);
$table = '';
//título
if(strlen($title) >0){
$cols = $this->cols - 4;
if(strlen($title) > 0){
$table .= $this->hline();
$title = str_pad($title, $cols, ' ', STR_PAD_BOTH );
$table .= "| $title |".PHP_EOL;
}
}
//cabeçalho
$table .= $this->tblline($colmodel);
foreach($colmodel as $cmk => $cm){
$len = $cm['len'] - 2;
$id = $cmk;
$labels[$id] = $this->paragraph($cm['label'], $len);
}
unset($cm, $len, $id);
$maxsize = 0;
foreach($labels as $label){
$size = count($label);
if($maxsize < $size){
$maxsize = $size;
}
}
unset($label);
$last = count($labels) - 1;
$j = 0;
$rows = array();
for($i = 0; $i < $maxsize; $i++){
@$rows[$i] .= "|";
}
foreach($labels as $id => $arr){
if(count($arr) <= $maxsize){
$arr = array_pad($arr, $maxsize, ' ');
}
if($j == $last){
$len = $colmodel[$id]['len'] -2;
}else{
$len = $colmodel[$id]['len'] -1;
}
$j++;
for($i = 0; $i < $maxsize; $i++){
if(!isset($colmodel[$id]['align'])){
$align = 'center';
}else{
$align = $colmodel[$id]['align'];
}
$align = $this->get_align($align);
$label = str_pad($arr[$i], $len, ' ', $align);
$rows[$i] .= "$label|";
}
}
foreach($rows as $line){
$table .= "$line\n";
}
$table .= $this->tblline($colmodel);
//corpo com os dados
$lens = array();
foreach($colmodel as $k => $v){
$lens[$k] = $v['len'] - 2;
}
$tmp = array();
foreach($data as $id => $line){
foreach($line as $fldname => $fldvalue){
$tmp[$id][$fldname] = $this->paragraph($fldvalue, $lens[$fldname]);
}
}
$data = $tmp;
unset($tmp);
foreach($data as $line){
$maxsize = 0;
foreach($line as $row){
if($maxsize < count($row)){
$maxsize = count($row);
}
}
unset($row);
$last = count($line) - 1;
$j = 0;
$rows = array();
for($i = 0; $i < $maxsize; $i++){
@$rows[$i] .= "|";
}
foreach($line as $id => $arr){
if(count($arr) <= $maxsize){
$arr = array_pad($arr, $maxsize, ' ');
}
if($j == $last){
$len = $colmodel[$id]['len'] -2;
}else{
$len = $colmodel[$id]['len'] -1;
}
$j++;
for($i = 0; $i < $maxsize; $i++){
if(!isset($colmodel[$id]['align'])){
$align = 'center';
}else{
$align = $colmodel[$id]['align'];
}
$align = $this->get_align($align);
$label = str_pad($arr[$i], $len, ' ', $align);
$rows[$i] .= "$label|";
}
}
foreach($rows as $line){
$table .= "$line\n";
}
$table .= $this->tblline($colmodel);
}
return $table;
}
/**
* Retorna a constante para alinhamento.
* @method get_align(string $align) Retorna o valor da constante de alinhamento para ser utilizada com str_pad().
* @param string $align Alinhamento desejado. Admite RIGHT LEFT e CENTER (mínusculas ou maiúsculas).
* @return int Retorna o valor da constante STR_PAD_RIGHT, STR_PAD_LEFT OU STR_PAD_BOTH, para $align RIGHT, LEFT ou CENTER, respectivamente.
*/
protected function get_align($align){
$align = strtolower($align);
switch($align){
case 'center':
return STR_PAD_BOTH;
break;
case 'right':
return STR_PAD_LEFT;
break;
case 'left':
return STR_PAD_RIGHT;
break;
default:
trigger_error("Alinhamento desconhecido\n", E_USER_ERROR);
return false;
}
}
}
?>
Redimensionador de fotos em PHP
Mostra a quantidade dos dias da semana em intervalo
Monitoramento simples de servidores [versão 1.0]
evePHP: Classe para desenvolvimento PHP
Classe para conversões de data/hora em diversos formatos
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Pergunta: Meu teclado não está respondendo direito como e consertar? (1)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)
Secure boot, artigo interessante, nada técnico. (5)









