annotate roundup/cgi/TAL/TALDefs.py @ 2077:3e0961d6d44d

Added the "actor" property. Metakit backend not done (still not confident I know how it's supposed to work ;) Currently it will come up as NULL in the RDBMS backends for older items. The *dbm backends will look up the journal. I hope to remedy the former before 0.7's release. Fixed a bunch of migration issues in the rdbms backends while I was at it (index changes for key prop changes) and simplified the class table update code for RDBMSes that have "alter table" in their command set (ie. not sqlite) ... migration from "version 1" to "version 2" still hasn't actually been tested yet though.
author Richard Jones <richard@users.sourceforge.net>
date Mon, 15 Mar 2004 05:50:20 +0000
parents fc52d57c6c3e
children 8c2402a78bb0
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.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 #
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
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 # FOR A PARTICULAR PURPOSE
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
14 """Common definitions used by TAL and METAL compilation an transformation.
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
16 __docformat__ = 'restructuredtext'
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 from types import ListType, TupleType
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 TAL_VERSION = "1.3.2"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 XML_NS = "http://www.w3.org/XML/1998/namespace" # URI for XML namespace
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 XMLNS_NS = "http://www.w3.org/2000/xmlns/" # URI for XML NS declarations
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 ZOPE_TAL_NS = "http://xml.zope.org/namespaces/tal"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 ZOPE_METAL_NS = "http://xml.zope.org/namespaces/metal"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 NAME_RE = "[a-zA-Z_][a-zA-Z0-9_]*"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 KNOWN_METAL_ATTRIBUTES = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 "define-macro",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 "use-macro",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 "define-slot",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 "fill-slot",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 "slot"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 KNOWN_TAL_ATTRIBUTES = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 "define",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 "condition",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "content",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 "replace",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "repeat",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 "attributes",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 "on-error",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 "omit-tag",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 "tal tag",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 class TALError(Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 def __init__(self, msg, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 assert msg != ""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 self.msg = msg
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 def __str__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 result = self.msg
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 if self.lineno is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 result = result + ", at line %d" % self.lineno
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 if self.offset is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 result = result + ", column %d" % (self.offset + 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 return result
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 class METALError(TALError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 class TALESError(TALError):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 class ErrorInfo:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 def __init__(self, err, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 if isinstance(err, Exception):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 self.type = err.__class__
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self.value = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self.type = err
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 self.value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self.lineno = position[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 self.offset = position[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 import re
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 _attr_re = re.compile(r"\s*([^\s]+)\s+([^\s].*)\Z", re.S)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 _subst_re = re.compile(r"\s*(?:(text|structure)\s+)?(.*)\Z", re.S)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 del re
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 def parseAttributeReplacements(arg):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 dict = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 for part in splitParts(arg):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 m = _attr_re.match(part)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 if not m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 raise TALError("Bad syntax in attributes:" + `part`)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 name, expr = m.group(1, 2)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 if dict.has_key(name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 raise TALError("Duplicate attribute name in attributes:" + `part`)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 dict[name] = expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 return dict
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 def parseSubstitution(arg, position=(None, None)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 m = _subst_re.match(arg)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 if not m:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 raise TALError("Bad syntax in substitution text: " + `arg`, position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 key, expr = m.group(1, 2)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 if not key:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 key = "text"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 return key, expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 def splitParts(arg):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 # Break in pieces at undoubled semicolons and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 # change double semicolons to singles:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 import string
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 arg = string.replace(arg, ";;", "\0")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 parts = string.split(arg, ';')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 parts = map(lambda s, repl=string.replace: repl(s, "\0", ";"), parts)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 if len(parts) > 1 and not string.strip(parts[-1]):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 del parts[-1] # It ended in a semicolon
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 return parts
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 def isCurrentVersion(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 version = getProgramVersion(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 return version == TAL_VERSION
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 def getProgramMode(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 version = getProgramVersion(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 if (version == TAL_VERSION and isinstance(program[1], TupleType) and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 len(program[1]) == 2):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 opcode, mode = program[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 if opcode == "mode":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 return mode
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 def getProgramVersion(program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 if (len(program) >= 2 and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 isinstance(program[0], TupleType) and len(program[0]) == 2):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 opcode, version = program[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 if opcode == "version":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 return version
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 import cgi
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 def quote(s, escape=cgi.escape):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 return '"%s"' % escape(s, 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 del cgi

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