"""
WebUtils.Funcs provides some basic functions that are useful in HTML and web development.
You can safely import * from WebUtils.Funcs if you like.
TO DO
* Document the 'codes' arg of htmlEncode/Decode.
"""
import string
htmlCodes = [
['&', '&'],
['<', '<'],
['>', '>'],
['"', '"'],
# ['\n', '<br>']
]
htmlCodesReversed = htmlCodes[:]
htmlCodesReversed.reverse()
def htmlEncode(s, codes=htmlCodes):
""" Returns the HTML encoded version of the given string. This is useful to display a plain ASCII text string on a web page."""
for code in codes:
s = string.replace(s, code[0], code[1])
return s
def htmlDecode(s, codes=htmlCodesReversed):
""" Returns the ASCII decoded version of the given HTML string. This does NOT remove normal HTML tags like <p>. It is the inverse of htmlEncode(). """
for code in codes:
s = string.replace(s, code[1], code[0])
return s
_urlEncode = {}
for i in range(256):
_urlEncode[chr(i)] = '%%%02x' % i
for c in string.letters + string.digits + '_,.-/':
_urlEncode[c] = c
_urlEncode[' '] = '+'
def urlEncode(s):
""" Returns the encoded version of the given string, safe for using as a URL. """
return string.join(map(lambda c: _urlEncode[c], list(s)), '')
def urlDecode(s):
""" Returns the decoded version of the given string. Note that invalid URLs will throw exceptons. For example, a URL whose % coding is incorrect. """
mychr = chr
atoi = string.atoi
parts = string.split(string.replace(s, '+', ' '), '%')
for i in range(1, len(parts)):
part = parts[i]
parts[i] = mychr(atoi(part[:2], 16)) + part[2:]
return string.join(parts, '')
def htmlForDict(dict, addSpace=None, filterValueCallBack=None, maxValueLength=None):
""" Returns an HTML string with a <table> where each row is a key-value pair. """
keys = dict.keys()
keys.sort()
# A really great (er, bad) example of hardcoding. :-)
html = ['<table width=100% border=0 cellpadding=2 cellspacing=2>']
for key in keys:
value = dict[key]
if addSpace!=None and addSpace.has_key(key):
target = addSpace[key]
value = string.join(string.split(value, target), '%s '%target)
if filterValueCallBack:
value = filterValueCallBack(value, key, dict)
value = str(value)
if maxValueLength and len(value) > maxValueLength:
value = value[:maxValueLength] + '...'
html.append('<tr bgcolor=#F0F0F0> <td> %s </td> <td> %s </td> </tr>\n' % (htmlEncode(key), htmlEncode(value)))
html.append('</table>')
return string.join(html, '')
def requestURI(dict):
""" Returns the request URI for a given CGI-style dictionary. Uses REQUEST_URI if available, otherwise constructs and returns it from SCRIPT_NAME, PATH_INFO and QUERY_STRING. """
uri = dict.get('REQUEST_URI', None)
if uri==None:
uri = dict.get('SCRIPT_NAME', '') + dict.get('PATH_INFO', '')
query = dict.get('QUERY_STRING', '')
if query!='':
uri = uri + '?' + query
return uri
def normURL(path):
"""Normalizes a URL path, like os.path.normpath, but acts on
a URL independant of operating system environmant.
"""
if not path:
return
initialslash = path[0] == '/'
lastslash = path[-1] == '/'
comps = string.split(path, '/')
newcomps = []
for comp in comps:
if comp in ('','.'):
continue
if comp != '..':
newcomps.append(comp)
elif newcomps:
newcomps.pop()
path = string.join(newcomps, '/')
if path and lastslash:
path = path + '/'
if initialslash:
path = '/' + path
return path
### Deprecated
HTMLCodes = htmlCodes
HTMLCodesReversed = htmlCodesReversed
def HTMLEncode(s):
print 'DEPRECATED: WebUtils.Funcs.HTMLEncode() on 02/24/01 in ver 0.3. Use htmlEncode() instead.'
return htmlEncode(s)
def HTMLDecode(s):
print 'DEPRECATED: WebUtils.Funcs.HTMLDecode() on 02/24/01 in ver 0.3. Use htmlDecode() instead.'
return htmlDecode(s)
def URLEncode(s):
print 'DEPRECATED: WebUtils.Funcs.URLEncode() on 02/24/01 in ver 0.3. Use urlEncode() instead.'
return urlEncode(s)
def URLDecode(s):
print 'DEPRECATED: WebUtils.Funcs.URLDecode() on 02/24/01 in ver 0.3. Use urlDecode() instead.'
return urlDecode(s)
def HTMLForDictionary(dict, addSpace=None):
print 'DEPRECATED: WebUtils.Funcs.HTMLForDictionary() on 02/24/01 in ver 0.3. Use htmlForDict() instead.'
return htmlForDict(dict, addSpace)
def RequestURI(dict):
print 'DEPRECATED: WebUtils.Funcs.RequestURI() on 02/24/01 in ver 0.3. Use requestURI() instead.'
return requestURI(dict)