summaryrefslogtreecommitdiffstats
path: root/vendor/gipfl/cli/src/Screen.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gipfl/cli/src/Screen.php')
-rw-r--r--vendor/gipfl/cli/src/Screen.php190
1 files changed, 190 insertions, 0 deletions
diff --git a/vendor/gipfl/cli/src/Screen.php b/vendor/gipfl/cli/src/Screen.php
new file mode 100644
index 0000000..cb05a3f
--- /dev/null
+++ b/vendor/gipfl/cli/src/Screen.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace gipfl\Cli;
+
+/**
+ * Base class providing minimal CLI Screen functionality. While classes
+ * extending this one (read: AnsiScreen) should implement all the fancy cool
+ * things, this base class makes sure that your code will still run in
+ * environments with no ANSI or similar support
+ *
+ * ```php
+ * $screen = Screen::instance();
+ * echo $screen->center($screen->underline('Hello world'));
+ * ```
+ */
+class Screen
+{
+ protected $isUtf8;
+
+ /**
+ * Get a new Screen instance.
+ *
+ * For now this is limited to either a very basic Screen implementation as
+ * a fall-back or an AnsiScreen implementation with more functionality
+ *
+ * @return AnsiScreen|Screen
+ */
+ public static function factory()
+ {
+ if (! defined('STDOUT')) {
+ return new Screen();
+ }
+ if (\function_exists('posix_isatty') && \posix_isatty(STDOUT)) {
+ return new AnsiScreen();
+ } else {
+ return new Screen();
+ }
+ }
+
+ /**
+ * Center the given string horizontally on the current screen
+ *
+ * @param $string
+ * @return string
+ */
+ public function center($string)
+ {
+ $len = $this->strlen($string);
+ $width = (int) \floor(($this->getColumns() + $len) / 2) - $len;
+
+ return \str_repeat(' ', $width) . $string;
+ }
+
+ /**
+ * Clear the screen
+ *
+ * Impossible for non-ANSI screens, so let's output a newline for now
+ *
+ * @return string
+ */
+ public function clear()
+ {
+ return "\n";
+ }
+
+ /**
+ * Colorize the given text. Has no effect on a basic Screen, all colors
+ * will be accepted. It's prefectly legal to provide background or foreground
+ * only
+ *
+ * Returns the very same string, eventually enriched with related ANSI codes
+ *
+ * @param $text
+ * @param null $fgColor
+ * @param null $bgColor
+ *
+ * @return mixed
+ */
+ public function colorize($text, $fgColor = null, $bgColor = null)
+ {
+ return $text;
+ }
+
+ /**
+ * Generate $count newline characters
+ *
+ * @param int $count
+ * @return string
+ */
+ public function newlines($count = 1)
+ {
+ return \str_repeat(PHP_EOL, $count);
+ }
+
+ /**
+ * Calculate the visible length of a given string. While this is simple on
+ * a non-ANSI-screen, such implementation will be required to strip control
+ * characters to get the correct result
+ *
+ * @param $string
+ * @return int
+ */
+ public function strlen($string)
+ {
+ if ($this->isUtf8()) {
+ return \mb_strlen($string, 'UTF-8');
+ } else {
+ return \strlen($string);
+ }
+ }
+
+ /**
+ * Underline the given text - if possible
+ *
+ * @return string
+ */
+ public function underline($text)
+ {
+ return $text;
+ }
+
+ /**
+ * Get the number of currently available columns. Please note that this
+ * might chance at any time while your program is running
+ *
+ * @return int
+ */
+ public function getColumns()
+ {
+ $cols = (int) \getenv('COLUMNS');
+ if (! $cols) {
+ // stty -a ?
+ $cols = (int) \exec('tput cols');
+ }
+ if (! $cols) {
+ $cols = 80;
+ }
+
+ return $cols;
+ }
+
+ /**
+ * Get the number of currently available rows. Please note that this
+ * might chance at any time while your program is running
+ *
+ * @return int
+ */
+ public function getRows()
+ {
+ $rows = (int) \getenv('ROWS');
+ if (! $rows) {
+ // stty -a ?
+ $rows = (int) \exec('tput lines');
+ }
+ if (! $rows) {
+ $rows = 25;
+ }
+
+ return $rows;
+ }
+
+ /**
+ * Whether we're on a UTF-8 screen. We assume latin1 otherwise, there is no
+ * support for additional encodings
+ *
+ * @return bool
+ */
+ public function isUtf8()
+ {
+ if ($this->isUtf8 === null) {
+ // null should equal 0 here, however seems to equal '' on some systems:
+ $current = \setlocale(LC_ALL, 0);
+
+ $parts = explode(';', $current);
+ $lc_parts = [];
+ foreach ($parts as $part) {
+ if (\strpos($part, '=') === false) {
+ continue;
+ }
+ list($key, $val) = explode('=', $part, 2);
+ $lc_parts[$key] = $val;
+ }
+
+ $this->isUtf8 = \array_key_exists('LC_CTYPE', $lc_parts)
+ && \preg_match('~\.UTF-8$~i', $lc_parts['LC_CTYPE']);
+ }
+
+ return $this->isUtf8;
+ }
+}