###############################################################################
# Name: postscript.py                                                         #
# Purpose: Define Postscript syntax for highlighting and other features       #
# Author: Cody Precord <cprecord@editra.org>                                  #
# Copyright: (c) 2007 Cody Precord <staff@editra.org>                         #
# License: wxWindows License                                                  #
###############################################################################

"""
FILE: postscript.py
AUTHOR: Cody Precord
@summary: Lexer configuration module for PostScript. (case sensitive)
@todo: l3 keywords and ghostscript

"""

__author__ = "Cody Precord <cprecord@editra.org>"
__svnid__ = "$Id: _postscript.py 68798 2011-08-20 17:17:05Z CJP $"
__revision__ = "$Revision: 68798 $"

#-----------------------------------------------------------------------------#
# Imports
import wx.stc as stc

# Local Imports
import syndata

#-----------------------------------------------------------------------------#

#---- Keyword Specifications ----#

# PS Level 1 Operators
PS_L1 = (0, "$error = == FontDirectory StandardEncoding UserObjects abs add "
            "aload anchorsearch and arc arcn arcto array ashow astore atan "
            "awidthshow begin bind bitshift bytesavailable cachestatus ceiling "
            "charpath clear cleardictstack cleartomark clip clippath closefile "
            "closepath concat concatmatrix copy copypage cos count "
            "countdictstack countexecstack counttomark currentcmykcolor "
            "currentcolorspace currentdash currentdict currentfile currentflat "
            "currentfont currentgray currenthsbcolor currentlinecap "
            "currentlinejoin currentlinewidth currentmatrix currentmiterlimit "
            "currentpagedevice currentpoint currentrgbcolor currentscreen "
            "currenttransfer cvi cvlit cvn cvr cvrs cvs cvx def defaultmatrix "
            "definefont dict dictstack div dtransform dup echo end eoclip "
            "eofill eq erasepage errordict exch exec execstack executeonly "
            "executive exit exp false file fill findfont flattenpath floor "
            "flush flushfile for forall ge get getinterval grestore "
            "grestoreall gsave gt idetmatrix idiv idtransform if ifelse image "
            "imagemask index initclip initgraphics initmatrix inustroke "
            "invertmatrix itransform known kshow le length lineto ln load log "
            "loop lt makefont mark matrix maxlength mod moveto mul ne neg "
            "newpath noaccess nor not null nulldevice or pathbbox pathforall "
            "pop print prompt pstack put putinterval quit rand rcheck rcurveto "
            "read readhexstring readline readonly readstring rectstroke repeat "
            "resetfile restore reversepath rlineto rmoveto roll rotate round "
            "rrand run save scale scalefont search setblackgeneration "
            "setcachedevice setcachelimit setcharwidth setcolorscreen "
            "setcolortransfer setdash setflat setfont setgray sethsbcolor "
            "setlinecap setlinejoin setlinewidth setmatrix setmiterlimit "
            "setpagedevice setrgbcolor setscreen settransfer setvmthreshold "
            "show showpage sin sqrt srand stack start status statusdict stop "
            "stopped store string stringwidth stroke strokepath sub systemdict "
            "token token transform translate true truncate type ueofill "
            "undefineresource userdict usertime version vmstatus wcheck where "
            "widthshow write writehexstring writestring xcheck xor")

# PS Level 2 Operators
PS_L2 = (1, "GlobalFontDirectory ISOLatin1Encoding SharedFontDirectory "
            "UserObject arct colorimage cshow currentblackgeneration "
            "currentcacheparams currentcmykcolor currentcolor "
            "currentcolorrendering currentcolorscreen currentcolorspace "
            "currentcolortransfer currentdevparams currentglobal currentgstate "
            "currenthalftone currentobjectformat currentoverprint "
            "currentpacking currentpagedevice currentshared "
            "currentstrokeadjust currentsystemparams currentundercolorremoval "
            "currentuserparams defineresource defineuserobject deletefile "
            "execform execuserobject filenameforall fileposition filter "
            "findencoding findresource gcheck globaldict glyphshow gstate "
            "ineofill infill instroke inueofill inufill inustroke "
            "languagelevel makepattern packedarray printobject product "
            "realtime rectclip rectfill rectstroke renamefile resourceforall "
            "resourcestatus revision rootfont scheck selectfont serialnumber "
            "setbbox setblackgeneration setcachedevice2 setcacheparams "
            "setcmykcolor setcolor setcolorrendering setcolorscreen "
            "setcolorspace setcolortranfer setdevparams setfileposition "
            "setglobal setgstate sethalftone setobjectformat setoverprint "
            "setpacking setpagedevice setpattern setshared setstrokeadjust "
            "setsystemparams setucacheparams setundercolorremoval "
            "setuserparams setvmthreshold shareddict startjob uappend ucache "
            "ucachestatus ueofill ufill undef undefinefont undefineresource "
            "undefineuserobject upath ustroke ustrokepath vmreclaim "
            "writeobject xshow xyshow yshow")

# PS 3 Operators
PS_L3 = (2, "cliprestore clipsave composefont currentsmoothness "
            "findcolorrendering setsmoothness shfill")

# RIP-specific operators
RIP_OP = (3, ".begintransparencygroup .begintransparencymask .bytestring "
             ".charboxpath .currentaccuratecurves .currentblendmode "
             ".currentcurvejoin .currentdashadapt .currentdotlength "
             ".currentfilladjust2 .currentlimitclamp .currentopacityalpha "
             ".currentoverprintmode .currentrasterop .currentshapealpha "
             ".currentsourcetransparent .currenttextknockout "
             ".currenttexturetransparent .dashpath .dicttomark "
             ".discardtransparencygroup .discardtransparencymask "
             ".endtransparencygroup .endtransparencymask .execn .filename "
             ".filename .fileposition .forceput .forceundef .forgetsave "
             ".getbitsrect .getdevice .inittransparencymask .knownget "
             ".locksafe .makeoperator .namestring .oserrno .oserrorstring "
             ".peekstring .rectappend .runandhide .setaccuratecurves ."
             "setblendmode .setcurvejoin .setdashadapt .setdebug "
             ".setdefaultmatrix .setdotlength .setfilladjust2 .setlimitclamp "
             ".setmaxlength .setopacityalpha .setoverprintmode .setrasterop "
             ".setsafe .setshapealpha .setsourcetransparent .settextknockout "
             ".settexturetransparent .stringbreak .stringmatch .tempfile "
             ".type1decrypt .type1encrypt .type1execchar .unread arccos arcsin "
             "copydevice copyscanlines currentdevice finddevice findlibfile "
             "findprotodevice flushpage getdeviceprops getenv makeimagedevice "
             "makewordimagedevice max min putdeviceprops setdevice")

# User Defined Operators
USER_DEF = (4, "")

#---- Syntax Style Specs ----#
SYNTAX_ITEMS = [ (stc.STC_PS_DEFAULT, 'default_style'),
                 (stc.STC_PS_BADSTRINGCHAR, 'unknown_style'),
                 (stc.STC_PS_BASE85STRING, 'string_style'),
                 (stc.STC_PS_COMMENT, 'comment_style'),
                 (stc.STC_PS_DSC_COMMENT, 'comment_style'),
                 (stc.STC_PS_DSC_VALUE, 'comment_style'), # STYLE ME
                 (stc.STC_PS_HEXSTRING, 'number_style'),
                 (stc.STC_PS_IMMEVAL, 'comment_style'), # STYLE ME
                 (stc.STC_PS_KEYWORD, 'class_style'),
                 (stc.STC_PS_LITERAL, 'scalar2_style'),
                 (stc.STC_PS_NAME, 'keyword_style'),
                 (stc.STC_PS_NUMBER, 'number_style'),
                 (stc.STC_PS_PAREN_ARRAY, 'default_style'), # STYLE ME
                 (stc.STC_PS_PAREN_DICT, 'default_style'), # STYLE ME
                 (stc.STC_PS_PAREN_PROC, 'default_style'), # STYLE ME
                 (stc.STC_PS_TEXT, 'default_style') ]

#---- Extra Properties ----#
FOLD = ("fold", "1")

#-----------------------------------------------------------------------------#

class SyntaxData(syndata.SyntaxDataBase):
    """SyntaxData object for PostScript""" 
    def __init__(self, langid):
        super(SyntaxData, self).__init__(langid)

        # Setup
        self.SetLexer(stc.STC_LEX_PS)

    def GetKeywords(self):
        """Returns Specified Keywords List """
        return [PS_L1, PS_L2]

    def GetSyntaxSpec(self):
        """Syntax Specifications """
        return SYNTAX_ITEMS

    def GetProperties(self):
        """Returns a list of Extra Properties to set """
        return [FOLD]

    def GetCommentPattern(self):
        """Returns a list of characters used to comment a block of code """
        return [u'%']
