annotate TAL/TALDefs.py @ 1029:c3e391d9c4e9

more FieldStorage fun
author Richard Jones <richard@users.sourceforge.net>
date Tue, 03 Sep 2002 07:42:38 +0000
parents bfd348432420
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
982
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # All Rights Reserved.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # This software is subject to the provisions of the Zope Public License,
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 # FOR A PARTICULAR PURPOSE
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 """
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 Common definitions used by TAL and METAL compilation an transformation.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 """
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 from types import ListType, TupleType
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 TAL_VERSION = "1.3.2"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 XML_NS = "http://www.w3.org/XML/1998/namespace" # URI for XML namespace
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 XMLNS_NS = "http://www.w3.org/2000/xmlns/" # URI for XML NS declarations
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 ZOPE_TAL_NS = "http://xml.zope.org/namespaces/tal"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 ZOPE_METAL_NS = "http://xml.zope.org/namespaces/metal"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 NAME_RE = "[a-zA-Z_][a-zA-Z0-9_]*"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 KNOWN_METAL_ATTRIBUTES = [
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 "define-macro",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 "use-macro",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 "define-slot",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 "fill-slot",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 "slot"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 ]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 KNOWN_TAL_ATTRIBUTES = [
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 "define",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 "condition",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "content",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 "replace",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "repeat",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 "attributes",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 "on-error",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 "omit-tag",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 "tal tag",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 ]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 class TALError(Exception):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 def __init__(self, msg, position=(None, None)):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 assert msg != ""
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 self.msg = msg
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 self.lineno = position[0]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 self.offset = position[1]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 def __str__(self):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 result = self.msg
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 if self.lineno is not None:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 result = result + ", at line %d" % self.lineno
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 if self.offset is not None:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 result = result + ", column %d" % (self.offset + 1)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 return result
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 class METALError(TALError):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 pass
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 class TALESError(TALError):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 pass
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 class ErrorInfo:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 def __init__(self, err, position=(None, None)):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 if isinstance(err, Exception):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 self.type = err.__class__
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self.value = err
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 else:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self.type = err
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 self.value = None
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self.lineno = position[0]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 self.offset = position[1]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 import re
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 _attr_re = re.compile(r"\s*([^\s]+)\s+([^\s].*)\Z", re.S)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 _subst_re = re.compile(r"\s*(?:(text|structure)\s+)?(.*)\Z", re.S)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 del re
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 def parseAttributeReplacements(arg):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 dict = {}
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 for part in splitParts(arg):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 m = _attr_re.match(part)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 if not m:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 raise TALError("Bad syntax in attributes:" + `part`)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 name, expr = m.group(1, 2)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 if dict.has_key(name):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 raise TALError("Duplicate attribute name in attributes:" + `part`)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 dict[name] = expr
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 return dict
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 def parseSubstitution(arg, position=(None, None)):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 m = _subst_re.match(arg)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 if not m:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 raise TALError("Bad syntax in substitution text: " + `arg`, position)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 key, expr = m.group(1, 2)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 if not key:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 key = "text"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 return key, expr
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 def splitParts(arg):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 # Break in pieces at undoubled semicolons and
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 # change double semicolons to singles:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 import string
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 arg = string.replace(arg, ";;", "\0")
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 parts = string.split(arg, ';')
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 parts = map(lambda s, repl=string.replace: repl(s, "\0", ";"), parts)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 if len(parts) > 1 and not string.strip(parts[-1]):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 del parts[-1] # It ended in a semicolon
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 return parts
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 def isCurrentVersion(program):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 version = getProgramVersion(program)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 return version == TAL_VERSION
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 def getProgramMode(program):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 version = getProgramVersion(program)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 if (version == TAL_VERSION and isinstance(program[1], TupleType) and
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 len(program[1]) == 2):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 opcode, mode = program[1]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 if opcode == "mode":
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 return mode
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 return None
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 def getProgramVersion(program):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 if (len(program) >= 2 and
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 isinstance(program[0], TupleType) and len(program[0]) == 2):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 opcode, version = program[0]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 if opcode == "version":
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 return version
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 return None
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 import cgi
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 def quote(s, escape=cgi.escape):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 return '"%s"' % escape(s, 1)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 del cgi

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