--- /dev/null
+#----------------------------------------------------------------------------
+# 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)