Подсветка синтаксиса в консоли на PHP

Подсветка синтаксиса в консоли на PHP

Подсветка синтаксиса в консоли на PHP

Создание PHP скрипта, который форматирует код для вывода в консоль, может быть полезным для целей отладки и логирования. Ниже приведен простой PHP скрипт, который форматирует код с подсветкой синтаксиса для вывода в консоль. Этот скрипт использует ANSI-коды для добавления цветов к различным частям кода.

CodeFormatter.php

<?php



class CodeFormatter

{

    // ANSI-коды для цветов

    private const RESET = "33[0m";

    private const RED = "33[31m";

    private const GREEN = "33[32m";

    private const YELLOW = "33[33m";

    private const BLUE = "33[34m";

    private const MAGENTA = "33[35m";

    private const CYAN = "33[36m";

    private const WHITE = "33[37m";



    // Ключевые слова для подсветки

    private const KEYWORDS = [

        'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue',

        'declare', 'default', 'do', 'else', 'elseif', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch',

        'endwhile', 'extends', 'final', 'finally', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements',

        'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'namespace', 'new', 'or', 'private',

        'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try',

        'use', 'var', 'while', 'xor', 'yield'

    ];



    /**

     * Форматирование и вывод кода с подсветкой синтаксиса

     *

     * @param string $code

     */

    public static function formatCode(string $code): void

    {

        $lines = explode(PHP_EOL, $code);

        foreach ($lines as $line) {

            self::printFormattedLine($line);

        }

    }



    /**

     * Вывод одной строки с подсветкой синтаксиса

     *

     * @param string $line

     */

    private static function printFormattedLine(string $line): void

    {

        $tokens = token_get_all('<?php ' . $line);

        array_shift($tokens); // Удаление токена открывающего тега PHP



        foreach ($tokens as $token) {

            if (is_array($token)) {

                [$id, $text] = $token;

                switch ($id) {

                    case T_COMMENT:

                    case T_DOC_COMMENT:

                        echo self::GREEN . $text . self::RESET;

                        break;

                    case T_STRING:

                        if (in_array(strtolower($text), self::KEYWORDS, true)) {

                            echo self::BLUE . $text . self::RESET;

                        } else {

                            echo self::YELLOW . $text . self::RESET;

                        }

                        break;

                    case T_VARIABLE:

                        echo self::CYAN . $text . self::RESET;

                        break;

                    default:

                        echo $text;

                }

            } else {

                echo $token;

            }

        }

        echo PHP_EOL;

    }

}

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

Вы можете использовать класс CodeFormatter для форматирования и вывода PHP кода с подсветкой синтаксиса. Вот пример:

<?php



require 'CodeFormatter.php';



$code = <<<'PHP'

<?php

function greet($name) {

    echo "Hello, $name!";

}



// Вызов функции

greet("World");

PHP;



CodeFormatter::formatCode($code);

Объяснение

  • Класс CodeFormatter определяет константы для ANSI-кодов различных цветов.
  • Он определяет список ключевых слов PHP для подсветки.
  • Метод formatCode принимает строку PHP кода, разбивает её на строки и выводит каждую строку с подсветкой синтаксиса.
  • Метод printFormattedLine использует функцию token_get_all для токенизации кода и применения цветов на основе типа токена.
  • Этот скрипт предоставляет базовую подсветку синтаксиса для PHP кода в консоли. Вы можете расширить его для поддержки большего количества типов токенов и языков по мере необходимости.

    Источник

    НЕТ КОММЕНТАРИЕВ

    Оставить комментарий