1 #---------------------------------------------------------------------------- 
   3 # Purpose:      Abstract Code Editor for pydocview tbat uses the Styled Text Control 
   9 # Copyright:    (c) 2004-2005 ActiveGrid, Inc. 
  10 # License:      wxWindows License 
  11 #---------------------------------------------------------------------------- 
  22 class HtmlDocument(CodeEditor
.CodeDocument
): 
  27 class HtmlView(CodeEditor
.CodeView
): 
  30     def GetCtrlClass(self
): 
  31         """ Used in split window to instantiate new instances """ 
  35     def GetAutoCompleteHint(self
): 
  36         pos 
= self
.GetCtrl().GetCurrentPos() 
  40         validLetters 
= string
.letters 
+ string
.digits 
+ '_!-' 
  46             char 
= chr(self
.GetCtrl().GetCharAt(pos
)) 
  47             if char 
not in validLetters
: 
  54     def GetAutoCompleteDefaultKeywords(self
): 
  58 ##    def _CreateControl(self, parent, id): 
  59 ##        import wx  # wxBug: When inlining the import of the appropriate html control below, have to specifically import wx for some reason 
  60 ##        self._notebook = wx.Notebook(parent, wx.NewId(), style = wx.NB_BOTTOM) 
  61 ##        self._textEditor = HtmlCtrl(self._notebook, id) 
  62 ##        if wx.Platform =='__WXMSW__': 
  63 ##            import wxPython.iewin 
  64 ##            self._browserCtrl = wxPython.iewin.wxIEHtmlWin(self._notebook, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE) 
  67 ##            self._browserCtrl = wx.html.HtmlWindow(self._notebook, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE) 
  68 ##        self._notebook.AddPage(self._textEditor, _("Edit")) 
  69 ##        self._notebook.AddPage(self._browserCtrl, _("View")) 
  70 ##        self._insertMode = True 
  71 ##        wx.EVT_NOTEBOOK_PAGE_CHANGED(self._notebook, self._notebook.GetId(), self.OnNotebookChanging) 
  72 ##        return self._textEditor 
  75 ##    def _CreateSizer(self, frame): 
  76 ##        sizer = wx.BoxSizer(wx.HORIZONTAL) 
  77 ##        sizer.Add(self._notebook, 1, wx.EXPAND) 
  78 ##        frame.SetSizer(sizer) 
  81 ##    def OnNotebookChanging(self, event): 
  82 ##        if event.GetSelection() == 0:  # Going to the edit page 
  83 ##            pass  # self._textEditor.Refresh() 
  84 ##        elif event.GetSelection() == 1:  # Going to the browser page 
  85 ##            text = self._textEditor.GetText() 
  86 ##            if wx.Platform == '__WXMSW__': 
  87 ##                path = os.path.join(tempfile.gettempdir(), "temp.html") 
  88 ##                file = open(path, 'w') 
  91 ##                self._browserCtrl.Navigate("file://" + path) 
  93 ##                self._browserCtrl.SetPage(text) 
  97 class HtmlService(CodeEditor
.CodeService
): 
 101         CodeEditor
.CodeService
.__init
__(self
) 
 104 class HtmlCtrl(CodeEditor
.CodeCtrl
): 
 107     def __init__(self
, parent
, id=-1, style
=wx
.NO_FULL_REPAINT_ON_RESIZE
): 
 108         CodeEditor
.CodeCtrl
.__init
__(self
, parent
, id, style
) 
 109         self
.SetLexer(wx
.stc
.STC_LEX_HTML
) 
 110         self
.SetProperty("fold.html", "1") 
 113     def GetMatchingBraces(self
): 
 117     def CanWordWrap(self
): 
 121     def SetViewDefaults(self
): 
 122         CodeEditor
.CodeCtrl
.SetViewDefaults(self
, configPrefix 
= "Html", hasWordWrap 
= True, hasTabs 
= True, hasFolding
=True) 
 125     def GetFontAndColorFromConfig(self
): 
 126         return CodeEditor
.CodeCtrl
.GetFontAndColorFromConfig(self
, configPrefix 
= "Html") 
 129     def UpdateStyles(self
): 
 130         CodeEditor
.CodeCtrl
.UpdateStyles(self
) 
 132         if not self
.GetFont(): 
 135         faces 
= { 'font' : self
.GetFont().GetFaceName(), 
 136                   'size' : self
.GetFont().GetPointSize(), 
 137                   'size2': self
.GetFont().GetPointSize() - 2, 
 138                   'color' : "%02x%02x%02x" % (self
.GetFontColor().Red(), self
.GetFontColor().Green(), self
.GetFontColor().Blue()) 
 142         self
.StyleSetSpec(wx
.stc
.STC_H_DEFAULT
, "face:%(font)s,fore:#000000,face:%(font)s,size:%(size)d" % faces
) 
 144         self
.StyleSetSpec(wx
.stc
.STC_H_COMMENT
, "face:%(font)s,fore:#007F00,italic,face:%(font)s,size:%(size)d" % faces
) 
 146         self
.StyleSetSpec(wx
.stc
.STC_H_NUMBER
, "face:%(font)s,fore:#007F7F,size:%(size)d" % faces
) 
 148         self
.StyleSetSpec(wx
.stc
.STC_H_SINGLESTRING
, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces
) 
 149         self
.StyleSetSpec(wx
.stc
.STC_H_DOUBLESTRING
, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces
) 
 151         self
.StyleSetSpec(wx
.stc
.STC_H_TAG
, "face:%(font)s,fore:#00007F,bold,size:%(size)d" % faces
) 
 153         self
.StyleSetSpec(wx
.stc
.STC_H_ATTRIBUTE
, "face:%(font)s,fore:#00007F,bold,size:%(size)d" % faces
) 
 156 class HtmlOptionsPanel(STCTextEditor
.TextOptionsPanel
): 
 158     def __init__(self
, parent
, id): 
 159         STCTextEditor
.TextOptionsPanel
.__init
__(self
, parent
, id, configPrefix 
= "Html", label 
= "HTML", hasWordWrap 
= True, hasTabs 
= True, hasFolding
=True) 
 167         "A", "ABBR", "ACRONYM", "ADDRESS", "APPLET", "AREA", "B", "BASE", "BASEFONT", "BDO", "BIG", "BLOCKQUOTE", 
 168         "BODY", "BR", "BUTTON", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "DD", "DEL", "DFN", "DIR", 
 169         "DIV", "DL", "DT", "EM", "FIELDSET", "FONT", "FORM", "FRAME", "FRAMESET", "H1", "H2", "H3", "H4", "H5", "H6", 
 170         "HEAD", "HR", "HTML", "I", "IFRAME", "IMG", "INPUT", "INS", "ISINDEX", "KBD", "LABEL", "LEGEND", "LI", "LINK", 
 171         "MAP", "MENU", "META", "NOFRAMES", "NOSCRIPT", "OBJECT", "OL", "OPTGROUP", "OPTION", "P", "PARAM", 
 172         "PRE", "Q", "S", "SAMP", "SCRIPT", "SELECT", "SMALL", "SPAN", "STRIKE", "STRONG", "STYLE", "SUB", "SUP", 
 173         "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TITLE", "TR", "TT", "U", "UL", "VAR", "XML", 
 174         "XMLNS", "ACCEPT-CHARSET", "ACCEPT", "ACCESSKEY", "ACTION", "ALIGN", "ALINK", "ALT", 
 175         "ARCHIVE", "AXIS", "BACKGROUND", "BGCOLOR", "BORDER", "CELLPADDING", "CELLSPACING", "CHAR", 
 176         "CHAROFF", "CHARSET", "CHECKED", "CLASS", "CLASSID", "CLEAR", "CODEBASE", "CODETYPE", 
 177         "COLOR", "COLS", "COLSPAN", "COMPACT", "CONTENT", "COORDS", "DATA", "DATAFLD", "DATAFORMATAS", 
 178         "DATAPAGESIZE", "DATASRC", "DATETIME", "DECLARE", "DEFER", "DISABLED", "ENCTYPE", 
 179         "EVENT", "FACE", "FOR", "FRAMEBORDER", "HEADERS", "HEIGHT", "HREF", "HREFLANG", "HSPACE", 
 180         "HTTP-EQUIV", "ID", "ISMAP", "LANG", "LANGUAGE", "LEFTMARGIN", "LONGDESC", 
 181         "MARGINWIDTH", "MARGINHEIGHT", "MAXLENGTH", "MEDIA", "METHOD", "MULTIPLE", "NAME", "NOHREF", 
 182         "NORESIZE", "NOSHADE", "NOWRAP", "ONBLUR", "ONCHANGE", "ONCLICK", "ONDBLCLICK", 
 183         "ONFOCUS", "ONKEYDOWN", "ONKEYPRESS", "ONKEYUP", "ONLOAD", "ONMOUSEDOWN", "ONMOUSEMOVE", 
 184         "ONMOUSEOVER", "ONMOUSEOUT", "ONMOUSEUP", "ONRESET", "ONSELECT", "ONSUBMIT", "ONUNLOAD", 
 185         "PROFILE", "PROMPT", "READONLY", "REL", "REV", "ROWS", "ROWSPAN", "RULES", "SCHEME", "SCOPE", 
 186         "SELECTED", "SHAPE", "SIZE", "SRC", "STANDBY", "START", "SUMMARY", "TABINDEX", 
 187         "TARGET", "TOPMARGIN", "TYPE", "USEMAP", "VALIGN", "VALUE", "VALUETYPE", 
 188         "VERSION", "VLINK", "VSPACE", "WIDTH", "TEXT", "PASSWORD", "CHECKBOX", "RADIO", "SUBMIT", "RESET", 
 189         "FILE", "HIDDEN", "IMAGE", "PUBLIC", "!DOCTYPE", 
 190         "ADD_DATE", "LAST_MODIFIED", "LAST_VISIT" 
 194 #---------------------------------------------------------------------------- 
 195 # Icon Bitmaps - generated by encode_bitmaps.py 
 196 #---------------------------------------------------------------------------- 
 197 from wx 
import ImageFromStream
, BitmapFromImage
 
 203 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ 
 204 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ 
 205 \x00\x01\xeeIDAT8\x8d}\x92?h\x13a\x18\xc6\x7fw=\x8d\xb4\x98\xa9-uP\x1a\xc9p$\ 
 206 \xdc`\xd0C\x8d\x8b)\xc5!Z\x11\xcc\xd0A\xd0*\xa8\x93\x8b8\x18\x11\x14RD\x07\t\ 
 207 N\xfe\xc1\x0cRAtS\x1c,\xcd\x10\x8c\xd8S\xba$9"\x11L\r\x96\x92\xa4.\xda#i\xa5\ 
 208 \xe7p^r\x97?\xbe\xd3\xf1~\xdf\xf3{\x9f\xe7\xbbW\xf8T(\x998j\xb9V\x07 _\xde\ 
 209 \x0e\xc0\xad\x19U\xe0?%\x01\x0c\xef\x19owv\xf9\xff\x01\x96\x88N\x850\x92)\ 
 210 \xf3\xde\x95s}!Rgcx\xdb\x9f\xd6\xf7Z\x13"\xa7\xcf\x00\xf4\x85t\x01\xea\x9b\ 
 211 \xedV\xfa\xd53\x00\xb2z\xb3\x7f\x84\xe5Z\xbd\x15\xc1)>x,\x04\x84,\xc0\xed\'\ 
 212 \xfd\x01\x9dB\xdb:\xc0\x8a\xb1E\xa3\xb2A8\xe0!\x9cL\x99\x00\x83;\x83D\x0fxQ\ 
 213 \x15Y\xe8\x19\xc1\x16\xff\xfe\xf2\x11V\xaf\xb1\x03\x90G\xe0\xf5\xe7\n\xd5\ 
 214 \xf58\xb0\xc4\xfc"\xbcL\xbf7c\x91#\x82h\xff\xae\xb5\xa6{\xf2\xdc\x9bi\x17\ 
 215 \xf8\xc6\x85\xaf\x9c\xbf:\x03\xc0\xe8P\x82\x8bwN\xa2\xe5\x8a\xa6\xe8\x9cjW\ 
 216 \xf1\xed\x1c`M\x05P\x94\xa7=\xf3\xcf\xa6&\x91\x8c_\x85\xd6c\xad\x18[\xae\x0b\ 
 217 \'\xf6\xef\xe6h4\r\xc0\xcf\x1f\xd0\xa8l0:\x94 \x937\x00\xc8\xe4\r\xeb\r:\x85\ 
 218 \xe3J\x0cy\xe41\xde\xb1\xbb\xd4\xbf\x97\x11\x07|\x00T\xcbz\x97\x0b\xb1\x97\ 
 219 \xb5jY\xa71\xf6\x0e-Wb65\xc9\x8b\xf9\xe7,\xaenZg\xebq\xd7])\xab7\xc9\xea\xee\ 
 220 \x8c\xdaB\x90\xf8u\xbde\x13n\xb6\x96I[\x08\xa2N$(~\x8b#\xfb\x12H\x1f\x1e^\ 
 221 \xeaZQ-W4\x0f\x9f\xaa\x01~\x8eO\r\x92\xc9\x1b\xc8>KlC\xbc{!\x1c\xf0\xf4\x8e\ 
 222 \xa0*\xb2\x90|\xb4\xcf\xe1\xa0-v\xd6\xe5\xb3\xd3\x08\x828\xd0\x8b\x01X\xcb\ 
 223 \xa2\xe5J\xdc\x7f\xe0o\xc3\'\n\x84\x03\x1eb\x91C\xa8\x8a,\xfc\x05\xf6\x0e\ 
 224 \xbfa\x1f\xe7Z\xfb\x00\x00\x00\x00IEND\xaeB`\x82'  
 228     return BitmapFromImage(getHTMLImage()) 
 231     stream 
= cStringIO
.StringIO(getHTMLData()) 
 232     return ImageFromStream(stream
) 
 235     return wx
.IconFromBitmap(getHTMLBitmap())