mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
This is a rewrite of the regex that handles Emacs modeline matching. The
current one is a little flaky, causing some files to be misclassified as
"E", among other things.
It's worth noting malformed modelines can still change a file's language
in Emacs. Provided the -*- delimiters are intact, and the mode's name is
decipherable, Emacs will set the appropriate language mode *and* display
a warning about a malformed modeline:
-*- foo-bar mode: ruby -*- # Malformed, but understandable
-*- mode: ruby--*- # Completely invalid
The new pattern accommodates this leniency, making no effort to validate
a modeline's syntax beyond readable mode-names. In other words, if Emacs
accepts certain errors, we should too.
63 lines
4.2 KiB
Ruby
63 lines
4.2 KiB
Ruby
require_relative "./helper"
|
|
|
|
class TestModelines < Minitest::Test
|
|
include Linguist
|
|
|
|
def assert_modeline(language, blob)
|
|
assert_equal language, Linguist::Strategy::Modeline.call(blob).first
|
|
end
|
|
|
|
def test_modeline_strategy
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby2")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby3")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby4")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby5")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby6")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby7")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby8")
|
|
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby9")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplus")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs3")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs4")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs5")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs6")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11")
|
|
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12")
|
|
assert_modeline Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c")
|
|
assert_modeline Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl")
|
|
assert_modeline Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md")
|
|
assert_modeline Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc")
|
|
assert_modeline nil, sample_blob("C/main.c")
|
|
end
|
|
|
|
def test_modeline_languages
|
|
assert_equal Language["Ruby"], fixture_blob("Data/Modelines/ruby").language
|
|
assert_equal Language["Ruby"], fixture_blob("Data/Modelines/ruby2").language
|
|
assert_equal Language["Ruby"], fixture_blob("Data/Modelines/ruby3").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplus").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs3").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs4").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs5").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs6").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs7").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs8").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs9").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs10").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs11").language
|
|
assert_equal Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs12").language
|
|
assert_equal Language["Text"], fixture_blob("Data/Modelines/fundamentalEmacs.c").language
|
|
assert_equal Language["Prolog"], fixture_blob("Data/Modelines/not_perl.pl").language
|
|
assert_equal Language["Smalltalk"], fixture_blob("Data/Modelines/example_smalltalk.md").language
|
|
assert_equal Language["PHP"], fixture_blob("Data/Modelines/iamphp.inc").language
|
|
end
|
|
end
|