annotate roundup/cgi/TAL/TALInterpreter.py @ 8528:fed0f839c260

fix: replace except: with except Exception: (by haosenwang1018@github) Remove bare 'except:' statements replace with 'except Exception'. In roundup_xmlrpc_server.py I changed Exception to BaseException so the database gets closed on signals as well. The rest of the changes do not look like they affect data integrity and are commited as supplied.
author John Rouillard <rouilj@ieee.org>
date Thu, 26 Feb 2026 09:46:02 -0500
parents 883c9e90b403
children
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
5803
d79ba7365abb Yet another use of cgi.escape. Fixed.
John Rouillard <rouilj@ieee.org>
parents: 5478
diff changeset
23
d79ba7365abb Yet another use of cgi.escape. Fixed.
John Rouillard <rouilj@ieee.org>
parents: 5478
diff changeset
24
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5803
diff changeset
25 from roundup.anypy.html import html_escape as escape
5418
55f09ca366c4 Python 3 preparation: StringIO.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5400
diff changeset
26 from roundup.anypy.strings import StringIO
2348
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
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
30 from .TALDefs import TAL_VERSION, TALError, METALError, attrEscape
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
31 from .TALDefs import isCurrentVersion, getProgramVersion, getProgramMode
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
32 from .TALGenerator import TALGenerator
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
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]
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
70 if var in mapping:
2348
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.
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
79 subst = repr(subst)[1:-1]
2348
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.
5478
c8902d398434 removed FasterStringIO
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5420
diff changeset
157 return StringIO()
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 "
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
182 "by %s" % (self.stackLimit, repr(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
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
268 def do_startTag(self, name_attrList,
1049
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.
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
274 (name, attrList) = name_attrList
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
275 L = ["<", name]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
276 append = L.append
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
277 col = self.col + _len(name) + 1
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 wrap = self.wrap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 align = col + 1
5400
2120f77554d5 Python 3 preparation: use // and __truediv__ as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5393
diff changeset
280 if align >= wrap//2:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 align = 4 # Avoid a narrow column far to the right
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 attrAction = self.dispatch["<attrAction>"]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 for item in attrList:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 if _len(item) == 2:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 name, s = item
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
288 # 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
289 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
290 if not self.showtal:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
291 continue
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
292 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
293 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
294 ok, name, s = attrAction(self, item)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 if not ok:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 continue
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 slen = _len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 if (wrap and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 col >= align and
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 col + 1 + slen > wrap):
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
301 append("\n")
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
302 append(" "*align)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 col = align + slen
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
304 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
305 append(" ")
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306 col = col + 1 + slen
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
307 append(s)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
308 append(end)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
309 self._stream_write("".join(L))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 col = col + endlen
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 finally:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
313 bytecode_handlers["startTag"] = do_startTag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
314
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
315 def attrAction(self, item):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
316 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
317 if action == 'insert':
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 macs = self.macroStack
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
320 if action == 'metal' and self.metal and macs:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321 if len(macs) > 1 or not macs[-1][2]:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322 # Drop all METAL attributes at a use-depth above one.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
324 # Clear 'entering' flag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325 macs[-1][2] = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326 # 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
327 i = name.rfind(":") + 1
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 prefix, suffix = name[:i], name[i:]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 if suffix == "define-macro":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 # Convert define-macro as we enter depth one.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 name = prefix + "use-macro"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 value = macs[-1][0] # Macro name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 elif suffix == "define-slot":
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
334 name = prefix + "fill-slot"
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 elif suffix == "fill-slot":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 return 0, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 value = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 else:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
343 value = '%s="%s"' % (name, attrEscape(value))
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 return 1, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 def attrAction_tal(self, item):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 name, value, action = item[:3]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 ok = 1
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
349 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
350 if self.html and name.lower() in BOOLEAN_HTML_ATTRS:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 evalue = self.engine.evaluateBoolean(item[3])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 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
353 if action == 'insert': # Cancelled insert
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 elif evalue:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 value = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 ok = 0
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
359 elif expr is not None:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 evalue = self.engine.evaluateText(item[3])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
361 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
362 if action == 'insert': # Cancelled insert
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 if evalue is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 ok = 0
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367 value = evalue
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
368 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
369 evalue = None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
370
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
371 if ok:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
372 if xlat:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
373 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
374 if translated is not None:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
375 value = translated
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
376 if value is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 value = name
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
378 elif evalue is self.Default:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
379 value = attrEscape(value)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
380 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
381 value = escape(value, quote=1)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
382 value = '%s="%s"' % (name, value)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
383 return ok, name, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
384 bytecode_handlers["<attrAction>"] = attrAction
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
386 def no_tag(self, start, program):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
387 state = self.saveState()
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
388 self.stream = stream = self.StringIO()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
389 self._stream_write = stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390 self.interpret(start)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391 self.restoreOutputState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
392 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
394 def do_optTag(self, args_tuple,
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395 omit=0):
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
396 (name, cexpr, tag_ns, isend, start, program) = args_tuple
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
397 if tag_ns and not self.showtal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 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
399
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400 self.interpret(start)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 if not isend:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 s = '</%s>' % name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 self.col = self.col + len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407 def do_optTag_tal(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 cexpr = stuff[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
409 if cexpr is not None and (cexpr == '' or
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
410 self.engine.evaluateBoolean(cexpr)):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
411 self.no_tag(stuff[-2], stuff[-1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413 self.do_optTag(stuff)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414 bytecode_handlers["optTag"] = do_optTag
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
415
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
416 def do_rawtextBeginScope(self, args_tuple):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
417 (s, col, position, closeprev, dict) = args_tuple
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
418 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
419 self.col = col
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
420 self.position = position
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
421 self.engine.setPosition(position)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
422 if closeprev:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
423 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
424 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
425 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
426 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
427 self.engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
428 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
429
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
430 def do_rawtextBeginScope_tal(self, args_tuple):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
431 (s, col, position, closeprev, dict) = args_tuple
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
432 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
433 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
434 engine = self.engine
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
435 self.position = position
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
436 engine.setPosition(position)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 if closeprev:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
438 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
440 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
441 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
442 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
443 engine.setLocal("attrs", dict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
444 bytecode_handlers["rawtextBeginScope"] = do_rawtextBeginScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
445
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
446 def do_beginScope(self, dict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
447 self.engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
448 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
449
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
450 def do_beginScope_tal(self, dict):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
451 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
452 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
453 engine.setLocal("attrs", dict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
454 self.scopeLevel = self.scopeLevel + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 bytecode_handlers["beginScope"] = do_beginScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
456
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
457 def do_endScope(self, notused=None):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
458 self.engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
459 self.scopeLevel = self.scopeLevel - 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
460 bytecode_handlers["endScope"] = do_endScope
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
461
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
462 def do_setLocal(self, notused):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
463 pass
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
465 def do_setLocal_tal(self, name_expr):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
466 (name, expr) = name_expr
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467 self.engine.setLocal(name, self.engine.evaluateValue(expr))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 bytecode_handlers["setLocal"] = do_setLocal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
470 def do_setGlobal_tal(self, name_expr):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
471 (name, expr) = name_expr
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472 self.engine.setGlobal(name, self.engine.evaluateValue(expr))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
473 bytecode_handlers["setGlobal"] = do_setLocal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
475 def do_beginI18nContext(self, settings):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
476 get = settings.get
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
477 self.i18nContext = TranslationContext(self.i18nContext,
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
478 domain=get("domain"),
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
479 source=get("source"),
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
480 target=get("target"))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
481 bytecode_handlers["beginI18nContext"] = do_beginI18nContext
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
482
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
483 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
484 self.i18nContext = self.i18nContext.parent
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
485 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
486 bytecode_handlers["endI18nContext"] = do_endI18nContext
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
487
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488 def do_insertText(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 self.interpret(stuff[1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
490
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
491 def do_insertText_tal(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
492 text = self.engine.evaluateText(stuff[0])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
493 if text is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
494 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
495 if text is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 self.interpret(stuff[1])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
497 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498 s = escape(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
499 self._stream_write(s)
1309
309f125f86cc removed use of string/strop from TAL/TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
500 i = s.rfind('\n')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
501 if i < 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
502 self.col = self.col + len(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
503 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
504 self.col = len(s) - (i + 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
505 bytecode_handlers["insertText"] = do_insertText
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
506
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
507 def do_i18nVariable(self, stuff):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
508 varname, program, expression = stuff
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
509 if expression is None:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
510 # 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
511 # 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
512 state = self.saveState()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
513 try:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
514 tmpstream = self.StringIO()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
515 self.interpretWithStream(program, tmpstream)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
516 value = normalize(tmpstream.getvalue())
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
517 finally:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
518 self.restoreState(state)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
519 else:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
520 # 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
521 # i18n interpolation dictionary.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
522 value = self.engine.evaluate(expression)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
523 # 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
524 # 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
525 # 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
526 # 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
527 # 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
528 i18ndict, srepr = self.i18nStack[-1]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
529 i18ndict[varname] = value
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
530 placeholder = '${%s}' % varname
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
531 srepr.append(placeholder)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
532 self._stream_write(placeholder)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
533 bytecode_handlers['i18nVariable'] = do_i18nVariable
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
534
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
535 def do_insertTranslation(self, stuff):
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
536 i18ndict = {}
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
537 srepr = []
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
538 obj = None
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
539 self.i18nStack.append((i18ndict, srepr))
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
540 msgid = stuff[0]
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
541 # 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
542 # 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
543 # 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
544 # 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
545 # 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
546 #
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
547 # 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
548 # 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
549 tmpstream = self.StringIO()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
550 self.interpretWithStream(stuff[1], tmpstream)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
551 default = tmpstream.getvalue()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
552 # 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
553 # 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
554 # the top of the i18nStack.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
555 if msgid == '':
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
556 msgid = normalize(default)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
557 self.i18nStack.pop()
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
558 # 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
559 if len(stuff) > 2:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
560 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
561 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
562 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
563 self._stream_write(xlated_msgid)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
564 bytecode_handlers['insertTranslation'] = do_insertTranslation
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
565
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
566 def do_insertStructure(self, stuff):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
567 self.interpret(stuff[2])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
568
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
569 def do_insertStructure_tal(self, expr_repldict_block):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
570 (expr, repldict, block) = expr_repldict_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571 structure = self.engine.evaluateStructure(expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572 if structure is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574 if structure is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
575 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
576 return
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
577 text = ustr(structure)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
578 if not (repldict or self.strictinsert):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 # Take a shortcut, no error checking
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
580 self.stream_write(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
581 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
582 if self.html:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
583 self.insertHTMLStructure(text, repldict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
584 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
585 self.insertXMLStructure(text, repldict)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586 bytecode_handlers["insertStructure"] = do_insertStructure
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
587
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588 def insertHTMLStructure(self, text, repldict):
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
589 from .HTMLTALParser import HTMLTALParser
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
590 gen = AltTALGenerator(repldict, self.engine.getCompiler(), 0)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 p = HTMLTALParser(gen) # Raises an exception if text is invalid
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592 p.parseString(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 program, macros = p.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
596 def insertXMLStructure(self, text, repldict):
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
597 from .TALParser import TALParser
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
598 gen = AltTALGenerator(repldict, self.engine.getCompiler(), 0)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
599 p = TALParser(gen)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 gen.enable(0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601 p.parseFragment('<!DOCTYPE foo PUBLIC "foo" "bar"><foo>')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
602 gen.enable(1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
603 p.parseFragment(text) # Raises an exception if text is invalid
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
604 gen.enable(0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
605 p.parseFragment('</foo>', 1)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 program, macros = gen.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607 self.interpret(program)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
608
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
609 def do_loop(self, name_expr_block):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
610 (name, expr, block) = name_expr_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
611 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
612
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
613 def do_loop_tal(self, name_expr_block):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
614 (name, expr, block) = name_expr_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
615 iterator = self.engine.setRepeat(name, expr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
616 while iterator.next():
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
617 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
618 bytecode_handlers["loop"] = do_loop
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
619
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
620 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
621 if obj:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
622 i18ndict.update(obj)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
623 if not self.i18nInterpolate:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
624 return msgid
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
625 # 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
626 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
627 msgid, i18ndict, default=default)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
628
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
629 def do_rawtextColumn(self, s_col):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
630 (s, col) = s_col
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
631 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
632 self.col = col
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633 bytecode_handlers["rawtextColumn"] = do_rawtextColumn
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
635 def do_rawtextOffset(self, s_offset):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
636 (s, offset) = s_offset
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
637 self._stream_write(s)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
638 self.col = self.col + offset
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
639 bytecode_handlers["rawtextOffset"] = do_rawtextOffset
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
640
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
641 def do_condition(self, condition_block):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
642 (condition, block) = condition_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
643 if not self.tal or self.engine.evaluateBoolean(condition):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
645 bytecode_handlers["condition"] = do_condition
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
646
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
647 def do_defineMacro(self, macroName_macro):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
648 (macroName, macro) = macroName_macro
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
649 macs = self.macroStack
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
650 if len(macs) == 1:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
651 entering = macs[-1][2]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
652 if not entering:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
653 macs.append(None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
654 self.interpret(macro)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
655 assert macs[-1] is None
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
656 macs.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
657 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
658 self.interpret(macro)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
659 bytecode_handlers["defineMacro"] = do_defineMacro
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
660
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
661 def do_useMacro(self, args_tuple):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
662 (macroName, macroExpr, compiledSlots, block) = args_tuple
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663 if not self.metal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
665 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666 macro = self.engine.evaluateMacro(macroExpr)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
667 if macro is self.Default:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
668 macro = block
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
669 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
670 if not isCurrentVersion(macro):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
671 raise METALError("macro %s has incompatible version %s" %
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
672 (repr(macroName), repr(getProgramVersion(macro))),
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
673 self.position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 mode = getProgramMode(macro)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
675 if mode != (self.html and "html" or "xml"):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676 raise METALError("macro %s has incompatible mode %s" %
5377
12fe83f90f0d Python 3 preparation: use repr() instead of ``.
Joseph Myers <jsm@polyomino.org.uk>
parents: 2348
diff changeset
677 (repr(macroName), repr(mode)), self.position)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
678 self.pushMacro(macroName, compiledSlots)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
679 prev_source = self.sourceFile
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
680 self.interpret(macro)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
681 if self.sourceFile != prev_source:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
682 self.engine.setSourceFile(prev_source)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
683 self.sourceFile = prev_source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
684 self.popMacro()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
685 bytecode_handlers["useMacro"] = do_useMacro
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
686
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
687 def do_fillSlot(self, slotName_block):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
688 # This is only executed if the enclosing 'use-macro' evaluates
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
689 # to 'default'.
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
690 (slotName, block) = slotName_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
691 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
692 bytecode_handlers["fillSlot"] = do_fillSlot
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
693
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
694 def do_defineSlot(self, slotName_block):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
695 (slotName, block) = slotName_block
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
696 if not self.metal:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
697 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
698 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
699 macs = self.macroStack
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
700 if macs and macs[-1] is not None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
701 macroName, slots = self.popMacro()[:2]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
702 slot = slots.get(slotName)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
703 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
704 prev_source = self.sourceFile
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
705 self.interpret(slot)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
706 if self.sourceFile != prev_source:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
707 self.engine.setSourceFile(prev_source)
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
708 self.sourceFile = prev_source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
709 self.pushMacro(macroName, slots, entering=0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 return
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
711 self.pushMacro(macroName, slots)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
712 # Falling out of the 'if' allows the macro to be interpreted.
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
714 bytecode_handlers["defineSlot"] = do_defineSlot
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
715
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
716 def do_onError(self, block_handler):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
717 (block, handler) = block_handler
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
718 self.interpret(block)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
719
5393
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
720 def do_onError_tal(self, block_handler):
46b2fd6d342e Python 3 preparation: avoid implicit tuple parameter unpacking.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
721 (block, handler) = block_handler
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
722 state = self.saveState()
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
723 self.stream = stream = self.StringIO()
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
724 self._stream_write = stream.write
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
725 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
726 self.interpret(block)
8528
fed0f839c260 fix: replace except: with except Exception: (by haosenwang1018@github)
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
727 except Exception:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
728 exc = sys.exc_info()[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729 self.restoreState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
730 engine = self.engine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
731 engine.beginScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
732 error = engine.createErrorInfo(exc, self.position)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 engine.setLocal('error', error)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
734 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
735 self.interpret(handler)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
736 finally:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737 engine.endScope()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
738 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
739 self.restoreOutputState(state)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
740 self.stream_write(stream.getvalue())
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
741 bytecode_handlers["onError"] = do_onError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
742
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
743 bytecode_handlers_tal = bytecode_handlers.copy()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
744 bytecode_handlers_tal["rawtextBeginScope"] = do_rawtextBeginScope_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
745 bytecode_handlers_tal["beginScope"] = do_beginScope_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
746 bytecode_handlers_tal["setLocal"] = do_setLocal_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
747 bytecode_handlers_tal["setGlobal"] = do_setGlobal_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
748 bytecode_handlers_tal["insertStructure"] = do_insertStructure_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
749 bytecode_handlers_tal["insertText"] = do_insertText_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
750 bytecode_handlers_tal["loop"] = do_loop_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
751 bytecode_handlers_tal["onError"] = do_onError_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
752 bytecode_handlers_tal["<attrAction>"] = attrAction_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
753 bytecode_handlers_tal["optTag"] = do_optTag_tal
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
754
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
755
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
756 def _write_ValueError(s):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5377
diff changeset
757 raise ValueError("I/O operation on closed file")

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