Changeset 177:651accf999b8 in livinglogic.java.ul4

Show
Ignore:
Timestamp:
12/23/08 20:42:16 (10 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add a function json().

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

Legend:

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

    r176 r177  
    99    public static void main(String[] args) 
    1010    { 
    11         Template tmpl = Compiler.compile("<?print csv('a,b')?>"); 
     11        Template tmpl = Compiler.compile("<?print json([None, True, False, 42, 42., ['a','b'], {'a': 'b', 'c': 'd'}])?>"); 
    1212        long start = System.currentTimeMillis(); 
    1313        Map map = new HashMap(); 
  • library/src/com/livinglogic/ul4/Opcode.java

    r176 r177  
    9696    public static final int CF1_CSV = 24; 
    9797    public static final int CF1_GET = 25; 
     98    public static final int CF1_JSON = 26; 
    9899 
    99100    public static final int CF2_RANGE = 0; 
     
    341342        else if (name.equals("get")) 
    342343            return CF1_GET; 
     344        else if (name.equals("json")) 
     345            return CF1_JSON; 
    343346        else 
    344347            throw new UnknownFunctionException(name); 
  • library/src/com/livinglogic/ul4/Template.java

    r176 r177  
    11651165                                    reg[code.r1] = variables.get(reg[code.r2]); 
    11661166                                    break; 
     1167                                case Opcode.CF1_JSON: 
     1168                                    reg[code.r1] = Utils.json(reg[code.r2]); 
     1169                                    break; 
    11671170                            } 
    11681171                            break; 
     
    18661869                            code(buffer, indent, "reg" + opcode.r1 + " = variables.get(reg" + opcode.r2 + ")"); 
    18671870                            break; 
     1871                        case Opcode.CF1_JSON: 
     1872                            code(buffer, indent, "reg" + opcode.r1 + " = json(reg" + opcode.r2 + ")"); 
     1873                            break; 
    18681874                        case Opcode.CF1_CHR: 
    18691875                            code(buffer, indent, "reg" + opcode.r1 + " = unichr(reg" + opcode.r2 + ")"); 
  • library/src/com/livinglogic/ul4/Utils.java

    r176 r177  
    719719    } 
    720720     
     721    public static String json(Object obj) 
     722    { 
     723        if (obj == null) 
     724            return "null"; 
     725        else if (obj instanceof Boolean) 
     726            return ((Boolean)obj).booleanValue() ? "true" : "false"; 
     727        else if (obj instanceof Integer) 
     728            return String.valueOf(((Integer)obj).intValue()); 
     729        else if (obj instanceof Double) 
     730            return String.valueOf(((Double)obj).doubleValue()); 
     731        else if (obj instanceof String) 
     732            return new StringBuffer() 
     733                .append("\"") 
     734                .append(StringEscapeUtils.escapeJavaScript(((String)obj))) 
     735                .append("\"") 
     736                .toString(); 
     737        else if (obj instanceof Date) 
     738            return json(isoformat((Date)obj)); 
     739        else if (obj instanceof Collection) 
     740        { 
     741            StringBuffer sb = new StringBuffer(); 
     742            sb.append("["); 
     743            boolean first = true; 
     744            for (Iterator iter = ((Collection)obj).iterator(); iter.hasNext();) 
     745            { 
     746                if (first) 
     747                    first = false; 
     748                else 
     749                    sb.append(", "); 
     750                sb.append(json(iter.next())); 
     751            } 
     752            sb.append("]"); 
     753            return sb.toString(); 
     754        } 
     755        else if (obj instanceof Map) 
     756        { 
     757            StringBuffer sb = new StringBuffer(); 
     758            sb.append("{"); 
     759            boolean first = true; 
     760            for (Iterator iter = ((Map)obj).entrySet().iterator(); iter.hasNext();) 
     761            { 
     762                if (first) 
     763                    first = false; 
     764                else 
     765                    sb.append(", "); 
     766                Map.Entry entry = (Map.Entry)iter.next(); 
     767                sb.append(json(entry.getKey())); 
     768                sb.append(": "); 
     769                sb.append(json(entry.getValue())); 
     770            } 
     771            sb.append("}"); 
     772            return sb.toString(); 
     773        } 
     774        return null; 
     775    } 
     776     
    721777    public static Object length(String obj) 
    722778    {