Changeset 125:d39e1f38f6ff in livinglogic.java.ul4

Show
Ignore:
Timestamp:
07/05/08 16:42:28 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

New render opcode (variables are passed as keyword arguments).

Location:
library/src/com/livinglogic/ul4
Files:
1 added
4 modified

Legend:

Unmodified
Added
Removed
  • library/src/com/livinglogic/ul4/Main.java

    r124 r125  
    1313    public static void main(String[] args) 
    1414    { 
    15         Template tmpl = Compiler.compile("<?for (key, value) in {'eins': 1, 'zwei': 2, 'drei': 3,}.items()?><?print key?> (<?print value?>)\n<?end for?>"); 
     15        Template tmpl1 = Compiler.compile("<?print key?> (<?print value?>)\n"); 
     16        Template tmpl2 = Compiler.compile("<?for (key, value) in {'eins': 1, 'zwei': 2, 'drei': 3,}.items()?><?render item(key=key, value=value)?><?end for?>"); 
    1617        long start = new Date().getTime(); 
    17         String output = tmpl.renders("<gu&rk> & 'foo'"); 
     18        HashMap templates = new HashMap(); 
     19        templates.put("item", tmpl1); 
     20        String output = tmpl2.renders(null, templates); 
    1821        System.out.println("rendered " + (time()-start)); 
    1922        System.out.println(output); 
  • library/src/com/livinglogic/ul4/Render.java

    r116 r125  
    11package com.livinglogic.ul4; 
     2 
     3import java.util.LinkedList; 
    24 
    35public class Render extends AST 
    46{ 
    57    protected Name name; 
    6     protected AST obj; 
     8    protected LinkedList args = new LinkedList(); 
    79 
    8     public Render(int start, int end, Name name, AST obj) 
     10    public Render(int start, int end, Name name) 
    911    { 
    1012        super(start, end); 
    1113        this.name = name; 
    12         this.obj = obj; 
     14    } 
     15 
     16    public void append(String name, AST value) 
     17    { 
     18        args.add(new RenderArg(name, value)); 
    1319    } 
    1420 
    1521    public int compile(Template template, Registers registers, Location location) 
    1622    { 
    17         int r = obj.compile(template, registers, location); 
    18         template.opcode(Opcode.OC_RENDER, r, name.value, location); 
    19         registers.free(r); 
     23        int ra = registers.alloc(); 
     24        template.opcode(Opcode.OC_BUILDDICT, ra, location); 
     25        int argCount = args.size(); 
     26        for (int i = 0; i < argCount; ++i) 
     27        { 
     28            RenderArg arg = (RenderArg)args.get(i); 
     29            int rv = arg.value.compile(template, registers, location); 
     30            int rk = registers.alloc(); 
     31            template.opcode(Opcode.OC_LOADSTR, rk, arg.name, location); 
     32            template.opcode(Opcode.OC_ADDDICT, ra, rk, rv, location); 
     33            registers.free(rk); 
     34            registers.free(rv); 
     35        } 
     36        template.opcode(Opcode.OC_RENDER, ra, name.value, location); 
    2037        return -1; 
    2138    } 
  • library/src/com/livinglogic/ul4/Template.java

    r124 r125  
    452452    } 
    453453 
    454     public Iterator render(Object data) 
    455     { 
    456         return new Renderer(data, null); 
    457     } 
    458  
    459     public Iterator render(Object data, Map templates) 
    460     { 
    461         return new Renderer(data, templates); 
    462     } 
    463  
    464     public String renders(Object data) 
    465     { 
    466         return renders(data, null); 
    467     } 
    468  
    469     public String renders(Object data, Map templates) 
     454    public Iterator render(Map variables, Map templates) 
     455    { 
     456        return new Renderer(variables, templates); 
     457    } 
     458 
     459    public String renders(Map variables, Map templates) 
    470460    { 
    471461        StringBuffer output = new StringBuffer(); 
    472462 
    473         for (Iterator iterator = render(data, templates); iterator.hasNext();) 
     463        for (Iterator iterator = render(variables, templates); iterator.hasNext();) 
    474464        { 
    475465            output.append((String)iterator.next()); 
     
    482472        private int pc = 0; 
    483473        private Object[] reg = new Object[10]; 
    484         private HashMap variables = new HashMap(); 
     474        private Map variables; 
    485475        private Map templates; 
    486476        private LinkedList iterators = new LinkedList(); 
     
    489479        private String nextChunk = null; 
    490480 
    491         public Renderer(Object data, Map templates) 
     481        public Renderer(Map variables, Map templates) 
    492482        { 
    493483            annotate(); 
    494             variables.put("data", data); 
     484            if (variables == null) 
     485                variables = new HashMap(); 
     486            this.variables = variables; 
    495487            if (templates == null) 
    496488                templates = new HashMap(); 
     
    862854                                throw new UnknownMethodException(code.arg); 
    863855                        case Opcode.OC_RENDER: 
    864                             subTemplateIterator = ((Template)templates.get(code.arg)).render(reg[code.r1], templates); 
     856                            subTemplateIterator = ((Template)templates.get(code.arg)).render((Map)reg[code.r1], templates); 
    865857                            if (subTemplateIterator.hasNext()) 
    866858                            { 
  • library/src/com/livinglogic/ul4/ul4c.py

    r124 r125  
    452452        ExprParser.__init__(self, start) 
    453453 
    454     def render(self, (name, _1, expr, _2)): 
    455         return ul4.Render(name.start, _2.end, name, expr) 
    456     render.spark = ['render ::= name ( expr0 )'] 
     454    def emptyrender(self, (name, _1, _2)): 
     455        return ul4.Render(name.start, _2.end, name) 
     456    emptyrender.spark = ['render ::= name ( )'] 
     457 
     458    def startrender(self, (name, _1, argname, _2, argexpr)): 
     459        render = ul4.Render(name.start, argexpr.end, name) 
     460        render.append(argname.value, argexpr) 
     461        return render 
     462    startrender.spark = ['buildrender ::= name ( name = expr0 '] 
     463 
     464    def buildrender(self, (render, _1, argname, _2, argexpr)): 
     465        render.append(argname.value, argexpr) 
     466        render.end = argexpr.end 
     467        return render 
     468    buildrender.spark = ['buildrender ::= buildrender , name = expr0'] 
     469 
     470    def finishrender(self, (render, _0)): 
     471        render.end = _0.end 
     472        return render 
     473    finishrender.spark = ['render ::= buildrender )'] 
     474 
     475    def finishrender1(self, (render, _0, _1)): 
     476        render.end = _1.end 
     477        return render 
     478    finishrender1.spark = ['render ::= buildrender , )'] 
    457479 
    458480