Changeset 3687:0d7535b6948e in livinglogic.python.xist

Show
Ignore:
Timestamp:
01/23/09 23:51:47 (10 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Added jsp.fromul4() which turns an UL4 template into jsp source.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • NEWS.rst

    r3686 r3687  
    88*   Added a class :class:`addattr` to :mod:`ll.xist.xsc`. This can be used 
    99    to extend XML attributes via ``with`` blocks. 
     10 
     11*   Added the function :func:`ll.xist.ns.jsp.fromul4` which can turn an UL4 
     12    template into JSP source code. 
    1013 
    1114 
  • src/ll/xist/ns/jsp.py

    r3263 r3687  
    162162                return node.publish(publisher) # return a generator-iterator 
    163163        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_expression(content): 
     195        result.append(expression(content)) 
     196 
     197    def make_scriptlet(content): 
     198        line = "%s%s\n" % ("\t"*indent, content) 
     199        if result and isinstance(result[-1], scriptlet): 
     200            result[-1] += "%s%s\n" % ("\t"*indent, content) 
     201        else: 
     202            result.append(scriptlet("\n%s%s\n" % ("\t"*indent, content))) 
     203 
     204    loopcounter = 0 # Used to number loop iterators 
     205    result = xsc.Frag() 
     206 
     207    make_scriptlet("//@@@ BEGIN template source") 
     208 
     209    lines = template.source.splitlines(False) 
     210    width = len(str(len(lines)+1)) 
     211    for (i, line) in enumerate(lines): 
     212        make_scriptlet("// %*d %s" % (width, i+1, line)) 
     213 
     214    make_scriptlet("//@@@ BEGIN template code") 
     215 
     216    for i in xrange(10): 
     217        make_scriptlet("Object r%d = null;" % i) 
     218 
     219    lastloc = None 
     220    for opcode in template.opcodes: 
     221        if opcode.code is not None and opcode.location is not lastloc: 
     222            lastloc = opcode.location 
     223            (line, col) = lastloc.pos() 
     224            tag = lastloc.tag 
     225            make_scriptlet("// Location %d (line %d, col %d): %s" % (lastloc.starttag+1, line, col, repr(tag)[1+isinstance(tag, unicode):-1])) 
     226        if opcode.code is None: 
     227            make_literal(opcode.location.code) 
     228        elif opcode.code == "loadstr": 
     229            make_scriptlet('r%d = %s;' % (opcode.r1, _string(opcode.arg))) 
     230        elif opcode.code == "loadint": 
     231            make_scriptlet("r%d = new Integer(%s);" % (opcode.r1, opcode.arg)) 
     232        elif opcode.code == "loadfloat": 
     233            make_scriptlet("r%d = new Double(%s);" % (opcode.r1, opcode.arg)) 
     234        elif opcode.code == "loadnone": 
     235            make_scriptlet("r%d = null;" % opcode.r1) 
     236        elif opcode.code == "loadfalse": 
     237            make_scriptlet("r%d = Boolean.FALSE;" % opcode.r1) 
     238        elif opcode.code == "loadtrue": 
     239            make_scriptlet("r%d = Boolean.TRUE;" % opcode.r1) 
     240        elif opcode.code == "loaddate": 
     241            make_scriptlet("r%d = com.livinglogic.ul4.Utils.isoDateFormatter.parse(%s);" % (opcode.r1, _string(opcode.arg))) 
     242        elif opcode.code == "loadcolor": 
     243            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:])) 
     244        elif opcode.code == "buildlist": 
     245            make_scriptlet("r%d = new java.util.ArrayList();" % opcode.r1) 
     246        elif opcode.code == "builddict": 
     247            make_scriptlet("r%d = new java.util.HashMap();" % opcode.r1) 
     248        elif opcode.code == "addlist": 
     249            make_scriptlet("((java.util.List)r%d).add(r%d)" % (opcode.r1, opcode.r2)) 
     250        elif opcode.code == "adddict": 
     251            make_scriptlet("((java.util.Map)r%d).put(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     252        elif opcode.code == "updatedict": 
     253            make_scriptlet("((java.util.Map)r%d).putAll((java.util.Map)r%d);" % (opcode.r1, opcode.r2)) 
     254        elif opcode.code == "loadvar": 
     255            make_scriptlet("r%d = %s.get(%s);" % (opcode.r1, variables, _string(opcode.arg))) 
     256        elif opcode.code == "storevar": 
     257            make_scriptlet("%s.put(%s, r%d);" % (variables, _string(opcode.arg), opcode.r1)) 
     258        elif opcode.code == "addvar": 
     259            name = _string(opcode.arg) 
     260            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.add(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     261        elif opcode.code == "addvar": 
     262            name = _string(opcode.arg) 
     263            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.sub(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     264        elif opcode.code == "addvar": 
     265            name = _string(opcode.arg) 
     266            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.mul(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     267        elif opcode.code == "truedivvar": 
     268            name = _string(opcode.arg) 
     269            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.truediv(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     270        elif opcode.code == "floordivvar": 
     271            name = _string(opcode.arg) 
     272            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.floordiv(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     273        elif opcode.code == "modvar": 
     274            name = _string(opcode.arg) 
     275            make_scriptlet("%s.put(%s, com.livinglogic.ul4.Utils.mod(%s.get(%s), r%d));" % (variables, name, variables, name, opcode.r1)) 
     276        elif opcode.code == "delvar": 
     277            make_scriptlet("%s.remove(%s);" % (variables, _string(opcode.arg))) 
     278        elif opcode.code == "getattr": 
     279            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getItem(r%d, %s);" % (opcode.r1, opcode.r2, _string(opcode.arg))) 
     280        elif opcode.code == "getitem": 
     281            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getItem(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     282        elif opcode.code == "getslice12": 
     283            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     284        elif opcode.code == "getslice1": 
     285            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, r%d, null);" % (opcode.r1, opcode.r2, opcode.r3)) 
     286        elif opcode.code == "getslice2": 
     287            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getSlice(r%d, null, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     288        elif opcode.code == "print": 
     289            make_expression("org.apache.commons.lang.ObjectUtils.toString(r%d)" % opcode.r1) 
     290        elif opcode.code == "printx": 
     291            make_expression("com.livinglogic.ul4.Utils.xmlescape(org.apache.commons.lang.ObjectUtils.toString(r%d))" % opcode.r1) 
     292        elif opcode.code == "for": 
     293            loopcounter += 1 
     294            make_scriptlet("for (java.util.Iterator iterator%d = com.livinglogic.ul4.Utils.iterator(r%d); iterator%d.hasNext();)" % (loopcounter, opcode.r2, loopcounter)) 
     295            make_scriptlet("{") 
     296            indent += 1 
     297            make_scriptlet("r%d = iterator%d.next();" % (opcode.r1, loopcounter)) 
     298        elif opcode.code == "endfor": 
     299            indent -= 1 
     300            make_scriptlet("}") 
     301        elif opcode.code == "break": 
     302            make_scriptlet("break;") 
     303        elif opcode.code == "continue": 
     304            make_scriptlet("continue;") 
     305        elif opcode.code == "not": 
     306            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2)) 
     307        elif opcode.code == "neg": 
     308            make_scriptlet("r%d = com.livinglogic.ul4.Utils.neg(r%d);" % (opcode.r1, opcode.r2)) 
     309        elif opcode.code == "contains": 
     310            make_scriptlet("r%d = com.livinglogic.ul4.Utils.contains(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     311        elif opcode.code == "notcontains": 
     312            make_scriptlet("r%d = com.livinglogic.ul4.Utils.contains(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     313        elif opcode.code == "eq": 
     314            make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.equals(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     315        elif opcode.code == "ne": 
     316            make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.equals(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     317        elif opcode.code == "lt": 
     318            make_scriptlet("r%d = com.livinglogic.ul4.Utils.lt(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     319        elif opcode.code == "le": 
     320            make_scriptlet("r%d = com.livinglogic.ul4.Utils.le(r%d, r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     321        elif opcode.code == "gt": 
     322            make_scriptlet("r%d = com.livinglogic.ul4.Utils.le(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     323        elif opcode.code == "ge": 
     324            make_scriptlet("r%d = com.livinglogic.ul4.Utils.lt(r%d, r%d) ? Boolean.FALSE : Boolean.TRUE;" % (opcode.r1, opcode.r2, opcode.r3)) 
     325        elif opcode.code == "add": 
     326            make_scriptlet("r%d = com.livinglogic.ul4.Utils.add(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     327        elif opcode.code == "sub": 
     328            make_scriptlet("r%d = com.livinglogic.ul4.Utils.sub(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     329        elif opcode.code == "mul": 
     330            make_scriptlet("r%d = com.livinglogic.ul4.Utils.mul(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     331        elif opcode.code == "floordiv": 
     332            make_scriptlet("r%d = com.livinglogic.ul4.Utils.floordiv(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     333        elif opcode.code == "truediv": 
     334            make_scriptlet("r%d = com.livinglogic.ul4.Utils.truediv(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     335        elif opcode.code == "and": 
     336            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? r%d : r%d;" % (opcode.r1, opcode.r3, opcode.r2, opcode.r3)) 
     337        elif opcode.code == "or": 
     338            make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? r%d : r%d;" % (opcode.r1, opcode.r2, opcode.r2, opcode.r3)) 
     339        elif opcode.code == "mod": 
     340            make_scriptlet("r%d = com.livinglogic.ul4.Utils.mod(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     341        elif opcode.code == "callfunc0": 
     342            if opcode.arg == "now": 
     343                make_scriptlet("r%d = new java.util.Date();" % opcode.r1) 
     344            elif opcode.arg == "vars": 
     345                make_scriptlet("r%d = %s;" % (opcode.r1, variables)) 
     346            else: 
     347                raise ul4c.UnknownFunctionError(opcode.arg) 
     348        elif opcode.code == "callfunc1": 
     349            if opcode.arg == "xmlescape": 
     350                make_scriptlet("r%d = com.livinglogic.ul4.Utils.xmlescape(r%d);" % (opcode.r1, opcode.r2)) 
     351            elif opcode.arg == "csv": 
     352                make_scriptlet("r%d = com.livinglogic.ul4.Utils.csv(r%d);" % (opcode.r1, opcode.r2)) 
     353            elif opcode.arg == "str": 
     354                make_scriptlet("r%d = org.apache.commons.lang.ObjectUtils.toString(r%d);" % (opcode.r1, opcode.r2)) 
     355            elif opcode.arg == "repr": 
     356                make_scriptlet("r%d = com.livinglogic.ul4.Utils.repr(r%d);" % (opcode.r1, opcode.r2)) 
     357            elif opcode.arg == "int": 
     358                make_scriptlet("r%d = com.livinglogic.ul4.Utils.toInteger(r%d);" % (opcode.r1, opcode.r2)) 
     359            elif opcode.arg == "bool": 
     360                make_scriptlet("r%d = com.livinglogic.ul4.Utils.getBool(r%d) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2)) 
     361            elif opcode.arg == "len": 
     362                make_scriptlet("r%d = com.livinglogic.ul4.Utils.length(r%d);" % (opcode.r1, opcode.r2)) 
     363            elif opcode.arg == "enumerate": 
     364                make_scriptlet("r%d = com.livinglogic.ul4.Utils.enumerate(r%d);" % (opcode.r1, opcode.r2)) 
     365            elif opcode.arg == "isnone": 
     366                make_scriptlet("r%d = (r%d == null) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2)) 
     367            elif opcode.arg == "isstr": 
     368                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof String)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     369            elif opcode.arg == "isint": 
     370                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Integer)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     371            elif opcode.arg == "isfloat": 
     372                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Double)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     373            elif opcode.arg == "isbool": 
     374                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof Boolean)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     375            elif opcode.arg == "isdate": 
     376                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.Date)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     377            elif opcode.arg == "islist": 
     378                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.List)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     379            elif opcode.arg == "isdict": 
     380                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof java.util.Map)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     381            elif opcode.arg == "istemplate": 
     382                make_scriptlet("r%d = ((r%d != null) && (r%d instanceof .livinglogic.ul4.Template)) ? Boolean.TRUE : Boolean.FALSE;" % (opcode.r1, opcode.r2, opcode.r2)) 
     383            elif opcode.arg == "chr": 
     384                make_scriptlet("r%d = com.livinglogic.ul4.Utils.chr(r%d);" % (opcode.r1, opcode.r2)) 
     385            elif opcode.arg == "ord": 
     386                make_scriptlet("r%d = com.livinglogic.ul4.Utils.ord(r%d);" % (opcode.r1, opcode.r2)) 
     387            elif opcode.arg == "hex": 
     388                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hex(r%d);" % (opcode.r1, opcode.r2)) 
     389            elif opcode.arg == "oct": 
     390                make_scriptlet("r%d = com.livinglogic.ul4.Utils.oct(r%d);" % (opcode.r1, opcode.r2)) 
     391            elif opcode.arg == "bin": 
     392                make_scriptlet("r%d = com.livinglogic.ul4.Utils.bin(r%d);" % (opcode.r1, opcode.r2)) 
     393            elif opcode.arg == "sorted": 
     394                make_scriptlet("r%d = com.livinglogic.ul4.Utils.sorted(r%d);" % (opcode.r1, opcode.r2)) 
     395            elif opcode.arg == "range": 
     396                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d);" % (opcode.r1, opcode.r2)) 
     397            elif opcode.arg == "type": 
     398                make_scriptlet("r%d = com.livinglogic.ul4.Utils.type(r%d);" % (opcode.r1, opcode.r2)) 
     399            elif opcode.arg == "get": 
     400                make_scriptlet("r%d = %s.get(r%d);" % (opcode.r1, variables, opcode.r2)) 
     401            elif opcode.arg == "json": 
     402                make_scriptlet("r%d = com.livinglogic.ul4.Utils.json(r%d);" % (opcode.r1, opcode.r2)) 
     403            else: 
     404                raise ul4c.UnknownFunctionError(opcode.arg) 
     405        elif opcode.code == "callfunc2": 
     406            if opcode.arg == "range": 
     407                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     408            elif opcode.arg == "get": 
     409                make_scriptlet("r%d = %s.containsKey(r%d) ? %s.get(r%d) : r%d;" % (opcode.r1, variables, opcode.r2, variables, opcode.r2, opcode.r3)) 
     410            elif opcode.arg == "zip": 
     411                make_scriptlet("r%d = com.livinglogic.ul4.Utils.zip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     412            else: 
     413                raise ul4c.UnknownFunctionError(opcode.arg) 
     414        elif opcode.code == "callfunc3": 
     415            if opcode.arg == "range": 
     416                make_scriptlet("r%d = com.livinglogic.ul4.Utils.range(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     417            elif opcode.arg == "zip": 
     418                make_scriptlet("r%d = com.livinglogic.ul4.Utils.zip(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     419            elif opcode.arg == "rgb": 
     420                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rgb(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     421            elif opcode.arg == "hls": 
     422                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hls(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     423            elif opcode.arg == "hsv": 
     424                make_scriptlet("r%d = com.livinglogic.ul4.Utils.hsv(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     425            else: 
     426                raise ul4c.UnknownFunctionError(opcode.arg) 
     427        elif opcode.code == "callfunc4": 
     428            if opcode.arg == "rgb": 
     429                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)) 
     430            elif opcode.arg == "hls": 
     431                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)) 
     432            elif opcode.arg == "hsv": 
     433                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)) 
     434            else: 
     435                raise ul4c.UnknownFunctionError(opcode.arg) 
     436        elif opcode.code == "callmeth0": 
     437            if opcode.arg == "split": 
     438                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d);" % (opcode.r1, opcode.r2)) 
     439            elif opcode.arg == "strip": 
     440                make_scriptlet("r%d = com.livinglogic.ul4.Utils.strip(r%d);" % (opcode.r1, opcode.r2)) 
     441            elif opcode.arg == "lstrip": 
     442                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lstrip(r%d);" % (opcode.r1, opcode.r2)) 
     443            elif opcode.arg == "rstrip": 
     444                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rstrip(r%d);" % (opcode.r1, opcode.r2)) 
     445            elif opcode.arg == "upper": 
     446                make_scriptlet("r%d = com.livinglogic.ul4.Utils.upper(r%d);" % (opcode.r1, opcode.r2)) 
     447            elif opcode.arg == "lower": 
     448                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lower(r%d);" % (opcode.r1, opcode.r2)) 
     449            elif opcode.arg == "capitalize": 
     450                make_scriptlet("r%d = com.livinglogic.ul4.Utils.capitalize(r%d);" % (opcode.r1, opcode.r2)) 
     451            elif opcode.arg == "items": 
     452                make_scriptlet("r%d = com.livinglogic.ul4.Utils.items(r%d);" % (opcode.r1, opcode.r2)) 
     453            elif opcode.arg == "isoformat": 
     454                make_scriptlet("r%d = com.livinglogic.ul4.Utils.isoformat(r%d);" % (opcode.r1, opcode.r2)) 
     455            elif opcode.arg == "r": 
     456                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).r();" % (opcode.r1, opcode.r2)) 
     457            elif opcode.arg == "g": 
     458                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).g();" % (opcode.r1, opcode.r2)) 
     459            elif opcode.arg == "b": 
     460                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).b();" % (opcode.r1, opcode.r2)) 
     461            elif opcode.arg == "a": 
     462                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).a();" % (opcode.r1, opcode.r2)) 
     463            elif opcode.arg == "hls": 
     464                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hls();" % (opcode.r1, opcode.r2)) 
     465            elif opcode.arg == "hlsa": 
     466                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hlsa();" % (opcode.r1, opcode.r2)) 
     467            elif opcode.arg == "hsv": 
     468                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hsv();" % (opcode.r1, opcode.r2)) 
     469            elif opcode.arg == "hsva": 
     470                make_scriptlet("r%d = ((com.livinglogic.ul4.Color)r%d).hsva();" % (opcode.r1, opcode.r2)) 
     471            elif opcode.arg == "lum": 
     472                make_scriptlet("r%d = new Double(((com.livinglogic.ul4.Color)r%d).lum());" % (opcode.r1, opcode.r2)) 
     473            else: 
     474                raise ul4c.UnknownMethodError(opcode.arg) 
     475        elif opcode.code == "callmeth1": 
     476            if opcode.arg == "split": 
     477                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     478            elif opcode.arg == "rsplit": 
     479                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rsplit(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     480            elif opcode.arg == "strip": 
     481                make_scriptlet("r%d = com.livinglogic.ul4.Utils.strip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     482            elif opcode.arg == "lstrip": 
     483                make_scriptlet("r%d = com.livinglogic.ul4.Utils.lstrip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     484            elif opcode.arg == "rstrip": 
     485                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rstrip(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     486            elif opcode.arg == "startswith": 
     487                make_scriptlet("r%d = com.livinglogic.ul4.Utils.startswith(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     488            elif opcode.arg == "endswith": 
     489                make_scriptlet("r%d = com.livinglogic.ul4.Utils.endswith(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     490            elif opcode.arg == "find": 
     491                make_scriptlet("r%d = com.livinglogic.ul4.Utils.find(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     492            elif opcode.arg == "rfind": 
     493                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rfind(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     494            elif opcode.arg == "format": 
     495                make_scriptlet("r%d = com.livinglogic.ul4.Utils.format(r%d, r%d, defaultLocale);" % (opcode.r1, opcode.r2, opcode.r3)) 
     496            elif opcode.arg == "get": 
     497                make_scriptlet("r%d = ((java.util.Map)r%d).get(r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     498            elif opcode.arg == "withlum": 
     499                make_scriptlet("r%d = com.livinglogic.ul4.Utils.withlum(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     500            elif opcode.arg == "witha": 
     501                make_scriptlet("r%d = com.livinglogic.ul4.Utils.witha(r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3)) 
     502            else: 
     503                raise ul4c.UnknownMethodError(opcode.arg) 
     504        elif opcode.code == "callmeth2": 
     505            if opcode.arg == "split": 
     506                make_scriptlet("r%d = com.livinglogic.ul4.Utils.split(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     507            elif opcode.arg == "rsplit": 
     508                make_scriptlet("r%d = com.livinglogic.ul4.Utils.rsplit(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     509            elif opcode.arg == "find": 
     510                make_scriptlet("r%d = com.livinglogic.ul4.Utils.find(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     511            elif opcode.arg == "replace": 
     512                make_scriptlet("r%d = com.livinglogic.ul4.Utils.replace(r%d, r%d, r%d);" % (opcode.r1, opcode.r2, opcode.r3, opcode.r4)) 
     513            elif opcode.arg == "get": 
     514                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)) 
     515            else: 
     516                raise ul4c.UnknownMethodError(opcode.arg) 
     517        elif opcode.code == "callmeth3": 
     518            if opcode.arg == "find": 
     519                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)) 
     520            else: 
     521                raise ul4c.UnknownMethodError(opcode.arg) 
     522        elif opcode.code == "if": 
     523            make_scriptlet("if (com.livinglogic.ul4.Utils.getBool(r%d))" % opcode.r1) 
     524            make_scriptlet("{") 
     525            indent += 1 
     526        elif opcode.code == "else": 
     527            indent -= 1 
     528            make_scriptlet("}") 
     529            make_scriptlet("else") 
     530            make_scriptlet("{") 
     531            indent += 1 
     532        elif opcode.code == "endif": 
     533            indent -= 1 
     534            make_scriptlet("}") 
     535        elif opcode.code == "render": 
     536            make_scriptlet("((com.livinglogic.utils.JSPTemplate)r%d).execute(out, (Map)r%d);" % (opcode.r1, opcode.r2)) 
     537        else: 
     538            raise ul4c.UnknownOpcodeError(opcode.code) 
     539    make_scriptlet("//@@@ END template code") 
     540    return result