Пользователь
0,0
рейтинг
20 ноября 2008 в 10:11

Разработка → Работа с ANSI консолью

PHP*
imageЧасто ли нужно сделать програму для консоли? Не так часто, да? А вот я последнее время только этим и занимаюсь… Поэтому сделал класс (на самом деле сделал еще очень давно).
Этот класс позволяет выполнять такие простые операции, как подсветка текста, подсветка бэкграунда буквы или текста, установка курсора на нужную позицию, выбор консоли для вывода и ввод текста в консоль.

Долго трепать языком не стану. Тот, кто зашел под кат явно знает зачем он пришел. А поэтому…Вот код:
  1. <?php
  2. class console
  3. {
  4.   const TARGET_OUTPUT = "php://output";
  5.   const TARGET_STDOUT = "php://stdout";
  6.   const TARGET_STDERR = "php://stderr";
  7.   const TARGET_STDIN = "php://stdin";
  8.   protected static $color = array(
  9.     'gray'     => 30,
  10.     'black'     => 30,
  11.     'red'      => 31,
  12.     'green'     => 32,
  13.     'yellow'    => 33,
  14.     'blue'     => 34,
  15.     'magenta'    => 35,
  16.     'cyan'     => 36,
  17.     'white'     => 37,
  18.     'default'    => 39
  19.   );
  20.   protected static $bgcolor = array(
  21.     'gray'    => 40,
  22.     'black'   => 40,
  23.     'red'    => 41,
  24.     'green'   => 42,
  25.     'yellow'   => 43,
  26.     'blue'    => 44,
  27.     'magenta'  => 45,
  28.     'cyan'    => 46,
  29.     'white'   => 47,
  30.     'default'  => 49,
  31.   );
  32.   protected static $style = array(
  33.     'default'      => '0',
  34.     'bold'       => 1,
  35.     'faint'       => 2,
  36.     'normal'      => 22,
  37.     'italic'      => 3,
  38.     'notitalic'     => 23,
  39.     'underlined'    => 4,
  40.     'doubleunderlined' => 21,
  41.     'notunderlined'   => 24,
  42.     'blink'       => 5,
  43.     'blinkfast'     => 6,
  44.     'noblink'      => 25,
  45.     'negative'     => 7,
  46.     'positive'     => 27,
  47.   );
  48.     private $text      = "";
  49.   // Outputing
  50.   public function draw($text='')
  51.   {
  52.     echo $this->text.$text;
  53.     $this->text = '';
  54.     return $this;
  55.   }
  56.   // Input
  57.   public function readNumeric()
  58.   {
  59.     $stdin = fopen('php://stdin', 'r');
  60.     $line = trim(fgets($stdin));
  61.     fscanf($stdin, "%d\n", $number);
  62.      return $number;
  63.   }
  64.   public function readString()
  65.   {
  66.     $stdin = fopen('php://stdin', 'r');
  67.     $line = trim(fgets($stdin));
  68.      fscanf($stdin, "%s\n", $string);
  69.      return $string;
  70.   }
  71.   // Sound
  72.   public function beep()              { echo "\007"; return $this; }
  73.   public function setSoundHerz($herz=100)      { echo "\033[10;{$herz}]"; return $this; }
  74.   public function setSoundLong($milliseconds=500)  { echo "'033[11;{$milliseconds}]"; return $this; }
  75.   // Cursor position
  76.   public function toPos( $row = 1, $column = 1 )  { echo "\033[{$row};{$column}H"; return $this; }
  77.   public function cursorUp($lines=1)        { echo "\033[{$lines}A"; return $this; }
  78.   public function cursorDown($lines=1)      { echo "\033[{$lines}B"; return $this; }
  79.   public function cursorRight($columns=1)      { echo "\033[{$columns}C"; return $this; }
  80.   public function cursorLeft($columns=1)      { echo "\033[{$columns}D"; return $this; }
  81.   // Text colors
  82.   public function setStyle($style='default')    { $this->text .= "\033[".$this->style[$style]."m"; return $this; }
  83.   public function setColor($color='default')    { $this->text .= "\033[".$this->color[$style]; return $this; }
  84.   public function setBgColor($color='default')  { $this->text .= "\033[".$this->bgcolor[$style]; return $this; }
  85.   // Application
  86.   public function setAppName($name='')      { echo "\033]0;{$name}\007"; return $this; }
  87.   public function setTitle($name='')        { echo "\033]2;{$name}\007"; return $this; }
  88.   public function setIcon($name='')        { echo "\033]1;{$name}\007"; return $this; }
  89.   // Other
  90.   public function clear()              { echo "\033c"; return $this; }
  91.   public function console($num=1)          { echo "\033[12;{$num}]"; return $this; }
  92. }
  93. ?>
* This source code was highlighted with Source Code Highlighter.
Так же скачать это можно с phpclasses.org по этой ссылке: http://www.phpclasses.org/browse/package/4969.html
И посмотреть кросс-пост в моем блоге по адресу: http://alexsnet.ru/2008/11/how-to-work-with-ansi-console/
Спасибо за внимание.
Алекс @MYPABEU
карма
92,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (43)

  • +3
    Мне с консолью пока не приходилось работать, но на блог ваш подписался и в букмарки добавил)
    • 0
      Спасибо =)
    • 0
      на хабре еще очень удобно добавлять в избранное, а то букмарки на других компах не доступны как правило :)
      • 0
        я блог в букмарки добавил)
  • 0
    Сам недавно делал тему для installer-а своей системы.
    Одна из них была как раз «консольная» :)
    Этакое «Ретро Классик» :)
    Видать не я один такой сумашедший ;)
    Правда я делал на JS
    • 0
      Всмысле? Консольное приложение на JS??
      Это сильно… Я тут все пытаюсь заставить JS выполнятся… Просто мне нужно связать DOM (который является класом в PHP) и JS.
      Есть сумасшедшая идея делать скрины на чистом PHP =)

      Почти удалось уже. Пока что только JS мешает осуществлению мечты. Но простенькие сайтики скринятся нормально…

      С формочками (input, textarea, option, etc...) задолбался… Сидел с фотошопом, принтскрином и сафари… =)
      • 0
        Сделал на JS, правда от курсора пришлось отказаться :\, так как пришлось бы фактически писать свой wsywing.

        А сделал я инсталлер своей CMS, с «консольной / терминальной» темой :)

        Даже с прогресс баром (jquery-ajax) и распаковкой zip архива («убиваем» хостеров у которых включен safe mode :)

        Кстати gmail отличился тоже тему «терминала» сделал в почте у себя!!!
        Так что сумашедшие мыслят одинаково

        • 0
          а… Тогда понятно =)
          Я уж испугался… думал консольный скрипт на JS…

          Типа:

          user@host$ js install.js

          =))
          • 0
            Интерпретаторы языка JS для Linux есть, так что почему нет?
            • 0
              Конечно есть, spidermonkey, к примеру…
              Другой вопрос — а не изврат ли??
              • 0
                В чём вы видите изврат?
                • 0
                  В написании консольных приложений под Линукс на ЯваСкпипте.
                  • 0
                    Задам вопрос иначе. Почему это изврат?
                  • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Многие хвалят JS за его развитые возможности как языка.
                    Для работы в консоли ему, насколько я могу судить, не хватает функционала работы с окружением.
                    А так — тоже ЯП, почему бы и нет.
                    • 0
                      в Windows JavaScript работает со средой через Windows Script Host, может и под Linux есть что-то похожее?
                      • 0
                        SpiderMonkey.

                        Конечно есть. Причем в разы лучше и быстрее работающий пакет.

                        Просто я к тому, что писать консольное приложение на JS — всеравно как разрабатывать ОС на BrainFuck'e…

                        Просто у обоих языков отсутствуют еопходимые возможности. Как, например, работа с файлами. Работа с сетью.

                        Ведь JS сам по себе не умеет ни о ни то.

                        AJAX?? Это все заслуги браузеров. Сам же интерпритатор этого не делает.
                        • 0
                          Ну это реализовано за счет использования ActiveX, мне по большому счету безразлично, что используется для доступа к файлам — родные методы или внешняя библиотека
                          • 0
                            Для IE исключительно.
                            • 0
                              да причем здесь IE — я говорю про использование javascript в рамках операционной системы, а не браузера
                              • 0
                                > это реализовано за счет использования ActiveX

                                ActiveX — исключительно IE'шная технология.
                                • 0
                                  Точнее виндовая, просто в IE она используется наиболее широко, видимо в связи с тем, что в IE ее просто использовать. А так ActiveX вполне может работать в любом виндовом приложении, практически все современные языки (и их IDE) позволяют использовать ActiveX при разработке, не трогая IE
                      • 0
                        apt-get install spidermonkey-bin
                        • 0
                          Именно так. Но это для убунту и дебиан-подобных.
                          Хотя ладно, не будем грузить публику.
    • +1
      WSH?
      • +1
        UNIX?
  • 0
    Отличная тема, порой нужно что-нибудь подсветить в консоле, так копипащу заклинание подсветки прямо в месте вывода, а тут класс подходящий, который упростит.
  • +2
    PHP, кстати, замечательный язык для написания консольных утилит. Может составить конкуренцию для перла и питона.
  • +3
    Мне кажется тут ошибка:
      // Text colors 
      function setStyle($style='default')    { $this->text .= "\033[".$this->style[$style]."m"; return $this; } 
      function setColor($color='default')    { $this->text .= "\033[".$this->color[$style]; return $this; } 
      function setBgColor($color='default')  { $this->text .= "\033[".$this->bgcolor[$style]; return $this; } 
    


    $this->color[$style];
    $this->bgcolor[$style];

    нужно заменить на:
    $this->color[$color];
    $this->bgcolor[$color];
  • 0
    Ещё немного и ncurse обгоним :)
  • 0
    Огромное спасибо!
    Очень полезный класс.
  • 0
    а где можно найти описание всех этих магических эскейп последовательностей "\033["…?
    • 0
      в моем блоге распишу скоро.
    • 0
      • 0
        Спасибо за поучительный линк.

        Не каждый догадается, что эти последовательности называются vt100 codes, ссылка не радует, даже обижает (
        • 0
          Это история. Это все называется ESC-последовательности и vt100 стал самым масовым терминалом.
  • 0
    Огромное спасибо!
  • +1
    public function setSoundLong($milliseconds=500) { echo "'033[11;{$milliseconds}]"; return $this; }

    '033 -> \033
    beep, setSoundHerz, setSoundLong почему то не работает
    не плохо было бы увидеть пример для тестов ;)
    • +1
      Огромное спсибо за поправку.
      Сейчас изменю, жто моя ошибка… У меня на ноуте кнопки рядом стоят просто…
      Пример сделаю…
      Положу в лаборатории, в своем блоге
      Раздел лабороторий пока готовится…
      Скоро будет работать…
      Еще раз спасбо.
      • +1
        $this->text .= вместо echo во всех методах
        draw для себя переименовал в output
        . «m» забыты в setColor и setBgColor

        зачем константы в классе забиты я не смог понять
        • 0
          Константы были определены для меня, а не для компилятора =)
          Просто что бы помнить что к чему. Почему не использовал и не убрал? Даже е знаю что ответить…
          • 0
            почему не комментарием? ;)
            • 0
              Так судьба сложилась… =)

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