JezK
Edit File: actionscript.rb
# -*- coding: utf-8 -*- # # frozen_string_literal: true module Rouge module Lexers class Actionscript < RegexLexer title "ActionScript" desc "ActionScript" tag 'actionscript' aliases 'as', 'as3' filenames '*.as' mimetypes 'application/x-actionscript' state :comments_and_whitespace do rule /\s+/, Text rule %r(//.*?$), Comment::Single rule %r(/\*.*?\*/)m, Comment::Multiline end state :expr_start do mixin :comments_and_whitespace rule %r(/) do token Str::Regex goto :regex end rule /[{]/, Punctuation, :object rule //, Text, :pop! end state :regex do rule %r(/) do token Str::Regex goto :regex_end end rule %r([^/]\n), Error, :pop! rule /\n/, Error, :pop! rule /\[\^/, Str::Escape, :regex_group rule /\[/, Str::Escape, :regex_group rule /\\./, Str::Escape rule %r{[(][?][:=<!]}, Str::Escape rule /[{][\d,]+[}]/, Str::Escape rule /[()?]/, Str::Escape rule /./, Str::Regex end state :regex_end do rule /[gim]+/, Str::Regex, :pop! rule(//) { pop! } end state :regex_group do # specially highlight / in a group to indicate that it doesn't # close the regex rule /\//, Str::Escape rule %r([^/]\n) do token Error pop! 2 end rule /\]/, Str::Escape, :pop! rule /\\./, Str::Escape rule /./, Str::Regex end state :bad_regex do rule /[^\n]+/, Error, :pop! end def self.keywords @keywords ||= Set.new %w( for in while do break return continue switch case default if else throw try catch finally new delete typeof is this with ) end def self.declarations @declarations ||= Set.new %w(var with function) end def self.reserved @reserved ||= Set.new %w( dynamic final internal native public protected private class const override static package interface extends implements namespace set get import include super flash_proxy object_proxy trace ) end def self.constants @constants ||= Set.new %w(true false null NaN Infinity undefined) end def self.builtins @builtins ||= %w( void Function Math Class Object RegExp decodeURI decodeURIComponent encodeURI encodeURIComponent eval isFinite isNaN parseFloat parseInt this ) end id = /[$a-zA-Z_][a-zA-Z0-9_]*/ 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 rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | === | !== )x, Operator, :expr_start rule %r([:-<>+*%&|\^/!=]=?), Operator, :expr_start rule /[(\[,]/, Punctuation, :expr_start rule /;/, Punctuation, :statement rule /[)\].]/, Punctuation rule /[?]/ do token Punctuation push :ternary push :expr_start end rule /[{}]/, Punctuation, :statement rule id do |m| if self.class.keywords.include? m[0] token Keyword push :expr_start elsif self.class.declarations.include? m[0] token Keyword::Declaration push :expr_start elsif self.class.reserved.include? m[0] token Keyword::Reserved elsif self.class.constants.include? m[0] token Keyword::Constant elsif self.class.builtins.include? m[0] token Name::Builtin else token Name::Other end 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 end # braced parts that aren't object literals state :statement do rule /(#{id})(\s*)(:)/ do groups Name::Label, Text, Punctuation end rule /[{}]/, Punctuation mixin :expr_start end # object literals state :object do mixin :comments_and_whitespace rule /[}]/ do token Punctuation goto :statement end rule /(#{id})(\s*)(:)/ do groups Name::Attribute, Text, Punctuation push :expr_start end rule /:/, Punctuation mixin :root end # ternary expressions, where <id>: is not a label! state :ternary do rule /:/ do token Punctuation goto :expr_start end mixin :root end end end end