2 Copyright (C) 2000-2004 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 #include <DOM/DOMNode.h>
24 #include <DOM/DOMDocument.h>
25 #include <DOM/DOMProcessingInstruction.h>
26 #include <DOM/DOMCharacterData.h>
27 #include <DOM/DOMElement.h>
28 #include <DOM/DOMAttribute.h>
31 NSString *DOMNodeName(id<DOMNode> _node) {
32 switch ([_node nodeType]) {
33 case DOM_ATTRIBUTE_NODE:
34 return [(id<DOMAttr>)_node name];
35 case DOM_CDATA_SECTION_NODE:
36 return @"#cdata-section";
37 case DOM_COMMENT_NODE:
39 case DOM_DOCUMENT_NODE:
41 case DOM_DOCUMENT_FRAGMENT_NODE:
42 return @"#document-fragment";
43 case DOM_ELEMENT_NODE:
44 return [(id<DOMElement>)_node tagName];
45 case DOM_PROCESSING_INSTRUCTION_NODE:
46 return [(id<DOMProcessingInstruction>)_node target];
50 case DOM_DOCUMENT_TYPE_NODE:
52 case DOM_ENTITY_REFERENCE_NODE:
53 case DOM_NOTATION_NODE:
55 NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
60 NSString *DOMNodeValue(id _node) {
61 switch ([_node nodeType]) {
62 case DOM_ATTRIBUTE_NODE:
65 case DOM_CDATA_SECTION_NODE:
66 case DOM_COMMENT_NODE:
68 return [(DOMCharacterData *)_node data];
70 case DOM_DOCUMENT_NODE:
71 case DOM_DOCUMENT_FRAGMENT_NODE:
72 case DOM_ELEMENT_NODE:
75 case DOM_PROCESSING_INSTRUCTION_NODE:
76 return [(DOMProcessingInstruction *)_node data];
78 case DOM_DOCUMENT_TYPE_NODE:
80 case DOM_ENTITY_REFERENCE_NODE:
81 case DOM_NOTATION_NODE:
83 NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
88 @implementation DOMNode
90 - (void)_domNodeRegisterParentNode:(id)_parent {
92 - (void)_domNodeForgetParentNode:(id)_parent {
97 - (DOMDocument *)ownerDocument {
100 for (node = [self parentNode]; node; node = [node parentNode]) {
101 if ([node nodeType] == DOM_DOCUMENT_NODE)
103 if ([node nodeType] == DOM_DOCUMENT_FRAGMENT_NODE)
112 - (DOMNodeType)nodeType {
113 return DOM_UNKNOWN_NODE;
116 - (NSString *)nodeName {
117 return DOMNodeName(self);
119 - (NSString *)nodeValue {
120 return DOMNodeValue(self);
123 - (id)subclassResponsibility:(SEL)_sel {
124 [self doesNotRecognizeSelector:_sel];
128 - (NSString *)localName {
129 /* introduced in DOM level 2 */
130 return [self subclassResponsibility:_cmd];
132 - (NSString *)namespaceURI {
133 /* introduced in DOM level 2 */
134 return [self subclassResponsibility:_cmd];
137 - (void)setPrefix:(NSString *)_prefix {
138 /* introduced in DOM level 2 */
139 [self subclassResponsibility:_cmd];
141 - (NSString *)prefix {
142 /* introduced in DOM level 2 */
143 return [self subclassResponsibility:_cmd];
146 /* element attributes */
149 /* returns a NamedNodeList */
150 return [self subclassResponsibility:_cmd];
155 - (BOOL)_isValidChildNode:(id)_node {
159 - (id)removeChild:(id)_node {
162 - (id)appendChild:(id)_node {
169 return [self subclassResponsibility:_cmd];
172 - (id)previousSibling {
175 if ((parent = (DOMNode *)[self parentNode]) == nil) return nil;
176 if (parent == nil) return nil;
177 if (![parent respondsToSelector:@selector(_domNodeBeforeNode:)]) return nil;
178 return [parent _domNodeBeforeNode:self];
183 if ((parent = (DOMNode *)[self parentNode]) == nil) return nil;
184 if (parent == nil) return nil;
185 if (![parent respondsToSelector:@selector(_domNodeBeforeNode:)]) return nil;
186 return [parent _domNodeAfterNode:self];
192 - (BOOL)hasChildNodes {
204 - (NSString *)description {
205 return [NSString stringWithFormat:
206 @"<0x%08X[%@]: name=%@ parent=%@ type=%i #children=%i>",
207 self, NSStringFromClass([self class]),
209 [[self parentNode] nodeName],
211 [self hasChildNodes] ? [[self childNodes] length] : 0];
216 #include "DOMXMLOutputter.h"
217 #include "DOMCharacterData.h"
219 @implementation DOMNode(Additions)
221 - (NSString *)nodeTypeString {
222 switch ([self nodeType]) {
223 case DOM_ATTRIBUTE_NODE: return @"attribute";
224 case DOM_CDATA_SECTION_NODE: return @"cdata-section";
225 case DOM_COMMENT_NODE: return @"comment";
226 case DOM_DOCUMENT_NODE: return @"document";
227 case DOM_DOCUMENT_FRAGMENT_NODE: return @"document-fragment";
228 case DOM_ELEMENT_NODE: return @"element";
229 case DOM_PROCESSING_INSTRUCTION_NODE: return @"processing-instruction";
230 case DOM_TEXT_NODE: return @"text";
231 case DOM_DOCUMENT_TYPE_NODE: return @"document-type";
232 case DOM_ENTITY_NODE: return @"entity";
233 case DOM_ENTITY_REFERENCE_NODE: return @"entity-reference";
234 case DOM_NOTATION_NODE: return @"notation";
240 - (NSString *)xmlStringValue {
241 DOMXMLOutputter *out;
245 s = [[NSMutableString alloc] initWithCapacity:1024];
246 out = [[DOMXMLOutputter alloc] init];
248 [out outputNode:self to:s];
253 return [r autorelease];
256 - (NSData *)xmlDataValue {
257 return [[self xmlStringValue] dataUsingEncoding:NSUTF8StringEncoding];
260 - (NSString *)textValue {
263 s = [NSMutableString stringWithCapacity:256];
265 switch ([self nodeType]) {
266 case DOM_ELEMENT_NODE:
267 case DOM_DOCUMENT_NODE:
268 case DOM_ATTRIBUTE_NODE:
269 if ([self hasChildNodes]) {
273 children = [self childNodes];
274 for (i = 0, count = [children count]; i < count; i++) {
277 cs = [[children objectAtIndex:i] textValue];
278 if (cs) [s appendString:cs];
284 case DOM_COMMENT_NODE:
285 case DOM_CDATA_SECTION_NODE:
286 [s appendString:[(DOMCharacterData *)self data]];
293 return [[s copy] autorelease];
296 @end /* DOMNode(Additions) */
298 @implementation NSArray(DOMNodeList)
304 @end /* NSObject(DOMNodeList) */