Refactor syntax highlighting, complete step 149
This commit is contained in:
parent
83168301ce
commit
0da8d12758
@ -49,6 +49,23 @@ class Key {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Highlight {
|
||||||
|
public const NORMAL = 0;
|
||||||
|
public const NUMBER = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function syntaxToColor(int $hl): int
|
||||||
|
{
|
||||||
|
switch ($hl)
|
||||||
|
{
|
||||||
|
case Highlight::NUMBER:
|
||||||
|
return 31; // Foreground Red
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 37; // Foreground White
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property-read int size
|
* @property-read int size
|
||||||
* @property-read int rsize
|
* @property-read int rsize
|
||||||
@ -59,6 +76,8 @@ class Row {
|
|||||||
public string $chars = '';
|
public string $chars = '';
|
||||||
public string $render = '';
|
public string $render = '';
|
||||||
|
|
||||||
|
public array $hl = [];
|
||||||
|
|
||||||
public static function new(string $chars): self
|
public static function new(string $chars): self
|
||||||
{
|
{
|
||||||
return new self($chars);
|
return new self($chars);
|
||||||
@ -108,6 +127,25 @@ class Row {
|
|||||||
$this->render[$idx++] = $this->chars[$i];
|
$this->render[$idx++] = $this->chars[$i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->updateSyntax();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// ! Syntax Highlighting
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
protected function updateSyntax(): void
|
||||||
|
{
|
||||||
|
$this->hl = array_fill(0, $this->rsize, Highlight::NORMAL);
|
||||||
|
|
||||||
|
for ($i = 0; $i < $this->rsize; $i++)
|
||||||
|
{
|
||||||
|
if (isdigit($this->render[$i]))
|
||||||
|
{
|
||||||
|
$this->hl[$i] = Highlight::NUMBER;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,20 +699,34 @@ class Editor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$c = substr($this->rows[$filerow]->render, $this->colOffset, $len);
|
$c = substr($this->rows[$filerow]->render, $this->colOffset, $len);
|
||||||
|
$hl = array_slice($this->rows[$filerow]->hl, $this->colOffset, $len);
|
||||||
|
|
||||||
|
$currentColor = -1;
|
||||||
|
|
||||||
for ($i = 0; $i < $len; $i++)
|
for ($i = 0; $i < $len; $i++)
|
||||||
{
|
{
|
||||||
if (isdigit($c[$i]))
|
if ($hl[$i] === Highlight::NORMAL)
|
||||||
|
{
|
||||||
|
if ($currentColor !== -1)
|
||||||
{
|
{
|
||||||
$this->ab .= "\x1b[31m";
|
|
||||||
$this->ab .= $c[$i];
|
|
||||||
$this->ab .= "\x1b[39m";
|
$this->ab .= "\x1b[39m";
|
||||||
|
$currentColor = -1;
|
||||||
|
}
|
||||||
|
$this->ab .= $c[$i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
$color = syntaxToColor($hl[$i]);
|
||||||
|
if ($color !== $currentColor)
|
||||||
|
{
|
||||||
|
$currentColor = $color;
|
||||||
|
$this->ab .= sprintf("\x1b[%dm", $color);
|
||||||
|
}
|
||||||
$this->ab .= $c[$i];
|
$this->ab .= $c[$i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->ab .= "\x1b[39m";
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->ab .= "\x1b[K"; // Clear the current line
|
$this->ab .= "\x1b[K"; // Clear the current line
|
||||||
|
Loading…
Reference in New Issue
Block a user