php标记输出数据,学习PHP-cli 模式在终端输出彩色标记文字以及动态内容

文字效果操作类namespace Console;class Style{

private $colors = [

"black"=>30,

"red"=>31,

"green"=>32,

"yellow"=>33,

"blue"=>34,

"purple"=>35,

"darkGreen"=>36,

"white"=>37,

];

private $backgrounds = [

"black"=>40,

"darkRed"=>41,

"green"=>42,

"yellow"=>43,

"blue"=>44,

"purple"=>45,

"darkGreen"=>46,

"white"=>47,

];

public $msg;

public $style = [];

public function __construct($msg){

$this->msg = $msg;

}

// 设置文本颜色

public function color( string $c ){

if( isset( $this->colors[$c]) ) $this->style[] = $this->colors[$c];

return $this;

}

// 设置背景色

public function bg( string $c ){

if(isset($this->backgrounds[$c]) ) $this->style[] = $this->backgrounds[$c];

return $this;

}

// 高亮

public function highLight(){

$this->style[] = 1;

return $this;

}

// 下划线

public function underLine(){

$this->style[] = 4;

return $this;

}

// 闪烁

public function twinkle(){

$this->style[] = 5;

return $this;

}

// 反显

public function rshow(){

$this->style[] = 7;

return $this;

}

// 消隐

public function hide(){

$this->style[] = 8;

return $this;

}

public function toString(){

$this->style = array_unique($this->style);

if($this->msg){

if(sizeof($this->style) ){

return "\033[".implode(';',$this->style)."m" . $this->msg . "\033[0m";

}else{

return $this->msg. "\033[0m";

}

}else{

return false;

}

}

}

光标操作类namespace Console;

// 光标的信息以及操作

class Cursor{

// 光标设置 \033[y;xH

private $x=0;

private $y=0;

// 获取光标X轴位置

public function offsetX(){

return $this->x;

}

// 获取光标Y轴位置

public function offsetY(){

return $this->y;

}

// 获取光标坐标

public function offset(){

return [

'x'=>$this->x,

'y'=>$this->y,

];

}

public function setX( int $x ){

$this->x = $x;

}

public function setY( int $y ){

$this->y = $y;

}

public function setOffset( int $x , int $y ){

$this->x = $x;

$this->y = $y;

return $this->toString();

}

// 清屏

public function clear(){

return "\033[2J";

}

public function show(){

return "\33[?25h";

}

public function hide(){

return "\33[?25l";

}

public function toString(){

if($this->x<0)$dx = 'D';

else $dx = 'C';

if($this->y<0)$dy = 'A';

else $dy = 'B';

$absx = abs($this->x);

$absy = abs($this->y);

return "\033[{$absx}{$dx}\033[{$absy}{$dy}";

}

}

table类,通便html的table标记语言,输出tablenamespace Console;class Table{

public $table=[];

private $getV;

private $currentTag='table';

private $props = [

'color','bg','twinkle','highLight','underLine','colspan','rowspan','width','border','align'

];

public function __construct( string $html){

// 解析字符串最好

$this->html=$html;

$this->parse();

}

// 解析字符串 将table的每个tr td以及属性都解析出来

private function parse(){

if( !preg_match("/

(.*?)/is",$this->html) ){

die('标签有误,必须包含table tr td标签且标签闭合');

}

$this->table['html'] = $this->html;

$this->getPrototype('table',$this->table);

preg_match_all("/

if( $innerTable[0][0] ){

preg_match_all("/

if( $trList[0] ){

$this->table['tr'] = $trList[0];

foreach($this->table['tr'] as $k=>$tr){

$this->table['tr'][$k] = [];

preg_match_all("/

(.*?)/is",$tr,$tdList);

$this->table['tr'][$k]['td'] = $tdList[0];

$this->table['tr'][$k]['html'] =$tr;

$this->getPrototype('tr',$this->table['tr'][$k]);

foreach ($this->table['tr'][$k]['td'] as $kk=>$td){

$this->table['tr'][$k]['td'][$kk] = [

'html'=>$td,

'content'=>$tdList[2][$kk]

];

$this->getPrototype('td',$this->table['tr'][$k]['td'][$kk]);

}

}

}else{

die('Tr 不存在');

}

}else{

die('Table 不存在');

}

}

private function getPrototype(string $tag,&$v){

preg_match("/(.*?)/is",$v['html'],$arr);

if(strlen($arr[1])){

$arr2 = explode(" ", trim(preg_replace("/( +)/is"," ",$arr[1])));

foreach ($arr2 as $arr3){

$arr4 = explode('=',str_replace([' ',"\"","\'"],'',$arr3));

if(in_array($arr4[0],$this->props)){

$v[$arr4[0]] = $arr4[1];

}

}

}

}

}

console类,输出自定义的文本或table格式文本namespace Console;class Console{

public $cursor;

private $msgList=[];

private $lastCountLine=0;

public function __construct(){

$this->cursor= new Cursor();

}

private static function getStrlen($str){

if(!$str) return 0;

$l=0;

$strArr = preg_split('//u',$str,-1, PREG_SPLIT_NO_EMPTY);

if(is_array($strArr)){

foreach($strArr as $v){

if(preg_match("/^[\x{4e00}-\x{9fa5}]$/u", $v)) $l += 2;

else $l += 1;

}

}

return $l;

}

public function write($msg){

$msgStyle = new Style($msg);

$this->msgList[] = $msgStyle;

return $msgStyle;

}

public function table(array $table){

foreach($table['tr'] as $tr){

foreach($tr['td'] as $td){

if($td['content']){

$len = self::getStrlen($td['content']); // 显示问题矫正

$tdlen = $td['width'] ?? max(15,$len);

$tdlen = max($tdlen,$len);

$align = $td['align'] ??$tr['align']??$table['align']?? false;

if( $tdlen>$len ){

if( $align=='left'){

$td['content'] = $td['content'].str_repeat(' ',$tdlen-$len);

}else if($align=='right'){

$td['content'] = str_repeat(' ',$tdlen-$len) . $td['content'];

}else{

$td['content'] = str_repeat(' ',floor(($tdlen-$len)/2)) . $td['content'] . str_repeat(' ',ceil(($tdlen-$len)/2));

}

}

$msg = $this->write($td['content']);

$color = $td['color'] ?? $tr['color'] ??$table['color']??false;

$twinkle = $td['twinkle'] ?? $tr['twinkle'] ??$table['twinkle']??false;

$bg = $td['bg '] ?? $tr['bg '] ??$table['bg ']??false;

$highLight = $td['highLight'] ?? $tr['highLight'] ??$table['highLight']??false;

$underLine = $td['underLine'] ?? $tr['underLine'] ??$table['underLine']??false;

if($color) $msg->color($color);

if($bg) $msg->bg($bg);

if($twinkle) $msg->twinkle();

if($highLight) $msg->highLight();

if($underLine) $msg->underLine();

}

}

$this->write("\n");

}

$this->dump();

}

public function dump(){

foreach( $this->msgList as $msg){

echo $msg->toString();

}

$this->lastCountLine = $this->getLine();

$this->msgList=[];

}

public function cursorMove( int $x , int $y ) {

$this->write( $this->cursor->setOffset( $x,$y));

}

public function getCountLine(){

return $this->lastCountLine;

}

private function getLine(){

if(!sizeof($this->msgList)) return 0;

else{

$line=0;

foreach( $this->msgList as $msg ){

for($i=0;$imsg);$i++){

if(mb_substr($msg->msg ,$i,1) == PHP_EOL) $line++;

}

}

return $line;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值