Я ищу механизм выделения синтаксиса PHP, который может быть настроен (т. Е. Я могу предоставить свои собственные токенизаторы для новых языков) и который может обрабатывать несколько языков одновременно (т.е. на той же странице вывода). Этот движок должен хорошо работать вместе с классами CSS , т. Е. Он должен форматировать вывод, вставляя элементы <span>
, которые украшены атрибутами class
. Бонусные баллы за расширяемую схему.
Я не ищу сценарий подсветки синтаксиса на стороне клиента (JavaScript).
До сих пор я застрял в GeSHi . К сожалению, GeSHi терпит неудачу по нескольким причинам. Основная причина в том, что разные языковые файлы определяют совершенно разные, непоследовательные стили. Я много работал, пытаясь реорганизовать различные определения языков до общего знаменателя, но поскольку большинство файлов определения сами по себе довольно плохие, я, наконец, хотел бы переключиться.
В идеале, я бы хотел иметь API, похожий на CodeRay , Pygments или JavaScript dp.SyntaxHighlighter .
Я ищу код, выделяющий программное обеспечение, написанное на PHP, а не PHP (так как мне нужно использовать его изнутри PHP).
Поскольку ни один из существующих инструментов не удовлетворил мои потребности, я написал свои собственные. И вот:
Использование чрезвычайно просто: просто используйте
<?php hyperlight($code, 'php'); ?>
для выделения кода. Написание новых определений языков относительно просто – с использованием регулярных выражений и мощной, но простой конечной машины. Кстати, мне все еще нужно много определений, поэтому не стесняйтесь вносить свой вклад.
[Я отметил этот ответ как Community Wiki, потому что вы специально не ищете Javascript]
http://softwaremaniacs.org/soft/highlight/ – это PHP ( плюс следующий список поддерживаемых языков ): библиотека подсветки синтаксиса:
Python, Ruby, Perl, PHP, XML, HTML, CSS, Django, Javascript, VBScript, Delphi, Java, C ++, C #, Lisp, RenderMan (RSL и RIB), встроенный язык Maya, SQL, SmallTalk, Axapta, 1C, Ini , Diff, DOS .bat, Bash
Он использует разметку стиля <span class = "keyword"> .
Он также был интегрирован в набор инструментов dojo (как проект dojox: dojox.lang.highlight )
Хотя это и не самый популярный способ запуска веб-сервера, строго говоря, Javascript не только реализуется на стороне клиента, но также есть комбинации движка и платформы на стороне сервера Javascript .
Я нашел этот простой генератор синтаксиса синтаксиса, написанный на 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| \<\!\-\-[\s\S]+\-\-\>| (?<!\\\)".*?(?<!\\\)"| (?<!\\\)\'(.*?)(?<!\\\)\' )/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)( (\$|\%|\@)(\->|\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) == '<!--') { $a[$id] = '<span class="C">' . $match . '</span>'; } else { $a[$id] = '<span class="S">' . $match . '</span>'; } return $id; } } ?>
во<?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| \<\!\-\-[\s\S]+\-\-\>| (?<!\\\)".*?(?<!\\\)"| (?<!\\\)\'(.*?)(?<!\\\)\' )/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)( (\$|\%|\@)(\->|\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) == '<!--') { $a[$id] = '<span class="C">' . $match . '</span>'; } else { $a[$id] = '<span class="S">' . $match . '</span>'; } return $id; } } ?>
Демо: http://phpfiddle.org/lite/code/1sf-htn
Я только что создал порт 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('<div class="foo"></div>'); ?></code></pre>
Возможно, стоит посмотреть на Pear_TextHighlighter ( документация )
Я думаю, что он не будет по умолчанию выводить html точно так, как вы этого хотите, но он предоставляет обширные возможности для настройки (т. Е. Вы можете создавать разные рендереры / парсеры)
У меня была точно такая же проблема, но, поскольку я был очень коротким по времени и нуждался в действительно хорошем покрытии кода, я решил написать оболочку PHP вокруг библиотеки Pygments .
Это называется PHPygmentizator . Это очень просто использовать. Я написал очень простое руководство . Поскольку PHP является языком веб-разработки в первую очередь, я подчинил структуру этому факту и сделал его очень простым для реализации практически на любом веб-сайте.
Он поддерживает файлы конфигурации, и если этого недостаточно, и кому-то нужно модифицировать материал в процессе, он также запускает события .
Демонстрация того, как это работает, можно найти в любой записи моего блога, содержащей исходный код, например , этот .
С конфигурацией по умолчанию вы можете просто предоставить ему строку в этом формате:
Any text here. [pygments=javascript] var a = function(ar1, ar2) { return null; } [/pygments] Any text.
Таким образом, он выделяет код между тегами (теги могут быть настроены в файле конфигурации), а остальные остаются нетронутыми.
Кроме того, я уже создал библиотеку распознавания синтаксиса (она использует алгоритм, который, вероятно, будет классифицирован как байесовская вероятность ), который автоматически распознает, какой блок кода языка написан и может быть легко подключен к одному из событий PHPygmentizator, чтобы обеспечить автоматическое распознавание языка. Вероятно, я расскажу об этом некоторое время на этой неделе, так как мне нужно немного украсить структуру и написать некоторую базовую документацию. Если вы снабдите его достаточными «обучающими» данными, он прекрасно узнает языки, я тестировал даже миниатюрные javascripts и языки, которые имеют похожие ключевые слова и структуры, и он никогда не совершал ошибок.
Другой вариант – использовать графическую программу GPL Highlight GUI от Andre Simon, которая доступна для большинства платформ. Он преобразует PHP (и другие языки) в HTML, RTF, XML и т. Д., Которые затем можно вырезать и вставлять на нужную вам страницу. Таким образом, обработка выполняется только один раз.
HTML также основан на CSS, поэтому вы можете изменить стиль по своему усмотрению.
Лично я использую dp.SyntaxHighlighter , но он использует Javascript на стороне клиента, поэтому он не отвечает вашим потребностям. У этого есть хороший плагин Windows Live, хотя я считаю полезным.
Немного поздно, чтобы перезвонить здесь, но я работал над своей собственной библиотекой подсветки синтаксиса PHP. Он все еще находится на ранних стадиях, но я использую его для всех образцов кода в своем блоге.
Просто проверил Hyperlight. Это выглядит довольно круто, но он делает довольно сумасшедшие вещи. Вложенные циклы, обработка строк за строкой и т. Д. Основной класс – более 1000 строк кода.
Если вас интересует что-то простое и легкое, просмотрите Nijikodo: http://www.craigiam.com/nijikodo
Почему бы не использовать ярлык синтаксиса синтаксиса PHP?
PHP Highlighter от Krijn Hoetmer предоставляет полностью настраиваемый класс PHP для выделения синтаксиса PHP. HTML, который он генерирует, проверяет под строгим doctype и полностью стилизуется с помощью CSS.
PHP Prettify работает отлично до сих пор, и имеет больше настроек, чем highlight_string