aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2012-08-03 13:53:12 -0500
committerJoshua Peek <josh@joshpeek.com>2012-08-03 13:53:12 -0500
commit6014bd015e56dbfd212bc1a6d9c75cc36a1449c7 (patch)
tree31f0838f9116519d00ce60d79d9a9dc309962a3c /lib
parent4a06d2ea7ed28c55879be8a2894ff2b07ab5808e (diff)
Change find_by_filename api to return all matching languages
Diffstat (limited to 'lib')
-rw-r--r--lib/linguist/blob_helper.rb29
-rw-r--r--lib/linguist/language.rb36
2 files changed, 16 insertions, 49 deletions
diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb
index 38e6d26..ee9f32f 100644
--- a/lib/linguist/blob_helper.rb
+++ b/lib/linguist/blob_helper.rb
@@ -410,14 +410,15 @@ module Linguist
def guess_language
return if binary_mime_type?
- # Disambiguate between multiple language extensions
- disambiguate_extension_language ||
+ possible_languages = Language.find_by_filename(name.to_s)
- # See if there is a Language for the extension
- Language.find_by_filename(name.to_s) ||
-
- # Try to detect Language from shebang line
- shebang_language
+ if possible_languages.length > 1
+ if result = Classifier.classify(Samples::DATA, data, possible_languages.map(&:name)).first
+ Language[result[0]]
+ end
+ else
+ possible_languages.first || shebang_language
+ end
end
# Internal: Get the lexer of the blob.
@@ -427,20 +428,6 @@ module Linguist
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
end
- # Internal: Disambiguates between multiple language extensions.
- #
- # Returns a Language or nil.
- def disambiguate_extension_language
- if Language.ambiguous?(extname)
- possible_languages = Language.all.select { |l| l.extensions.include?(extname) }.map(&:name)
- if possible_languages.any?
- if result = Classifier.classify(Samples::DATA, data, possible_languages).first
- Language[result[0]]
- end
- end
- end
- end
-
# Internal: Extract the script name from the shebang line
#
# Requires Blob#data
diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb
index 24b7867..8586fa7 100644
--- a/lib/linguist/language.rb
+++ b/lib/linguist/language.rb
@@ -15,8 +15,8 @@ module Linguist
@index = {}
@name_index = {}
@alias_index = {}
- @extension_index = {}
- @filename_index = {}
+ @extension_index = Hash.new { |h,k| h[k] = [] }
+ @filename_index = Hash.new { |h,k| h[k] = [] }
# Valid Languages types
TYPES = [:data, :markup, :programming]
@@ -60,13 +60,7 @@ module Linguist
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
end
- unless ambiguous?(extension)
- # Index the extension with a leading ".": ".rb"
- @extension_index[extension] = language
-
- # Index the extension without a leading ".": "rb"
- @extension_index[extension.sub(/^\./, '')] = language
- end
+ @extension_index[extension] << language
end
language.overrides.each do |extension|
@@ -82,7 +76,7 @@ module Linguist
end
language.filenames.each do |filename|
- @filename_index[filename] = language
+ @filename_index[filename] << language
end
language
@@ -123,33 +117,19 @@ module Linguist
@alias_index[name]
end
- # Public: Look up Language by extension.
- #
- # extension - The extension String. May include leading "."
- #
- # Examples
- #
- # Language.find_by_extension('.rb')
- # # => #<Language name="Ruby">
- #
- # Returns the Language or nil if none was found.
- def self.find_by_extension(extension)
- @extension_index[extension]
- end
-
- # Public: Look up Language by filename.
+ # Public: Look up Languages by filename.
#
# filename - The path String.
#
# Examples
#
# Language.find_by_filename('foo.rb')
- # # => #<Language name="Ruby">
+ # # => [#<Language name="Ruby">]
#
- # Returns the Language or nil if none was found.
+ # Returns all matching Languages or [] if none were found.
def self.find_by_filename(filename)
basename, extname = File.basename(filename), File.extname(filename)
- @filename_index[basename] || @extension_index[extname]
+ @filename_index[basename] + @extension_index[extname]
end
# Public: Look up Language by its name or lexer.