diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index e1897df7..66a42f22 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3134,6 +3134,8 @@ Tea: Text: type: prose wrap: true + aliases: + - fundamental extensions: - .txt - .fr diff --git a/lib/linguist/strategy/modeline.rb b/lib/linguist/strategy/modeline.rb index e77597f4..55a8f355 100644 --- a/lib/linguist/strategy/modeline.rb +++ b/lib/linguist/strategy/modeline.rb @@ -1,7 +1,7 @@ module Linguist module Strategy class Modeline - EmacsModeline = /-\*-\s*mode:\s*(\w+);?\s*-\*-/i + EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i VimModeline = /\/\*\s*vim:\s*set\s*(?:ft|filetype)=(\w+):\s*\*\//i # Public: Detects language based on Vim and Emacs modelines diff --git a/samples/WebIDL/AnimationEvent.webidl b/samples/WebIDL/AnimationEvent.webidl index e48ed571..5dbc2752 100644 --- a/samples/WebIDL/AnimationEvent.webidl +++ b/samples/WebIDL/AnimationEvent.webidl @@ -1,4 +1,4 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: linguist-disable-strategy-modeline-IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/samples/WebIDL/Fetch.webidl b/samples/WebIDL/Fetch.webidl index fb022126..87a4e957 100644 --- a/samples/WebIDL/Fetch.webidl +++ b/samples/WebIDL/Fetch.webidl @@ -1,4 +1,4 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* -*- Mode: linguist-disable-strategy-modeline-IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/test/fixtures/Data/Modelines/fundamentalEmacs.c b/test/fixtures/Data/Modelines/fundamentalEmacs.c new file mode 100644 index 00000000..b384bc79 --- /dev/null +++ b/test/fixtures/Data/Modelines/fundamentalEmacs.c @@ -0,0 +1,6 @@ +// -*- fundamental -*- + +int main(int argc, char * argc[]) +{ + this should not be syntax highlighted, even though it looks like c. +} diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs1 b/test/fixtures/Data/Modelines/seeplusplusEmacs1 new file mode 100644 index 00000000..6c1b6e80 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs1 @@ -0,0 +1,2 @@ +// -*-c++-*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs2 b/test/fixtures/Data/Modelines/seeplusplusEmacs2 new file mode 100644 index 00000000..3756149c --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs2 @@ -0,0 +1,2 @@ +// -*- c++ -*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs3 b/test/fixtures/Data/Modelines/seeplusplusEmacs3 new file mode 100644 index 00000000..7a871e6a --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs3 @@ -0,0 +1,2 @@ +// -*- mode:C++ -*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs4 b/test/fixtures/Data/Modelines/seeplusplusEmacs4 new file mode 100644 index 00000000..f020eb5a --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs4 @@ -0,0 +1,2 @@ +// -*- font:bar;mode:c++ -*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs5 b/test/fixtures/Data/Modelines/seeplusplusEmacs5 new file mode 100644 index 00000000..49e9a7d6 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs5 @@ -0,0 +1,2 @@ +// -*-foo:bar;mode:c++;bar:foo-*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs6 b/test/fixtures/Data/Modelines/seeplusplusEmacs6 new file mode 100644 index 00000000..305f7f77 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs6 @@ -0,0 +1,2 @@ +// -*- foo : bar ; mode : c++ ; bar : foo -*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs7 b/test/fixtures/Data/Modelines/seeplusplusEmacs7 new file mode 100644 index 00000000..236c3b8e --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs7 @@ -0,0 +1,2 @@ +// -*- mode : c++ ; bar : foo -*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs8 b/test/fixtures/Data/Modelines/seeplusplusEmacs8 new file mode 100644 index 00000000..f502058a --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs8 @@ -0,0 +1,2 @@ +// -*- font:x;foo : bar ; mode : C++ ; bar : foo ; foooooo:baaaaar;fo:ba-*- +template class { X i; }; diff --git a/test/fixtures/Data/Modelines/seeplusplusEmacs9 b/test/fixtures/Data/Modelines/seeplusplusEmacs9 new file mode 100644 index 00000000..953ca220 --- /dev/null +++ b/test/fixtures/Data/Modelines/seeplusplusEmacs9 @@ -0,0 +1,2 @@ +// -*-foo:bar;mode:c++;bar:foo;tyrell:corp-*- +template class { X i; }; diff --git a/test/test_modelines.rb b/test/test_modelines.rb index 6c68cc87..a2be5d3b 100644 --- a/test/test_modelines.rb +++ b/test/test_modelines.rb @@ -10,6 +10,16 @@ class TestModelines < Minitest::Test def test_modeline_strategy assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby") 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["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") @@ -18,6 +28,16 @@ class TestModelines < Minitest::Test def test_modeline_languages assert_equal Language["Ruby"], fixture_blob("Data/Modelines/ruby").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["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