Skip to content

Commit 3da7ac7

Browse files
authored
Disambiguate free pascal and puppet (#1845)
Both free pascal and puppet are sharing the same file extension, that is `.pp`. This change adds `.pp` as a possible extension for pascal lexer and disambiguates them using keywords.
1 parent b8e146f commit 3da7ac7

5 files changed

Lines changed: 50 additions & 3 deletions

File tree

lib/rouge/guessers/disambiguation.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ def match?(filename)
131131
next TeX if matches?(/\A\s*(?:\\|%)/)
132132
next Apex
133133
end
134+
135+
disambiguate '*.pp' do
136+
next Pascal if matches?(/\b(function|begin|var)\b/)
137+
next Pascal if matches?(/\b(end(;|\.))/)
138+
139+
Puppet
140+
end
134141
end
135142
end
136143
end

lib/rouge/lexers/pascal.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class Pascal < RegexLexer
77
tag 'pascal'
88
title "Pascal"
99
desc 'a procedural programming language commonly used as a teaching language.'
10-
filenames '*.pas', '*.lpr'
10+
filenames '*.pas', '*.lpr', '*.pp'
1111

1212
mimetypes 'text/x-pascal'
1313

spec/guesser_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,40 @@
7676
assert_guess(Rouge::Lexers::Ruby, :source => '# v' + 'im: syntax=ruby')
7777
end
7878
end
79+
80+
describe 'disambiguation guessing' do
81+
describe 'guesses *.pp filename' do
82+
it 'guesses pascal' do
83+
assert_guess(
84+
Rouge::Lexers::Pascal,
85+
filename: 'foo.pp',
86+
source: <<~SOURCE
87+
function sum(a, b: integer): integer;
88+
var tempSum: integer
89+
begin
90+
tempSum := a + b;
91+
sum := tempSum;
92+
end;
93+
SOURCE
94+
)
95+
end
96+
97+
it 'guesses puppet' do
98+
assert_guess(
99+
Rouge::Lexers::Puppet,
100+
filename: 'foo.pp',
101+
source: <<~SOURCE
102+
class foo::bar (
103+
Array[String] = foo::bar::baz,
104+
) {
105+
$foo = [
106+
'bar',
107+
'baz',
108+
]
109+
}
110+
SOURCE
111+
)
112+
end
113+
end
114+
end
79115
end

spec/lexers/pascal_spec.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010
it 'guesses by filename' do
1111
assert_guess :filename => 'foo.pas'
12-
assert_guess :filename => 'foo.lpr'
12+
assert_guess :filename => 'foo.lpr'
13+
14+
# *.pp needs source hints because it's also used by Puppet
15+
assert_guess :filename => 'foo.pp', :source => 'begin end.'
1316
end
1417

1518
it 'guesses by mimetype' do

spec/lexers/puppet_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
include Support::Guessing
99

1010
it 'guesses by filename' do
11-
assert_guess :filename => 'foo.pp'
11+
# *.pp needs source hints because it's also used by Pascal
12+
assert_guess :filename => 'foo.pp', :source => 'class privileges { }'
1213
end
1314

1415
it 'guesses by source' do

0 commit comments

Comments
 (0)