module Rouge module Lexers class Coffeescript < RegexLexer tag 'coffeescript' aliases 'coffee', 'coffee-script' filenames '*.coffee', 'Cakefile' mimetypes 'text/coffeescript' desc 'The Coffeescript programming language (coffeescript.org)' def self.analyze_text(text) return 1 if text.shebang? 'coffee' end def self.keywords @keywords ||= Set.new %w( for in of while break return continue switch when then if else throw try catch finally new delete typeof instanceof super extends this class by ) end def self.constants @constants ||= Set.new %w( true false yes no on off null NaN Infinity undefined ) end def self.builtins @builtins ||= Set.new %w( Array Boolean Date Error Function Math netscape Number Object Packages RegExp String sun decodeURI decodeURIComponent encodeURI encodeURIComponent eval isFinite isNaN parseFloat parseInt document window ) end id = /[$a-zA-Z_][a-zA-Z0-9_]*/ state :comments_and_whitespace do rule /\s+/m, Text rule /###.*?###/m, Comment::Multiline rule /#.*?\n/, Comment::Single end state :multiline_regex do # this order is important, so that #{ isn't interpreted # as a comment mixin :has_interpolation mixin :comments_and_whitespace rule %r(///([gim]+\b|\B)), Str::Regex, :pop! rule %r(/), Str::Regex rule %r([^/#]+), Str::Regex end state :slash_starts_regex do mixin :comments_and_whitespace rule %r(///) do token Str::Regex goto :multiline_regex end rule %r( /(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex ([gim]+\b|\B) )x, Str::Regex, :pop! rule(//) { pop! } end state :root do rule(%r(^(?=\s|/|