Alien-SVN
view release on metacpan or search on metacpan
src/subversion/build/generator/ezt.py view on Meta::CPAN
# walk the rest of the dotted reference
for attr in rest:
try:
ob = getattr(ob, attr)
except AttributeError:
raise UnknownReference(refname, filename, line_number)
# make sure we return a string instead of some various Python types
if isinstance(ob, (int, long, float)):
return str(ob)
if ob is None:
return ''
# string or a sequence
return ob
def _replace(s, replace_map):
for orig, repl in replace_map:
s = s.replace(orig, repl)
return s
REPLACE_JS_MAP = (
('\\', r'\\'), ('\t', r'\t'), ('\n', r'\n'), ('\r', r'\r'),
('"', r'\x22'), ('\'', r'\x27'), ('&', r'\x26'),
('<', r'\x3c'), ('>', r'\x3e'), ('=', r'\x3d'),
)
# Various unicode whitespace
if sys.version_info[0] >= 3:
# Python >=3.0
REPLACE_JS_UNICODE_MAP = (
('\u0085', r'\u0085'), ('\u2028', r'\u2028'), ('\u2029', r'\u2029')
)
else:
# Python <3.0
REPLACE_JS_UNICODE_MAP = eval("((u'\u0085', r'\u0085'), (u'\u2028', r'\u2028'), (u'\u2029', r'\u2029'))")
# Why not cgi.escape? It doesn't do single quotes which are occasionally
# used to contain HTML attributes and event handler definitions (unfortunately)
REPLACE_HTML_MAP = (
('&', '&'), ('<', '<'), ('>', '>'),
('"', '"'), ('\'', '''),
)
def _js_escape(s):
s = _replace(s, REPLACE_JS_MAP)
### perhaps attempt to coerce the string to unicode and then replace?
if isinstance(s, unicode):
s = _replace(s, REPLACE_JS_UNICODE_MAP)
return s
def _html_escape(s):
return _replace(s, REPLACE_HTML_MAP)
def _url_escape(s):
### quote_plus barfs on non-ASCII characters. According to
### http://www.w3.org/International/O-URL-code.html URIs should be
### UTF-8 encoded first.
if isinstance(s, unicode):
s = s.encode('utf8')
return urllib_parse_quote_plus(s)
FORMATTERS = {
FORMAT_RAW: None,
FORMAT_HTML: _html_escape,
FORMAT_XML: _html_escape, ### use the same quoting as HTML for now
FORMAT_JS: _js_escape,
FORMAT_URL: _url_escape,
}
def _parse_format(format_string=FORMAT_RAW):
format_funcs = []
try:
for fspec in format_string.split(','):
format_func = FORMATTERS[fspec]
if format_func is not None:
format_funcs.append(format_func)
except KeyError:
raise UnknownFormatConstantError(format_string)
return format_funcs
class _context:
"""A container for the execution context"""
class Reader:
"""Abstract class which allows EZT to detect Reader objects."""
def filename(self):
return '(%s does not provide filename() method)' % repr(self)
class _FileReader(Reader):
"""Reads templates from the filesystem."""
def __init__(self, fname):
self.text = open(fname, 'rb').read()
if sys.version_info[0] >= 3:
# Python >=3.0
self.text = self.text.decode()
self._dir = os.path.dirname(fname)
self.fname = fname
def read_other(self, relative):
return _FileReader(os.path.join(self._dir, relative))
def filename(self):
return self.fname
class _TextReader(Reader):
"""'Reads' a template from provided text."""
def __init__(self, text):
self.text = text
def read_other(self, relative):
raise BaseUnavailableError()
def filename(self):
return '(text)'
class EZTException(Exception):
"""Parent class of all EZT exceptions."""
def __init__(self, message=None, filename=None, line_number=None):
self.message = message
self.filename = filename
self.line_number = line_number
( run in 0.869 second using v1.01-cache-2.11-cpan-3782747c604 )