mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Dispatch to ambiguous language guess method
This commit is contained in:
@@ -275,17 +275,8 @@ module Linguist
|
|||||||
def guess_language
|
def guess_language
|
||||||
return if binary?
|
return if binary?
|
||||||
|
|
||||||
# If its a header file (.h) try to guess the language
|
# Disambiguate between multiple language extensions
|
||||||
header_language ||
|
disambiguate_extension_language ||
|
||||||
|
|
||||||
# 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 ||
|
|
||||||
|
|
||||||
# See if there is a Language for the extension
|
# See if there is a Language for the extension
|
||||||
pathname.language ||
|
pathname.language ||
|
||||||
@@ -304,12 +295,22 @@ module Linguist
|
|||||||
language ? language.lexer : Lexer['Text only']
|
language ? language.lexer : Lexer['Text only']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: Disambiguates between multiple language extensions.
|
||||||
|
#
|
||||||
|
# Delegates to "guess_EXTENSION_language".
|
||||||
|
#
|
||||||
|
# Returns a Language or nil.
|
||||||
|
def disambiguate_extension_language
|
||||||
|
if Language.ambiguous?(extname)
|
||||||
|
name = "guess_#{extname.sub(/^\./, '')}_language"
|
||||||
|
send(name) if respond_to?(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Guess language of header files (.h).
|
# Internal: Guess language of header files (.h).
|
||||||
#
|
#
|
||||||
# Returns a Language.
|
# Returns a Language.
|
||||||
def header_language
|
def guess_h_language
|
||||||
return unless extname == '.h'
|
|
||||||
|
|
||||||
if lines.grep(/^@(interface|property|private|public|end)/).any?
|
if lines.grep(/^@(interface|property|private|public|end)/).any?
|
||||||
Language['Objective-C']
|
Language['Objective-C']
|
||||||
elsif lines.grep(/^class |^\s+(public|protected|private):/).any?
|
elsif lines.grep(/^class |^\s+(public|protected|private):/).any?
|
||||||
@@ -329,9 +330,7 @@ module Linguist
|
|||||||
# * "%" comments
|
# * "%" comments
|
||||||
#
|
#
|
||||||
# Returns a Language.
|
# Returns a Language.
|
||||||
def m_language
|
def guess_m_language
|
||||||
return unless extname == '.m'
|
|
||||||
|
|
||||||
# Objective-C keywords
|
# Objective-C keywords
|
||||||
if lines.grep(/^#import|@(interface|implementation|property|synthesize|end)/).any?
|
if lines.grep(/^#import|@(interface|implementation|property|synthesize|end)/).any?
|
||||||
Language['Objective-C']
|
Language['Objective-C']
|
||||||
@@ -352,15 +351,14 @@ module Linguist
|
|||||||
|
|
||||||
# Internal: Guess language of .pl files
|
# Internal: Guess language of .pl files
|
||||||
#
|
#
|
||||||
# Returns a Language.
|
|
||||||
def pl_language
|
|
||||||
return unless extname == '.pl'
|
|
||||||
|
|
||||||
# The rules for disambiguation are:
|
# The rules for disambiguation are:
|
||||||
#
|
#
|
||||||
# 1. Many perl files begin with a shebang
|
# 1. Many perl files begin with a shebang
|
||||||
# 2. Most Prolog source files have a rule somewhere (marked by the :- operator)
|
# 2. Most Prolog source files have a rule somewhere (marked by the :- operator)
|
||||||
# 3. Default to Perl, because it is more popular
|
# 3. Default to Perl, because it is more popular
|
||||||
|
#
|
||||||
|
# Returns a Language.
|
||||||
|
def guess_pl_language
|
||||||
if shebang_script == 'perl'
|
if shebang_script == 'perl'
|
||||||
Language['Perl']
|
Language['Perl']
|
||||||
elsif lines.grep(/:-/).any?
|
elsif lines.grep(/:-/).any?
|
||||||
@@ -373,9 +371,7 @@ module Linguist
|
|||||||
# Internal: Guess language of .r files.
|
# Internal: Guess language of .r files.
|
||||||
#
|
#
|
||||||
# Returns a Language.
|
# Returns a Language.
|
||||||
def r_language
|
def guess_r_language
|
||||||
return unless extname == '.r'
|
|
||||||
|
|
||||||
if lines.grep(/(rebol|(:\s+func|make\s+object!|^\s*context)\s*\[)/i).any?
|
if lines.grep(/(rebol|(:\s+func|make\s+object!|^\s*context)\s*\[)/i).any?
|
||||||
Language['Rebol']
|
Language['Rebol']
|
||||||
else
|
else
|
||||||
@@ -473,5 +469,12 @@ module Linguist
|
|||||||
return if !text? || large?
|
return if !text? || large?
|
||||||
lexer.colorize_without_wrapper(data)
|
lexer.colorize_without_wrapper(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Language.overridden_extensions.each do |extension|
|
||||||
|
name = "guess_#{extension.sub(/^\./, '')}_language"
|
||||||
|
unless instance_methods.include?(name)
|
||||||
|
warn "Language##{name} was not defined"
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user