Annotation of parser3/src/types/pa_vxnode.C, revision 1.44
1.1 parser 1: /** @node
2: Parser: @b dnode parser type.
3:
1.43 paf 4: Copyright(c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)
1.15 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 parser 6: */
7: #include "pa_config_includes.h"
8: #ifdef XML
1.18 paf 9:
1.44 ! paf 10: static const char * const IDENT_VXNODE_C="$Date: 2005/08/09 08:14:56 $";
1.1 parser 11:
12: #include "pa_vxnode.h"
13: #include "pa_vxdoc.h"
14: #include "pa_vstring.h"
15: #include "pa_vbool.h"
16: #include "pa_vhash.h"
1.31 paf 17: #include "pa_request_charsets.h"
18: #include "pa_charset.h"
1.36 paf 19: #include "pa_xml_exception.h"
1.1 parser 20:
1.44 ! paf 21: Request_charsets& VXnode::charsets() {
! 22: return get_internal_vxdoc().charsets();
! 23: }
! 24:
1.31 paf 25: Value* VXnode::get_element(const String& aname, Value& aself, bool looking_up) {
1.12 paf 26: // $CLASS,$method
1.31 paf 27: if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.12 paf 28: return result;
29:
30: // fields
1.44 ! paf 31: xmlNode& selfNode=get_xmlnode();
1.12 paf 32:
1.21 paf 33: if(aname=="nodeName") {
1.44 ! paf 34: return new VString(charsets().source().transcode(selfNode.name));
1.21 paf 35: } else if(aname=="nodeValue") {
1.44 ! paf 36: return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.21 paf 37: } else if(aname=="nodeType") {
1.44 ! paf 38: return new VInt(selfNode.type);
1.21 paf 39: } else if(aname=="parentNode") {
1.44 ! paf 40: if(xmlNode* result_node=selfNode.parent)
! 41: return &get_vxdoc().wrap(*result_node);
1.25 paf 42: return 0;
1.21 paf 43: } else if(aname=="childNodes") {
1.44 ! paf 44: if(xmlNode* currentNode=selfNode.children) {
1.31 paf 45: VHash* result=new VHash;
1.12 paf 46: int i=0;
47: do {
1.31 paf 48: result->hash().put(
1.33 paf 49: String::Body::Format(i++),
1.44 ! paf 50: &get_vxdoc().wrap(*currentNode));
! 51: } while((currentNode=currentNode->next));
1.3 parser 52: return result;
1.12 paf 53: }
1.25 paf 54: return 0;
1.21 paf 55: } else if(aname=="firstChild") {
1.44 ! paf 56: if(xmlNode* result_node=selfNode.children)
! 57: return &get_vxdoc().wrap(*result_node);
1.25 paf 58: return 0;
1.21 paf 59: } else if(aname=="lastChild") {
1.44 ! paf 60: if(xmlNode* result_node=selfNode.last)
! 61: return &get_vxdoc().wrap(*result_node);
1.25 paf 62: return 0;
1.21 paf 63: } else if(aname=="previousSibling") {
1.44 ! paf 64: if(xmlNode* result_node=selfNode.prev)
! 65: return &get_vxdoc().wrap(*result_node);
1.25 paf 66: return 0;
1.21 paf 67: } else if(aname=="nextSibling") {
1.44 ! paf 68: if(xmlNode* result_node=selfNode.next)
! 69: return &get_vxdoc().wrap(*result_node);
1.25 paf 70: return 0;
1.21 paf 71: } else if(aname=="ownerDocument") {
1.44 ! paf 72: return &get_vxdoc();
! 73: } else switch(selfNode.type) {
! 74: case XML_ELEMENT_NODE:
1.21 paf 75: if(aname=="attributes") {
1.44 ! paf 76: if(xmlNode* currentNode=(xmlNode*)selfNode.properties) {
1.31 paf 77: VHash* result=new VHash;
1.44 ! paf 78: do {
1.31 paf 79: result->hash().put(
1.44 ! paf 80: charsets().source().transcode(currentNode->name),
! 81: &get_vxdoc().wrap(*currentNode));
! 82: } while((currentNode=currentNode->next));
1.12 paf 83: return result;
84: }
1.25 paf 85: return 0;
1.21 paf 86: } else if(aname=="tagName") {
1.44 ! paf 87: return new VString(charsets().source().transcode(selfNode.name));
1.2 parser 88: }
1.12 paf 89: break;
1.44 ! paf 90: case XML_ATTRIBUTE_NODE:
1.21 paf 91: if(aname=="specified")
1.44 ! paf 92: return new VBool(true); // were not working in gdome, leaving out
1.27 paf 93: else if(aname=="name")
1.44 ! paf 94: return new VString(charsets().source().transcode(selfNode.name));
1.21 paf 95: else if(aname=="value")
1.44 ! paf 96: return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.12 paf 97: break;
98: /*
1.44 ! paf 99: case XML_COMMENT_NODE:
1.12 paf 100: substringData(unsigned int offset, unsigned int count)
101: */
1.44 ! paf 102: case XML_PI_NODE:
1.21 paf 103: if(aname=="target")
1.44 ! paf 104: return new VString(charsets().source().transcode(selfNode.name));
1.21 paf 105: else if(aname=="data")
1.44 ! paf 106: return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.12 paf 107: break;
1.44 ! paf 108: case XML_DTD_NODE:
1.12 paf 109: {
1.26 paf 110: if(aname=="name") {
1.21 paf 111: // readonly attribute DOMString aname;
112: // The aname of DTD; i.e., the aname immediately following
1.12 paf 113: // the DOCTYPE keyword in an XML source document.
1.44 ! paf 114: return new VString(charsets().source().transcode(selfNode.name));
1.1 parser 115: }
1.12 paf 116: /*
117: readonly attribute NamedNodeMap entities;
118: readonly attribute NamedNodeMap notations;
119: virtual const XalanNamedNodeMap* getEntities () const = 0
120: This function returns a NamedNodeMap containing the general entities, both external and internal, declared in the DTD. More...
121: virtual const XalanNamedNodeMap* getNotations () const = 0
122: This function returns a named selfNode map containing an entry for each notation declared in a document's DTD. More...
123: */
124: }
125: break;
1.44 ! paf 126: /* someday
! 127: case XML_NOTATION_NODE:
1.12 paf 128: {
1.44 ! paf 129: GdomeNotation *notation=XML_NOT(selfNode);
1.21 paf 130: if(aname=="publicId") {
1.12 paf 131: // readonly attribute DOMString publicId;
1.44 ! paf 132: return new VString(charsets().source().transcode(gdome_not_publicId(notation, &exc)));
1.21 paf 133: } else if(aname=="systemId") {
1.12 paf 134: // readonly attribute DOMString systemId;
1.44 ! paf 135: return new VString(charsets().source().transcode(gdome_not_systemId(notation, &exc)));
1.4 parser 136: }
1.12 paf 137: }
138: break;
1.44 ! paf 139: */
1.12 paf 140: }
1.3 parser 141:
1.32 paf 142: return bark("%s field not found", &aname);
1.1 parser 143: }
144:
1.42 paf 145: const VJunction* VXnode::put_element(Value& /*aself*/, const String& aname, Value* avalue, bool /*replace*/)
1.36 paf 146: {
1.44 ! paf 147: xmlNode& selfNode=get_xmlnode();
1.36 paf 148:
149: if(aname=="nodeValue") {
1.44 ! paf 150: xmlNodeSetContent(&selfNode,
! 151: charsets().source().transcode(avalue->as_string()));
1.36 paf 152:
1.39 paf 153: return PUT_ELEMENT_REPLACED_ELEMENT;
1.36 paf 154: }
155:
1.38 paf 156: bark("element can not be stored to %s", &aname);
1.39 paf 157: return 0;
1.36 paf 158: }
1.1 parser 159: #endif
E-mail: