diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb index 97b6fa06..a1202cb9 100644 --- a/lib/linguist/blob_helper.rb +++ b/lib/linguist/blob_helper.rb @@ -262,6 +262,9 @@ module Linguist # If it's a .r file, try to guess the 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 pathname.language || @@ -304,6 +307,26 @@ module Linguist 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 # # Requires Blob#data diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 46bbd766..eab2a7a5 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -589,6 +589,12 @@ Perl: - .perl - .psgi +Prolog: + major: true + extensions: + - .pro + - .prolog + Pure Data: major: true lexer: Text only diff --git a/test/test_blob.rb b/test/test_blob.rb index bcc63a98..9d6c9670 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -228,6 +228,11 @@ class TestBlob < Test::Unit::TestCase assert_equal Language['R'], blob("hello-r.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 assert_equal Language['OCaml'], blob("Foo.ml").language assert_equal Language['Standard ML'], blob("Foo.sig").language diff --git a/test/test_language.rb b/test/test_language.rb index ffea3054..1a9f4108 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -81,6 +81,7 @@ class TestLanguage < Test::Unit::TestCase assert_equal Lexer['Ooc'], Language['ooc'].lexer assert_equal Lexer['PHP'], Language['PHP'].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'], Language['Python'].lexer assert_equal Lexer['REBOL'], Language['Rebol'].lexer @@ -310,6 +311,7 @@ class TestLanguage < Test::Unit::TestCase assert Language['Objective-J'].major? assert Language['PHP'].major? assert Language['Perl'].major? + assert Language['Prolog'].major? assert Language['Pure Data'].major? assert Language['Python'].major? assert Language['R'].major?