annotate roundup/cgi/TAL/TALInterpreter.py @ 5253:2d61e39b89c8

Issue2550716 Email address displayed after password reset request (fix) Change the message displayed upon password reset using an account name to no longer expose the email address. Password reset triggered using an email address will still display the user supplied email address.
author John Rouillard <rouilj@ieee.org>
date Sat, 26 Aug 2017 20:27:08 -0400
parents 8c2402a78bb0
children 12fe83f90f0d
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. implemented ustr as str
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 Interpreter for a pre-compiled TAL program.
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 import sys
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 import getopt
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
22 import re
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
23 from types import ListType
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 from cgi import escape
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
25 # Do not use cStringIO here! It's not unicode aware. :(
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
26 from StringIO import StringIO
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
27 #from DocumentTemplate.DT_Util import ustr
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
28 ustr = str
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
30 from TALDefs import TAL_VERSION, TALError, METALError, attrEscape
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 from TALDefs import isCurrentVersion, getProgramVersion, getProgramMode
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 from TALGenerator import TALGenerator
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
33 from TranslationContext import TranslationContext
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 BOOLEAN_HTML_ATTRS = [
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 # List of Boolean attributes in HTML that should be rendered in
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 # minimized form (e.g. <img ismap> rather than <img ismap="">)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 # From http://www.w3.org/TR/xhtml1/#guidelines (C.10)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 # XXX The problem with this is that this is not valid XML and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 # can't be parsed back!
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "compact", "nowrap", "ismap", "declare", "noshade", "checked",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 "disabled", "readonly", "multiple", "selected", "noresize",
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "defer"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 ]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
46 def normalize(text):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
47 # Now we need to normalize the whitespace in implicit message ids and
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
48 # implicit $name substitution values by stripping leading and trailing
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
49 # whitespace, and folding all internal whitespace to a single space.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
50 return ' '.join(text.split())
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
51
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
52
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
53 NAME_RE = r"[a-zA-Z][a-zA-Z0-9_]*"
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
54 _interp_regex = re.compile(r'(?<!\$)(\$(?:%(n)s|{%(n)s}))' %({'n': NAME_RE}))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
55 _get_var_regex = re.compile(r'%(n)s' %({'n': NAME_RE}))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
56
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
57 def interpolate(text, mapping):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
58 """Interpolate ${keyword} substitutions.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
59
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
60 This is called when no translation is provided by the translation
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
61 service.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
62 """
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
63 if not mapping:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
64 return text
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
65 # Find all the spots we want to substitute.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
66 to_replace = _interp_regex.findall(text)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
67 # Now substitute with the variables in mapping.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
68 for string in to_replace:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
69 var = _get_var_regex.findall(string)[0]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
70 if mapping.has_key(var):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
71 # Call ustr because we may have an integer for instance.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
72 subst = ustr(mapping[var])
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
73 try:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
74 text = text.replace(string, subst)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
75 except UnicodeError:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
76 # subst contains high-bit chars...
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
77 # As we have no way of knowing the correct encoding,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
78 # substitue something instead of raising an exception.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
79 subst = `subst`[1:-1]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
80 text = text.replace(string, subst)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
81 return text
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
82
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 class AltTALGenerator(TALGenerator):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 def __init__(self, repldict, expressionCompiler=None, xml=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 self.repldict = repldict
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 self.enabled = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 TALGenerator.__init__(self, expressionCompiler, xml)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 def enable(self, enabled):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 self.enabled = enabled
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 def emit(self, *args):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 if self.enabled:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
96 TALGenerator.emit(self, *args)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
98 def emitStartElement(self, name, attrlist, taldict, metaldict, i18ndict,
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 position=(None, None), isend=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 metaldict = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 taldict = {}
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
102 i18ndict = {}
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 if self.enabled and self.repldict:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 taldict["attributes"] = "x x"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 TALGenerator.emitStartElement(self, name, attrlist,
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
106 taldict, metaldict, i18ndict,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
107 position, isend)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 def replaceAttrs(self, attrlist, repldict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 if self.enabled and self.repldict:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 repldict = self.repldict
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 self.repldict = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 return TALGenerator.replaceAttrs(self, attrlist, repldict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 class TALInterpreter:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 def __init__(self, program, macros, engine, stream=None,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 debug=0, wrap=60, metal=1, tal=1, showtal=-1,
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
120 strictinsert=1, stackLimit=100, i18nInterpolate=1):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 self.program = program
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 self.macros = macros
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
123 self.engine = engine # Execution engine (aka context)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 self.Default = engine.getDefault()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 self.stream = stream or sys.stdout
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 self._stream_write = self.stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 self.debug = debug
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 self.wrap = wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 self.metal = metal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 self.tal = tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 if tal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 self.dispatch = self.bytecode_handlers_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 self.dispatch = self.bytecode_handlers
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 assert showtal in (-1, 0, 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 if showtal == -1:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 showtal = (not tal)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 self.showtal = showtal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 self.strictinsert = strictinsert
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 self.stackLimit = stackLimit
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 self.html = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 self.endsep = "/>"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 self.endlen = len(self.endsep)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 self.macroStack = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 self.position = None, None # (lineno, offset)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 self.col = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 self.level = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 self.scopeLevel = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 self.sourceFile = None
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
150 self.i18nStack = []
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
151 self.i18nInterpolate = i18nInterpolate
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
152 self.i18nContext = TranslationContext()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
153
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
154 def StringIO(self):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
155 # Third-party products wishing to provide a full Unicode-aware
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
156 # StringIO can do so by monkey-patching this method.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
157 return FasterStringIO()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 def saveState(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 return (self.position, self.col, self.stream,
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
161 self.scopeLevel, self.level, self.i18nContext)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 def restoreState(self, state):
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
164 (self.position, self.col, self.stream, scopeLevel, level, i18n) = state
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 self._stream_write = self.stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 assert self.level == level
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 while self.scopeLevel > scopeLevel:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 self.engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 self.scopeLevel = self.scopeLevel - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 self.engine.setPosition(self.position)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
171 self.i18nContext = i18n
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 def restoreOutputState(self, state):
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
174 (dummy, self.col, self.stream, scopeLevel, level, i18n) = state
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 self._stream_write = self.stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 assert self.level == level
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 assert self.scopeLevel == scopeLevel
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 def pushMacro(self, macroName, slots, entering=1):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 if len(self.macroStack) >= self.stackLimit:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 raise METALError("macro nesting limit (%d) exceeded "
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 "by %s" % (self.stackLimit, `macroName`))
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
183 self.macroStack.append([macroName, slots, entering, self.i18nContext])
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
185 def popMacro(self):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
186 return self.macroStack.pop()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 def __call__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 assert self.level == 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 assert self.scopeLevel == 0
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
191 assert self.i18nContext.parent is None
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 self.interpret(self.program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 assert self.level == 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 assert self.scopeLevel == 0
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
195 assert self.i18nContext.parent is None
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 if self.col > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 self._stream_write("\n")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 self.col = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
200 def stream_write(self, s,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
201 len=len):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 self._stream_write(s)
1309
309f125f86cc removed use of string/strop from TAL/TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
203 i = s.rfind('\n')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 if i < 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 self.col = self.col + len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 self.col = len(s) - (i + 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 bytecode_handlers = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
211 def interpretWithStream(self, program, stream):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
212 oldstream = self.stream
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
213 self.stream = stream
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
214 self._stream_write = stream.write
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
215 try:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
216 self.interpret(program)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
217 finally:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
218 self.stream = oldstream
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
219 self._stream_write = oldstream.write
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
220
1409
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1309
diff changeset
221 def interpret(self, program):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 oldlevel = self.level
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 self.level = oldlevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 handlers = self.dispatch
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 if self.debug:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 for (opcode, args) in program:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
228 s = "%sdo_%s(%s)\n" % (" "*self.level, opcode,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
229 repr(args))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 if len(s) > 80:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 s = s[:76] + "...\n"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 sys.stderr.write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 handlers[opcode](self, args)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 for (opcode, args) in program:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 handlers[opcode](self, args)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 finally:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 self.level = oldlevel
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 def do_version(self, version):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 assert version == TAL_VERSION
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 bytecode_handlers["version"] = do_version
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 def do_mode(self, mode):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 assert mode in ("html", "xml")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 self.html = (mode == "html")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 if self.html:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 self.endsep = " />"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 self.endsep = "/>"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 self.endlen = len(self.endsep)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 bytecode_handlers["mode"] = do_mode
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 def do_setSourceFile(self, source_file):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 self.sourceFile = source_file
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 self.engine.setSourceFile(source_file)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 bytecode_handlers["setSourceFile"] = do_setSourceFile
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 def do_setPosition(self, position):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 self.position = position
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 self.engine.setPosition(position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 bytecode_handlers["setPosition"] = do_setPosition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 def do_startEndTag(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 self.do_startTag(stuff, self.endsep, self.endlen)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 bytecode_handlers["startEndTag"] = do_startEndTag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 def do_startTag(self, (name, attrList),
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 end=">", endlen=1, _len=len):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 # The bytecode generator does not cause calls to this method
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 # for start tags with no attributes; those are optimized down
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 # to rawtext events. Hence, there is no special "fast path"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 # for that case.
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
274 L = ["<", name]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
275 append = L.append
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
276 col = self.col + _len(name) + 1
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 wrap = self.wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 align = col + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 if align >= wrap/2:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 align = 4 # Avoid a narrow column far to the right
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 attrAction = self.dispatch["<attrAction>"]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 for item in attrList:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 if _len(item) == 2:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 name, s = item
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
287 # item[2] is the 'action' field:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
288 if item[2] in ('metal', 'tal', 'xmlns', 'i18n'):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
289 if not self.showtal:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
290 continue
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
291 ok, name, s = self.attrAction(item)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
292 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
293 ok, name, s = attrAction(self, item)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 if not ok:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 continue
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 slen = _len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 if (wrap and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 col >= align and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 col + 1 + slen > wrap):
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
300 append("\n")
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
301 append(" "*align)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 col = align + slen
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
304 append(" ")
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
305 col = col + 1 + slen
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
306 append(s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
307 append(end)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
308 self._stream_write("".join(L))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
309 col = col + endlen
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 finally:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 bytecode_handlers["startTag"] = do_startTag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
313
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
314 def attrAction(self, item):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
315 name, value, action = item[:3]
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
316 if action == 'insert':
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 macs = self.macroStack
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
319 if action == 'metal' and self.metal and macs:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
320 if len(macs) > 1 or not macs[-1][2]:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321 # Drop all METAL attributes at a use-depth above one.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 # Clear 'entering' flag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
324 macs[-1][2] = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325 # Convert or drop depth-one METAL attributes.
1309
309f125f86cc removed use of string/strop from TAL/TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
326 i = name.rfind(":") + 1
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 prefix, suffix = name[:i], name[i:]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 if suffix == "define-macro":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 # Convert define-macro as we enter depth one.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 name = prefix + "use-macro"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 value = macs[-1][0] # Macro name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 elif suffix == "define-slot":
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
333 name = prefix + "fill-slot"
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 elif suffix == "fill-slot":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 value = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
342 value = '%s="%s"' % (name, attrEscape(value))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 return 1, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 def attrAction_tal(self, item):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 name, value, action = item[:3]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 ok = 1
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
348 expr, xlat, msgid = item[3:]
1309
309f125f86cc removed use of string/strop from TAL/TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
349 if self.html and name.lower() in BOOLEAN_HTML_ATTRS:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350 evalue = self.engine.evaluateBoolean(item[3])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 if evalue is self.Default:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
352 if action == 'insert': # Cancelled insert
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 elif evalue:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 ok = 0
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
358 elif expr is not None:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 evalue = self.engine.evaluateText(item[3])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 if evalue is self.Default:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
361 if action == 'insert': # Cancelled insert
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 if evalue is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 value = evalue
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
367 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
368 evalue = None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
369
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
370 if ok:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
371 if xlat:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
372 translated = self.translate(msgid or value, value, {})
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
373 if translated is not None:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
374 value = translated
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
375 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
376 value = name
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
377 elif evalue is self.Default:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
378 value = attrEscape(value)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
379 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
380 value = escape(value, quote=1)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
381 value = '%s="%s"' % (name, value)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382 return ok, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
383 bytecode_handlers["<attrAction>"] = attrAction
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
384
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385 def no_tag(self, start, program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
386 state = self.saveState()
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
387 self.stream = stream = self.StringIO()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
388 self._stream_write = stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
389 self.interpret(start)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390 self.restoreOutputState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
392
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393 def do_optTag(self, (name, cexpr, tag_ns, isend, start, program),
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
394 omit=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395 if tag_ns and not self.showtal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396 return self.no_tag(start, program)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
397
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 self.interpret(start)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
399 if not isend:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 s = '</%s>' % name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 self.col = self.col + len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 def do_optTag_tal(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406 cexpr = stuff[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407 if cexpr is not None and (cexpr == '' or
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 self.engine.evaluateBoolean(cexpr)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
409 self.no_tag(stuff[-2], stuff[-1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
410 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
411 self.do_optTag(stuff)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 bytecode_handlers["optTag"] = do_optTag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414 def do_rawtextBeginScope(self, (s, col, position, closeprev, dict)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
415 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
416 self.col = col
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
417 self.position = position
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
418 self.engine.setPosition(position)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
419 if closeprev:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
420 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
421 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
422 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
423 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
424 self.engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
425 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
426
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
427 def do_rawtextBeginScope_tal(self, (s, col, position, closeprev, dict)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
428 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
429 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
430 engine = self.engine
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
431 self.position = position
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
432 engine.setPosition(position)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
433 if closeprev:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
434 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
435 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
438 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439 engine.setLocal("attrs", dict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
440 bytecode_handlers["rawtextBeginScope"] = do_rawtextBeginScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
441
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
442 def do_beginScope(self, dict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
443 self.engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
444 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
445
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
446 def do_beginScope_tal(self, dict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
447 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
448 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
449 engine.setLocal("attrs", dict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
450 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
451 bytecode_handlers["beginScope"] = do_beginScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
452
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
453 def do_endScope(self, notused=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
454 self.engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 self.scopeLevel = self.scopeLevel - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
456 bytecode_handlers["endScope"] = do_endScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
457
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
458 def do_setLocal(self, notused):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
459 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
460
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
461 def do_setLocal_tal(self, (name, expr)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
462 self.engine.setLocal(name, self.engine.evaluateValue(expr))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
463 bytecode_handlers["setLocal"] = do_setLocal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
465 def do_setGlobal_tal(self, (name, expr)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466 self.engine.setGlobal(name, self.engine.evaluateValue(expr))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467 bytecode_handlers["setGlobal"] = do_setLocal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
469 def do_beginI18nContext(self, settings):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
470 get = settings.get
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
471 self.i18nContext = TranslationContext(self.i18nContext,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
472 domain=get("domain"),
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
473 source=get("source"),
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
474 target=get("target"))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
475 bytecode_handlers["beginI18nContext"] = do_beginI18nContext
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
476
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
477 def do_endI18nContext(self, notused=None):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
478 self.i18nContext = self.i18nContext.parent
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
479 assert self.i18nContext is not None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
480 bytecode_handlers["endI18nContext"] = do_endI18nContext
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
481
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
482 def do_insertText(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
483 self.interpret(stuff[1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
484
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
485 def do_insertText_tal(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
486 text = self.engine.evaluateText(stuff[0])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
487 if text is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 if text is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
490 self.interpret(stuff[1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
491 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
492 s = escape(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
493 self._stream_write(s)
1309
309f125f86cc removed use of string/strop from TAL/TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
494 i = s.rfind('\n')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
495 if i < 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 self.col = self.col + len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
497 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498 self.col = len(s) - (i + 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
499 bytecode_handlers["insertText"] = do_insertText
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
500
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
501 def do_i18nVariable(self, stuff):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
502 varname, program, expression = stuff
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
503 if expression is None:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
504 # The value is implicitly the contents of this tag, so we have to
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
505 # evaluate the mini-program to get the value of the variable.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
506 state = self.saveState()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
507 try:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
508 tmpstream = self.StringIO()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
509 self.interpretWithStream(program, tmpstream)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
510 value = normalize(tmpstream.getvalue())
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
511 finally:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
512 self.restoreState(state)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
513 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
514 # Evaluate the value to be associated with the variable in the
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
515 # i18n interpolation dictionary.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
516 value = self.engine.evaluate(expression)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
517 # Either the i18n:name tag is nested inside an i18n:translate in which
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
518 # case the last item on the stack has the i18n dictionary and string
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
519 # representation, or the i18n:name and i18n:translate attributes are
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
520 # in the same tag, in which case the i18nStack will be empty. In that
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
521 # case we can just output the ${name} to the stream
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
522 i18ndict, srepr = self.i18nStack[-1]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
523 i18ndict[varname] = value
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
524 placeholder = '${%s}' % varname
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
525 srepr.append(placeholder)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
526 self._stream_write(placeholder)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
527 bytecode_handlers['i18nVariable'] = do_i18nVariable
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
528
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
529 def do_insertTranslation(self, stuff):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
530 i18ndict = {}
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
531 srepr = []
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
532 obj = None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
533 self.i18nStack.append((i18ndict, srepr))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
534 msgid = stuff[0]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
535 # We need to evaluate the content of the tag because that will give us
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
536 # several useful pieces of information. First, the contents will
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
537 # include an implicit message id, if no explicit one was given.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
538 # Second, it will evaluate any i18nVariable definitions in the body of
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
539 # the translation (necessary for $varname substitutions).
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
540 #
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
541 # Use a temporary stream to capture the interpretation of the
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
542 # subnodes, which should /not/ go to the output stream.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
543 tmpstream = self.StringIO()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
544 self.interpretWithStream(stuff[1], tmpstream)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
545 default = tmpstream.getvalue()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
546 # We only care about the evaluated contents if we need an implicit
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
547 # message id. All other useful information will be in the i18ndict on
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
548 # the top of the i18nStack.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
549 if msgid == '':
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
550 msgid = normalize(default)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
551 self.i18nStack.pop()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
552 # See if there is was an i18n:data for msgid
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
553 if len(stuff) > 2:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
554 obj = self.engine.evaluate(stuff[2])
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
555 xlated_msgid = self.translate(msgid, default, i18ndict, obj)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
556 assert xlated_msgid is not None, self.position
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
557 self._stream_write(xlated_msgid)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
558 bytecode_handlers['insertTranslation'] = do_insertTranslation
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
559
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560 def do_insertStructure(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
561 self.interpret(stuff[2])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
562
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 def do_insertStructure_tal(self, (expr, repldict, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
564 structure = self.engine.evaluateStructure(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
565 if structure is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
566 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
567 if structure is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
568 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
569 return
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
570 text = ustr(structure)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571 if not (repldict or self.strictinsert):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572 # Take a shortcut, no error checking
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 self.stream_write(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
575 if self.html:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
576 self.insertHTMLStructure(text, repldict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
577 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
578 self.insertXMLStructure(text, repldict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 bytecode_handlers["insertStructure"] = do_insertStructure
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
580
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
581 def insertHTMLStructure(self, text, repldict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
582 from HTMLTALParser import HTMLTALParser
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
583 gen = AltTALGenerator(repldict, self.engine.getCompiler(), 0)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
584 p = HTMLTALParser(gen) # Raises an exception if text is invalid
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
585 p.parseString(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586 program, macros = p.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
587 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
589 def insertXMLStructure(self, text, repldict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590 from TALParser import TALParser
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
591 gen = AltTALGenerator(repldict, self.engine.getCompiler(), 0)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592 p = TALParser(gen)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 gen.enable(0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 p.parseFragment('<!DOCTYPE foo PUBLIC "foo" "bar"><foo>')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595 gen.enable(1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
596 p.parseFragment(text) # Raises an exception if text is invalid
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
597 gen.enable(0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
598 p.parseFragment('</foo>', 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
599 program, macros = gen.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
602 def do_loop(self, (name, expr, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
603 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
604
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
605 def do_loop_tal(self, (name, expr, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 iterator = self.engine.setRepeat(name, expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607 while iterator.next():
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
608 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
609 bytecode_handlers["loop"] = do_loop
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
610
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
611 def translate(self, msgid, default, i18ndict, obj=None):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
612 if obj:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
613 i18ndict.update(obj)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
614 if not self.i18nInterpolate:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
615 return msgid
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
616 # XXX We need to pass in one of context or target_language
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
617 return self.engine.translate(self.i18nContext.domain,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
618 msgid, i18ndict, default=default)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
619
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
620 def do_rawtextColumn(self, (s, col)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
621 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
622 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
623 bytecode_handlers["rawtextColumn"] = do_rawtextColumn
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
624
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
625 def do_rawtextOffset(self, (s, offset)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
626 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
627 self.col = self.col + offset
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
628 bytecode_handlers["rawtextOffset"] = do_rawtextOffset
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
629
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
630 def do_condition(self, (condition, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
631 if not self.tal or self.engine.evaluateBoolean(condition):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
632 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633 bytecode_handlers["condition"] = do_condition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
635 def do_defineMacro(self, (macroName, macro)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
636 macs = self.macroStack
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
637 if len(macs) == 1:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
638 entering = macs[-1][2]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
639 if not entering:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
640 macs.append(None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
641 self.interpret(macro)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
642 assert macs[-1] is None
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
643 macs.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
645 self.interpret(macro)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
646 bytecode_handlers["defineMacro"] = do_defineMacro
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
647
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
648 def do_useMacro(self, (macroName, macroExpr, compiledSlots, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
649 if not self.metal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
650 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
651 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
652 macro = self.engine.evaluateMacro(macroExpr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
653 if macro is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
654 macro = block
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
655 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
656 if not isCurrentVersion(macro):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
657 raise METALError("macro %s has incompatible version %s" %
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
658 (`macroName`, `getProgramVersion(macro)`),
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
659 self.position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
660 mode = getProgramMode(macro)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
661 if mode != (self.html and "html" or "xml"):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
662 raise METALError("macro %s has incompatible mode %s" %
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663 (`macroName`, `mode`), self.position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 self.pushMacro(macroName, compiledSlots)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
665 prev_source = self.sourceFile
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666 self.interpret(macro)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
667 if self.sourceFile != prev_source:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
668 self.engine.setSourceFile(prev_source)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
669 self.sourceFile = prev_source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
670 self.popMacro()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
671 bytecode_handlers["useMacro"] = do_useMacro
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
672
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
673 def do_fillSlot(self, (slotName, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 # This is only executed if the enclosing 'use-macro' evaluates
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
675 # to 'default'.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
677 bytecode_handlers["fillSlot"] = do_fillSlot
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
678
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
679 def do_defineSlot(self, (slotName, block)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
680 if not self.metal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
681 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
682 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
683 macs = self.macroStack
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
684 if macs and macs[-1] is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
685 macroName, slots = self.popMacro()[:2]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
686 slot = slots.get(slotName)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
687 if slot is not None:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
688 prev_source = self.sourceFile
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
689 self.interpret(slot)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
690 if self.sourceFile != prev_source:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
691 self.engine.setSourceFile(prev_source)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
692 self.sourceFile = prev_source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
693 self.pushMacro(macroName, slots, entering=0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
694 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
695 self.pushMacro(macroName, slots)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
696 # Falling out of the 'if' allows the macro to be interpreted.
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
697 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
698 bytecode_handlers["defineSlot"] = do_defineSlot
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
699
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
700 def do_onError(self, (block, handler)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
701 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
702
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
703 def do_onError_tal(self, (block, handler)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
704 state = self.saveState()
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
705 self.stream = stream = self.StringIO()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
706 self._stream_write = stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
707 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
708 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
709 except:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 exc = sys.exc_info()[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
711 self.restoreState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
712 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
714 error = engine.createErrorInfo(exc, self.position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
715 engine.setLocal('error', error)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
716 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
717 self.interpret(handler)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
718 finally:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
719 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
720 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
721 self.restoreOutputState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
722 self.stream_write(stream.getvalue())
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
723 bytecode_handlers["onError"] = do_onError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
724
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
725 bytecode_handlers_tal = bytecode_handlers.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
726 bytecode_handlers_tal["rawtextBeginScope"] = do_rawtextBeginScope_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
727 bytecode_handlers_tal["beginScope"] = do_beginScope_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
728 bytecode_handlers_tal["setLocal"] = do_setLocal_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729 bytecode_handlers_tal["setGlobal"] = do_setGlobal_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
730 bytecode_handlers_tal["insertStructure"] = do_insertStructure_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
731 bytecode_handlers_tal["insertText"] = do_insertText_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
732 bytecode_handlers_tal["loop"] = do_loop_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 bytecode_handlers_tal["onError"] = do_onError_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
734 bytecode_handlers_tal["<attrAction>"] = attrAction_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
735 bytecode_handlers_tal["optTag"] = do_optTag_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
736
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
738 class FasterStringIO(StringIO):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
739 """Append-only version of StringIO.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
740
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
741 This let's us have a much faster write() method.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
742 """
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
743 def close(self):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
744 if not self.closed:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
745 self.write = _write_ValueError
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
746 StringIO.close(self)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
747
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
748 def seek(self, pos, mode=0):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
749 raise RuntimeError("FasterStringIO.seek() not allowed")
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
750
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
751 def write(self, s):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
752 #assert self.pos == self.len
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
753 self.buflist.append(s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
754 self.len = self.pos = self.pos + len(s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
755
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
756
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
757 def _write_ValueError(s):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
758 raise ValueError, "I/O operation on closed file"

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