Work on line numbers
All checks were successful
timw4mail/php-kilo/pipeline/head This commit looks good

This commit is contained in:
Timothy Warren 2021-04-15 18:35:03 -04:00
parent 9c5493100f
commit 4812d548a7
5 changed files with 90 additions and 13 deletions

View File

@ -230,6 +230,10 @@ class Document {
// Add a new row with the contents of the previous row at the point of the split
$this->insertRow($at->y + 1, substr($chars, $at->x));
// Highlight the two changed rows
$row->update();
$this->rows[$at->y + 1]->update();
}
$this->dirty = true;

View File

@ -56,6 +56,11 @@ class Editor {
*/
protected bool $shouldQuit = false;
/**
* @var int The amount to move the cursor off the left
*/
protected int $cursorLeftOffset = 0;
/**
* @var int The number of times to confirm you wish to quit
*/
@ -87,6 +92,8 @@ class Editor {
{
$this->statusMessage = StatusMessage::from('HELP: Ctrl-S = save | Ctrl-Q = quit | Ctrl-F = find');
$this->cursor = Point::new();
$this->cursor->x += $this->cursorLeftOffset;
$this->offset = Point::new();
$this->terminalSize = Terminal::size();
@ -385,13 +392,13 @@ class Editor {
($fileRow >= $this->document->numRows)
? $this->drawPlaceholderRow($y)
: $this->drawRow($fileRow);
: $this->drawRow($fileRow, true);
$this->outputBuffer .= "\r\n";
}
}
protected function drawRow(int $rowIdx): void
protected function drawRow(int $rowIdx, bool $lineNumbers): void
{
$row = $this->document->row($rowIdx);
if ( ! $row->isValid())
@ -409,8 +416,46 @@ class Editor {
$len = $this->terminalSize->cols;
}
$chars = substr($row->render, $this->offset->x, (int)$len);
$hl = array_slice($row->hl, $this->offset->x, (int)$len);
if ($lineNumbers)
{
$this->drawLineNumbers($rowIdx);
}
$this->drawRowHighlighting($row, $len);
$this->outputBuffer .= ANSI::RESET_TEXT;
$this->outputBuffer .= ANSI::color(Color::FG_WHITE);
}
protected function drawLineNumbers(int $rowIdx): void
{
$rawColCount = match (true) {
$this->document->numRows > 50 => 3,
$this->document->numRows > 500 => 4,
$this->document->numRows > 5_000 => 5,
$this->document->numRows > 50_000 => 6,
$this->document->numRows > 500_000 => 7,
default => 2,
};
$rowNumber = $rowIdx + 1;
$digitLen = strlen("$rowNumber");
$frontPadding = str_repeat(' ', $rawColCount - $digitLen);
$rearPadding = str_repeat(' ', 2);
$output = sprintf("%s%d%s", $frontPadding, $rowNumber, $rearPadding);
$this->outputBuffer .= ANSI::RESET_TEXT;
$this->outputBuffer .= ANSI::color(Color::FG_WHITE);
$this->outputBuffer .= $output;
$this->cursorLeftOffset = strlen($output);
}
protected function drawRowHighlighting(Row $row, int $len): void
{
$chars = substr($row->render, $this->offset->x, $len);
$hl = array_slice($row->hl, $this->offset->x, $len);
$currentColor = -1;
@ -454,9 +499,6 @@ class Editor {
$this->outputBuffer .= $ch;
}
}
$this->outputBuffer .= ANSI::RESET_TEXT;
$this->outputBuffer .= ANSI::color(Color::FG_WHITE);
}
protected function drawPlaceholderRow(int $y): void
@ -548,9 +590,10 @@ class Editor {
$this->drawMessageBar();
// Specify the current cursor position
// The current 'x' position takes into account the length of the line number column
$this->outputBuffer .= ANSI::moveCursor(
$this->cursor->y - $this->offset->y,
$this->renderX - $this->offset->x
$this->renderX - $this->offset->x + $this->cursorLeftOffset,
);
$this->outputBuffer .= ANSI::SHOW_CURSOR;
@ -666,7 +709,7 @@ class Editor {
protected function moveCursor(string $key): void
{
$x = $this->cursor->x;
$x = saturating_sub($this->cursor->x, $this->cursorLeftOffset);
$y = $this->cursor->y;
$row = $this->document->row($y);
if ( ! $row->isValid())
@ -685,7 +728,7 @@ class Editor {
{
// Beginning of a line, go to end of previous line
$y--;
$x = $row->size - 1;
$x = $this->document->row($y)->size - 1;
}
break;
@ -766,7 +809,7 @@ class Editor {
$this->document->delete($this->cursor);
}
if ($ch === KeyType::BACKSPACE && ($this->cursor->x > 0 || $this->cursor->y > 0))
if ($ch === KeyType::BACKSPACE && ($this->cursor->x > $this->cursorLeftOffset || $this->cursor->y > 0))
{
$this->moveCursor(KeyType::ARROW_LEFT);
$this->document->delete($this->cursor);

View File

@ -115,7 +115,7 @@ class FileType {
'usize', '&str', 'Copy', 'Drop', 'From', 'Into', 'None', 'Self', 'Send', 'Some',
'Sync', 'bool', 'char', 'i128', 'u128', 'Box', 'Err', 'Ord', 'Vec', 'dyn', 'f32',
'f64', 'i16', 'i32', 'i64', 'str', 'u16', 'u32', 'u64', 'Eq', 'Fn', 'Ok', 'i8', 'u8',
'&mut self', '&mut', '&self', 'self',
'&mut self', '&mut', '&self', 'self', '()',
],
[
'...', '=>', '..', '>>=', '<<=', '--', '%=', '>>', ':=', '++', '/=', '<<', '>=',

View File

@ -263,7 +263,14 @@ class Row {
|| $this->highlightCommonOperators($i, $syntax)
|| $this->highlightNumber($i, $syntax)
) {
continue;
if ($i >= $this->rsize)
{
break;
}
else
{
continue;
}
}
$i++;

View File

@ -189,6 +189,12 @@ function tabs_to_spaces(string $str, int $number = KILO_TAB_STOP): string
return str_replace(RawKeyCode::TAB, str_repeat(RawKeyCode::SPACE, $number), $str);
}
/**
* Get an understandable name for the type of error code
*
* @param int $code
* @return string
*/
function error_code_name(int $code): string
{
return match ($code) {
@ -210,11 +216,28 @@ function error_code_name(int $code): string
};
}
/**
* Add two integers, returning the sum, or if the
* sum is greater than $max, returning $max
*
* @param int $a
* @param int $b
* @param int $max
* @return int
*/
function saturating_add(int $a, int $b, int $max): int
{
return ($a + $b > $max) ? $max : $a + $b;
}
/**
* Subtract $b from $a, returning the difference
* or 0, whichever is greater
*
* @param int $a
* @param int $b
* @return int
*/
function saturating_sub(int $a, int $b): int
{
if ($b > $a)