Changeset 20851 for lang/cplusplus

Show
Ignore:
Timestamp:
10/06/08 21:55:17 (2 months ago)
Author:
tokuhirom
Message:

added node.toString(), node.appendChild()

Location:
lang/cplusplus/llv8call/trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/llv8call/trunk/ext/libxml/document.cc

    r20850 r20851  
    2424 
    2525#define EXTERNAL_DOC() EXTERNAL(xmlDocPtr, doc, args.This(), 0); 
    26  
    27 static inline Handle<Object> createNode(xmlNodePtr node_raw) { 
    28     Handle<Value> consarg[1]; 
    29     consarg[0] = External::New(node_raw); 
    30     return node_class()->NewInstance(1, consarg); 
    31 } 
    3226 
    3327FUNCTION(_readFile) 
     
    5852    xmlNodePtr node_raw = xmlDocGetRootElement(doc); 
    5953    assert(node_raw); 
    60     return createNode( node_raw ); 
     54    return createNode( doc,  node_raw ); 
    6155END 
    6256 
     
    6458    ARG_COUNT(1); 
    6559    ARG_str(elname, 0); 
     60    EXTERNAL_DOC(); 
    6661 
    6762    xmlNodePtr node_raw = xmlNewNode(NULL, (const xmlChar*)*elname); 
    6863    assert(node_raw); 
    69     return createNode( node_raw ); 
     64    return createNode( doc, node_raw ); 
    7065END 
    7166 
     
    109104ENDSUBMODULE 
    110105 
    111 // rest: 44/51 
     106// rest: 7/51 
    112107 
    113108// TODO: doc.createDocument 
  • lang/cplusplus/llv8call/trunk/ext/libxml/libxml.h

    r20828 r20851  
    2323} 
    2424 
     25static inline Handle<Object> createNode(xmlDocPtr doc, xmlNodePtr node_raw) { 
     26    Handle<Value> consarg[2]; 
     27    consarg[0] = External::New(node_raw); 
     28    consarg[1] = External::New(doc); 
     29    return node_class()->NewInstance(2, consarg); 
     30} 
     31 
  • lang/cplusplus/llv8call/trunk/ext/libxml/node.cc

    r20850 r20851  
    2323#include "libxml.h" 
    2424 
    25 #define EXTERNAL_NODE() EXTERNAL(xmlNodePtr, node, args.This(), 0); 
     25#define EXTERNAL_NODE()   EXTERNAL(xmlNodePtr, node, args.This(),         0) 
     26#define EXTERNAL_DOC()    EXTERNAL(xmlDocPtr,  doc,  args.This(),         1) 
     27#define ARG_node(name, n) EXTERNAL(xmlNodePtr, name, args[n]->ToObject(), 0) 
    2628 
    2729FUNCTION(_new) 
    28     ARG_COUNT(1); 
     30    ARG_COUNT(2); 
    2931    assert(args[0]->IsExternal()); 
     32    assert(args[1]->IsExternal()); 
    3033    args.This()->SetInternalField(0, args[0]); 
     34    args.This()->SetInternalField(1, args[1]); 
    3135    return args.This(); 
    3236END 
     
    3842END 
    3943 
     44FUNCTION(toString) 
     45    ARG_BETWEEN(0, 1); 
     46    EXTERNAL_NODE(); 
     47    EXTERNAL_DOC(); 
     48    int format = args.Length() > 0 ? args[0]->Int32Value() : 0; 
     49 
     50    xmlBufferPtr buffer = xmlBufferCreate(); 
     51    if ( format <= 0 ) { 
     52        xmlNodeDump( 
     53            buffer, 
     54            doc, 
     55            node, 0, format 
     56        ); 
     57    } 
     58    else { 
     59        int t_indent_var = xmlIndentTreeOutput; 
     60        xmlIndentTreeOutput = 1; 
     61        xmlNodeDump( 
     62            buffer, 
     63            doc, 
     64            node, 0, format 
     65        ); 
     66        xmlIndentTreeOutput = t_indent_var; 
     67    } 
     68    const xmlChar *ret = xmlBufferContent( buffer ); 
     69    assert(ret); 
     70    Handle<String> s = String::New((const char*)ret); 
     71    xmlBufferFree(buffer); 
     72    return s; 
     73END 
     74 
     75FUNCTION(appendChild) 
     76    ARG_BETWEEN(0, 1); 
     77    EXTERNAL_NODE(); 
     78    EXTERNAL_DOC(); 
     79    ARG_node(argnode, 0); 
     80    xmlNodePtr rNode = domAppendChild( node, argnode ); 
     81    return createNode( doc, rNode ); 
     82END 
     83 
    4084SUBMODULE(init_node) 
    4185    CLASS_WITH_CONSTRUCTOR(_new); 
    42     BIND_IM("nodeName", nodeName); 
    43     INTERNALCOUNT(1); 
     86    BIND_IM("nodeName",       nodeName); 
     87    BIND_IM("toString",       toString); 
     88    BIND_IM("appendChild",    appendChild); 
     89    INTERNALCOUNT(2); 
    4490    EXPORT_CLASS("Node"); 
    4591ENDSUBMODULE 
    4692 
    47 // REST: 49/50 
     93// REST: 3/50 
    4894// TODO: node.setNodeName 
    4995// TODO: node.isSameNode 
     
    56102// TODO: node.replaceChild 
    57103// TODO: node.replaceNode 
    58 // TODO: node.appendChild 
    59104// TODO: node.addChild 
    60105// TODO: node.addNewChild 
     
    76121// TODO: node.findvalue 
    77122// TODO: node.childNodes 
    78 // TODO: node.toString 
    79123// TODO: node.toStringC14N 
    80124// TODO: node.toStringEC14N 
  • lang/cplusplus/llv8call/trunk/t/070_libxml/01_simple.js

    r20850 r20851  
    77var doc = new libxml.Document(); 
    88doc.readFile("t/070_libxml/simple.xml"); 
     9var root = doc.documentElement(); 
    910is(doc.encoding(), "UTF-8"); 
    1011is(doc.version(),  "1.0"); 
    11 is(doc.documentElement().nodeName(), "foo"); 
     12is(root.nodeName(), "foo", 'nodeName'); 
    1213is(doc.createElement("bar").nodeName(), "bar", 'createElement'); 
    1314is(doc.toString(), '<?xml version="1.0" encoding="UTF-8"?>' + "\n" + '<foo/>' + "\n", 'toString'); 
     15is(doc.createElement("bar").toString(), "<bar/>", 'node.toString'); 
     16root.appendChild(doc.createElement("bar")); 
     17is(root.toString(), "<foo><bar/></foo>", "node.toString, node.appendChild"); 
    1418doc.close(); 
    1519