diff options
| author | Joshua Peek <josh@joshpeek.com> | 2012-08-03 13:53:12 -0500 |
|---|---|---|
| committer | Joshua Peek <josh@joshpeek.com> | 2012-08-03 13:53:12 -0500 |
| commit | 6014bd015e56dbfd212bc1a6d9c75cc36a1449c7 (patch) | |
| tree | 31f0838f9116519d00ce60d79d9a9dc309962a3c /lib | |
| parent | 4a06d2ea7ed28c55879be8a2894ff2b07ab5808e (diff) | |
Change find_by_filename api to return all matching languages
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/linguist/blob_helper.rb | 29 | ||||
| -rw-r--r-- | lib/linguist/language.rb | 36 |
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. |
