annotate roundup/cgi/TAL/TALInterpreter.py @ 5814:bd6d41f21a5a

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

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