Start to add 256 color rendering support
All checks were successful
timw4mail/php-kilo/pipeline/head This commit looks good
All checks were successful
timw4mail/php-kilo/pipeline/head This commit looks good
This commit is contained in:
parent
3b4ed0f245
commit
048f2c5f38
41
src/ANSI.php
41
src/ANSI.php
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace Aviat\Kilo;
|
namespace Aviat\Kilo;
|
||||||
|
|
||||||
|
use Aviat\Kilo\Enum\Color;
|
||||||
|
use Aviat\Kilo\Enum\Color256;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ANSI
|
* ANSI
|
||||||
*/
|
*/
|
||||||
@ -58,14 +61,48 @@ class ANSI {
|
|||||||
/**
|
/**
|
||||||
* Generate the ascii sequence for basic foreground text color
|
* Generate the ascii sequence for basic foreground text color
|
||||||
*
|
*
|
||||||
* @param Enum\Color $color
|
* @param Color|Color256|int $color
|
||||||
|
* @param Color $ground
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function color(Enum\Color $color): string
|
public static function color(Enum\Color | Enum\Color256 | int $color, Enum\Color $ground = Enum\Color::Fg): string
|
||||||
{
|
{
|
||||||
|
if ( ! $color instanceof Enum\Color)
|
||||||
|
{
|
||||||
|
return self::color256($color, $ground);
|
||||||
|
}
|
||||||
|
|
||||||
return self::escapeSequence('%dm', $color->value);
|
return self::escapeSequence('%dm', $color->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the ANSI sequence for a 256 mode color
|
||||||
|
*
|
||||||
|
* @param Color256 | int $color
|
||||||
|
* @param Color $ground
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function color256(Enum\Color256 | int $color, Enum\Color $ground = Enum\Color::Fg): string
|
||||||
|
{
|
||||||
|
if ($color instanceof Enum\Color256)
|
||||||
|
{
|
||||||
|
$color = $color->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::escapeSequence('%d;5;%dm', $ground->value, $color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invert the foreground/background on a text segment
|
||||||
|
*
|
||||||
|
* @param string $text
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function invert(string $text): string
|
||||||
|
{
|
||||||
|
return self::INVERSE_TEXT . $text . self::RESET_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a sequence for an rgb color
|
* Generate a sequence for an rgb color
|
||||||
*
|
*
|
||||||
|
@ -5,6 +5,7 @@ namespace Aviat\Kilo;
|
|||||||
use Aviat\Kilo\Type\TerminalSize;
|
use Aviat\Kilo\Type\TerminalSize;
|
||||||
use Aviat\Kilo\Enum\{
|
use Aviat\Kilo\Enum\{
|
||||||
Color,
|
Color,
|
||||||
|
Color256,
|
||||||
RawKeyCode,
|
RawKeyCode,
|
||||||
KeyType,
|
KeyType,
|
||||||
Highlight,
|
Highlight,
|
||||||
@ -429,9 +430,7 @@ class Editor {
|
|||||||
$sym = (ord($ch) <= 26)
|
$sym = (ord($ch) <= 26)
|
||||||
? chr(ord('@') + ord($ch))
|
? chr(ord('@') + ord($ch))
|
||||||
: '?';
|
: '?';
|
||||||
$this->outputBuffer .= ANSI::color(Color::INVERT);
|
$this->outputBuffer .= ANSI::invert($sym);
|
||||||
$this->outputBuffer .= $sym;
|
|
||||||
$this->outputBuffer .= ANSI::RESET_TEXT;
|
|
||||||
if ($currentColor !== -1)
|
if ($currentColor !== -1)
|
||||||
{
|
{
|
||||||
$this->outputBuffer .= ANSI::color($currentColor);
|
$this->outputBuffer .= ANSI::color($currentColor);
|
||||||
@ -496,7 +495,7 @@ class Editor {
|
|||||||
|
|
||||||
protected function drawStatusBar(): void
|
protected function drawStatusBar(): void
|
||||||
{
|
{
|
||||||
$this->outputBuffer .= ANSI::color(Color::INVERT);
|
$this->outputBuffer .= ANSI::INVERSE_TEXT;
|
||||||
|
|
||||||
$statusFilename = $this->document->filename !== '' ? $this->document->filename : '[No Name]';
|
$statusFilename = $this->document->filename !== '' ? $this->document->filename : '[No Name]';
|
||||||
$syntaxType = $this->document->fileType->name;
|
$syntaxType = $this->document->fileType->name;
|
||||||
|
@ -11,6 +11,10 @@ use Aviat\Kilo\Traits;
|
|||||||
enum Color: int {
|
enum Color: int {
|
||||||
use Traits\ConstList;
|
use Traits\ConstList;
|
||||||
|
|
||||||
|
// Foreground/Background
|
||||||
|
case Fg = 38;
|
||||||
|
case Bg = 48;
|
||||||
|
|
||||||
// Foreground colors
|
// Foreground colors
|
||||||
case FG_BLACK = 30;
|
case FG_BLACK = 30;
|
||||||
case FG_RED = 31;
|
case FG_RED = 31;
|
||||||
|
31
src/Enum/Color256.php
Normal file
31
src/Enum/Color256.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Aviat\Kilo\Enum;
|
||||||
|
|
||||||
|
use Aviat\Kilo\Traits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ANSI 256 Color escape sequences
|
||||||
|
* @enum
|
||||||
|
*/
|
||||||
|
enum Color256: int {
|
||||||
|
use Traits\ConstList;
|
||||||
|
|
||||||
|
// Base colors for 256-color setup
|
||||||
|
case Black = 0;
|
||||||
|
case Red = 1;
|
||||||
|
case Green = 2;
|
||||||
|
case Yellow = 3;
|
||||||
|
case Blue = 4;
|
||||||
|
case Magenta = 5;
|
||||||
|
case Cyan = 6;
|
||||||
|
case White = 7;
|
||||||
|
case BrightBlack = 8;
|
||||||
|
case BrightRed = 9;
|
||||||
|
case BrightGreen = 10;
|
||||||
|
case BrightYellow = 11;
|
||||||
|
case BrightBlue = 12;
|
||||||
|
case BrightMagenta = 13;
|
||||||
|
case BrightCyan = 14;
|
||||||
|
case BrightWhite = 15;
|
||||||
|
}
|
@ -25,6 +25,7 @@ enum Highlight implements JsonSerializable {
|
|||||||
case SearchMatch;
|
case SearchMatch;
|
||||||
case Identifier;
|
case Identifier;
|
||||||
case Character;
|
case Character;
|
||||||
|
case Embed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map a PHP syntax token to its associated highlighting type
|
* Map a PHP syntax token to its associated highlighting type
|
||||||
@ -37,6 +38,7 @@ enum Highlight implements JsonSerializable {
|
|||||||
return match($token) {
|
return match($token) {
|
||||||
// Delimiters
|
// Delimiters
|
||||||
T_ARRAY,
|
T_ARRAY,
|
||||||
|
T_ATTRIBUTE,
|
||||||
T_CURLY_OPEN,
|
T_CURLY_OPEN,
|
||||||
T_DOLLAR_OPEN_CURLY_BRACES,
|
T_DOLLAR_OPEN_CURLY_BRACES,
|
||||||
T_OPEN_TAG,
|
T_OPEN_TAG,
|
||||||
@ -66,6 +68,8 @@ enum Highlight implements JsonSerializable {
|
|||||||
|
|
||||||
// Operators
|
// Operators
|
||||||
T_AS,
|
T_AS,
|
||||||
|
T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG,
|
||||||
|
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG,
|
||||||
T_AND_EQUAL,
|
T_AND_EQUAL,
|
||||||
T_BOOLEAN_AND,
|
T_BOOLEAN_AND,
|
||||||
T_BOOLEAN_OR,
|
T_BOOLEAN_OR,
|
||||||
@ -185,6 +189,11 @@ enum Highlight implements JsonSerializable {
|
|||||||
// Invalid syntax
|
// Invalid syntax
|
||||||
T_BAD_CHARACTER => Highlight::Invalid,
|
T_BAD_CHARACTER => Highlight::Invalid,
|
||||||
|
|
||||||
|
// Comments
|
||||||
|
T_DOC_COMMENT => Highlight::MultiLineComment,
|
||||||
|
|
||||||
|
T_INLINE_HTML => Highlight::Embed,
|
||||||
|
|
||||||
default => Highlight::Normal,
|
default => Highlight::Normal,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -3,15 +3,16 @@
|
|||||||
namespace Aviat\Kilo;
|
namespace Aviat\Kilo;
|
||||||
|
|
||||||
use Aviat\Kilo\Enum\Color;
|
use Aviat\Kilo\Enum\Color;
|
||||||
|
use Aviat\Kilo\Enum\Color256;
|
||||||
use Aviat\Kilo\Enum\Highlight;
|
use Aviat\Kilo\Enum\Highlight;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure syntax highlighting colors
|
* Configure syntax highlighting colors
|
||||||
*
|
*
|
||||||
* @param Highlight $hl
|
* @param Highlight $hl
|
||||||
* @return Color
|
* @return Color | Color256 | int
|
||||||
*/
|
*/
|
||||||
function get_syntax_color(Highlight $hl): Color {
|
function get_syntax_color(Highlight $hl): Color | Color256 | int {
|
||||||
return match ($hl)
|
return match ($hl)
|
||||||
{
|
{
|
||||||
Highlight::Comment => Color::FG_CYAN,
|
Highlight::Comment => Color::FG_CYAN,
|
||||||
|
6
test.php
6
test.php
@ -17,6 +17,7 @@ abstract class Foo implements Ifoo {
|
|||||||
protected function doNothing(): void {}
|
protected function doNothing(): void {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Attribute]
|
||||||
class Test {
|
class Test {
|
||||||
public function __construct(public string $foo, public string $bar) {}
|
public function __construct(public string $foo, public string $bar) {}
|
||||||
}
|
}
|
||||||
@ -30,9 +31,12 @@ class FooBar extends Foo implements Ifoo {
|
|||||||
$cstr = print_r($c, TRUE);
|
$cstr = print_r($c, TRUE);
|
||||||
$d();
|
$d();
|
||||||
|
|
||||||
return "{$a}, ${b}, " . $cstr;
|
$r = $this->operations($a, (int)$b);
|
||||||
|
|
||||||
|
return "{$a}, ${b}, " . $cstr . " = {$r}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Test('a', 'b')]
|
||||||
private function operations(int $a, int $b): int
|
private function operations(int $a, int $b): int
|
||||||
{
|
{
|
||||||
$this?->x?->bar();
|
$this?->x?->bar();
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user