mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Added detection for Prolog and disambiguation for .pl files
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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?
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user