# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - highlighting VB Source Parser

    @license: GNU GPL, see COPYING for details.
"""

from MoinMoin.util.ParserBase import ParserBase

Dependencies = ["time"]


class Parser(ParserBase):
    """ Send colored VB source.
    """
    parsername = "ColorizedVB"
    extensions = ['.bas', '.cls', '.frm', '.vbs', '.CATScript', '.catvbs', '.wsf']
    Dependencies = []

    def setupRules(self):
        ParserBase.setupRules(self)

        #self.addRulePair("Comment","/[*]","[*]/")
        self.addRule("Comment","'.*$")
        self.addRulePair("String",'L?"',r'$|[^\\](\\\\)*"')
        self.addRule("Char",r"'\\.'|'[^\\]'")
        self.addRule("Number",r"[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?")
        self.addRule("Preprc",r"^\s*#(.*\\\n)*(.*(?!\\))$")
        self.addRule("ID","[a-zA-Z_][0-9a-zA-Z_]*")
        self.addRule("SPChar",r"[~!%^&*()+=|\[\]:;,.<>/?{}-]")

        _words_string = """and begin case call continue do each else elseif end erase 
error event exit false for function get gosub goto if implement in load loop lset 
me mid new next not nothing on or property raiseevent rem resume return rset 
select set stop sub then to true unload until wend while with withevents 
attribute alias as boolean byref byte byval const compare currency date declare dim double 
enum explicit friend global integer let lib long module object option optional 
preserve private property public redim single static string type variant 
appactivate beep chdir chdrive close 
deletesetting filecopy get input kill line lock unlock lset mid mkdir name 
open print put randomize reset rmdir rset savepicture savesetting seek 
sendkeys setattr time unload width write debug call"""

        reserved_words = _words_string.split()
        reserved_words.extend(map(lambda X: X.title(), reserved_words)) 


        _words2_string = """"""
        reserved_words2 = _words2_string.split()
        reserved_words2.extend(map(lambda X: X.title(), reserved_words2)) 

        special_words = ['std','string','vector','map','set','cout','cin','cerr']
        constant_words = ['True','False','Nothing','Empty']

        self.addReserved(reserved_words)
        self.addConstant(constant_words)

        self.addWords(reserved_words2,'ResWord2')
        self.addWords(special_words,'Special')

