2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
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
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.
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
22 #include <DOM/DOMDocument.h>
23 #include <DOM/DOMImplementation.h>
24 #include <DOM/DOMCharacterData.h>
25 #include <DOM/DOMAttribute.h>
26 #include <DOM/DOMElement.h>
27 #include <DOM/DOMDocumentType.h>
28 #include <DOM/DOMProcessingInstruction.h>
29 #include "NSObject+StringValue.h"
33 Differences to DOM JavaScript
35 Differences are due to JavaScript bridge retain-cycle issues with parent
36 properties (properties are cached by the JS engine, while function return
40 original property | SKYRiX function
41 parentNode | getParentNode()
42 childNodes | getChildNodes()
43 firstChild | getFirstChild()
44 lastChild | getLastChild()
45 previousSibling | getPreviousSibling()
46 nextSibling | getNextSibling()
47 attributes | getAttributes()
48 ownerDocument | getOwnerDocument()
51 ownerElement | getOwnerElement()
54 original property | SKYRiX function
55 documentElement | getDocumentElement()
58 @implementation NGDOMImplementation(JSSupport)
60 - (id)_jsfunc_createDocument:(NSArray *)_args {
61 NSString *nsuri = nil, *qname = nil, *doctype = nil;
64 count = [_args count];
65 if (count > 0) nsuri = [[_args objectAtIndex:0] stringValue];
66 if (count > 1) qname = [[_args objectAtIndex:1] stringValue];
67 if (count > 2) doctype = [[_args objectAtIndex:2] stringValue];
69 return [self createDocumentWithName:qname
71 documentType:doctype];
74 - (id)_jsfunc_createDocumentType:(NSArray *)_args {
75 NSString *qname = nil, *pubId = nil, *sysId = nil;
78 count = [_args count];
79 if (count > 0) qname = [[_args objectAtIndex:0] stringValue];
80 if (count > 1) pubId = [[_args objectAtIndex:1] stringValue];
81 if (count > 2) sysId = [[_args objectAtIndex:2] stringValue];
83 return [self createDocumentType:qname publicId:pubId systemId:sysId];
86 @end /* NGDOMImplementation(JSSupport) */
88 @implementation NGDOMDocument(JSSupport)
90 - (id)_jsprop_doctype {
91 return [self doctype];
93 - (id)_jsprop_implementation {
94 return [self implementation];
97 - (id)_jsfunc_getDocumentElement:(NSArray *)_args {
98 return [self documentElement];
103 - (id)_jsfunc_getElementsByTagName:(NSArray *)_args {
105 if ((count = [_args count]) == 0) return nil;
108 return [self getElementsByTagName:[[_args objectAtIndex:0] stringValue]];
110 return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
111 namespaceURI:[[_args objectAtIndex:0] stringValue]];
114 - (id)_jsfunc_getElementsByTagNameNS:(NSArray *)_args {
115 return [self _jsfunc_getElementsByTagName:_args];
118 - (id)_jsfunc_getElementById:(NSArray *)_args {
120 if ((count = [_args count]) == 0) return nil;
122 return [self getElementById:[[_args objectAtIndex:0] stringValue]];
127 - (id)_jsfunc_createElement:(NSArray *)_args {
129 if ((count = [_args count]) == 0) return nil;
131 return [self createElement:[[_args objectAtIndex:0] stringValue]];
133 return [self createElement:[[_args objectAtIndex:1] stringValue]
134 namespaceURI:[[_args objectAtIndex:0] stringValue]];
137 - (id)_jsfunc_createElementNS:(NSArray *)_args {
138 return [self _jsfunc_createElement:_args];
141 - (id)_jsfunc_createDocumentFragment:(NSArray *)_args {
142 return [self createDocumentFragment];
144 - (id)_jsfunc_createTextNode:(NSArray *)_args {
146 if ((count = [_args count]) == 0) return nil;
147 return [self createTextNode:[[_args objectAtIndex:0] stringValue]];
149 - (id)_jsfunc_createComment:(NSArray *)_args {
151 if ((count = [_args count]) == 0) return nil;
152 return [self createComment:[[_args objectAtIndex:0] stringValue]];
154 - (id)_jsfunc_createCDATASection:(NSArray *)_args {
156 if ((count = [_args count]) == 0) return nil;
157 return [self createCDATASection:[[_args objectAtIndex:0] stringValue]];
160 - (id)_jsfunc_createProcessingInstruction:(NSArray *)_args {
162 if ((count = [_args count]) < 2) return nil;
164 return [self createProcessingInstruction:
165 [[_args objectAtIndex:0] stringValue]
166 data:[[_args objectAtIndex:1] stringValue]];
168 - (id)_jsfunc_createAttribute:(NSArray *)_args {
170 if ((count = [_args count]) == 0) return nil;
172 return [self createAttribute:[[_args objectAtIndex:0] stringValue]];
174 return [self createAttribute:[[_args objectAtIndex:1] stringValue]
175 namespaceURI:[[_args objectAtIndex:0] stringValue]];
178 - (id)_jsfunc_createAttributeNS:(NSArray *)_args {
179 return [self _jsfunc_createAttribute:_args];
182 - (id)_jsfunc_createEntityReference:(NSArray *)_args {
184 if ((count = [_args count]) == 0) return nil;
185 return [self createEntityReference:[[_args objectAtIndex:0] stringValue]];
188 @end /* NGDOMDocument(JSSupport) */
190 @implementation NGDOMNode(JSSupport)
192 - (NSString *)_jsprop_nodeName {
193 return [self nodeName];
195 - (NSString *)_jsprop_nodeValue {
196 return [self nodeValue];
198 - (NSNumber *)_jsprop_nodeType {
199 return [NSNumber numberWithShort:[self nodeType]];
202 - (NSString *)_jsprop_namespaceURI {
203 return [self namespaceURI];
205 - (NSString *)_jsprop_prefix {
206 return [self prefix];
208 - (NSString *)_jsprop_localName {
209 return [self localName];
212 - (id)_jsfunc_getParentNode:(NSArray *)_args {
213 return [self parentNode];
215 - (id)_jsfunc_getChildNodes:(NSArray *)_args {
216 return [self childNodes];
218 - (id)_jsfunc_getFirstChild:(NSArray *)_args {
219 return [self firstChild];
221 - (id)_jsfunc_getLastChild:(NSArray *)_args {
222 return [self lastChild];
224 - (id)_jsfunc_getPreviousSibling:(NSArray *)_args {
225 return [self previousSibling];
227 - (id)_jsfunc_getNextSibling:(NSArray *)_args {
228 return [self nextSibling];
230 - (id)_jsfunc_getAttributes:(NSArray *)_args {
231 return [self attributes];
233 - (id)_jsfunc_getOwnerDocument:(NSArray *)_args {
234 return [self ownerDocument];
237 - (NSNumber *)_jsfunc_hasChildNodes:(NSArray *)_args {
238 return [NSNumber numberWithBool:[self hasChildNodes]];
241 - (id)_jsfunc_normalize:(NSArray *)_args {
245 - (id)_jsfunc_appendChild:(NSArray *)_args {
248 for (i = 0, count = [_args count]; i < count; i++)
249 last = [self appendChild:[_args objectAtIndex:i]];
252 - (id)_jsfunc_removeChild:(NSArray *)_args {
255 for (i = 0, count = [_args count]; i < count; i++)
256 last = [self removeChild:[_args objectAtIndex:i]];
260 // #warning some JS DOMNode API missing
262 @end /* NGDOMNode(JSSupport) */
264 @implementation NGDOMCharacterData(JSSupport)
266 - (void)_jsprop_data:(NSString *)_data {
267 _data = [_data stringValue];
268 [self setData:_data];
270 - (NSString *)_jsprop_data {
274 - (NSNumber *)_jsprop_length {
275 return [NSNumber numberWithInt:[self length]];
278 - (NSString *)_jsfunc_substringData:(NSArray *)_args {
280 if ((count = [_args count]) < 2) return nil;
281 return [self substringData:[[_args objectAtIndex:0] intValue]
282 count:[[_args objectAtIndex:1] intValue]];
284 - (id)_jsfunc_appendData:(NSArray *)_args {
286 for (i = 0, count = [_args count]; i < count; i++)
287 [self appendData:[[_args objectAtIndex:i] stringValue]];
290 - (id)_jsfunc_insertData:(NSArray *)_args {
292 if ((count = [_args count]) == 0) return nil;
294 [self insertData:[[_args objectAtIndex:0] stringValue] offset:0];
296 [self insertData:[[_args objectAtIndex:0] stringValue]
297 offset:[[_args objectAtIndex:1] intValue]];
301 - (id)_jsfunc_deleteData:(NSArray *)_args {
303 if ((count = [_args count]) < 2) return nil;
304 [self deleteData:[[_args objectAtIndex:0] intValue]
305 count:[[_args objectAtIndex:1] intValue]];
308 - (id)_jsfunc_replaceData:(NSArray *)_args {
310 if ((count = [_args count]) < 3) return nil;
311 [self replaceData:[[_args objectAtIndex:0] intValue]
312 count:[[_args objectAtIndex:1] intValue]
313 with:[[_args objectAtIndex:2] stringValue]];
317 @end /* NGDOMCharacterData(JSSupport) */
319 @implementation NGDOMAttribute(JSSupport)
321 - (NSString *)_jsprop_name {
324 - (NSNumber *)_jsprop_specified {
325 return [NSNumber numberWithBool:[self specified]];
328 - (void)_jsprop_value:(NSString *)_value {
329 [self setValue:[_value stringValue]];
331 - (NSString *)_jsprop_value {
335 - (id)_jsfunc_getOwnerElement:(NSArray *)_args {
336 return [self ownerElement];
339 @end /* NGDOMAttribute(JSSupport) */
341 @implementation NGDOMElement(JSSupport)
343 - (NSString *)_jsprop_tagName {
344 return [self tagName];
349 - (NSString *)_jsfunc_getAttribute:(NSArray *)_args {
352 if ((count = [_args count]) == 0) return nil;
353 return [self attribute:[[_args objectAtIndex:0] stringValue]];
355 - (NSString *)_jsfunc_getAttributeNS:(NSArray *)_args {
358 if ((count = [_args count]) == 0) return nil;
359 return [self attribute:[[_args objectAtIndex:1] stringValue]
360 namespaceURI:[[_args objectAtIndex:0] stringValue]];
363 - (id)_jsfunc_setAttribute:(NSArray *)_args {
366 if ((count = [_args count]) < 2) return nil;
367 [self setAttribute:[[_args objectAtIndex:0] stringValue]
368 value:[[_args objectAtIndex:1] stringValue]];
371 - (id)_jsfunc_setAttributeNS:(NSArray *)_args {
374 if ((count = [_args count]) < 3) return nil;
375 [self setAttribute:[[_args objectAtIndex:1] stringValue]
376 namespaceURI:[[_args objectAtIndex:0] stringValue]
377 value:[[_args objectAtIndex:2] stringValue]];
381 - (id)_jsfunc_removeAttribute:(NSArray *)_args {
383 for (i = 0, count = [_args count]; i < count; i++)
384 [self removeAttribute:[[_args objectAtIndex:i] stringValue]];
387 - (id)_jsfunc_removeAttributeNS:(NSArray *)_args {
389 if ((count = [_args count]) < 2) return nil;
390 [self removeAttribute:[[_args objectAtIndex:1] stringValue]
391 namespaceURI:[[_args objectAtIndex:0] stringValue]];
395 - (id)_jsfunc_getAttributeNode:(NSArray *)_args {
398 if ((count = [_args count]) == 0) return nil;
399 return [[self attributes] namedItem:[[_args objectAtIndex:0] stringValue]];
401 - (id)_jsfunc_setAttributeNode:(NSArray *)_args {
405 for (i = 0, count = [_args count]; i < count; i++)
406 last = [self setAttributeNode:[_args objectAtIndex:i]];
409 - (id)_jsfunc_removeAttributeNode:(NSArray *)_args {
413 for (i = 0, count = [_args count]; i < count; i++)
414 last = [self removeAttributeNode:[_args objectAtIndex:i]];
420 - (id)_jsfunc_getElementsByTagName:(NSArray *)_args {
423 if ((count = [_args count]) < 1) return nil;
426 return [self getElementsByTagName:[[_args objectAtIndex:0] stringValue]];
428 return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
429 namespaceURI:[[_args objectAtIndex:0] stringValue]];
432 - (id)_jsfunc_getElementsByTagNameNS:(NSArray *)_args {
435 if ((count = [_args count]) < 2) return nil;
436 return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
437 namespaceURI:[[_args objectAtIndex:0] stringValue]];
440 @end /* NGDOMElement(JSSupport) */
442 @implementation NGDOMDocumentType(JSSupport)
444 - (NSString *)_jsprop_name {
447 - (NSString *)_jsprop_publicId {
448 return [self publicId];
450 - (NSString *)_jsprop_systemId {
451 return [self systemId];
453 - (NSString *)_jsprop_internalSubset {
454 return [self internalSubset];
457 @end /* NGDOMDocumentType(JSSupport) */
459 @implementation NGDOMProcessingInstruction(JSSupport)
461 - (NSString *)_jsprop_target {
462 return [self target];
465 - (void)_jsprop_data:(NSString *)_data {
466 [self setData:[_data stringValue]];
468 - (NSString *)_jsprop_data {
472 @end /* NGDOMProcessingInstruction(JSSupport) */