]> err.no Git - sope/blob - sope-xml/DOM/DOMNode.m
fixed an uninit var on Cocoa
[sope] / sope-xml / DOM / DOMNode.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
6   SOPE 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
9   later version.
10
11   SOPE 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.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with SOPE; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #include <DOM/DOMNode.h>
23 #include <DOM/DOMDocument.h>
24 #include <DOM/DOMProcessingInstruction.h>
25 #include <DOM/DOMCharacterData.h>
26 #include <DOM/DOMElement.h>
27 #include <DOM/DOMAttribute.h>
28 #include "common.h"
29
30 NSString *DOMNodeName(id<DOMNode> _node) {
31   switch ([_node nodeType]) {
32     case DOM_ATTRIBUTE_NODE:
33       return [(id<DOMAttr>)_node name];
34     case DOM_CDATA_SECTION_NODE:
35       return @"#cdata-section";
36     case DOM_COMMENT_NODE:
37       return @"#comment";
38     case DOM_DOCUMENT_NODE:
39       return @"#document";
40     case DOM_DOCUMENT_FRAGMENT_NODE:
41       return @"#document-fragment";
42     case DOM_ELEMENT_NODE:
43       return [(id<DOMElement>)_node tagName];
44     case DOM_PROCESSING_INSTRUCTION_NODE:
45       return [(id<DOMProcessingInstruction>)_node target];
46     case DOM_TEXT_NODE:
47       return @"#text";
48       
49     case DOM_DOCUMENT_TYPE_NODE:
50     case DOM_ENTITY_NODE:
51     case DOM_ENTITY_REFERENCE_NODE:
52     case DOM_NOTATION_NODE:
53     default:
54       NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
55       return nil;
56   }
57 }
58
59 NSString *DOMNodeValue(id _node) {
60   switch ([_node nodeType]) {
61     case DOM_ATTRIBUTE_NODE:
62       return [_node value];
63       
64     case DOM_CDATA_SECTION_NODE:
65     case DOM_COMMENT_NODE:
66     case DOM_TEXT_NODE:
67       return [(id<DOMCharacterData>)_node data];
68
69     case DOM_DOCUMENT_NODE:
70     case DOM_DOCUMENT_FRAGMENT_NODE:
71     case DOM_ELEMENT_NODE:
72       return nil;
73       
74     case DOM_PROCESSING_INSTRUCTION_NODE:
75       return [(id<DOMProcessingInstruction>)_node data];
76       
77     case DOM_DOCUMENT_TYPE_NODE:
78     case DOM_ENTITY_NODE:
79     case DOM_ENTITY_REFERENCE_NODE:
80     case DOM_NOTATION_NODE:
81     default:
82       NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
83       return nil;
84   }
85 }
86
87 @implementation NGDOMNode
88
89 - (void)_domNodeRegisterParentNode:(id)_parent {
90 }
91 - (void)_domNodeForgetParentNode:(id)_parent {
92 }
93
94 /* owner */
95
96 - (IDOMDocument)ownerDocument {
97   id node;
98
99   for (node = [self parentNode]; node; node = [node parentNode]) {
100     if ([node nodeType] == DOM_DOCUMENT_NODE)
101       return node;
102     if ([node nodeType] == DOM_DOCUMENT_FRAGMENT_NODE)
103       return node;
104   }
105   
106   return nil;
107 }
108
109 /* attributes */
110
111 - (DOMNodeType)nodeType {
112   return DOM_UNKNOWN_NODE;
113 }
114
115 - (NSString *)nodeName {
116   return DOMNodeName(self);
117 }
118 - (NSString *)nodeValue {
119   return DOMNodeValue(self);
120 }
121
122 - (id)subclassResponsibility:(SEL)_sel {
123   [self doesNotRecognizeSelector:_sel];
124   return nil;
125 }
126
127 - (NSString *)localName {
128   /* introduced in DOM level 2 */
129   return [self subclassResponsibility:_cmd];
130 }
131 - (NSString *)namespaceURI {
132   /* introduced in DOM level 2 */
133   return [self subclassResponsibility:_cmd];
134 }
135
136 - (void)setPrefix:(NSString *)_prefix {
137   /* introduced in DOM level 2 */
138   [self subclassResponsibility:_cmd];
139 }
140 - (NSString *)prefix {
141   /* introduced in DOM level 2 */
142   return [self subclassResponsibility:_cmd];
143 }
144
145 /* element attributes */
146
147 - (id<NSObject,DOMNamedNodeMap>)attributes {
148   /* returns a NamedNodeList */
149   return [self subclassResponsibility:_cmd];
150 }
151
152 /* modification */
153
154 - (BOOL)_isValidChildNode:(id)_node {
155   return NO;
156 }
157
158 - (id<NSObject,DOMNode>)removeChild:(id<NSObject,DOMNode>)_node {
159   return nil;
160 }
161 - (id<NSObject,DOMNode>)appendChild:(id<NSObject,DOMNode>)_node {
162   return nil;
163 }
164
165 /* navigation */
166
167 - (id<NSObject,DOMNode>)parentNode {
168   return [self subclassResponsibility:_cmd];
169 }
170
171 - (id<NSObject,DOMNode>)previousSibling {
172   NGDOMNode *parent;
173   
174   if ((parent = (NGDOMNode *)[self parentNode]) == nil) return nil;
175   if (parent == nil) return nil;
176   if (![parent respondsToSelector:@selector(_domNodeBeforeNode:)]) return nil;
177   return [parent _domNodeBeforeNode:self];
178 }
179 - (id<NSObject,DOMNode>)nextSibling {
180   NGDOMNode *parent;
181   
182   if ((parent = (NGDOMNode *)[self parentNode]) == nil) return nil;
183   if (parent == nil) return nil;
184   if (![parent respondsToSelector:@selector(_domNodeBeforeNode:)]) return nil;
185   return [parent _domNodeAfterNode:self];
186 }
187
188 - (id<NSObject,DOMNodeList>)childNodes {
189   return nil;
190 }
191 - (BOOL)hasChildNodes {
192   return NO;
193 }
194 - (id<NSObject,DOMNode>)firstChild {
195   return nil;
196 }
197 - (id<NSObject,DOMNode>)lastChild {
198   return nil;
199 }
200
201 /* description */
202
203 - (NSString *)description {
204   return [NSString stringWithFormat:
205                      @"<0x%08X[%@]: name=%@ parent=%@ type=%i #children=%i>",
206                      self, NSStringFromClass([self class]),
207                      [self nodeName],
208                      [[self parentNode] nodeName],
209                      [self nodeType],
210                      [self hasChildNodes] ? [[self childNodes] length] : 0];
211 }
212
213 @end /* NGDOMNode */
214
215 #include "DOMXMLOutputter.h"
216 #include "DOMCharacterData.h"
217
218 @implementation NGDOMNode(Additions)
219
220 - (NSString *)nodeTypeString {
221   switch ([self nodeType]) {
222     case DOM_ATTRIBUTE_NODE:              return @"attribute";
223     case DOM_CDATA_SECTION_NODE:          return @"cdata-section";
224     case DOM_COMMENT_NODE:                return @"comment";
225     case DOM_DOCUMENT_NODE:               return @"document";
226     case DOM_DOCUMENT_FRAGMENT_NODE:      return @"document-fragment";
227     case DOM_ELEMENT_NODE:                return @"element";
228     case DOM_PROCESSING_INSTRUCTION_NODE: return @"processing-instruction";
229     case DOM_TEXT_NODE:                   return @"text";
230     case DOM_DOCUMENT_TYPE_NODE:          return @"document-type";
231     case DOM_ENTITY_NODE:                 return @"entity";
232     case DOM_ENTITY_REFERENCE_NODE:       return @"entity-reference";
233     case DOM_NOTATION_NODE:               return @"notation";
234     default:
235       return @"unknown";
236   }
237 }
238
239 - (NSString *)xmlStringValue {
240   DOMXMLOutputter *out;
241   NSMutableString *s;
242   NSString *r;
243
244   s   = [[NSMutableString alloc] initWithCapacity:1024];
245   out = [[DOMXMLOutputter alloc] init];
246
247   [out outputNode:self to:s];
248   [out release];
249   
250   r = [s copy];
251   [s release];
252   return [r autorelease];
253 }
254
255 - (NSData *)xmlDataValue {
256   return [[self xmlStringValue] dataUsingEncoding:NSUTF8StringEncoding];
257 }
258
259 - (NSString *)textValue {
260   NSMutableString *s;
261   
262   s = [NSMutableString stringWithCapacity:256];
263
264   switch ([self nodeType]) {
265     case DOM_ELEMENT_NODE:
266     case DOM_DOCUMENT_NODE:
267     case DOM_ATTRIBUTE_NODE:
268       if ([self hasChildNodes]) {
269         id children;
270         unsigned i, count;
271         
272         children = [self childNodes];
273         for (i = 0, count = [children count]; i < count; i++) {
274           NSString *cs;
275
276           cs = [[children objectAtIndex:i] textValue];
277           if (cs) [s appendString:cs];
278         }
279       }
280       break;
281       
282     case DOM_TEXT_NODE:
283     case DOM_COMMENT_NODE:
284     case DOM_CDATA_SECTION_NODE:
285       [s appendString:[(id<DOMCharacterData>)self data]];
286       break;
287       
288     default:
289       return nil;
290   }
291   
292   return [[s copy] autorelease];
293 }
294
295 @end /* NGDOMNode(Additions) */
296
297 @implementation NSArray(DOMNodeList)
298
299 - (unsigned)length {
300   return [self count];
301 }
302
303 @end /* NSObject(DOMNodeList) */