Написание питона script, и ему нужно выяснить, на каком языке написан блок кода. Я мог бы легко написать это сам, но я хотел бы знать, существует ли решение.
Пигменты недостаточны и ненадежны.
Написание питона script, и ему нужно выяснить, на каком языке написан блок кода. Я мог бы легко написать это сам, но я хотел бы знать, существует ли решение.
Пигменты недостаточны и ненадежны.
Pygments может угадать. Вот пример из документации:
>>> from pygments.lexers import guess_lexer, guess_lexer_for_filename
>>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"')
<pygments.lexers.PythonLexer>
>>> guess_lexer_for_filename('test.py', 'print "Hello World!"')
<pygments.lexers.PythonLexer>
Я думаю, вы должны попробовать, что использует этот самый сайт: google-code-prettify (из this вопрос)
[EDIT] J.F. Себастьян указал мне на Pygments (см. этот ответ)
Это может быть немного трудно сделать надежно. Например, какой язык является следующим:
print("blah");
Самый надежный способ (за исключением того, что пользователь выбирает правильный язык, конечно), - это проверить, начинается ли первая строка с #!
( "hashbang" ) - независимо от того, что после этого является интерпретатором сценариев язык.
Это будет надежно работать для многих языков сценариев (включая скрипты python, shell, perl, ruby и т.д. и т.д.), но не для компилированных языков.
Вы можете искать уникальные синтаксические стили, или конкретные ключевые слова, и вес каждого из них на определенный язык. Например, $#somevar
, вероятно, Perl. somevar.each do |another| ..... end
, вероятно, рубин.. но это в конечном итоге будет большой работой и не всегда будет работать (особенно с короткими блоками кода)
Другой очевидный способ - использовать расширение файла. Если это *.pl
, это, вероятно, код Perl..
Чего вы пытаетесь достичь? Если вы хотите выделить синтаксис, посмотрите, что google-code-prettify делает - в основном разумный, общий синтаксический синтаксис.
В вышеприведенном двусмысленном примере print
, вероятно, является выражением оператора или функции, "blah"
, вероятно, является строкой. Если вы выделите эти два по-разному, вы успешно выделили много разных языков, не обнаружив, что это на самом деле... но это может не всегда работать в зависимости от задачи.
Ohcount разработан для этого точно: http://labs.ohloh.net/ohcount
Они используют его на www.ohloh.net, чтобы подсчитать вклад людей в языки.
Плохая новость в том, что она закодирована в ruby, но я уверен, что вы можете интегрировать ее так или иначе в python.
Vim использует кучу интересных тестов и регулярных выражений для поиска определенных форматов файлов. Вы можете посмотреть файл инструкции vim в vim/vim71/filetype.vim
или здесь онлайн.
какой язык блок кода написан в
Каковы ваши альтернативы, среди каких языков? Невозможно определить это универсально. Но если вы сузите фокус, возможно, где-то есть инструмент
Вы можете проверить highlight.js, который автоматически выделяет блок кода, они говорят, что используют какие-то эвристические методы для выполнения этого http://softwaremaniacs.org/soft/highlight/en/
Поскольку вы задали этот вопрос, GitHub выпустил код, который они используют для обнаружения языков программирования, Linguist. По моему опыту, GitHub очень точен.
Определение языка
Linguist определяет список всех языков, известных GitHub в файле yaml. Чтобы выделить файл, необходимо указать язык и лексер.
Большинство языков определяется их расширением. Это самая быстрая и наиболее распространенная ситуация.
Для устранения неоднозначности между файлами с общими расширениями мы используем байесовский классификатор. Например, это помогает нам определить разницу между файлами .h, которые могут быть либо C, С++, либо Obj-C.
Ruby gem: http://rubygems.org/gems/github-linguist
Если вы не можете использовать Ruby по какой-либо причине, логика достаточно проста для порта https://github.com/github/linguist/blob/master/lib/linguist/language.rb
Как утверждают другие, Pyigs будет вашим лучшим выбором.