diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index bc475023..04441935 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -57,14 +57,20 @@ module Linguist # # Returns a String. def extension - # File.extname returns nil if the filename is an extension. - extension = File.extname(name) - basename = File.basename(name) - # Checks if the filename is an extension. - if extension.empty? && basename[0] == "." - basename - else - extension + extensions.last || "" + end + + # Public: Return an array of the file extensions + # + # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions + # => [".html.erb", ".erb"] + # + # Returns an Array + def extensions + basename, *segments = File.basename(name).split(".") + + segments.map.with_index do |segment, index| + "." + segments[index..-1].join(".") end end end diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index f4c7a62e..b811baa5 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -106,8 +106,8 @@ module Linguist # A bit of an elegant hack. If the file is executable but extensionless, # append a "magic" extension so it can be classified with other # languages that have shebang scripts. - extension = FileBlob.new(name).extension - if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 + extensions = FileBlob.new(name).extensions + if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 name += ".script!" end @@ -190,8 +190,13 @@ module Linguist # Returns all matching Languages or [] if none were found. def self.find_by_filename(filename) basename = File.basename(filename) - extname = FileBlob.new(filename).extension - (@filename_index[basename] + find_by_extension(extname)).compact.uniq + + # find the first extension with language definitions + extname = FileBlob.new(filename).extensions.detect do |e| + !@extension_index[e].empty? + end + + (@filename_index[basename] + @extension_index[extname]).compact.uniq end # Public: Look up Languages by file extension. diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb new file mode 100644 index 00000000..9371dce7 --- /dev/null +++ b/test/test_file_blob.rb @@ -0,0 +1,10 @@ +require 'linguist/file_blob' +require 'test/unit' + +class TestFileBlob < Test::Unit::TestCase + def test_extensions + assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions + assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions + assert_equal [".html.erb", ".erb"], Linguist::FileBlob.new("dotted.dir/index.html.erb").extensions + end +end diff --git a/test/test_language.rb b/test/test_language.rb index 1ad47e33..bea5c8bc 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -223,6 +223,7 @@ class TestLanguage < Test::Unit::TestCase assert_equal [Language['Clojure']], Language.find_by_filename('riemann.config') assert_equal [Language['HTML+Django']], Language.find_by_filename('index.jinja') assert_equal [Language['Chapel']], Language.find_by_filename('examples/hello.chpl') + assert_equal [Language['Ant Build System']], Language.find_by_filename('build.ant.xml') end def test_find_by_shebang