Класс PHP для вывода в консоль цветного текста

    Делал для себя скрипт для деплоя сайта на продакшен. Для чего нужно было выводить на экран что происходит. И чтобы было нагляднее решил выводить в цвете. Однако не смог найти что-то подходящее. Максимум библиотека выводила цветной текст, но не поддерживала отступы. Поэтому сделал свою библиотеку для этого. Возможно кому-то будет полезно. Небольшая (но функциональная) библиотека для вывода на консоль цветного текста с поддержкой отступов в таком вот виде


    Console::indent(2)->color('brown')->bgcolor('magenta')->writeln('Привет Habr!');


    1. Установка
    2. Использование
    3. Отступ
    4. Стили
    5. Логирование
    6. Синтаксический сахар

    Установка


    Для установки можно воспользоваться composer


    composer require shasoft/console

    или скачать с github


    Использование


    Список всех поддерживаемых цветов. Имена колонок — цвета фона, имена строк — цвета текста.
    Пример вывода цветного текста


    Вывод цветного текста


    • Функция color(значение) — установить цвет текста
    • Функция bgcolor(значение) — установить цвет фона
    • Функция write(значение1, значение2,...) — вывести значение на экран. Если значение не является строкой, то оно преобразовывается в строку с помощью php функции var_export(значение,true)
    • Функция reset() — сбросить цвета в значения по умолчанию
    • Функция setDefault() — установить цвета по умолчанию. Значения по умолчанию: цвет фона = black, цвет текста = white
    • Функция enter($resetColor=true). По умолчанию вызов функции сбрасывает цвета в значения по умолчанию. Обратите внимание, что строка не выводится пока не вызвана функция enter(). Это связано с тем, что библиотека поддерживает отступы.
    • Функция writeln(...) — write(...)+enter()

    use Shasoft\Console\Console;
    // Вывод цветного текста в строке
    Console::color('red')->bgcolor('green')->write('Красный текст на зеленом фоне')->enter();
    // Вывод цветного текста в строке
    Console::color('green')->bgcolor('red')->writeln('Зеленый текст на красном фоне');
    // Вывод цветного текста в строке
    Console::color('red')->bgcolor('white')->write('Красный текст на белом фоне фоне')->reset()->writeln('Вывод текста цветом по умолчанию');

    Отступы


    Для работы с отступами служит функция indent(значение отступа[,абсолютное значение]) — если указан второй параметр и он = true, то отступ абсолютный. Иначе отступ относительный. Для получения текущего отступа нужно вызвать функцию indent() без параметров.


    Пример:


    use Shasoft\Console\Console;
    
    Console::indent(0,true); // Отступ 0
    Console::indent(1)->color('red')->writeln('Отступ 1');
    Console::indent(3,true)->color('green')->writeln('Отступ 3');
    Console::indent(-1)->color('blue')->writeln('Отступ 2');

    К примеру был отступ = 2 indent(1) Отступ = 3
    К примеру был отступ = 2 indent(-1) Отступ = 2
    К примеру был отступ = 2 indent(10) Отступ = 10
    К примеру был отступ = 2 indent(1) Отступ = 1

    вывод: Пример вывода с отступом


    • Функция setTabSize(размер табулятора) — задает размер табулятора. По умолчанию = 3
    • Функция setSpace(символ) — задает символ табулятора. По умолчанию = ' ' (пробел)

    функция indent применяется к выводимой СТРОКЕ и значение будет меняться до вызова функции enter(). Т.е. вот этот код выведет строку с отступом 3


    Console::indent(0,true)->color('red')->indent(1)->bgcolor('blue')->indent(1)->write('Отступ 3')->indent(1)->enter();

    Стили


    Можно указать стили. По умолчанию задан стиль ошибок "error"


    • Функция setStyle(имя стиля,цвет текста=null,цвет фон=null) — установить параметры стиля
    • Функция style(имя стиля) — использовать указанный стиль

    Пример использования:


    Console::indent(1,true)->style("error")->writeln('Какая-то ошибка');

    вывод: Пример использования стиля


    Логирование


    Имеются специальные функции для контроля логирования


    • Функция setLogLevel($value=null) — Установить/получить глобальный уровень логирования. По умолчанию = 0
    • Функция logLevel($value=null) — Установить/получить уровень логирования. По умолчанию = 0

    Значения выводятся на экран с помощью функции write() только в случае если текущий уровень логирования меньше-равен глобальноному уровню логирования.


    Пример:


    Console::setLogLevel(0)->logLevel(1)->writeln('Не выведется, так как уровень логирования = 1 который больше 0');
    Console::setLogLevel(2)->logLevel(1)->writeln('Выведется, так как уровень логирования = 1 который меньше-равен 2');
    Console::setLogLevel(2)->logLevel(3)->write('Этот текст не выведется')->logLevel(1)->write('Текст на экране')->enter();

    Синтаксический сахар


    Чтобы не писать color('red')->bgcolor('green') можно писать в коротком виде


    Console::red()->bg_green()->writeln('Строка красного цвета на зеленом фоне.');

    Цвет фона можно задавать функцией без подчеркивания. Однако оно визуально отделяет цвет от префикса и, на мой взгляд, весьма удобна.


    Страница библиотеки


    upd: раз уж мне указали на ошибку в имени функции ident вместо indent, то я её исправил чтобы не смущать тех, кто знает английский хорошо :)

    Поделиться публикацией

    Похожие публикации

    Комментарии 25
      +1
      А почему функция называется ident?

      Ещё, с гита

      > * При вызове с одним параметром устанавливает значение отступа в это значение.
      * При вызове с двумя параметрами и вторым параметром true значение изменяется на значение первого параметра

      Чем отличается один параметр и два, где второй true? С одним параметром 'устанавливает значение отступа', с двумя — 'значение изменяется на значение первого параметра'
        0
        А почему функция называется ident?

        Моя ошибка. Хотел назвать indent, но написал с пропущенной буквой и потом так все и пошло. В планах изменить это.

        С одним параметром изменение относительное. Если второй параметр указать = true, то изменение значения абсолютное.
        К примеру отсуп = 5
        отступ = 5 ident(1) — отступ 6
        отступ = 5 ident(-1) — отступ 4
        отступ = 5 ident(1,true) — отступ 1
        +4
        Однако не смог найти что-то подходящее.

        Плохо искали.
        Там и табы, и цвет, и многое другое.
          +2
            +2
            Скорее больше похоже на что-то вроде этого, но так тоже неплохо.
            +1
            в копилочку github.com/Zuzest/WriteCLI
              +1
              Пару лет назад делал штуку для раскраски текста:
              github.com/win0err/php-terminal-tools
              Там и цвета для палитр предопределены, разные вариации шрифтов.

              Скриншот
              image
                +5
                Удивительно, что никто не упомянул компонент symfony/console. А ведь это, наверное, самый популярный пакет для работы с консолькой и цветами в том числе: symfony.com/doc/current/console/coloring.html
                  0
                  Наверное потому, что оно тянет за собой целый фреймворк?
                  Да и упомянули его. Буквально в третьей ветке комментов.
                    +2
                    Наверное потому, что оно тянет за собой целый фреймворк?


                    Ну если только фреймворк для работы с терминалом. С другой стороны — а не пофигу ли? Зато надёжно. Автокомплит по командам поддерживается всякими IDE, вроде шторма, подсветка работает даже под виндой (с ограничениями, правда), а из коробки идут куча полезных хелперов, вроде таблиц, прогрессбаров и проч. Да и как бы тот же Composer использует именно Symfony. Ну т.е. не вижу проблем использовать то, что используют и так подавляющее большинство фреймворков и библиотек для работы с консолью.

                    Да и упомянули его. Буквально в третьей ветке комментов.


                    Ну я слепой. Увидел что у меня ссылочка эта сиреневая, а навести и увидеть куда именно ведёт адрес — не подумал. Бывает =)
                      0
                      Ну т.е. не вижу проблем использовать то, что используют и так подавляющее большинство фреймворков и библиотек для работы с консолью.

                      Это старый спор про то, что лучше — подключить библиотеку ради 1% её функциональности или писать свой велосипед, зато быстрый и заточенный под задачу ;)
                        +1

                        Ой, ну прям ради 1%? Кажется, что для описанной топикастером задачи (для команды деплоя) она будет использоваться почти что полностью.

                          0
                          Для деплоя я написал свой велосипед :)
                          От класса вывода на консоль мне нужен был только вывод на консоль
                            +3
                            Ну вот теперь давайте тогда сравним:
                            1) Код игнорирует все мыслимые стандарты PHP, кроме PSR-4. В 2018ом году (19ый уже на носу) — это не нормально.
                            2) Комментарии на русском — нормально только для локальных проектов, но не для пакетов.
                            3) Отсутствие тестов, непродуманная архитектура, отсутствие контрактов на PSR (ну например зачем изобретать велосипед, если можно было просто зафоллбечиться на psr/log для логгирования) и прочее — говорит о том, что в продакшене использовать такое не вариант.

                            В результате:
                            1) Показать читателям механизм, с помощью которого выводятся символы на экран не получилось.
                            2) Показать читателям нормальный код — тоже не получилось.
                            3) Показать уникальное и интересное решение — тоже не получилось. Даже я сам писал такое лет 5 назад.

                            Ну т.е. как бы так сказать… Я вообще не представляю зачем вам понадобился «свой велосипед», который проигрывает существующим решениям вообще во всём. И тем более статью писать о нём на хабре, не раскрыв вообще никакой мысли.

                            Могу лишь только похвалить за труд и рекомендовать не останавливаться и продолжать, результат получился лучше 90% той дичи, что постят на хабре под эгидой «смотрите что я запилил» =)
                              0
                              Задача была — написать библиотеку которую можно легко использовать в своих проектах. Мысль статьи — можете ставить и пользоваться. Простое использование позволяет быстро понять что к чему. Я не смог найти что-то подходящие не потому что этого нет, а потому что этих библиотек слишком много. Когда десяток посморишь и все не то, то становится понятно что проще написать свое (заточенное под свою задачу), чем дальше тратить время на поиски, а затем на освоение чужой библиотеки.

                              У каждого свой уровень, думаю кому-то эта библиотека и статья будут полезны.
                                0
                                который проигрывает существующим решениям вообще во всём.

                                Про такие параметры, как производительность и объем кода, нынешние IT-бюрократы уже просто не вспоминают)
                                  +1
                                  Ну конечно, лишние 10 килобайт кода ради качественного решения — это надо половину серверов гугла скупить.
                                    0
                                    Справедливости ради — там сейчас весь код 10КБ занимает, включая комменты и пробелы.
                                    Но в целом я с вами полностью согласен.
                                    0
                                    > производительность

                                    на фоне того что вы в консоль синхронно пишите? э не.
                          0
                          что оно тянет за собой целый фреймворк?

                          Вы что-то путаете. symfony/console самодостаточный пакет который по умолчанию не тянет ничего дополнительно.


                          Ну и опять же — простая логика. Если вам нужно текст раскрасить в CLI приложение, кто скорее всего нужно будет и аргументы распарсить, и в целом почему бы и нет.

                            0

                            Спорить не буду, с symfony не работал.
                            С другой стороны, посмотрел сейчас доку на symfony/console
                            Знаете, я когда вот так, в ознакомительном режиме, смотрю в сторону какой либо новой для меня технологии/библиотеки/фреймворка/etc, то рассматриваю ее в контексте решения какой-нибудь простой задачи. Читая доку я держал в уме такую — "Сделать простой инсталлер: собрать инфу по окружению, распаковать архив, создать конфиг, все действия логировать в консоль".
                            В процессе беглого изучения я понял, что ни на шаг не приблизился к пониманию, как с помощью этой библиотеки решить мою простую задачу и возможно ли это в принципе.


                            Скорее всего, потратив некоторое время на курение мануалов и поиск по стековерфлоу решение найдется. Возможно в итоге оно даже будет простым, но… Зачем!? Полученный результат не будет стоить времени, затраченного на изучение этого мета-ЯП. Кроме того, я стану зависим от сторонней библиотеки, со всеми вытекающими.

                          0
                          Ну это немного другое. Тянуть огромный компонент, в котором можно создавать полноценные консольные приложения только ради покраски текста — ну такое
                            +2
                            В комментарии выше я уже заметил, что симфонёвую консоль и так из коробки используют вообще почти все, начиная с Composer заканчивая Laravel или Drupal, так что не вижу особой разницы притащить популярную библиотеку из десятка классов, вместо менее популярной, более ограниченной, но из пары классов.

                            По-моему, больше проблем доставляют те компоненты, которые в зависимостях половину пакагиста выкачивают, потому что потом «composer update» превращается в головную боль и растягивается на пол года, пока все зависимости нормально зарезолвятся. И не дай бог одна из них помрёт или кинет какой-нибудь конфликт. А относительно самодостаточный (он там полифилл и пару интерфейсов тянет за собой только) компонент на 300кб — это не страшно.
                              +1

                              Как бы это дико не звучало, но далеко не все используют Composer, Drupal или Laravel. Еще не все динозавры, пишущие на голом PHP, вымерли. [/sarcasm]

                          0
                          А можно коммент по коду?

                          — Я бы посоветовать посмотреть на php-cs-fixer и придерживаться какого-то стандарта. Сейчас все в разнобой как-то.

                          — Не переводите на русский то, что переводить не нужно. Например:
                          // Типаж для вывода логов
                          use TraitLog;
                          

                          Что за типаж?

                          — Переходите на PHP 7, писать новый проект в стиле пятого нет смысла.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое