diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 9c1d9948..13f0173f 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -36,6 +36,9 @@ module Linguist if languages.all? { |l| ["AsciiDoc", "AGS Script"].include?(l) } result = disambiguate_asc(data) end + if languages.all? { |l| ["FORTRAN", "Forth"].include?(l) } + result = disambiguate_f(data) + end return result end end @@ -138,6 +141,16 @@ module Linguist matches end + def self.disambiguate_f(data) + matches = [] + if /^: /.match(data) + matches << Language["Forth"] + elsif /^([c*][^a-z]| subroutine\s)/i.match(data) + matches << Language["FORTRAN"] + end + matches + end + def self.active? !!ACTIVE end diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 022918e6..ac284ca4 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -792,6 +792,9 @@ Forth: extensions: - .fth - .4th + - .F + - .f + - .for - .forth - .frt diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 3e04daf3..db8f286e 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -105,6 +105,16 @@ class TestHeuristcs < Test::Unit::TestCase end end + def test_f_by_heuristics + languages = ["FORTRAN", "Forth"] + languages.each do |language| + all_fixtures(language).each do |fixture| + results = Heuristics.disambiguate_f(fixture("#{language}/#{File.basename(fixture)}")) + assert_equal Language[language], results.first + end + end + end + # Candidate languages = ["Hack", "PHP"] def test_hack_by_heuristics results = Heuristics.disambiguate_hack(fixture("Hack/funs.php"))