Подтвердить что ты не робот

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

Я ищу механизм синтаксического синтаксиса синтаксиса, который можно настроить (например, я могу предоставить свои собственные токенизаторы для новых языков) и которые могут обрабатывать одновременно несколько языков (т.е. на той же странице вывода). Этот движок должен хорошо работать вместе с классами CSS, т.е. Он должен форматировать вывод, вставляя <span> элементы, которые украшены атрибутами class. Бонусные точки для расширяемой схемы.

Я не ищу подсветку синтаксиса на стороне клиента script (JavaScript).

До сих пор я придерживался GeSHi. К сожалению, GeSHi терпит неудачу по нескольким причинам. Основная причина в том, что разные языковые файлы определяют совершенно разные, непоследовательные стили. Я много работал, пытаясь реорганизовать различные определения языков до общего знаменателя, но поскольку большинство файлов определения сами по себе довольно плохие, я бы, наконец, хотел переключиться.

В идеале, я хотел бы иметь API, похожий на CodeRay, Pygments или JavaScript dp.SyntaxHighlighter.

Разъяснение:

Я ищу программное обеспечение для выделения кода, написанное на PHP, а не для PHP (так как мне нужно использовать его изнутри PHP).

4b9b3361

Ответ 1

Поскольку ни один из существующих инструментов не удовлетворил мои потребности, я написал свои собственные. Вот и вот:

Hyperlight

Использование очень просто: просто используйте

 <?php hyperlight($code, 'php'); ?>

чтобы выделить код. Написание новых определений языков относительно просто - с использованием регулярных выражений и мощной, но простой конечной машины. Кстати, мне все еще нужно много определений, поэтому не стесняйтесь вносить свой вклад.

Ответ 2

[Я отметил этот ответ как Community Wiki, потому что вы специально не ищете Javascript]

http://softwaremaniacs.org/soft/highlight/ - это PHP (плюс следующий список поддерживаемых языков) библиотека подсветки синтаксиса:

Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, С++, С#, Lisp, RenderMan (RSL и RIB), Maya Embedded Language, SQL, SmallTalk, Axapta, 1C, Ini, Diff, DOS.bat, Bash

Он использует < span class= "keyword" > стиль разметки.

Он также был интегрирован в dojo toolkit (в качестве проекта dojox: dojox.lang.highlight)

Хотя это не самый популярный способ запуска веб-сервера, строго говоря, Javascript не только реализуется на стороне клиента, но также есть Server-Side Комбинации Javascript с двигателем и платформой тоже.

Ответ 3

Я нашел этот простой генератор синтаксиса синтаксиса, написанный на PHP здесь и немного изменил его:

<?php

/**
 * Original => http://phoboslab.org/log/2007/08/generic-syntax-highlighting-with-regular-expressions
 * Usage => `echo SyntaxHighlight::process('source code here');`
 */

class SyntaxHighlight {
    public static function process($s) {
        $s = htmlspecialchars($s);

        // Workaround for escaped backslashes
        $s = str_replace('\\\\','\\\\<e>', $s); 

        $regexp = array(

            // Comments/Strings
            '/(
                \/\*.*?\*\/|
                \/\/.*?\n|
                \#.[^a-fA-F0-9]+?\n|
                \&lt;\!\-\-[\s\S]+\-\-\&gt;|
                (?<!\\\)&quot;.*?(?<!\\\)&quot;|
                (?<!\\\)\'(.*?)(?<!\\\)\'
            )/isex' 
            => 'self::replaceId($tokens,\'$1\')',

            // Punctuations
            '/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
            => '<span class="P">$1</span>',

            // Numbers (also look for Hex)
            '/(?<!\w)(
                (0x|\#)[\da-f]+|
                \d+|
                \d+(px|em|cm|mm|rem|s|\%)
            )(?!\w)/ix'
            => '<span class="N">$1</span>',

            // Make the bold assumption that an
            // all uppercase word has a special meaning
            '/(?<!\w|>|\#)(
                [A-Z_0-9]{2,}
            )(?!\w)/x'
            => '<span class="D">$1</span>',

            // Keywords
            '/(?<!\w|\$|\%|\@|>)(
                and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
                elseif|new|delete|try|throw|catch|finally|class|function|string|
                array|object|resource|var|bool|boolean|int|integer|float|double|
                real|string|array|global|const|static|public|private|protected|
                published|extends|switch|true|false|null|void|this|self|struct|
                char|signed|unsigned|short|long
            )(?!\w|=")/ix'
            => '<span class="K">$1</span>',

            // PHP/Perl-Style Vars: $var, %var, @var
            '/(?<!\w)(
                (\$|\%|\@)(\-&gt;|\w)+
            )(?!\w)/ix'
            => '<span class="V">$1</span>'

        );

        $tokens = array(); // This array will be filled from the regexp-callback

        $s = preg_replace(array_keys($regexp), array_values($regexp), $s);

        // Paste the comments and strings back in again
        $s = str_replace(array_keys($tokens), array_values($tokens), $s);

        // Delete the "Escaped Backslash Workaround Token" (TM)
        // and replace tabs with four spaces.
        $s = str_replace(array('<e>', "\t"), array('', '    '), $s);

        return '<pre><code>' . $s . '</code></pre>';
    }

    // Regexp-Callback to replace every comment or string with a uniqid and save
    // the matched text in an array
    // This way, strings and comments will be stripped out and wont be processed
    // by the other expressions searching for keywords etc.
    private static function replaceId(&$a, $match) {
        $id = "##r" . uniqid() . "##";

        // String or Comment?
        if(substr($match, 0, 2) == '//' || substr($match, 0, 2) == '/*' || substr($match, 0, 2) == '##' || substr($match, 0, 7) == '&lt;!--') {
            $a[$id] = '<span class="C">' . $match . '</span>';
        } else {
            $a[$id] = '<span class="S">' . $match . '</span>';
        }
        return $id;
    }
}

?>

Демо: http://phpfiddle.org/lite/code/1sf-htn


Update

Я только что создал порт PHP моего собственного синтаксиса синтаксиса JavaScript здесь → https://github.com/tovic/generic-syntax-highlighter/blob/master/generic-syntax-highlighter.php

Как использовать:

<?php require 'generic-syntax-highlighter.php'; ?>
<pre><code><?php echo SH('&lt;div class="foo"&gt;&lt;/div&gt;'); ?></code></pre>

Ответ 4

Возможно, стоит посмотреть Pear_TextHighlighter (документация)

Я думаю, что он не будет по умолчанию выводить html точно так, как вы этого хотите, но он предоставляет широкие возможности для настройки (т.е. вы можете создавать разные рендеринги/парсеры)

Ответ 5

У меня была точно такая же проблема, но, поскольку я был очень коротким во времени и нуждался в действительно хорошем покрытии кода, я решил написать оболочку PHP вокруг Pygments библиотека.

Он называется PHPygmentizator. Это очень просто использовать. Я написал очень простой справочник . Поскольку PHP является языком веб-разработки в первую очередь, я подчинил структуру этому факту и сделал ее очень простой в использовании практически на любом веб-сайте.

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

Демонстрация того, как это работает, можно найти в любой записи моего блога, содержащей исходный код этот пример.

С конфигурацией по умолчанию вы можете просто указать строку в этом формате:

Any text here.

[pygments=javascript]
var a = function(ar1, ar2) {
    return null;
}
[/pygments]

Any text.

Таким образом, он выделяет код между тегами (теги могут быть настроены в файле конфигурации), а остальные остаются нетронутыми.

Кроме того, я уже создал библиотеку распознавания синтаксиса (он использует алгоритм, который, вероятно, будет классифицирован как байесовская вероятность), который автоматически распознает, какой языковой кодовый блок написано и может быть легко подключено к одному из событий PHPygmentizator, чтобы обеспечить автоматическое распознавание языка. Вероятно, я расскажу об этом некоторое время на этой неделе, так как мне нужно немного украсить структуру и написать некоторую базовую документацию. Если вы снабдите его достаточными "обучающими" данными, он прекрасно узнает языки, я тестировал даже миниатюрные javascripts и языки, которые имеют похожие ключевые слова и структуры, и он никогда не совершал ошибок.

Ответ 6

Другим вариантом является использование программы GPL Highlight GUI от Andre Simon, доступной для большинства платформ. Он преобразует PHP (и другие языки) в HTML, RTF, XML и т.д., Которые затем можно вырезать и вставлять на нужную вам страницу. Таким образом, обработка выполняется только один раз.

HTML также основан на CSS, поэтому вы можете изменить стиль по своему усмотрению.

Лично я использую dp.SyntaxHighlighter, но использует Javascript на стороне клиента, поэтому он не удовлетворить ваши потребности. У этого есть хороший плагин Windows Live, хотя я считаю полезным.

Ответ 7

Немного поздно, чтобы перезвонить здесь, но я работал над своей собственной библиотекой подсветки синтаксиса PHP. Он все еще находится на ранних стадиях, но я использую его для всех образцов кода в своем блоге.

Только что проверил Hyperlight. Это выглядит довольно круто, но он делает довольно сумасшедшие вещи. Вложенные циклы, обработка строк за строкой и т.д. Основной класс - более 1000 строк кода.

Если вы заинтересованы в чем-то простом и легком осмотре Nijikodo: http://www.craigiam.com/nijikodo

Ответ 9

Krijn Hoetmer PHP Highlighter предоставляет полностью настраиваемый класс PHP для выделения синтаксиса PHP. HTML, который он генерирует, проверяет под строгим doctype и полностью стилизуется с помощью CSS.

Ответ 10

PHP Prettify Хорошо работает до сих пор, И имеет больше настроек, чем highlight_string