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