| # -*- coding: utf-8 -*- # |
| |
| 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 |