Guess if .r is R or REBOL

.r is the default extension used widely for both, R and REBOL. This
patch attempts to guess if .r is a REBOL file by looking for the
following very common REBOL code fragments:

- `REBOL`
- `: func [`
- `make object! [`
- `context [`

If any of those is found in a .r file, it is identified as a REBOL file.
Otherwise the language for a .r file is R.

Signed-off-by: Andreas Bolka <a@bolka.at>
This commit is contained in:
Andreas Bolka
2011-06-29 01:37:30 +02:00
parent 521bb9b9b2
commit 2707d1db67
4 changed files with 29 additions and 0 deletions

View File

@@ -259,6 +259,9 @@ module Linguist
# If its a header file (.h) try to guess the language
header_language ||
# If it's a .r file, try to guess the language
r_language ||
# See if there is a Language for the extension
pathname.language ||
@@ -288,6 +291,19 @@ module Linguist
end
end
# Internal: Guess language of .r files.
#
# Returns a Language.
def r_language
return unless extname == '.r'
if lines.grep(/(rebol|(:\s+func|make\s+object!|^\s*context)\s*\[)/i).any?
Language['Rebol']
else
Language['R']
end
end
# Internal: Extract the script name from the shebang line
#
# Requires Blob#data

4
test/fixtures/hello-r.R vendored Normal file
View File

@@ -0,0 +1,4 @@
hello <- function() {
print("hello, world!")
}
hello()

5
test/fixtures/hello-rebol.r vendored Normal file
View File

@@ -0,0 +1,5 @@
REBOL []
hello: func [] [
print "hello, world!"
]
hello

View File

@@ -224,6 +224,10 @@ class TestBlob < Test::Unit::TestCase
assert_equal Language['Ruby'], blob("wrong_shebang.rb").language
assert_nil blob("octocat.png").language
# .r disambiguation
assert_equal Language['R'], blob("hello-r.R").language
assert_equal Language['Rebol'], blob("hello-rebol.r").language
# ML
assert_equal Language['OCaml'], blob("Foo.ml").language
assert_equal Language['Standard ML'], blob("Foo.sig").language