instiki/vendor/plugins/syntax/lib/syntax/lang/javascript.rb

59 lines
1.9 KiB
Ruby
Raw Normal View History

require 'syntax'
module Syntax
class Javascript < Tokenizer
JAVASCRIPT_KEYWORDS =
%w{abstract break case catch class const continue
debugger default delete do else enum export extends
final finally for function goto if implements
import in instanceof interface native new
package private protected public return
static super switch synchronized this throw
throws transient try typeof
var void volatile while with} unless const_defined?(:JAVASCRIPT_KEYWORDS)
JAVASCRIPT_PREDEFINED_TYPES =
%w{boolean byte char double float int long short} unless const_defined?(:JAVASCRIPT_PREDEFINED_TYPES)
JAVASCRIPT_PREDEFINED_CONSTANTS =
%w{null true false} unless const_defined?(:JAVASCRIPT_PREDEFINED_CONSTANTS)
def step
case
when scan(/\s+/)
start_group :normal, matched
when scan(/\\u[0-9a-f]{4}/i)
start_group :unicode, matched
when scan(/0[xX][0-9A-Fa-f]+/)
start_group :hex, matched
when scan(/(?:0[0-7]+)(?![89.eEfF])/)
start_group :oct, matched
when scan(/(?:\d+)(?![.eEfF])/)
start_group :integer, matched
when scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/)
start_group :float, matched
when (scan(/"(?:[^"\\]|\\.)*"/) or scan(/'(?:[^'\\]|\\.)*'/) )
start_group :string, matched
when scan(/[a-z_$][a-z_\d]*/i)
if JAVASCRIPT_KEYWORDS.include?( matched )
start_group :keyword, matched
elsif JAVASCRIPT_PREDEFINED_TYPES.include?( matched )
start_group :predefined_types, matched
else
start_group :ident, matched
end
when scan(%r! // [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) !mx)
start_group :comment, matched
else
start_group :other, scan(/./x)
end
end
end
SYNTAX["javascript"] = Javascript
end