annotate roundup/cgi/TAL/TALDefs.py @ 3916:57ad3e2c2545

handle bad cookies Roundup's cgi gets all cookies from all apps on the same server. some apps aren't as well behaved as roundup and generate cookies that do not follow the spec perfectly. This causes python's Cookie module to throw an exception when trying to parse them. In the spirit of being liberal in what we accept, we create a LiberalCookie class that can handle those out-of-spec cookies and allow roundup to continue onward. [SF#1691708] code from S. Woodside
author Justus Pendleton <jpend@users.sourceforge.net>
date Sat, 22 Sep 2007 21:20:57 +0000
parents 8c2402a78bb0
children 63868084b8bb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # All Rights Reserved.
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
5 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
11 # FOR A PARTICULAR PURPOSE.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
12 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
14 # Modifications for Roundup:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
15 # 1. commented out ITALES references
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 """
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
17 Common definitions used by TAL and METAL compilation an transformation.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
18 """
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 from types import ListType, TupleType
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
22 #from ITALES import ITALESErrorInfo
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
23
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
24 TAL_VERSION = "1.4"
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 XML_NS = "http://www.w3.org/XML/1998/namespace" # URI for XML namespace
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 XMLNS_NS = "http://www.w3.org/2000/xmlns/" # URI for XML NS declarations
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 ZOPE_TAL_NS = "http://xml.zope.org/namespaces/tal"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 ZOPE_METAL_NS = "http://xml.zope.org/namespaces/metal"
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
31 ZOPE_I18N_NS = "http://xml.zope.org/namespaces/i18n"
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
33 # This RE must exactly match the expression of the same name in the
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
34 # zope.i18n.simpletranslationservice module:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
35 NAME_RE = "[a-zA-Z_][-a-zA-Z0-9_]*"
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 KNOWN_METAL_ATTRIBUTES = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 "define-macro",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 "use-macro",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 "define-slot",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "fill-slot",
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
42 "slot",
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 KNOWN_TAL_ATTRIBUTES = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 "define",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 "condition",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 "content",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 "replace",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 "repeat",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 "attributes",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 "on-error",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 "omit-tag",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 "tal tag",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
57 KNOWN_I18N_ATTRIBUTES = [
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
58 "translate",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
59 "domain",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
60 "target",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
61 "source",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
62 "attributes",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
63 "data",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
64 "name",
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
65 ]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
66
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 class TALError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 def __init__(self, msg, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 assert msg != ""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 self.msg = msg
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 self.offset = position[1]
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
74 self.filename = None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
75
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
76 def setFile(self, filename):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
77 self.filename = filename
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 def __str__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 result = self.msg
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 if self.lineno is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 result = result + ", at line %d" % self.lineno
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 if self.offset is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 result = result + ", column %d" % (self.offset + 1)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
85 if self.filename is not None:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
86 result = result + ', in file %s' % self.filename
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 return result
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 class METALError(TALError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 class TALESError(TALError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
95 class I18NError(TALError):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
96 pass
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
97
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
98
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 class ErrorInfo:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
101 #__implements__ = ITALESErrorInfo
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
102
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 def __init__(self, err, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 if isinstance(err, Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 self.type = err.__class__
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 self.value = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 self.type = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 self.value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
113
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
114
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 import re
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 _attr_re = re.compile(r"\s*([^\s]+)\s+([^\s].*)\Z", re.S)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 _subst_re = re.compile(r"\s*(?:(text|structure)\s+)?(.*)\Z", re.S)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 del re
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
120 def parseAttributeReplacements(arg, xml):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 dict = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 for part in splitParts(arg):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 m = _attr_re.match(part)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 if not m:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
125 raise TALError("Bad syntax in attributes: " + `part`)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 name, expr = m.group(1, 2)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
127 if not xml:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
128 name = name.lower()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 if dict.has_key(name):
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
130 raise TALError("Duplicate attribute name in attributes: " + `part`)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 dict[name] = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 return dict
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 def parseSubstitution(arg, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 m = _subst_re.match(arg)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 if not m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 raise TALError("Bad syntax in substitution text: " + `arg`, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 key, expr = m.group(1, 2)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 if not key:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 key = "text"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 return key, expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 def splitParts(arg):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 # Break in pieces at undoubled semicolons and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 # change double semicolons to singles:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
146 arg = arg.replace(";;", "\0")
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
147 parts = arg.split(';')
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
148 parts = [p.replace("\0", ";") for p in parts]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
149 if len(parts) > 1 and not parts[-1].strip():
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 del parts[-1] # It ended in a semicolon
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 return parts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 def isCurrentVersion(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 version = getProgramVersion(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 return version == TAL_VERSION
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 def getProgramMode(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 version = getProgramVersion(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 if (version == TAL_VERSION and isinstance(program[1], TupleType) and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 len(program[1]) == 2):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 opcode, mode = program[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 if opcode == "mode":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 return mode
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 def getProgramVersion(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 if (len(program) >= 2 and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 isinstance(program[0], TupleType) and len(program[0]) == 2):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 opcode, version = program[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 if opcode == "version":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 return version
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
174 import re
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
175 _ent1_re = re.compile('&(?![A-Z#])', re.I)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
176 _entch_re = re.compile('&([A-Z][A-Z0-9]*)(?![A-Z0-9;])', re.I)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
177 _entn1_re = re.compile('&#(?![0-9X])', re.I)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
178 _entnx_re = re.compile('&(#X[A-F0-9]*)(?![A-F0-9;])', re.I)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
179 _entnd_re = re.compile('&(#[0-9][0-9]*)(?![0-9;])')
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
180 del re
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
181
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
182 def attrEscape(s):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
183 """Replace special characters '&<>' by character entities,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
184 except when '&' already begins a syntactically valid entity."""
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
185 s = _ent1_re.sub('&amp;', s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
186 s = _entch_re.sub(r'&amp;\1', s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
187 s = _entn1_re.sub('&amp;#', s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
188 s = _entnx_re.sub(r'&amp;\1', s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
189 s = _entnd_re.sub(r'&amp;\1', s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
190 s = s.replace('<', '&lt;')
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
191 s = s.replace('>', '&gt;')
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
192 s = s.replace('"', '&quot;')
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
193 return s

Roundup Issue Tracker: http://roundup-tracker.org/