Added detection for Prolog and disambiguation for .pl files

This commit is contained in:
Andrei Formiga
2011-07-05 17:33:28 -03:00
parent 302f8763b7
commit b3e7065972
4 changed files with 36 additions and 0 deletions

View File

@@ -262,6 +262,9 @@ module Linguist
# If it's a .r file, try to guess the language # If it's a .r file, try to guess the language
r_language || r_language ||
# If it's a .pl file, try to guess the language
pl_language ||
# See if there is a Language for the extension # See if there is a Language for the extension
pathname.language || pathname.language ||
@@ -304,6 +307,26 @@ module Linguist
end end
end end
# Internal: Guess language of .pl files
#
# Returns a Language.
def pl_language
return unless extname == '.pl'
# The rules for disambiguation are:
#
# 1. Many perl files begin with a shebang
# 2. Most Prolog source files have a rule somewhere (marked by the :- operator)
# 3. Default to Perl, because it is more popular
if shebang_script == 'perl'
Language['Perl']
elsif lines.grep(/:-/).any?
Language['Prolog']
else
Language['Perl']
end
end
# Internal: Extract the script name from the shebang line # Internal: Extract the script name from the shebang line
# #
# Requires Blob#data # Requires Blob#data

View File

@@ -589,6 +589,12 @@ Perl:
- .perl - .perl
- .psgi - .psgi
Prolog:
major: true
extensions:
- .pro
- .prolog
Pure Data: Pure Data:
major: true major: true
lexer: Text only lexer: Text only

View File

@@ -228,6 +228,11 @@ class TestBlob < Test::Unit::TestCase
assert_equal Language['R'], blob("hello-r.R").language assert_equal Language['R'], blob("hello-r.R").language
assert_equal Language['Rebol'], blob("hello-rebol.r").language assert_equal Language['Rebol'], blob("hello-rebol.r").language
# .pl disambiguation
assert_equal Language['Prolog'], blob("test-prolog.pl").language
assert_equal Language['Perl'], blob("test-perl.pl").language
assert_equal Language['Perl'], blob("test-perl2.pl").language
# ML # ML
assert_equal Language['OCaml'], blob("Foo.ml").language assert_equal Language['OCaml'], blob("Foo.ml").language
assert_equal Language['Standard ML'], blob("Foo.sig").language assert_equal Language['Standard ML'], blob("Foo.sig").language

View File

@@ -81,6 +81,7 @@ class TestLanguage < Test::Unit::TestCase
assert_equal Lexer['Ooc'], Language['ooc'].lexer assert_equal Lexer['Ooc'], Language['ooc'].lexer
assert_equal Lexer['PHP'], Language['PHP'].lexer assert_equal Lexer['PHP'], Language['PHP'].lexer
assert_equal Lexer['Perl'], Language['Perl'].lexer assert_equal Lexer['Perl'], Language['Perl'].lexer
assert_equal Lexer['Prolog'], Language['Prolog'].lexer
assert_equal Lexer['Python Traceback'], Language['Python traceback'].lexer assert_equal Lexer['Python Traceback'], Language['Python traceback'].lexer
assert_equal Lexer['Python'], Language['Python'].lexer assert_equal Lexer['Python'], Language['Python'].lexer
assert_equal Lexer['REBOL'], Language['Rebol'].lexer assert_equal Lexer['REBOL'], Language['Rebol'].lexer
@@ -310,6 +311,7 @@ class TestLanguage < Test::Unit::TestCase
assert Language['Objective-J'].major? assert Language['Objective-J'].major?
assert Language['PHP'].major? assert Language['PHP'].major?
assert Language['Perl'].major? assert Language['Perl'].major?
assert Language['Prolog'].major?
assert Language['Pure Data'].major? assert Language['Pure Data'].major?
assert Language['Python'].major? assert Language['Python'].major?
assert Language['R'].major? assert Language['R'].major?