Mercurial > p > roundup > code
annotate TAL/TALDefs.py @ 1042:adcfdeac4e76
not sure how useful this is...
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Wed, 04 Sep 2002 04:47:28 +0000 |
| parents | bfd348432420 |
| children |
| 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 |
