]> err.no Git - sope/blob - skyrix-xml/DOM/DOMNode.m
added svn:keywords and svn:ignore where appropriate. removed CVS artifacts.
[sope] / skyrix-xml / DOM / DOMNode.m
1 /*
2   Copyright (C) 2000-2004 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21 // $Id$
22
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>
29 #include "common.h"
30
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:
38       return @"#comment";
39     case DOM_DOCUMENT_NODE:
40       return @"#document";
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];
47     case DOM_TEXT_NODE:
48       return @"#text";
49       
50     case DOM_DOCUMENT_TYPE_NODE:
51     case DOM_ENTITY_NODE:
52     case DOM_ENTITY_REFERENCE_NODE:
53     case DOM_NOTATION_NODE:
54     default:
55       NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
56       return nil;
57   }
58 }
59
60 NSString *DOMNodeValue(id _node) {
61   switch ([_node nodeType]) {
62     case DOM_ATTRIBUTE_NODE:
63       return [_node value];
64       
65     case DOM_CDATA_SECTION_NODE:
66     case DOM_COMMENT_NODE:
67     case DOM_TEXT_NODE:
68       return [(DOMCharacterData *)_node data];
69
70     case DOM_DOCUMENT_NODE:
71     case DOM_DOCUMENT_FRAGMENT_NODE:
72     case DOM_ELEMENT_NODE:
73       return nil;
74       
75     case DOM_PROCESSING_INSTRUCTION_NODE:
76       return [(DOMProcessingInstruction *)_node data];
77       
78     case DOM_DOCUMENT_TYPE_NODE:
79     case DOM_ENTITY_NODE:
80     case DOM_ENTITY_REFERENCE_NODE:
81     case DOM_NOTATION_NODE:
82     default:
83       NSLog(@"ERROR: unknown node type %i !", [_node nodeType]);
84       return nil;
85   }
86 }
87
88 @implementation DOMNode
89
90 - (void)_domNodeRegisterParentNode:(id)_parent {
91 }
92 - (void)_domNodeForgetParentNode:(id)_parent {
93 }
94
95 /* owner */
96
97 - (DOMDocument *)ownerDocument {
98   id node;
99
100   for (node = [self parentNode]; node; node = [node parentNode]) {
101     if ([node nodeType] == DOM_DOCUMENT_NODE)
102       return node;
103     if ([node nodeType] == DOM_DOCUMENT_FRAGMENT_NODE)
104       return node;
105   }
106   
107   return nil;
108 }
109
110 /* attributes */
111
112 - (DOMNodeType)nodeType {
113   return DOM_UNKNOWN_NODE;
114 }
115
116 - (NSString *)nodeName {
117   return DOMNodeName(self);
118 }
119 - (NSString *)nodeValue {
120   return DOMNodeValue(self);
121 }
122
123 - (id)subclassResponsibility:(SEL)_sel {
124   [self doesNotRecognizeSelector:_sel];
125   return nil;
126 }
127
128 - (NSString *)localName {
129   /* introduced in DOM level 2 */
130   return [self subclassResponsibility:_cmd];
131 }
132 - (NSString *)namespaceURI {
133   /* introduced in DOM level 2 */
134   return [self subclassResponsibility:_cmd];
135 }
136
137 - (void)setPrefix:(NSString *)_prefix {
138   /* introduced in DOM level 2 */
139   [self subclassResponsibility:_cmd];
140 }
141 - (NSString *)prefix {
142   /* introduced in DOM level 2 */
143   return [self subclassResponsibility:_cmd];
144 }
145
146 /* element attributes */
147
148 - (id)attributes {
149   /* returns a NamedNodeList */
150   return [self subclassResponsibility:_cmd];
151 }
152
153 /* modification */
154
155 - (BOOL)_isValidChildNode:(id)_node {
156   return NO;
157 }
158
159 - (id)removeChild:(id)_node {
160   return nil;
161 }
162 - (id)appendChild:(id)_node {
163   return nil;
164 }
165
166 /* navigation */
167
168 - (id)parentNode {
169   return [self subclassResponsibility:_cmd];
170 }
171
172 - (id)previousSibling {
173   DOMNode *parent;
174   
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];
179 }
180 - (id)nextSibling {
181   DOMNode *parent;
182   
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];
187 }
188
189 - (id)childNodes {
190   return nil;
191 }
192 - (BOOL)hasChildNodes {
193   return NO;
194 }
195 - (id)firstChild {
196   return nil;
197 }
198 - (id)lastChild {
199   return nil;
200 }
201
202 /* description */
203
204 - (NSString *)description {
205   return [NSString stringWithFormat:
206                      @"<0x%08X[%@]: name=%@ parent=%@ type=%i #children=%i>",
207                      self, NSStringFromClass([self class]),
208                      [self nodeName],
209                      [[self parentNode] nodeName],
210                      [self nodeType],
211                      [self hasChildNodes] ? [[self childNodes] length] : 0];
212 }
213
214 @end /* DOMNode */
215
216 #include "DOMXMLOutputter.h"
217 #include "DOMCharacterData.h"
218
219 @implementation DOMNode(Additions)
220
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";
235     default:
236       return @"unknown";
237   }
238 }
239
240 - (NSString *)xmlStringValue {
241   DOMXMLOutputter *out;
242   NSMutableString *s;
243   NSString *r;
244
245   s   = [[NSMutableString alloc] initWithCapacity:1024];
246   out = [[DOMXMLOutputter alloc] init];
247
248   [out outputNode:self to:s];
249   [out release];
250   
251   r = [s copy];
252   [s release];
253   return [r autorelease];
254 }
255
256 - (NSData *)xmlDataValue {
257   return [[self xmlStringValue] dataUsingEncoding:NSUTF8StringEncoding];
258 }
259
260 - (NSString *)textValue {
261   NSMutableString *s;
262   
263   s = [NSMutableString stringWithCapacity:256];
264
265   switch ([self nodeType]) {
266     case DOM_ELEMENT_NODE:
267     case DOM_DOCUMENT_NODE:
268     case DOM_ATTRIBUTE_NODE:
269       if ([self hasChildNodes]) {
270         id children;
271         unsigned i, count;
272         
273         children = [self childNodes];
274         for (i = 0, count = [children count]; i < count; i++) {
275           NSString *cs;
276
277           cs = [[children objectAtIndex:i] textValue];
278           if (cs) [s appendString:cs];
279         }
280       }
281       break;
282       
283     case DOM_TEXT_NODE:
284     case DOM_COMMENT_NODE:
285     case DOM_CDATA_SECTION_NODE:
286       [s appendString:[(DOMCharacterData *)self data]];
287       break;
288       
289     default:
290       return nil;
291   }
292   
293   return [[s copy] autorelease];
294 }
295
296 @end /* DOMNode(Additions) */
297
298 @implementation NSArray(DOMNodeList)
299
300 - (unsigned)length {
301   return [self count];
302 }
303
304 @end /* NSObject(DOMNodeList) */