Определение языка сценариев из строки

#php #scripting #syntax-highlighting

#php #сценарии #подсветка синтаксиса

Вопрос:

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

Любые существующие методы определения языка сценариев данного файла по содержимому и / или местоположению?

У меня есть тип mime из:

 $finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime_type = @finfo_file($finfo, $full_path );
 

Это позволяет мне знать, что это, по крайней мере, текст (я также разрешаю загрузку не текста).

Я думаю, что анализ строки / расширения файла bang или поиск простых тегов, таких как php, дали бы мне хороший путь для таких вещей, как perl / shell scripts / php.

У меня также есть путь к файлу, поскольку эти файлы поступают непосредственно с исходных серверов, поэтому правила, основанные на пути, могут работать для таких вещей, как /etc/httpd/conf.d/* , /etc/passwd.

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

Еще одно предостережение. Некоторые из этих файлов могут иметь размер> 150 МБ, поэтому я хотел бы прочитать только часть файла, хотя я мог бы просто отключить эту функцию для больших файлов, если это необходимо.

Комментарии:

1. Почему вы не смотрите на расширение файла?

Ответ №1:

Если вы можете вызвать внешнюю программу, попробуйте команду Linux file .

Комментарии:

1. Да, я могу. Это дает мне синтаксический анализ строки. Хорошее начало.

2. Вы знаете, я отклонил возможности ‘file’ как не что иное, как то, что дал бы мне mime-тип, но я только что протестировал это, и это довольно хорошо. На самом деле .. не удается обнаружить скрипты perl как perl на смонтированной Windows fs.

3. Начинаются ли неверно идентифицированные скрипты perl со строки bang?

4. Да, но они похожи на #!perl

Ответ №2:

Я удивлен, что никто не указал мне на prettify.js из кода Google. Вероятно, он будет делать все, что мне нужно, на стороне клиента.