diff --git a/lib/rouge/guessers/disambiguation.rb b/lib/rouge/guessers/disambiguation.rb index 0a111d5043..95585814a2 100644 --- a/lib/rouge/guessers/disambiguation.rb +++ b/lib/rouge/guessers/disambiguation.rb @@ -131,6 +131,13 @@ def match?(filename) next TeX if matches?(/\A\s*(?:\\|%)/) next Apex end + + disambiguate '*.pp' do + next Pascal if matches?(/\b(function|begin|var)\b/) + next Pascal if matches?(/\b(end(;|\.))/) + + Puppet + end end end end diff --git a/lib/rouge/lexers/pascal.rb b/lib/rouge/lexers/pascal.rb index 587a05b37c..29491c8431 100644 --- a/lib/rouge/lexers/pascal.rb +++ b/lib/rouge/lexers/pascal.rb @@ -7,7 +7,7 @@ class Pascal < RegexLexer tag 'pascal' title "Pascal" desc 'a procedural programming language commonly used as a teaching language.' - filenames '*.pas', '*.lpr' + filenames '*.pas', '*.lpr', '*.pp' mimetypes 'text/x-pascal' diff --git a/spec/guesser_spec.rb b/spec/guesser_spec.rb index f0e6daece3..424a78c3dc 100644 --- a/spec/guesser_spec.rb +++ b/spec/guesser_spec.rb @@ -76,4 +76,40 @@ assert_guess(Rouge::Lexers::Ruby, :source => '# v' + 'im: syntax=ruby') end end + + describe 'disambiguation guessing' do + describe 'guesses *.pp filename' do + it 'guesses pascal' do + assert_guess( + Rouge::Lexers::Pascal, + filename: 'foo.pp', + source: <<~SOURCE + function sum(a, b: integer): integer; + var tempSum: integer + begin + tempSum := a + b; + sum := tempSum; + end; + SOURCE + ) + end + + it 'guesses puppet' do + assert_guess( + Rouge::Lexers::Puppet, + filename: 'foo.pp', + source: <<~SOURCE + class foo::bar ( + Array[String] = foo::bar::baz, + ) { + $foo = [ + 'bar', + 'baz', + ] + } + SOURCE + ) + end + end + end end diff --git a/spec/lexers/pascal_spec.rb b/spec/lexers/pascal_spec.rb index 8f6795b313..3c30a3a6e5 100644 --- a/spec/lexers/pascal_spec.rb +++ b/spec/lexers/pascal_spec.rb @@ -9,7 +9,10 @@ it 'guesses by filename' do assert_guess :filename => 'foo.pas' - assert_guess :filename => 'foo.lpr' + assert_guess :filename => 'foo.lpr' + + # *.pp needs source hints because it's also used by Puppet + assert_guess :filename => 'foo.pp', :source => 'begin end.' end it 'guesses by mimetype' do diff --git a/spec/lexers/puppet_spec.rb b/spec/lexers/puppet_spec.rb index 884a48605a..11b44e3849 100644 --- a/spec/lexers/puppet_spec.rb +++ b/spec/lexers/puppet_spec.rb @@ -8,7 +8,8 @@ include Support::Guessing it 'guesses by filename' do - assert_guess :filename => 'foo.pp' + # *.pp needs source hints because it's also used by Pascal + assert_guess :filename => 'foo.pp', :source => 'class privileges { }' end it 'guesses by source' do