Skip to content

Commit

Permalink
Extract string handling methods from DrawsBoxes trait (#142)
Browse files Browse the repository at this point in the history
* Extract string handling methods from DrawsBoxes

* formatting

* add file

---------

Co-authored-by: Taylor Otwell <[email protected]>
  • Loading branch information
ProjektGopher and taylorotwell authored Apr 30, 2024
1 parent 733c937 commit 23ea808
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 40 deletions.
42 changes: 2 additions & 40 deletions src/Themes/Default/Concerns/DrawsBoxes.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

trait DrawsBoxes
{
use InteractsWithStrings;

protected int $minWidth = 60;

/**
Expand Down Expand Up @@ -55,44 +57,4 @@ protected function box(

return $this;
}

/**
* Get the length of the longest line.
*
* @param array<string> $lines
*/
protected function longest(array $lines, int $padding = 0): int
{
return max(
$this->minWidth,
collect($lines)
->map(fn ($line) => mb_strwidth($this->stripEscapeSequences($line)) + $padding)
->max()
);
}

/**
* Pad text ignoring ANSI escape sequences.
*/
protected function pad(string $text, int $length, string $char = ' '): string
{
$rightPadding = str_repeat($char, max(0, $length - mb_strwidth($this->stripEscapeSequences($text))));

return "{$text}{$rightPadding}";
}

/**
* Strip ANSI escape sequences from the given text.
*/
protected function stripEscapeSequences(string $text): string
{
// Strip ANSI escape sequences.
$text = preg_replace("/\e[^m]*m/", '', $text);

// Strip Symfony named style tags.
$text = preg_replace("/<(info|comment|question|error)>(.*?)<\/\\1>/", '$2', $text);

// Strip Symfony inline style tags.
return preg_replace("/<(?:(?:[fb]g|options)=[a-z,;]+)+>(.*?)<\/>/i", '$1', $text);
}
}
46 changes: 46 additions & 0 deletions src/Themes/Default/Concerns/InteractsWithStrings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Laravel\Prompts\Themes\Default\Concerns;

trait InteractsWithStrings
{
/**
* Get the length of the longest line.
*
* @param array<string> $lines
*/
protected function longest(array $lines, int $padding = 0): int
{
return max(
$this->minWidth,
collect($lines)
->map(fn ($line) => mb_strwidth($this->stripEscapeSequences($line)) + $padding)
->max()
);
}

/**
* Pad text ignoring ANSI escape sequences.
*/
protected function pad(string $text, int $length, string $char = ' '): string
{
$rightPadding = str_repeat($char, max(0, $length - mb_strwidth($this->stripEscapeSequences($text))));

return "{$text}{$rightPadding}";
}

/**
* Strip ANSI escape sequences from the given text.
*/
protected function stripEscapeSequences(string $text): string
{
// Strip ANSI escape sequences.
$text = preg_replace("/\e[^m]*m/", '', $text);

// Strip Symfony named style tags.
$text = preg_replace("/<(info|comment|question|error)>(.*?)<\/\\1>/", '$2', $text);

// Strip Symfony inline style tags.
return preg_replace("/<(?:(?:[fb]g|options)=[a-z,;]+)+>(.*?)<\/>/i", '$1', $text);
}
}

0 comments on commit 23ea808

Please sign in to comment.