Changeset 20881 for lang/cplusplus

Show
Ignore:
Timestamp:
10/07/08 09:25:10 (2 months ago)
Author:
tokuhirom
Message:

added doc.createAttribute, element class, attribute class, elem.setAttributeNode

Location:
lang/cplusplus/llv8call/trunk
Files:
3 added
7 modified

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/llv8call/trunk/ext/include/llv8-macros.h

    r20827 r20881  
    103103#define SUBMODULE(funcname) void funcname(Handle<Object> target) { 
    104104#define ENDSUBMODULE } 
     105#define OBJECT_TEMPLATE   __k7_ot 
    105106  
    106107#endif 
  • lang/cplusplus/llv8call/trunk/ext/libxml/SConscript

    r20828 r20881  
    1212    env.SharedLibrary( 
    1313        "libxml", 
    14         [Split('libxml.cc document.cc node.cc dom.c')], 
     14        [Split('libxml.cc document.cc node.cc dom.c element.cc attr.cc')], 
    1515        LIBS=['v8'] + env['LIBS'], 
    1616    ) 
  • lang/cplusplus/llv8call/trunk/ext/libxml/document.cc

    r20866 r20881  
    8080    xmlNodePtr node_raw = xmlDocGetRootElement(doc); 
    8181    assert(node_raw); 
    82     return createNode( doc,  node_raw ); 
     82    return createElem( doc,  node_raw ); 
    8383END 
    8484 
     
    109109    assert(node_raw); 
    110110    xmlAddChild(fragment, node_raw); 
    111     return createNode( doc, node_raw ); 
     111    return createElem( doc, node_raw ); 
     112END 
     113 
     114// attrnode = doc.createAttribute(name [,value]); 
     115FUNCTION(createAttribute) 
     116    ARG_BETWEEN(1, 2); 
     117    ARG_str(name,  0); 
     118    ARG_str(value, 1); 
     119    EXTERNAL_DOC(); 
     120 
     121    xmlAttrPtr attr = xmlNewDocProp(doc, (const xmlChar*)*name, args.Length() == 2 ? (const xmlChar*)*value : NULL); 
     122    return createAttr(attr); 
    112123END 
    113124 
     
    174185    BIND_IM("setDocumentElement",     setDocumentElement); 
    175186    BIND_IM("createElement",          _createElement); 
     187    BIND_IM("createAttribute",        createAttribute); 
    176188    BIND_IM("createTextNode",         createTextNode); 
    177189    BIND_IM("createComment",          createComment); 
     
    202214// TODO: doc.documentElement 
    203215// TODO: doc.createElementNS 
    204 // TODO: doc.createAttribute 
    205216// TODO: doc.createAttributeNS 
    206217// TODO: doc.createDocumentFragment 
     
    223234// TODO: doc.getElementById 
    224235// TODO: doc.indexElements 
     236 
  • lang/cplusplus/llv8call/trunk/ext/libxml/libxml.cc

    r20828 r20881  
    3535extern void init_document(Handle<Object> target); 
    3636extern void init_node(Handle<Object> target); 
     37extern void init_attr(Handle<Object> target); 
     38extern void init_elem(Handle<Object> target); 
    3739 
    3840V8EXTINIT_FUNC  
     
    4345    init_document(target); 
    4446    init_node(target); 
     47    init_attr(target); 
     48    init_elem(target); 
    4549 
    4650    return target; 
  • lang/cplusplus/llv8call/trunk/ext/libxml/libxml.h

    r20859 r20881  
    2323} 
    2424 
     25inline v8::Handle<v8::Function> attr_class() { 
     26    return Handle<Function>::Cast( libxml_namespace()->Get(String::New("Attr")) ); 
     27} 
     28 
     29inline v8::Handle<v8::Function> elem_class() { 
     30    return Handle<Function>::Cast( libxml_namespace()->Get(String::New("Element")) ); 
     31} 
     32 
    2533inline v8::Handle<v8::Function> document_class() { 
    2634    return Handle<Function>::Cast( libxml_namespace()->Get(String::New("Document")) ); 
     
    3442} 
    3543 
     44static inline Handle<Object> createElem(xmlDocPtr doc, xmlNodePtr elem_raw) { 
     45    Handle<Value> consarg[2]; 
     46    consarg[0] = External::New(elem_raw); 
     47    consarg[1] = External::New(doc); 
     48    return elem_class()->NewInstance(2, consarg); 
     49} 
     50 
     51static inline Handle<Object> createAttr(xmlAttrPtr attr_raw) { 
     52    Handle<Value> consarg[1]; 
     53    consarg[0] = External::New(attr_raw); 
     54    return attr_class()->NewInstance(1, consarg); 
     55} 
     56 
    3657#define ARG_node(name, n) EXTERNAL(xmlNodePtr, name, args[n]->ToObject(), 0) 
     58#define ARG_attr(name, n) EXTERNAL(xmlAttrPtr, name, args[n]->ToObject(), 0) 
    3759 
  • lang/cplusplus/llv8call/trunk/ext/libxml/node.cc

    r20866 r20881  
    2121// THE SOFTWARE. 
    2222 
    23 #include "libxml.h" 
    24  
    25 #define EXTERNAL_NODE()   EXTERNAL(xmlNodePtr, node, args.This(),         0) 
    26 #define EXTERNAL_DOC()    EXTERNAL(xmlDocPtr,  doc,  args.This(),         1) 
    27  
    28 FUNCTION(_new) 
    29     ARG_COUNT(2); 
    30     assert(args[0]->IsExternal()); 
    31     assert(args[1]->IsExternal()); 
    32     args.This()->SetInternalField(0, args[0]); 
    33     args.This()->SetInternalField(1, args[1]); 
    34     return args.This(); 
    35 END 
    36  
    37 FUNCTION(nodeName) 
    38     ARG_COUNT(0); 
    39     EXTERNAL_NODE(); 
    40     return String::New((char*)domName(node)); 
    41 END 
    42  
    43 FUNCTION(toString) 
    44     ARG_BETWEEN(0, 1); 
    45     EXTERNAL_NODE(); 
    46     EXTERNAL_DOC(); 
    47     int format = args.Length() > 0 ? args[0]->Int32Value() : 0; 
    48  
    49     xmlBufferPtr buffer = xmlBufferCreate(); 
    50     if ( format <= 0 ) { 
    51         xmlNodeDump( 
    52             buffer, 
    53             doc, 
    54             node, 0, format 
    55         ); 
    56     } 
    57     else { 
    58         int t_indent_var = xmlIndentTreeOutput; 
    59         xmlIndentTreeOutput = 1; 
    60         xmlNodeDump( 
    61             buffer, 
    62             doc, 
    63             node, 0, format 
    64         ); 
    65         xmlIndentTreeOutput = t_indent_var; 
    66     } 
    67     const xmlChar *ret = xmlBufferContent( buffer ); 
    68     assert(ret); 
    69     Handle<String> s = String::New((const char*)ret); 
    70     xmlBufferFree(buffer); 
    71     return s; 
    72 END 
    73  
    74 FUNCTION(appendChild) 
    75     ARG_BETWEEN(0, 1); 
    76     EXTERNAL_NODE(); 
    77     EXTERNAL_DOC(); 
    78     ARG_node(argnode, 0); 
    79     xmlNodePtr rNode = domAppendChild( node, argnode ); 
    80     return createNode( doc, rNode ); 
    81 END 
    82  
    83 FUNCTION(insertBefore) 
    84     ARG_COUNT(2); 
    85     EXTERNAL_NODE(); 
    86     EXTERNAL_DOC(); 
    87     ARG_node(newnode, 0); 
    88     ARG_node(refnode, 1); 
    89     xmlNodePtr rNode = domInsertBefore( node, newnode, refnode ); 
    90     assert(rNode); 
    91     return createNode( doc, rNode ); 
    92 END 
    93  
    94 FUNCTION(insertAfter) 
    95     ARG_COUNT(2); 
    96     EXTERNAL_NODE(); 
    97     EXTERNAL_DOC(); 
    98     ARG_node(newnode, 0); 
    99     ARG_node(refnode, 1); 
    100     xmlNodePtr rNode = domInsertAfter( node, newnode, refnode ); 
    101     assert(rNode); 
    102     return createNode( doc, rNode ); 
    103 END 
    104  
    105 FUNCTION(removeChild) 
    106     ARG_BETWEEN(0, 1); 
    107     EXTERNAL_NODE(); 
    108     EXTERNAL_DOC(); 
    109     ARG_node(argnode, 0); 
    110     xmlNodePtr rNode = domRemoveChild( node, argnode ); 
    111     return createNode( doc, rNode ); 
    112 END 
    113  
    114 // remove whole child nodes 
    115 FUNCTION(removeChildNodes) 
    116     ARG_BETWEEN(0, 1); 
    117     EXTERNAL_NODE(); 
    118     xmlNodePtr elem = node->children; 
    119     while (elem ) { 
    120         xmlUnlinkNode( elem ); 
    121         elem = elem->next; 
    122     } 
    123     node->children = node->last = NULL; 
    124     return Undefined(); 
    125 END 
    126  
    127 xmlNodePtr 
    128 _CloneNodeIn( xmlNodePtr node, int recursive ) 
    129 { 
    130     xmlNodePtr retval = NULL; 
    131      
    132     if ( node != NULL ) { 
    133         switch ( node->type ) { 
    134         case XML_ELEMENT_NODE: 
    135         case XML_TEXT_NODE: 
    136         case XML_CDATA_SECTION_NODE: 
    137         case XML_ENTITY_REF_NODE: 
    138         case XML_PI_NODE: 
    139         case XML_COMMENT_NODE: 
    140         case XML_DOCUMENT_FRAG_NODE: 
    141         case XML_ENTITY_DECL:  
    142           retval = xmlCopyNode( node, recursive ? 1 : 2 ); 
    143           break; 
    144         case XML_ATTRIBUTE_NODE: 
    145           retval = (xmlNodePtr) xmlCopyProp( NULL, (xmlAttrPtr) node ); 
    146           break; 
    147         case XML_DOCUMENT_NODE: 
    148         case XML_HTML_DOCUMENT_NODE: 
    149           retval = (xmlNodePtr) xmlCopyDoc( (xmlDocPtr)node, recursive ); 
    150           break; 
    151         case XML_DOCUMENT_TYPE_NODE: 
    152         case XML_DTD_NODE: 
    153           retval = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr)node ); 
    154           break; 
    155         case XML_NAMESPACE_DECL: 
    156           retval = ( xmlNodePtr ) xmlCopyNamespace( (xmlNsPtr) node ); 
    157           break; 
    158         default: 
    159           break; 
    160         } 
    161     } 
    162  
    163     return retval; 
    164 } 
    165  
    166 FUNCTION(cloneNode) 
    167     ARG_BETWEEN(0, 1); 
    168     EXTERNAL_NODE(); 
    169     EXTERNAL_DOC(); 
    170     int deep = args.Length() == 1 ? args[0]->Int32Value() : 0; 
    171     xmlNodePtr ret = _CloneNodeIn( node, deep ); 
    172     assert(ret); 
    173     return createNode( doc, ret ); 
    174 END 
    175  
    176 FUNCTION(firstChild) 
    177     ARG_COUNT(0); 
    178     EXTERNAL_NODE(); 
    179     EXTERNAL_DOC(); 
    180     return createNode( doc, node->children ); 
    181 END 
    182  
    183 FUNCTION(lastChild) 
    184     ARG_COUNT(0); 
    185     EXTERNAL_NODE(); 
    186     EXTERNAL_DOC(); 
    187     return createNode( doc, node->last ); 
    188 END 
    189  
    190 FUNCTION(parentNode) 
    191     ARG_COUNT(0); 
    192     EXTERNAL_NODE(); 
    193     EXTERNAL_DOC(); 
    194     return createNode( doc, node->parent ); 
    195 END 
     23#include "node.h" 
    19624 
    19725SUBMODULE(init_node) 
    19826    CLASS_WITH_CONSTRUCTOR(_new); 
    199     BIND_IM("nodeName",            nodeName); 
    200     BIND_IM("toString",            toString); 
    201     BIND_IM("appendChild",         appendChild); 
    202     BIND_IM("insertBefore",        insertBefore); 
    203     BIND_IM("insertAfter",         insertAfter); 
    204     BIND_IM("removeChild",         removeChild); 
    205     BIND_IM("removeChildNodes",    removeChildNodes); 
    206     BIND_IM("cloneNode",           cloneNode); 
    207     BIND_IM("firstChild",          firstChild); 
    208     BIND_IM("lastChild",           lastChild); 
    209     BIND_IM("parentNode",          parentNode); 
    210     INTERNALCOUNT(2); 
     27    setupNodeIM(OBJECT_TEMPLATE); 
    21128    EXPORT_CLASS("Node"); 
    21229ENDSUBMODULE 
  • lang/cplusplus/llv8call/trunk/t/070_libxml/02_dom.js

    r20866 r20881  
    8888}); 
    8989 
     90test(function () { 
     91    root.setAttributeNode(doc.createAttribute("foo", "bar")); 
     92    is(root.toString(),  '<foo foo="bar"/>', 'node.createAttribute()'); 
     93}); 
     94 
    9095doc.close(); 
    9196