blob: e70e896667e98853f2495726e4ce2e7fd8d6cdae [file] [log] [blame]
# -*- coding: utf-8 -*- #
module Rouge
module Lexers
class R < RegexLexer
title "R"
desc 'The R statistics language (r-project.org)'
tag 'r'
aliases 'r', 'R', 's', 'S'
filenames '*.R', '*.r', '.Rhistory', '.Rprofile'
mimetypes 'text/x-r-source', 'text/x-r', 'text/x-R'
mimetypes 'text/x-r', 'application/x-r'
KEYWORDS = %w(if else for while repeat in next break function)
KEYWORD_CONSTANTS = %w(
NULL Inf TRUE FALSE NaN NA
NA_integer_ NA_real_ NA_complex_ NA_character_
)
BUILTIN_CONSTANTS = %w(LETTERS letters month.abb month.name pi T F)
# These are all the functions in `base` that are implemented as a
# `.Primitive`, minus those functions that are also keywords.
PRIMITIVE_FUNCTIONS = %w(
abs acos acosh all any anyNA Arg as.call as.character
as.complex as.double as.environment as.integer as.logical
as.null.default as.numeric as.raw asin asinh atan atanh attr
attributes baseenv browser c call ceiling class Conj cos cosh
cospi cummax cummin cumprod cumsum digamma dim dimnames
emptyenv exp expression floor forceAndCall gamma gc.time
globalenv Im interactive invisible is.array is.atomic is.call
is.character is.complex is.double is.environment is.expression
is.finite is.function is.infinite is.integer is.language
is.list is.logical is.matrix is.na is.name is.nan is.null
is.numeric is.object is.pairlist is.raw is.recursive is.single
is.symbol lazyLoadDBfetch length lgamma list log max min
missing Mod names nargs nzchar oldClass on.exit pos.to.env
proc.time prod quote range Re rep retracemem return round
seq_along seq_len seq.int sign signif sin sinh sinpi sqrt
standardGeneric substitute sum switch tan tanh tanpi tracemem
trigamma trunc unclass untracemem UseMethod xtfrm
)
def self.analyze_text(text)
return 1 if text.shebang? 'Rscript'
end
state :root do
rule /#'.*?\n/, Comment::Doc
rule /#.*?\n/, Comment::Single
rule /\s+/m, Text::Whitespace
rule /`[^`]+?`/, Name
rule /'(\\.|.)*?'/m, Str::Single
rule /"(\\.|.)*?"/m, Str::Double
rule /%[^%]*?%/, Operator
rule /0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/, Num::Hex
rule /[+-]?(\d+([.]\d+)?|[.]\d+)([eE][+-]?\d+)?[Li]?/,
Num
# Only recognize built-in functions when they are actually used as a
# function call, i.e. followed by an opening parenthesis.
# `Name::Builtin` would be more logical, but is usually not
# highlighted specifically; thus use `Name::Function`.
rule /\b(?<!.)(#{PRIMITIVE_FUNCTIONS.join('|')})(?=\()/, Name::Function
rule /[a-zA-Z.]([a-zA-Z_][\w.]*)?/ do |m|
if KEYWORDS.include? m[0]
token Keyword
elsif KEYWORD_CONSTANTS.include? m[0]
token Keyword::Constant
elsif BUILTIN_CONSTANTS.include? m[0]
token Name::Builtin
else
token Name
end
end
rule /[\[\]{}();,]/, Punctuation
rule %r([-<>?*+^/!=~$@:%&|]), Operator
end
end
end
end