是否有一个库可以检测代码块的源代码语言?

时间:2008-11-28 06:40:35

标签: python

编写一个python脚本,它需要找出写入代码块的语言。我可以自己轻松编写,但我想知道解决方案是否已经存在。

Pygments不够且不可靠。

9 个答案:

答案 0 :(得分:12)

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>

答案 1 :(得分:6)

我想您应该尝试本网站使用的内容:google-code-prettify(来自this question

[编辑] J.F。塞巴斯蒂安向我指出Pygments(见this answer

答案 2 :(得分:3)

这可能有点难以可靠地完成。例如,以下是什么语言:

print("blah");

最可靠的方法(当然,除了让用户选择正确的语言之外)是检查第一行是否以#!(“hashbang”)开头 - 无论是在此之后是什么?脚本语言。

这对于许多脚本语言(包括python,shell脚本,perl,ruby等等)可靠地工作,但不适用于编译语言..

您可以寻找独特的语法样式或特定关键字,并针对特定语言对每个关键字进行加权。例如,$#somevar可能是Perl。 somevar.each do |another| ..... end可能是红宝石......但这最终会成为很多的工作,并且不会一直有效(特别是对于短代码块)

另一个显而易见的方法是使用文件扩展名。如果它是*.pl它可能是Perl代码..

你想要达到什么目的?如果你想要语法高亮,看看google-code-prettify做了什么 - 基本上是一个相当聪明的通用语法高亮显示器..

在上面的上述模糊示例中,print可能是一个语句或函数名称,"blah"可能是一个字符串。如果你以不同的方式突出显示这两者,你已经成功地突出显示了不同语言的 lot ,而不必检测它实际上是什么......但是这可能并不总是有效,具体取决于任务.. < / p>

答案 3 :(得分:3)

Ohcount就是为此而开发的: http://labs.ohloh.net/ohcount

他们在www.ohloh.net上使用它来计算人们对语言的贡献。

坏消息是它是用ruby编码的,但我确信你可以在python中以这种或那种方式集成它。

答案 4 :(得分:2)

Vim使用一堆有趣的测试和正则表达式来查找某些文件格式。您可以在vim/vim71/filetype.vimhere online查看vim指令文件。

答案 5 :(得分:1)

  

编写代码块的语言

您可以选择哪种语言?普遍没有办法确定这一点。但如果你缩小你的注意力,可能会有一个工具

答案 6 :(得分:1)

你可以查看突出显示代码块的highlight.js,他们说他们正在使用某种启发式方法来完成这个http://softwaremaniacs.org/soft/highlight/en/

答案 7 :(得分:1)

由于您提出了这个问题,GitHub已经发布了用于检测编程语言的代码Linguist。根据我的经验,GitHub非常准确。

  

语言检测

     

Linguist在yaml文件中定义GitHub已知的所有语言的列表。为了突出显示文件,必须在那里定义语言和词法分析器。

     

大多数语言都是通过文件扩展名检测到的。这是最快和最常见的情况。

     

为了消除具有公共扩展名的文件之间的歧义,我们使用贝叶斯分类器。例如,这有助于我们区分.h文件,它们可以是C,C ++或Obj-C。

Ruby gem:http://rubygems.org/gems/github-linguist

如果因任何原因无法使用Ruby,逻辑就足以移植https://github.com/github/linguist/blob/master/lib/linguist/language.rb

答案 8 :(得分:0)

正如其他人所说,Pygments将是你最好的选择。