New Features: In Tab-View mode, Ctrl-number will take the user to
    the numbered tab view.  Modified files now show an '*' astrisk in
    the view title.  Debugger framework can now support PHP debugging.
    Not important for python development, but at least that means the
    debugger framework is more generalized.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38852 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
	
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #----------------------------------------------------------------------------
 | |
| # Name:         utillang.py
 | |
| # Purpose:      Provide language specific utilities 
 | |
| #
 | |
| # Author:       Joel Hare
 | |
| #
 | |
| # Created:      8/23/05
 | |
| # CVS-ID:       $Id$
 | |
| # Copyright:    (c) 2004-2005 ActiveGrid, Inc.
 | |
| # License:      wxWindows License
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import UserDict
 | |
| import tempfile
 | |
| import xml.sax.saxutils as saxutils
 | |
| 
 | |
| import activegrid.util.parser as parser
 | |
| 
 | |
| PY2WEB_codepages = {
 | |
|      'cp1251' : 'CP-1251',
 | |
|      'koi8_r' : 'KOI8-R',
 | |
| }
 | |
| 
 | |
| def evalXPath(xpath, data, specialEntries=None):
 | |
|     codeStr = parser.xpathToCode(xpath)
 | |
|     return evalCode(codeStr, data, specialEntries)
 | |
| 
 | |
| def evalCode(codeStr, data, specialEntries=None):
 | |
|     if isinstance(data, ObjAsDict):
 | |
|         namespace = data
 | |
|     elif isinstance(data, dict):
 | |
|         namespace = dict(data)
 | |
|     else:
 | |
|         namespace = ObjAsDict(data)
 | |
|     if specialEntries:
 | |
|         for key, value in specialEntries.items():
 | |
|             namespace.addSpecialEntry(key, value)
 | |
|     return eval(codeStr, {}, namespace)
 | |
| 
 | |
| def deriveCharset():
 | |
|     charset = None
 | |
|     encodingString = sys.getdefaultencoding()
 | |
|     if encodingString != 'ascii':
 | |
|         charset = PY2WEB_codepages.get(encodingString.lower())
 | |
|         if charset == None:
 | |
|             charset = encodingString
 | |
|     return charset
 | |
| 
 | |
| def toUTF8(value):
 | |
|     """
 | |
|     Converts all unicode and non-string values to utf-8.
 | |
|     This assumes string instances are already encoded in utf-8.
 | |
|     Note that us-ascii is a subset of utf-8.
 | |
|     """
 | |
|     if isinstance(value, unicode):
 | |
|         return value.encode('utf-8')
 | |
|     return str(value)
 | |
| 
 | |
| def toUnicode(value):
 | |
|     """
 | |
|     Converts all strings non-string values to unicode.
 | |
|     This assumes string instances are encoded in utf-8.
 | |
|     Note that us-ascii is a subset of utf-8.
 | |
|     """
 | |
|     if not isinstance(value, unicode):
 | |
|         if not isinstance(value, str):
 | |
|             return unicode(value)
 | |
|         return unicode(value, 'utf-8')
 | |
|     return value
 | |
|     
 | |
| 
 | |
| def getSystemTempDir():
 | |
|     return tempfile.gettempdir()
 | |
| 
 | |
| def getEnvVar(name, defaultVal=None):
 | |
|     if os.environ.has_key(name):
 | |
|         return os.environ[name]
 | |
|     return defaultVal
 | |
| 
 | |
| class ObjAsDict(UserDict.DictMixin):
 | |
|     """
 | |
|     Passing this to eval as the local variables dictionary allows the
 | |
|     evaluated code to access properties in the wrapped object
 | |
|     """
 | |
|     def __init__(self, obj):
 | |
|         self.obj = obj
 | |
|         self.specialEntries = {}
 | |
| 
 | |
|     def __getitem__(self, key):
 | |
|         try:
 | |
|             return getattr(self.obj, key)
 | |
|         except AttributeError, e:
 | |
|             if self.specialEntries.has_key(key):
 | |
|                 return self.specialEntries[key]
 | |
|             raise KeyError(e.args)
 | |
|     def __setitem__(self, key, item): setattr(self.obj, key, item)
 | |
|     def __delitem__(self, key): delattr(self.obj, key)
 | |
|     def keys(self):
 | |
|         ret=[]
 | |
|         for i in list(dir(self.obj)+self.specialEntries.keys()):
 | |
|             if i=="__doc__" or i=="__module__":
 | |
|                 pass
 | |
|             elif i not in ret:
 | |
|                 ret.append(i)
 | |
|         return ret
 | |
| 
 | |
|     def addSpecialEntry(self, key, value):
 | |
|         self.specialEntries[key] = value
 | |
| 
 | |
| global saxXMLescapeDoubleQuote
 | |
| saxXMLescapeDoubleQuote = {'"':'"'}
 | |
| 
 | |
| global saxXMLescapesAllQuotes
 | |
| # IE doesn't support ' but it doesn't seem like we should need this escaped at all so I took it out.
 | |
| saxXMLescapesAllQuotes = {'"':'"', "'":"'"}
 | |
| 
 | |
| global saxXMLunescapes
 | |
| saxXMLunescapes = {'"':'"', "'":"'"}
 | |
| 
 | |
| def escape(data, extraEscapes=None):
 | |
|     """Escape ', ", &, <, and > in a string of data.
 | |
| 
 | |
|     Basically, everything that saxutils.escape does (and this calls that, at
 | |
|     least for now), but with " and ' added as well.
 | |
| 
 | |
|     TODO: make this faster; saxutils.escape() is really slow
 | |
|     """
 | |
|     
 | |
|     global saxXMLescapeDoubleQuote
 | |
|     if (extraEscapes == None):
 | |
|         extraEscapes = saxXMLescapeDoubleQuote
 | |
|     return saxutils.escape(data, extraEscapes)
 | |
| 
 | |
| def unescape(data):
 | |
|     """Unescape ', ", &, <, and > in a string of data.
 | |
| 
 | |
|     Basically, everything that saxutils.unescape does (and this calls that, at
 | |
|     least for now), but with " and ' added as well.
 | |
| 
 | |
|     TODO: make this faster; saxutils.unescape() is really slow
 | |
|     """
 | |
|     
 | |
|     global saxXMLunescapes
 | |
|     return saxutils.unescape(data, saxXMLunescapes)
 |