diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb index 5f843ac6..44264327 100644 --- a/lib/linguist/blob_helper.rb +++ b/lib/linguist/blob_helper.rb @@ -281,6 +281,9 @@ module Linguist # If it's a .m file, try to guess the language m_language || + # If it's a .pl file, try to guess the language + pl_language || + # If it's a .r file, try to guess the language r_language || @@ -347,6 +350,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: Guess language of .r files. # # Returns a Language. diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index f36ee009..ffae58e5 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -590,6 +590,12 @@ Perl: - .perl - .psgi +Prolog: + major: true + extensions: + - .pro + - .prolog + Pure Data: major: true lexer: Text only diff --git a/test/fixtures/test-perl.pl b/test/fixtures/test-perl.pl new file mode 100644 index 00000000..83710279 --- /dev/null +++ b/test/fixtures/test-perl.pl @@ -0,0 +1,2 @@ +#!/usr/bin/perl +print "Hello, world!\n"; diff --git a/test/fixtures/test-perl2.pl b/test/fixtures/test-perl2.pl new file mode 100644 index 00000000..55a2762c --- /dev/null +++ b/test/fixtures/test-perl2.pl @@ -0,0 +1,3 @@ + +# Perl file without shebang +print "Hello, world!\n"; diff --git a/test/fixtures/test-prolog.pl b/test/fixtures/test-prolog.pl new file mode 100644 index 00000000..aab83d54 --- /dev/null +++ b/test/fixtures/test-prolog.pl @@ -0,0 +1,12 @@ +/* Prolog test file */ +male(john). +male(peter). + +female(vick). +female(christie). + +parents(john, peter, christie). +parents(vick, peter, christie). + +/* X is a brother of Y */ +brother(X, Y) :- male(X), parents(X, F, M), parents(Y, F, M). diff --git a/test/test_blob.rb b/test/test_blob.rb index 11be67a9..b9b67244 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -230,9 +230,10 @@ class TestBlob < Test::Unit::TestCase assert_equal Language['Ruby'], blob("wrong_shebang.rb").language assert_nil blob("octocat.png").language - # .r disambiguation - 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 # .m disambiguation assert_equal Language['Objective-C'], blob("Foo.m").language @@ -240,6 +241,10 @@ class TestBlob < Test::Unit::TestCase assert_equal Language['Matlab'], blob("matlab_function.m").language assert_equal Language['Matlab'], blob("matlab_script.m").language + # .r disambiguation + assert_equal Language['R'], blob("hello-r.R").language + assert_equal Language['Rebol'], blob("hello-rebol.r").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?