#----------------------------------------------------------------------------- # Name: PyrexSupport.py # Purpose: Support for editing pyrex files and compiling to C # # Author: Riaan Booysen # # Created: 2002 # RCS-ID: $Id: PyrexSupport.plug-in.py,v 1.7 2005/05/18 12:11:50 riaan Exp $ # Copyright: (c) 2002 - 2005 # Licence: GPL #----------------------------------------------------------------------------- import os, imp import wx import wx.stc import Preferences, Utils, Plugins try: imp.find_module('Pyrex') except ImportError: raise Plugins.SkipPlugin, 'Pyrex is not installed' from Models import Controllers, EditorHelper, EditorModels, PythonEditorModels, PythonControllers from Views import SourceViews, StyledTextCtrls EditorHelper.imgPyrexModel = EditorHelper.imgIdxRange() class PyrexModel(EditorModels.SourceModel): modelIdentifier = 'Pyrex' defaultName = 'pyrex' bitmap = 'Pyrex.png' ext = '.pyx' imgIdx = EditorHelper.imgPyrexModel pyrex_cfgfile = os.path.join(Preferences.rcPath, 'stc-pyrex.rc.cfg') #if not os.path.exists(pyrex_cfgfile): # pyrex_cfgfile = Preferences.pyPath +'/Plug-ins/stc-pyrex.rc.cfg' class PyrexStyledTextCtrlMix(StyledTextCtrls.LanguageSTCMix): def __init__(self, wId): StyledTextCtrls.LanguageSTCMix.__init__(self, wId, (0, Preferences.STCLineNumMarginWidth), 'pyrex', pyrex_cfgfile) self.setStyles() wxID_PYREXSOURCEVIEW = wx.NewId() class PyrexSourceView(SourceViews.EditorStyledTextCtrl, PyrexStyledTextCtrlMix): viewName = 'Source' def __init__(self, parent, model): SourceViews.EditorStyledTextCtrl.__init__(self, parent, wxID_PYREXSOURCEVIEW, model, (), -1) PyrexStyledTextCtrlMix.__init__(self, wxID_PYREXSOURCEVIEW) self.active = True #wxID_PYREXCOMPILE = wx.NewId() class PyrexController(Controllers.SourceController): Model = PyrexModel DefaultViews = [PyrexSourceView] compileBmp = 'Images/Debug/Compile.png' def actions(self, model): return Controllers.SourceController.actions(self, model) + [ ('Compile', self.OnCompile, '-', 'CheckSource')] def OnCompile(self, event): from Pyrex.Compiler import Main, Errors model = self.getModel() try: result = Main.compile(model.localFilename(), c_only=1) except Errors.PyrexError, err: wx.LogError(str(err)) msg = 'Error' else: msg = 'Info' if msg == 'Error' or result.num_errors > 0: model.editor.setStatus('Pyrex compilation failed', 'Error') else: model.editor.setStatus('Pyrex compilation succeeded') #------------------------------------------------------------------------------- Plugins.registerFileType(PyrexController) Plugins.registerLanguageSTCStyle('Pyrex', 'pyrex', PyrexStyledTextCtrlMix, pyrex_cfgfile) #------------------------------------------------------------------------------- pyrexSource = '''## Comment Blocks! cdef extern from "Numeric/arrayobject.h": struct PyArray_Descr: int type_num, elsize char type ctypedef class PyArrayObject [type PyArray_Type]: cdef char *data cdef int nd cdef int *dimensions, *strides cdef object base cdef PyArray_Descr *descr cdef int flags ''' pyrexStyleEditorConfig = ''' common.defs.msw={'size': 10, 'backcol': '#FFFFFF', 'lnsize2': 7, 'mono': 'Courier New', 'lnsize': 8, 'helv': 'Lucida Console', 'ln-font': 'Lucida Console', 'ln-size': 8} common.defs.gtk={'mono': 'Courier', 'helv': 'Helvetica', 'other': 'new century schoolbook', 'size': 9, 'lnsize': 6, 'backcol': '#FFFFFF', 'ln-font': 'Lucida Console', 'ln-size': 8} common.styleidnames = {wx.stc.STC_STYLE_DEFAULT: 'Style default', wx.stc.STC_STYLE_LINENUMBER: 'Line numbers', wx.stc.STC_STYLE_BRACELIGHT: 'Matched braces', wx.stc.STC_STYLE_BRACEBAD: 'Unmatched brace', wx.stc.STC_STYLE_CONTROLCHAR: 'Control characters', wx.stc.STC_STYLE_INDENTGUIDE: 'Indent guide'} [style.pyrex] setting.pyrex.-3= setting.pyrex.-2=fore:#000000 setting.pyrex.-1=fore:#000000,back:#88C4FF style.pyrex.000=fore:#808080 style.pyrex.001=fore:#007F00,back:#E8FFE8 style.pyrex.002=fore:#007F7F style.pyrex.003=fore:#7F007F style.pyrex.004=fore:#7F007F style.pyrex.005=fore:#00007F,bold style.pyrex.006=fore:#7F0000 style.pyrex.007=fore:#000033,back:#FFFFE8 style.pyrex.008=fore:#0000FF,bold style.pyrex.009=fore:#007F7F,bold style.pyrex.010=bold style.pyrex.011= style.pyrex.012=fore:#7F7F7F style.pyrex.013=fore:#000000,back:#ECD7EC,eolfilled style.pyrex.032=back:%(backcol)s,face:%(mono)s,size:%(size)d style.pyrex.033=size:%(ln-size)d,face:%(ln-font)s,back:#A0A0A0 style.pyrex.034=fore:#0000FF,back:#FFFF88,bold style.pyrex.035=fore:#FF0000,back:#FFFF88,bold style.pyrex.036= style.pyrex.037= [style.pyrex.default] [pyrex] displaysrc='''+`pyrexSource`[1:-1]+''' braces={} styleidnames={wx.stc.STC_P_DEFAULT: 'Default', wx.stc.STC_P_COMMENTLINE: 'Comment', wx.stc.STC_P_NUMBER : 'Number', wx.stc.STC_P_STRING : 'String', wx.stc.STC_P_CHARACTER: 'Single quoted string', wx.stc.STC_P_WORD: 'Keyword', wx.stc.STC_P_TRIPLE:'Triple quotes', wx.stc.STC_P_TRIPLEDOUBLE: 'Triple double quotes', wx.stc.STC_P_CLASSNAME: 'Class definition', wx.stc.STC_P_DEFNAME: 'Function or method', wx.stc.STC_P_OPERATOR: 'Operators', wx.stc.STC_P_IDENTIFIER: 'Identifiers', wx.stc.STC_P_COMMENTBLOCK: 'Comment blocks', wx.stc.STC_P_STRINGEOL: 'EOL unclosed string'} lexer=wx.stc.STC_LEX_PYTHON keywords=and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while struct union enum ctypedef cdef void extern NULL ''' Plugins.assureConfigFile(pyrex_cfgfile, pyrexStyleEditorConfig) #------------------------------------------------------------------------------- def getPyrexModuleData(): return \ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ \x00\x00\xfaIDATx\x9c\x85SQ\xae\xc4 \x08\x1c6=\x00\x07v\x9b\r\x8fw_n0\xefCT\ \xda\xb5y4\x06*\x82\x0c#\xa2\xaa\x18\x12\x11t\xebv;\x01U\x95\xeaC\x91\xe9SUd\ \x12\x92\xe4\xd0n \x00.\xdfuM\x9f\xaa\xc2\xcds\x937\r\xee\x82k\x92c\x94$\x02\ \x90\xc0\xef\xcf\xd2w\x11Y6\x13\x90\x00\x98\xb8w\xd2\xcerX\x16\xf6\x88\xa0\ \xaa\xca\xf1\x14\xdc\xdei\x9c\xcf\xc9\x01\xe0\xd56\x81m\xd4\xb6\x91\x88`D\ \x90\\\xcc\xf0\xf2e\xe3\x06\x0b\xf8\xa7\x89\x8b\xc2<\x0c\xbb&\xc2g\x9f\x04I\ \xe3\x0byR,\x8dZ\xbe\x01\xf8\x00n\xbd\x81u\x8dfJ\xde|\x81\xec\xd6{\xe1\x85\ \xca\xfb\xcb\x1c\xfd\x98\x10\x86\xf6\x02\xc1m\xf5\xc2\xcd9\x1e\xdd\x84\x07P\ \xc6,D\x04a\x00\xde\xbd\x9c\x1d\xbd\xed\xfc\xde?\xea\x8f\xa3S\xf8\xf46\xea~\ \xcb\x8b\xe60\xb99a\xdf\x10\xc6\x9e\xdb\x9df_\xc3T\'\x12\x19Tq\xde\x83\xea\ \xfa\x03.(\xfa\xcc\xbb\xaeS\xb9\x00\x00\x00\x00IEND\xaeB`\x82' def getPyrexPaletteData(): return \ '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\ \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\ \x01QIDATx\x9c\xdd\x95AN\xc40\x0cE\x9f\x11\x070WE\xb3#D(\x98\xdd\x88\xab\x92\ \x1b\x98E\x125\xd3\xb8\x15\x0bf\x01\x96\xaaVu\xf2\x7f\xfc\xbf\xdd\x8a\xaar\ \xcfx\xb8+\xfa\xbf x\x94\x08&\x99 \x9c`+\xc6\xf5s\x05\xfd1\xc1o\xc4\xdf\xffe\xde\ \x9d\xe0\x1b_\xc7\xa9{G\x16\x95\x05\x00\x00\x00\x00IEND\xaeB`\x82' Preferences.IS.registerImage('Images/Modules/Pyrex.png', getPyrexModuleData()) Preferences.IS.registerImage('Images/Palette/Pyrex.png', getPyrexPaletteData())