root/livinglogic.googleappengine.lltools/site/ll/xist/ns/jsp.py @ 28:ffac60e84a1c

Revision 28:ffac60e84a1c, 24.9 KB (checked in by Walter Doerwald <walter@…>, 10 years ago)

Update XIST to 3.6.2.

Line 
1# -*- coding: utf-8 -*-
2
3## Copyright 1999-2009 by LivingLogic AG, Bayreuth/Germany
4## Copyright 1999-2009 by Walter Dörwald
5##
6## All Rights Reserved
7##
8## See ll/__init__.py for the license
9
10
11"""
12A module that allows you to embed JSP content as processing instructions.
13"""
14
15
16import cgi # for parse_header
17
18from ll.xist import xsc, sims
19
20
21__docformat__ = "reStructuredText"
22
23
24xmlns = "http://java.sun.com/JSP/Page"
25
26
27class directive(xsc.Element):
28    model = sims.Empty()
29    register = False # only serves as a base class
30
31    def publish(self, publisher):
32        yield publisher.encode(u"<%@ ")
33        yield publisher.encode(self._publishname(publisher))
34        for part in self.attrs.publish(publisher):
35            yield part
36        yield publisher.encode(u"%>")
37
38
39class scriptlet(xsc.ProcInst):
40    """
41    Will be published as ``<% content %>``.
42    """
43
44    def publish(self, publisher):
45        yield publisher.encode(u"<% ")
46        yield publisher.encode(self.content)
47        yield publisher.encode(u" %>")
48
49
50class expression(xsc.ProcInst):
51    """
52    Will be published as ``<%= content %>``.
53    """
54
55    def publish(self, publisher):
56        yield publisher.encode(u"<%= ")
57        yield publisher.encode(self.content)
58        yield publisher.encode(u" %>")
59
60
61class declaration(xsc.ProcInst):
62    """
63    Will be published as ``<%! content %>``.
64    """
65
66    def publish(self, publisher):
67        yield publisher.encode(u"<%! ")
68        yield publisher.encode(self.content)
69        yield publisher.encode(u" %>")
70
71
72class If(scriptlet):
73    xmlname = "if"
74
75    def convert(self, converter):
76        return scriptlet(u"if(", self.content, u"){")
77
78
79class Else(scriptlet):
80    xmlname = "else"
81
82    def convert(self, converter):
83        return scriptlet(u"}else{")
84
85
86class ElIf(scriptlet):
87    xmlname = "elif"
88
89    def convert(self, converter):
90        return scriptlet(u"}else if (", self.content, u"){")
91
92
93class End(scriptlet):
94    xmlname = "end"
95
96    def convert(self, converter):
97        return scriptlet(u"}")
98
99
100class block(xsc.Element):
101    """
102    This element embeds its content in ``{}`` brackets. Note that the content
103    itself will not be turned into a scriptlet automatically but will be used
104    as-is.
105    """
106    model = sims.Any()
107
108    def convert(self, converter):
109        e = xsc.Frag(
110            scriptlet(u"{"),
111            self.content,
112            scriptlet(u"}")
113        )
114        return e.convert(converter)
115
116
117class directive_include(directive):
118    xmlname = "include"
119    class Attrs(directive.Attrs):
120        class file(xsc.TextAttr): pass
121
122
123class directive_taglib(directive):
124    xmlname = "taglib"
125    class Attrs(directive.Attrs):
126        class uri(xsc.TextAttr): pass
127        class prefix(xsc.TextAttr): pass
128
129
130class directive_page(directive):
131    xmlname = "page"
132    class Attrs(directive.Attrs):
133        class language(xsc.TextAttr):
134            values = ("java",)
135        class extends(xsc.TextAttr): pass
136        class import_(xsc.TextAttr): xmlname = "import"
137        class session(xsc.TextAttr): values = (u"true", u"false")
138        class buffer(xsc.TextAttr): pass
139        class autoFlush(xsc.TextAttr): values = (u"true", u"false")
140        class isThreadSafe(xsc.TextAttr): values = (u"true", u"false")
141        class info(xsc.TextAttr): pass
142        class errorPage(xsc.URLAttr): pass
143        class contentType(xsc.TextAttr): pass
144        class isErrorPage(xsc.TextAttr): values = (u"true", u"false")
145        class pageEncoding(xsc.TextAttr): pass
146
147    def publish(self, publisher):
148        # Only a contentType attribute triggers the special code
149        if u"contentType" in self.attrs and not self.attrs.contentType.isfancy() and not self.attrs.pageEncoding.isfancy():
150            (contenttype, options) = cgi.parse_header(unicode(self.attrs.contentType))
151            pageencoding = unicode(self.attrs.pageEncoding)
152            encoding = publisher.encoding
153            if encoding is None:
154                encoding = "utf-8"
155            if u"charset" not in options or not (options[u"charset"] == pageencoding == encoding):
156                options[u"charset"] = encoding
157                node = self.__class__(
158                    self.attrs,
159                    contentType=(contenttype, u"; ", u"; ".join("%s=%s" % option for option in options.items())),
160                    pageEncoding=encoding
161                )
162                return node.publish(publisher) # return a generator-iterator
163        return super(directive_page, self).publish(publisher) # return a generator-iterator
164
165
166def fromul4(template, variables="variables", indent=0):
167    """
168    Return the UL4 template :var:`template` as JSP source code. :var:`variables`
169    is the variable name of the map object containing the top level variables.
170    :var:`indent` is the initial indentation of the source code.
171
172    The code produced requires the `UL4 Java package`__.
173
174    __ http://hg.livinglogic.de/LivingLogic.Java.ul4
175    """
176    from ll import ul4c
177    from ll.xist.ns import specials
178
179    # Turn a Python string into a Java string literal
180    def _string(s):
181        v = []
182        specialchars = {"\r": "\\r", "\n": "\\n", "\t": "\\t", '"': '\\"'}
183        for c in s:
184            try:
185                v.append(specialchars[c])
186            except KeyError:
187                oc = ord(c)
188                v.append("\\u%04x" % oc if oc >= 128 else c)
189        return '"%s"' % "".join(s)
190
191    def make_literal(content):
192        result.append(specials.literal(content))
193
194    def make_scriptlet(content):
195        line = "%s%s\n" % ("\t"*indent, content)
196        if result and isinstance(result[-1], scriptlet):
197            result[-1] += "%s%s\n" % ("\t"*indent, content)
198        else:
199            result.append(scriptlet("\n%s%s\n" % ("\t"*indent, content)))
200
201    loopcounter = 0 # Used to number loop iterators
202    result = xsc.Frag()
203
204    make_scriptlet("//@@@ BEGIN template source")
205
206    lines = template.source.splitlines(False)
207    width = len(str(len(lines)+1))
208    for (i, line) in enumerate(lines):
209        make_scriptlet("// %*d %s" % (width, i+1, line))
210
211    make_scriptlet("//@@@ BEGIN template code")
212
213    for i in xrange(10):
214        make_scriptlet("Object r%d = null;" % i)
215
216    lastloc = None
217    for opcode in template.opcodes:
218        if opcode.code is not None and opcode.location is not lastloc:
219            lastloc = opcode.location
220            (line, col) = lastloc.pos()
221            tag = lastloc.tag
222            make_scriptlet("// Location %d (line %d, col %d): %s" % (lastloc.starttag+1, line, col, repr(tag)[1+isinstance(tag, unicode):-1]))
223        if opcode.code is None:
224            make_literal(opcode.location.code)
225        elif opcode.code == "loadstr":
226            make_scriptlet('r%d = %s;' % (opcode.r1, _string(opcode.arg)))
227        elif opcode.code == "loadint":
228            make_scriptlet("r%d = new Integer(%s);" % (opcode.r1, opcode.arg))
229        elif opcode.code == "loadfloat":
230            make_scriptlet("r%d = new Double(%s);" % (opcode.r1, opcode.arg))
231        elif opcode.code == "loadnone":
232            make_scriptlet("r%d = null;" % opcode.r1)
233        elif opcode.code == "loadfalse":
234            make_scriptlet("r%d = Boolean.FALSE;" % opcode.r1)
235        elif opcode.code == "loadtrue":
236            make_scriptlet("r%d = Boolean.TRUE;" % opcode.r1)
237        elif opcode.code == "loaddate":
238            make_scriptlet("r%d = com.livinglogic.ul4.Utils.isoDateFormatter.parse(%s);" % (opcode.r1, _string(opcode.arg)))
239        elif opcode.code == "loadcolor":
240            make_scriptlet("r%d = new com.livinglogic.ul4.Color(0x%s, 0x%s, 0x%s, 0x%s)" % (opcode.r1, opcode.arg[:2], opcode.arg[2:4], opcode.arg[4:6], opcode.arg[6:]))
241        elif opcode.code == "buildlist":
242            make_scriptlet("r%d = new java.util.ArrayList();" % opcode.r1)
243        elif opcode.code == "builddict":
244            make_scriptlet("r%d = new java.util.HashMap();" % opcode.r1)
245        elif opcode.code == "addlist":
246            make_scriptlet("((java.util.List)r%d).add(r%d)" % (opcode.r1, opcode.r2))
247        elif opcode.code == "adddict":
248            make_scriptlet("((java.util.Map)r%d).put(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
249        elif opcode.code == "updatedict":
250            make_scriptlet("((java.util.Map)r%d).putAll((java.util.Map)r%d);" % (opcode.r1, opcode.r2))
251        elif opcode.code == "loadvar":
252            make_scriptlet("r%d = %s.get(%s);" % (opcode.r1, variables, _string(opcode.arg)))
253        elif opcode.code == "storevar":
254            make_scriptlet("%s.put(%s, r%d);" % (variables, _string(opcode.arg), opcode.r1))
255        elif opcode.code == "addvar":
256            name = _string(opcode.arg)
257            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.add(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
258        elif opcode.code == "subvar":
259            name = _string(opcode.arg)
260            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.sub(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
261        elif opcode.code == "mulvar":
262            name = _string(opcode.arg)
263            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.mul(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
264        elif opcode.code == "truedivvar":
265            name = _string(opcode.arg)
266            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.truediv(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
267        elif opcode.code == "floordivvar":
268            name = _string(opcode.arg)
269            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.floordiv(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
270        elif opcode.code == "modvar":
271            name = _string(opcode.arg)
272            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.mod(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1))
273        elif opcode.code == "delvar":
274            make_scriptlet("%s.remove(%s);" % (variables, _string(opcode.arg)))
275        elif opcode.code == "getattr":
276            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getItem(r%d, %s);" % (opcode.r1, opcode.r2, _string(opcode.arg)))
277        elif opcode.code == "getitem":
278            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getItem(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
279        elif opcode.code == "getslice12":
280            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
281        elif opcode.code == "getslice1":
282            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, r%d, null);" % (opcode.r1, opcode.r2, opcode.r3))
283        elif opcode.code == "getslice2":
284            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, null, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
285        elif opcode.code == "print":
286            make_scriptlet("out.write(org.apache.commons.lang.ObjectUtils.toString(r%d));" % opcode.r1)
287        elif opcode.code == "printx":
288            make_scriptlet("out.write(com.livinglogic.ul4.Utils.xmlescape(org.apache.commons.lang.ObjectUtils.toString(r%d)));" % opcode.r1)
289        elif opcode.code == "for":
290            loopcounter += 1
291            make_scriptlet("for (java.util.Iterator iterator%d = com.livinglogic.ul4.Utils.iterator(r%d); iterator%d.hasNext();)" % (loopcounter, opcode.r2, loopcounter))
292            make_scriptlet("{")
293            indent += 1
294            make_scriptlet("r%d = iterator%d.next();" % (opcode.r1, loopcounter))
295        elif opcode.code == "endfor":
296            indent -= 1
297            make_scriptlet("}")
298        elif opcode.code == "break":
299            make_scriptlet("break;")
300        elif opcode.code == "continue":
301            make_scriptlet("continue;")
302        elif opcode.code == "not":
303            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2))
304        elif opcode.code == "neg":
305            make_scriptlet("r%d = com.livinglogic.ul4.Utils.neg(r%d);" % (opcode.r1, opcode.r2))
306        elif opcode.code == "contains":
307            make_scriptlet("r%d = com.livinglogic.ul4.Utils.contains(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3))
308        elif opcode.code == "notcontains":
309            make_scriptlet("r%d = com.livinglogic.ul4.Utils.contains(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3))
310        elif opcode.code == "eq":
311            make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.equals(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3))
312        elif opcode.code == "ne":
313            make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.equals(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3))
314        elif opcode.code == "lt":
315            make_scriptlet("r%d = com.livinglogic.ul4.Utils.lt(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3))
316        elif opcode.code == "le":
317            make_scriptlet("r%d = com.livinglogic.ul4.Utils.le(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3))
318        elif opcode.code == "gt":
319            make_scriptlet("r%d = com.livinglogic.ul4.Utils.le(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3))
320        elif opcode.code == "ge":
321            make_scriptlet("r%d = com.livinglogic.ul4.Utils.lt(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3))
322        elif opcode.code == "add":
323            make_scriptlet("r%d = com.livinglogic.ul4.Utils.add(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
324        elif opcode.code == "sub":
325            make_scriptlet("r%d = com.livinglogic.ul4.Utils.sub(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
326        elif opcode.code == "mul":
327            make_scriptlet("r%d = com.livinglogic.ul4.Utils.mul(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
328        elif opcode.code == "floordiv":
329            make_scriptlet("r%d = com.livinglogic.ul4.Utils.floordiv(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
330        elif opcode.code == "truediv":
331            make_scriptlet("r%d = com.livinglogic.ul4.Utils.truediv(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
332        elif opcode.code == "and":
333            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? r%d : r%d;" % (opcode.r1, opcode.r3, opcode.r2, opcode.r3))
334        elif opcode.code == "or":
335            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? r%d : r%d;" % (opcode.r1, opcode.r2, opcode.r2, opcode.r3))
336        elif opcode.code == "mod":
337            make_scriptlet("r%d = com.livinglogic.ul4.Utils.mod(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
338        elif opcode.code == "callfunc0":
339            if opcode.arg == "now":
340                make_scriptlet("r%d = new java.util.Date();" % opcode.r1)
341            elif opcode.arg == "vars":
342                make_scriptlet("r%d = %s;" % (opcode.r1, variables))
343            else:
344                raise ul4c.UnknownFunctionError(opcode.arg)
345        elif opcode.code == "callfunc1":
346            if opcode.arg == "xmlescape":
347                make_scriptlet("r%d = com.livinglogic.ul4.Utils.xmlescape(r%d);" % (opcode.r1, opcode.r2))
348            elif opcode.arg == "csv":
349                make_scriptlet("r%d = com.livinglogic.ul4.Utils.csv(r%d);" % (opcode.r1, opcode.r2))
350            elif opcode.arg == "str":
351                make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.toString(r%d);" % (opcode.r1, opcode.r2))
352            elif opcode.arg == "repr":
353                make_scriptlet("r%d = com.livinglogic.ul4.Utils.repr(r%d);" % (opcode.r1, opcode.r2))
354            elif opcode.arg == "int":
355                make_scriptlet("r%d = com.livinglogic.ul4.Utils.toInteger(r%d);" % (opcode.r1, opcode.r2))
356            elif opcode.arg == "bool":
357                make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2))
358            elif opcode.arg == "len":
359                make_scriptlet("r%d = com.livinglogic.ul4.Utils.length(r%d);" % (opcode.r1, opcode.r2))
360            elif opcode.arg == "enumerate":
361                make_scriptlet("r%d = com.livinglogic.ul4.Utils.enumerate(r%d);" % (opcode.r1, opcode.r2))
362            elif opcode.arg == "isnone":
363                make_scriptlet("r%d = (r%d == null) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2))
364            elif opcode.arg == "isstr":
365                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof String)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
366            elif opcode.arg == "isint":
367                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Integer)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
368            elif opcode.arg == "isfloat":
369                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Double)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
370            elif opcode.arg == "isbool":
371                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Boolean)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
372            elif opcode.arg == "isdate":
373                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.Date)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
374            elif opcode.arg == "islist":
375                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.List)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
376            elif opcode.arg == "isdict":
377                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.Map)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
378            elif opcode.arg == "istemplate":
379                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof .livinglogic.ul4.Template)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2))
380            elif opcode.arg == "chr":
381                make_scriptlet("r%d = com.livinglogic.ul4.Utils.chr(r%d);" % (opcode.r1, opcode.r2))
382            elif opcode.arg == "ord":
383                make_scriptlet("r%d = com.livinglogic.ul4.Utils.ord(r%d);" % (opcode.r1, opcode.r2))
384            elif opcode.arg == "hex":
385                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hex(r%d);" % (opcode.r1, opcode.r2))
386            elif opcode.arg == "oct":
387                make_scriptlet("r%d = com.livinglogic.ul4.Utils.oct(r%d);" % (opcode.r1, opcode.r2))
388            elif opcode.arg == "bin":
389                make_scriptlet("r%d = com.livinglogic.ul4.Utils.bin(r%d);" % (opcode.r1, opcode.r2))
390            elif opcode.arg == "sorted":
391                make_scriptlet("r%d = com.livinglogic.ul4.Utils.sorted(r%d);" % (opcode.r1, opcode.r2))
392            elif opcode.arg == "range":
393                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d);" % (opcode.r1, opcode.r2))
394            elif opcode.arg == "type":
395                make_scriptlet("r%d = com.livinglogic.ul4.Utils.type(r%d);" % (opcode.r1, opcode.r2))
396            elif opcode.arg == "get":
397                make_scriptlet("r%d = %s.get(r%d);" % (opcode.r1, variables, opcode.r2))
398            elif opcode.arg == "json":
399                make_scriptlet("r%d = com.livinglogic.ul4.Utils.json(r%d);" % (opcode.r1, opcode.r2))
400            else:
401                raise ul4c.UnknownFunctionError(opcode.arg)
402        elif opcode.code == "callfunc2":
403            if opcode.arg == "range":
404                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
405            elif opcode.arg == "get":
406                make_scriptlet("r%d = %s.containsKey(r%d) ? %s.get(r%d) : r%d;" % (opcode.r1, variables, opcode.r2, variables, opcode.r2, opcode.r3))
407            elif opcode.arg == "zip":
408                make_scriptlet("r%d = com.livinglogic.ul4.Utils.zip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
409            else:
410                raise ul4c.UnknownFunctionError(opcode.arg)
411        elif opcode.code == "callfunc3":
412            if opcode.arg == "range":
413                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
414            elif opcode.arg == "zip":
415                make_scriptlet("r%d = com.livinglogic.ul4.Utils.zip(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
416            elif opcode.arg == "rgb":
417                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rgb(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
418            elif opcode.arg == "hls":
419                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hls(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
420            elif opcode.arg == "hsv":
421                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hsv(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
422            else:
423                raise ul4c.UnknownFunctionError(opcode.arg)
424        elif opcode.code == "callfunc4":
425            if opcode.arg == "rgb":
426                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rgb(r%d, r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4, opcode.r5))
427            elif opcode.arg == "hls":
428                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hls(r%d, r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4, opcode.r5))
429            elif opcode.arg == "hsv":
430                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hsv(r%d, r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4, opcode.r5))
431            else:
432                raise ul4c.UnknownFunctionError(opcode.arg)
433        elif opcode.code == "callmeth0":
434            if opcode.arg == "split":
435                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d);" % (opcode.r1, opcode.r2))
436            elif opcode.arg == "strip":
437                make_scriptlet("r%d = com.livinglogic.ul4.Utils.strip(r%d);" % (opcode.r1, opcode.r2))
438            elif opcode.arg == "lstrip":
439                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lstrip(r%d);" % (opcode.r1, opcode.r2))
440            elif opcode.arg == "rstrip":
441                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rstrip(r%d);" % (opcode.r1, opcode.r2))
442            elif opcode.arg == "upper":
443                make_scriptlet("r%d = com.livinglogic.ul4.Utils.upper(r%d);" % (opcode.r1, opcode.r2))
444            elif opcode.arg == "lower":
445                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lower(r%d);" % (opcode.r1, opcode.r2))
446            elif opcode.arg == "capitalize":
447                make_scriptlet("r%d = com.livinglogic.ul4.Utils.capitalize(r%d);" % (opcode.r1, opcode.r2))
448            elif opcode.arg == "items":
449                make_scriptlet("r%d = com.livinglogic.ul4.Utils.items(r%d);" % (opcode.r1, opcode.r2))
450            elif opcode.arg == "isoformat":
451                make_scriptlet("r%d = com.livinglogic.ul4.Utils.isoformat(r%d);" % (opcode.r1, opcode.r2))
452            elif opcode.arg == "r":
453                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).r();" % (opcode.r1, opcode.r2))
454            elif opcode.arg == "g":
455                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).g();" % (opcode.r1, opcode.r2))
456            elif opcode.arg == "b":
457                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).b();" % (opcode.r1, opcode.r2))
458            elif opcode.arg == "a":
459                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).a();" % (opcode.r1, opcode.r2))
460            elif opcode.arg == "hls":
461                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hls();" % (opcode.r1, opcode.r2))
462            elif opcode.arg == "hlsa":
463                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hlsa();" % (opcode.r1, opcode.r2))
464            elif opcode.arg == "hsv":
465                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hsv();" % (opcode.r1, opcode.r2))
466            elif opcode.arg == "hsva":
467                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hsva();" % (opcode.r1, opcode.r2))
468            elif opcode.arg == "lum":
469                make_scriptlet("r%d = new Double(((com.livinglogic.ul4.Color)r%d).lum());" % (opcode.r1, opcode.r2))
470            else:
471                raise ul4c.UnknownMethodError(opcode.arg)
472        elif opcode.code == "callmeth1":
473            if opcode.arg == "split":
474                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
475            elif opcode.arg == "rsplit":
476                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rsplit(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
477            elif opcode.arg == "strip":
478                make_scriptlet("r%d = com.livinglogic.ul4.Utils.strip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
479            elif opcode.arg == "lstrip":
480                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lstrip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
481            elif opcode.arg == "rstrip":
482                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rstrip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
483            elif opcode.arg == "startswith":
484                make_scriptlet("r%d = com.livinglogic.ul4.Utils.startswith(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
485            elif opcode.arg == "endswith":
486                make_scriptlet("r%d = com.livinglogic.ul4.Utils.endswith(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
487            elif opcode.arg == "find":
488                make_scriptlet("r%d = com.livinglogic.ul4.Utils.find(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
489            elif opcode.arg == "rfind":
490                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rfind(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
491            elif opcode.arg == "format":
492                make_scriptlet("r%d = com.livinglogic.ul4.Utils.format(r%d, r%d, defaultLocale);" % (opcode.r1, opcode.r2, opcode.r3))
493            elif opcode.arg == "get":
494                make_scriptlet("r%d = ((java.util.Map)r%d).get(r%d);" % (opcode.r1, opcode.r2, opcode.r3))
495            elif opcode.arg == "withlum":
496                make_scriptlet("r%d = com.livinglogic.ul4.Utils.withlum(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
497            elif opcode.arg == "witha":
498                make_scriptlet("r%d = com.livinglogic.ul4.Utils.witha(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3))
499            else:
500                raise ul4c.UnknownMethodError(opcode.arg)
501        elif opcode.code == "callmeth2":
502            if opcode.arg == "split":
503                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
504            elif opcode.arg == "rsplit":
505                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rsplit(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
506            elif opcode.arg == "find":
507                make_scriptlet("r%d = com.livinglogic.ul4.Utils.find(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
508            elif opcode.arg == "replace":
509                make_scriptlet("r%d = com.livinglogic.ul4.Utils.replace(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4))
510            elif opcode.arg == "get":
511                make_scriptlet("r%d = ((java.util.Map)r%d).containsKey(r%d) ? ((java.util.Map)r%d).get(r%d) : r%d;" % (opcode.r1, opcode.r2, opcode.r3, opcode.r2, opcode.r3, opcode.r4))
512            else:
513                raise ul4c.UnknownMethodError(opcode.arg)
514        elif opcode.code == "callmeth3":
515            if opcode.arg == "find":
516                make_scriptlet("r%d = com.livinglogic.ul4.Utils.find(r%d, r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4, opcode.r5))
517            else:
518                raise ul4c.UnknownMethodError(opcode.arg)
519        elif opcode.code == "callmethkw":
520            if opcode.arg == "render":
521                make_scriptlet("r%d = ((com.livinglogic.ul4.Template)r%d).renders((java.util.Map)r%d);" % (opcode.r1, opcode.r2, opcode.r3))
522            else:
523                raise ul4c.UnknownMethodError(opcode.arg)
524        elif opcode.code == "if":
525            make_scriptlet("if (com.livinglogic.ul4.Utils.getBool(r%d))" % opcode.r1)
526            make_scriptlet("{")
527            indent += 1
528        elif opcode.code == "else":
529            indent -= 1
530            make_scriptlet("}")
531            make_scriptlet("else")
532            make_scriptlet("{")
533            indent += 1
534        elif opcode.code == "endif":
535            indent -= 1
536            make_scriptlet("}")
537        elif opcode.code == "render":
538            make_scriptlet("((com.livinglogic.ul4.Template)r%d).renderjsp(out, (Map)r%d);" % (opcode.r1, opcode.r2))
539        else:
540            raise ul4c.UnknownOpcodeError(opcode.code)
541    make_scriptlet("//@@@ END template code")
542    return result
Note: See TracBrowser for help on using the browser.