lib/rouge/lexers/javascript.rb in rouge-2.0.5 vs lib/rouge/lexers/javascript.rb in rouge-2.0.6

- old
+ new

@@ -22,15 +22,21 @@ return 1 if text.shebang?('node') return 1 if text.shebang?('jsc') # TODO: rhino, spidermonkey, etc end + state :multiline_comment do + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^*/]+), Comment::Multiline + rule %r([*/]), Comment::Multiline + end + state :comments_and_whitespace do rule /\s+/, Text rule /<!--/, Comment # really...? rule %r(//.*?$), Comment::Single - rule %r(/\*.*?\*/)m, Comment::Multiline + rule %r(/[*]), Comment::Multiline, :multiline_comment end state :expr_start do mixin :comments_and_whitespace @@ -122,12 +128,16 @@ Error eval isFinite isNaN parseFloat parseInt document this window ) end - id = /[$a-zA-Z_][a-zA-Z0-9_]*/ + def self.id_regex + /[$a-z_][a-z0-9_]*/io + end + id = self.id_regex + state :root do rule /\A\s*#!.*?\n/m, Comment::Preproc, :statement rule /\n/, Text, :statement rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start mixin :comments_and_whitespace @@ -171,12 +181,12 @@ end rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float rule /0x[0-9a-fA-F]+/, Num::Hex rule /[0-9]+/, Num::Integer - rule /"(\\\\|\\"|[^"])*"/, Str::Double - rule /'(\\\\|\\'|[^'])*'/, Str::Single + rule /"(\\[\\"]|[^"])*"/, Str::Double + rule /'(\\[\\']|[^'])*'/, Str::Single rule /:/, Punctuation end # braced parts that aren't object literals state :statement do @@ -252,85 +262,32 @@ # could mean doing two full lexes. def self.analyze_text(text) return 0.8 if text =~ /\A\s*{/m && text.lexes_cleanly?(self) end - string = /"(\\.|[^"])*"/ - state :root do - mixin :whitespace + rule /\s+/m, Text::Whitespace + rule /"/, Str::Double, :string rule /(?:true|false|null)\b/, Keyword::Constant - rule /{/, Punctuation, :object_key_initial - rule /\[/, Punctuation, :array + rule /[{},:\[\]]/, Punctuation rule /-?(?:0|[1-9]\d*)\.\d+(?:e[+-]\d+)?/i, Num::Float rule /-?(?:0|[1-9]\d*)(?:e[+-]\d+)?/i, Num::Integer - mixin :has_string end - state :whitespace do - rule /\s+/m, Text::Whitespace + state :string do + rule /[^\\"]+/, Str::Double + rule /\\./, Str::Escape + rule /"/, Str::Double, :pop! end - - state :has_string do - rule string, Str::Double - end - - # in object_key_initial it's allowed to immediately close the object again - state :object_key_initial do - mixin :whitespace - rule string do - token Name::Tag - goto :object_key - end - rule /}/, Punctuation, :pop! - end - - # in object_key at least one more name/value pair is required - state :object_key do - mixin :whitespace - rule string, Name::Tag - rule /:/, Punctuation, :object_val - rule /}/, Error, :pop! - end - - state :object_val do - rule /,/, Punctuation, :pop! - rule(/}/) { token Punctuation; pop!(2) } - mixin :root - end - - state :array do - rule /\]/, Punctuation, :pop! - rule /,/, Punctuation - mixin :root - end end class JSONDOC < JSON desc "JavaScript Object Notation with extenstions for documentation" tag 'json-doc' prepend :root do - mixin :comments + rule %r(//.*?$), Comment::Single rule /(\.\.\.)/, Comment::Single end - - prepend :object_key_initial do - mixin :comments - rule /(\.\.\.)/, Comment::Single - end - - prepend :object_key do - mixin :comments - rule /(\.\.\.)/ do - token Comment::Single - goto :object_key_initial - end - end - - state :comments do - rule %r(//.*?$), Comment::Single - end end - end end