# -*- coding: utf-8 -*- #

module Rouge
  class Token
    class << self
      attr_reader :name
      attr_reader :parent
      attr_reader :shortname

      def cache
        @cache ||= {}
      end

      def sub_tokens
        @sub_tokens ||= {}
      end

      def [](qualname)
        return qualname unless qualname.is_a? ::String

        Token.cache[qualname]
      end

      def inspect
        "<Token #{qualname}>"
      end

      def matches?(other)
        other.token_chain.include? self
      end

      def token_chain
        @token_chain ||= ancestors.take_while { |x| x != Token }.reverse
      end

      def qualname
        @qualname ||= token_chain.map(&:name).join('.')
      end

      def register!
        Token.cache[self.qualname] = self
        parent.sub_tokens[self.name] = self
      end

      def make_token(name, shortname, &b)
        parent = self
        Class.new(parent) do
          @parent = parent
          @name = name
          @shortname = shortname
          register!
          class_eval(&b) if b
        end
      end

      def token(name, shortname, &b)
        tok = make_token(name, shortname, &b)
        const_set(name, tok)
      end

      def each_token(&b)
        Token.cache.each do |(_, t)|
          b.call(t)
        end
      end
    end

    module Tokens
      def self.token(name, shortname, &b)
        tok = Token.make_token(name, shortname, &b)
        const_set(name, tok)
      end

      # XXX IMPORTANT XXX
      # For compatibility, this list must be kept in sync with
      # pygments.token.STANDARD_TYPES
      # please see https://github.com/jneen/rouge/wiki/List-of-tokens
      token :Text, '' do
        token :Whitespace, 'w'
      end

      token :Error, 'err'
      token :Other, 'x'

      token :Keyword, 'k' do
        token :Constant,    'kc'
        token :Declaration, 'kd'
        token :Namespace,   'kn'
        token :Pseudo,      'kp'
        token :Reserved,    'kr'
        token :Type,        'kt'
        token :Variable,    'kv'
      end

      token :Name, 'n' do
        token :Attribute,    'na'
        token :Builtin,      'nb' do
          token :Pseudo,     'bp'
        end
        token :Class,        'nc'
        token :Constant,     'no'
        token :Decorator,    'nd'
        token :Entity,       'ni'
        token :Exception,    'ne'
        token :Function,     'nf'
        token :Property,     'py'
        token :Label,        'nl'
        token :Namespace,    'nn'
        token :Other,        'nx'
        token :Tag,          'nt'
        token :Variable,     'nv' do
          token :Class,      'vc'
          token :Global,     'vg'
          token :Instance,   'vi'
        end
      end

      token :Literal,      'l' do
        token :Date,       'ld'

        token :String,     's' do
          token :Backtick, 'sb'
          token :Char,     'sc'
          token :Doc,      'sd'
          token :Double,   's2'
          token :Escape,   'se'
          token :Heredoc,  'sh'
          token :Interpol, 'si'
          token :Other,    'sx'
          token :Regex,    'sr'
          token :Single,   's1'
          token :Symbol,   'ss'
        end

        token :Number,     'm' do
          token :Float,    'mf'
          token :Hex,      'mh'
          token :Integer,  'mi' do
            token :Long,   'il'
          end
          token :Oct,      'mo'
          token :Bin,      'mb'
          token :Other,    'mx'
        end
      end

      token :Operator, 'o' do
        token :Word,   'ow'
      end

      token :Punctuation, 'p' do
        token :Indicator, 'pi'
      end

      token :Comment,     'c' do
        token :Doc,       'cd'
        token :Multiline, 'cm'
        token :Preproc,   'cp'
        token :Single,    'c1'
        token :Special,   'cs'
      end

      token :Generic,      'g' do
        token :Deleted,    'gd'
        token :Emph,       'ge'
        token :Error,      'gr'
        token :Heading,    'gh'
        token :Inserted,   'gi'
        token :Output,     'go'
        token :Prompt,     'gp'
        token :Strong,     'gs'
        token :Subheading, 'gu'
        token :Traceback,  'gt'
        token :Lineno,     'gl'
      end

      # convenience
      Num = Literal::Number
      Str = Literal::String
    end
  end
end
