Skip to content

Commit

Permalink
Initial DOM implementation for IOS. TODO:Proxy implementation for Ent…
Browse files Browse the repository at this point in the history
…ity,Notation,DocType(partial). Implement Node.normalize(). Implement proxy object comparison
  • Loading branch information
vishalduggal committed Nov 8, 2011
1 parent 3d33a26 commit c546f21
Show file tree
Hide file tree
Showing 33 changed files with 1,903 additions and 210 deletions.
14 changes: 13 additions & 1 deletion iphone/Classes/GDataXMLNode.h
Expand Up @@ -160,6 +160,13 @@ typedef NSUInteger GDataXMLNodeKind;
- (void)releaseCachedValues;

+ (id)nodeBorrowingXMLNode:(xmlNodePtr)theXMLNode;
+ (id)nodeConsumingXMLNode:(xmlNodePtr)theXMLNode;
//ADDITIONS FOR DOM MODULE

+ (id)createNewDocFragment;
+ (id)commentWithStringValue:(NSString *)value;
+ (id)processingInstructionWithTarget:(NSString *)theName andData:(NSString*)content;
+ (id)dtdWithQualifiedName:(NSString*)qName publicId:(NSString*)pubId sysId:(NSString*)sysId;

@end

Expand All @@ -172,7 +179,7 @@ typedef NSUInteger GDataXMLNodeKind;
- (void)setNamespaces:(NSArray *)namespaces;
- (void)addNamespace:(GDataXMLNode *)aNamespace;

- (void)addChild:(GDataXMLNode *)child;
- (GDataXMLNode*)addChild:(GDataXMLNode *)child;
- (void)removeChild:(GDataXMLNode *)child;

- (NSArray *)elementsForName:(NSString *)name;
Expand Down Expand Up @@ -215,6 +222,11 @@ typedef NSUInteger GDataXMLNodeKind;
- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error;

- (NSString *)description;

//ADDITIONS FOR DOM MODULE
- (id) importNode:(GDataXMLNode*)theNode recursive:(BOOL)deep;
- (id) entityRefForName:(NSString*)theName;
- (xmlDtdPtr) getIntDTD;
@end

#endif
89 changes: 85 additions & 4 deletions iphone/Classes/GDataXMLNode.m
Expand Up @@ -248,6 +248,43 @@ + (id)textWithStringValue:(NSString *)value {
return nil;
}

+ (id)commentWithStringValue:(NSString *)value
{
xmlNodePtr theNewText = xmlNewComment(GDataGetXMLString(value));
if (theNewText) {
return [self nodeConsumingXMLNode:theNewText];
}
return nil;
}

+ (id)processingInstructionWithTarget:(NSString *)theName andData:(NSString*)content
{
xmlNodePtr theNewPI = xmlNewPI(GDataGetXMLString(theName), GDataGetXMLString(content));
if(theNewPI){
return [self nodeConsumingXMLNode:theNewPI];
}
return nil;
}

+ (id)dtdWithQualifiedName:(NSString*)qName publicId:(NSString*)pubId sysId:(NSString*)sysId
{
xmlDtdPtr theNewDTD = xmlNewDtd(nil, GDataGetXMLString(qName), GDataGetXMLString(pubId), GDataGetXMLString(sysId));
if(theNewDTD)
{
return [self nodeConsumingXMLNode:(xmlNodePtr)theNewDTD];
}
return nil;
}

+ (id)createNewDocFragment
{
xmlNodePtr theDocFrag = xmlNewDocFragment(nil);
if (theDocFrag) {
return [self nodeConsumingXMLNode:theDocFrag];
}
return nil;
}

+ (id)namespaceWithName:(NSString *)name stringValue:(NSString *)value {

xmlChar *href = GDataGetXMLString(value);
Expand Down Expand Up @@ -1011,10 +1048,10 @@ - (void)addNamespace:(GDataXMLNode *)aNamespace {
}
}

- (void)addChild:(GDataXMLNode *)child {
- (GDataXMLNode*)addChild:(GDataXMLNode *)child {
if ([child kind] == GDataXMLAttributeKind) {
[self addAttribute:child];
return;
return [GDataXMLNode nodeBorrowingXMLNode:xmlNode_];
}

if (xmlNode_ != NULL) {
Expand All @@ -1035,17 +1072,18 @@ - (void)addChild:(GDataXMLNode *)child {
// previously-unresolved namespace prefixes that can now be fixed up
[[self class] fixUpNamespacesForNode:childNodeCopy
graftingToTreeNode:xmlNode_];

return [GDataXMLNode nodeConsumingXMLNode:resultNode];
}
}
}
return nil;
}

- (void)removeChild:(GDataXMLNode *)child {
// this is safe for attributes too
if (xmlNode_ != NULL) {

[self releaseCachedValues];

xmlNodePtr node = [child XMLNode];

xmlUnlinkNode(node);
Expand All @@ -1056,6 +1094,7 @@ - (void)removeChild:(GDataXMLNode *)child {
if (![child shouldFreeXMLNode]) {
xmlFreeNode(node);
}
[self releaseCachedValues];
}
}

Expand Down Expand Up @@ -1790,6 +1829,48 @@ - (NSArray *)nodesForXPath:(NSString *)xpath
return nil;
}

- (id) importNode:(GDataXMLNode*)theNode recursive:(BOOL)deep
{
xmlNodePtr ret = nil;
if (xmlDoc_ != NULL)
{
xmlNodePtr nodeToImport = [theNode XMLNode];

if(deep)
{
ret = xmlDocCopyNode(nodeToImport, xmlDoc_, 1);
}
else
{
ret = xmlDocCopyNode(nodeToImport, xmlDoc_, 0);
}
}

if(ret != nil)
{
return [GDataXMLNode nodeConsumingXMLNode:ret];
}
return nil;
}

- (id) entityRefForName:(NSString*)theName
{
if(xmlDoc_ != nil)
{
xmlNodePtr theRef = xmlNewReference(xmlDoc_, GDataGetXMLString(theName));
if(theRef != nil)
{
return [GDataXMLNode nodeConsumingXMLNode:theRef];
}
}
return nil;
}

-(xmlDtdPtr) getIntDTD
{
return xmlGetIntSubset(xmlDoc_);
}

@end

//
Expand Down
24 changes: 14 additions & 10 deletions iphone/Classes/TIDOMCharacterDataProxy.m
Expand Up @@ -14,12 +14,6 @@
@implementation TiDOMCharacterDataProxy


-(id)text
{
DEPRECATED_REPLACED(@"XML.CharacterData.text", 1.8, 1.9, @"Ti.XML.CharacterData.data")
return [self data];
}

-(NSString *)data
{
return [node stringValue];
Expand Down Expand Up @@ -77,10 +71,20 @@ -(void) insertData:(id)args
NSString * ourData = [self data];
int dataLength = [ourData length];
ENSURE_VALUE_RANGE(offsetArg, 0, dataLength);

NSString * result = [ourData stringByReplacingCharactersInRange:
NSMakeRange(offsetArg, 0) withString:newData];

NSString *result;

if(offsetArg == dataLength)
{
result = [ourData stringByAppendingString:newData];
}
else if(offsetArg == 0)
{
result = [newData stringByAppendingString:ourData];
}
else
{
result = result = [ourData stringByReplacingCharactersInRange:NSMakeRange(offsetArg, 0) withString:newData];
}
[node setStringValue:result];
}

Expand Down
2 changes: 0 additions & 2 deletions iphone/Classes/TIDOMDOMImplementationProxy.h
Expand Up @@ -10,9 +10,7 @@
#import "GDataXMLNode.h"

@interface TIDOMDOMImplementation : TiProxy {

}

@end

#endif
128 changes: 128 additions & 0 deletions iphone/Classes/TIDOMDOMImplementationProxy.m
Expand Up @@ -7,10 +7,138 @@
#if defined(USE_TI_XML) || defined(USE_TI_NETWORK)

#import "TIDOMDOMImplementationProxy.h"
#import "TIDOMDocumentTypeProxy.h"
#import "TiDOMDocumentProxy.h"


@implementation TIDOMDOMImplementation

-(id)hasFeature:(id)args
{
ENSURE_ARG_COUNT(args, 2);

NSString *feature = [args objectAtIndex:0];
ENSURE_STRING_OR_NIL(feature);

NSString *version = [args objectAtIndex:1];
ENSURE_STRING_OR_NIL(version);

if(feature != nil)
{
if( (version == nil) || ([[version lowercaseString] compare:@"1.0"] == 0) || ([[version lowercaseString] compare:@"2.0"] == 0) )
{
if([[feature lowercaseString] compare:@"core"] == 0)
return NUMBOOL(YES);
else if([[feature lowercaseString] compare:@"xml"] == 0)
return NUMBOOL(YES);
else
return NUMBOOL(NO);
}
}

return NUMBOOL(NO);
}

-(id)createDocumentType:(id)args
{
ENSURE_ARG_COUNT(args, 3);
NSString* qualifiedName;
NSString* publicId;
NSString* systemId;

ENSURE_ARG_OR_NIL_AT_INDEX(qualifiedName,args,0,NSString);
ENSURE_ARG_OR_NIL_AT_INDEX(publicId,args,1,NSString);
ENSURE_ARG_OR_NIL_AT_INDEX(systemId,args,2,NSString);

GDataXMLNode* resultElement = [GDataXMLNode dtdWithQualifiedName:qualifiedName publicId:publicId sysId:systemId];

TIDOMDocumentTypeProxy * result = [[[TIDOMDocumentTypeProxy alloc] _initWithPageContext:[self executionContext]] autorelease];
[result setNode:resultElement];
[result setDocument:nil];

return result;
}

-(id)createDocument:(id)args
{
ENSURE_ARG_COUNT(args, 3);
NSObject* obj1;
NSObject* obj2;
NSObject* obj3;
NSString* theNsURI;
NSString* qualifiedName;
TIDOMDocumentTypeProxy* docType;

ENSURE_ARG_OR_NIL_AT_INDEX(obj1,args,0,NSObject);
ENSURE_ARG_OR_NIL_AT_INDEX(obj2,args,1,NSObject);
ENSURE_ARG_OR_NIL_AT_INDEX(obj3,args,2,NSObject);

if([obj1 isKindOfClass:[NSNull class]])
{
theNsURI = nil;
}
else
{
theNsURI = (NSString*)obj1;
}

if([obj2 isKindOfClass:[NSNull class]])
{
[self throwException:@"could not create root element with null localname" subreason:nil location:CODELOCATION];
return [NSNull null];
}
else
{
qualifiedName = (NSString*)obj2;
}

if([obj3 isKindOfClass:[NSNull class]])
{
docType = nil;
}
else
{
docType = (TIDOMDocumentTypeProxy*)obj3;
}

xmlChar *pre = NULL;
xmlChar *href = NULL;
if(theNsURI != nil)
href = (xmlChar*)[theNsURI UTF8String];
NSString* prefix = [GDataXMLNode prefixForName:qualifiedName];
NSString* localName = [GDataXMLNode localNameForName:qualifiedName];

if (prefix != nil && ([prefix length] > 0))
{
pre = (xmlChar*)[prefix UTF8String];
}

xmlNsPtr theNewNs = xmlNewNs(NULL, // parent node
href, pre);

xmlNodePtr rootPtr = xmlNewNode(theNewNs, (xmlChar*)[localName UTF8String]);
xmlDocPtr doc = xmlNewDoc(NULL);
xmlDocSetRootElement(doc, rootPtr);
GDataXMLDocument * theDocument = [[GDataXMLDocument alloc]initWithDocument:doc];

if(docType != nil)
{
GDataXMLNode *docTypeNode = [docType node];
xmlNodePtr theRealNode = [docTypeNode XMLNode];
if(theRealNode != nil)
{
xmlDtdPtr theNewDTDNode = xmlCopyDtd((xmlDtdPtr) theRealNode);
doc->intSubset = theNewDTDNode;
}
}

TiDOMDocumentProxy * result = [[[TiDOMDocumentProxy alloc] _initWithPageContext:[self executionContext]] autorelease];
[result setNode:[theDocument rootElement]];
[result setDocument:theDocument];
return result;

}

@end

#endif
10 changes: 7 additions & 3 deletions iphone/Classes/TIDOMDocumentTypeProxy.h
Expand Up @@ -6,13 +6,17 @@
*/
#if defined(USE_TI_XML) || defined(USE_TI_NETWORK)

#import "TiProxy.h"
#import "TiDOMNodeProxy.h"
#import "GDataXMLNode.h"

@interface TIDOMDocumentType : TiProxy {
@interface TIDOMDocumentTypeProxy : TiDOMNodeProxy {

}

@property(nonatomic,readonly) id entities;
@property(nonatomic,readonly) id notations;
@property(nonatomic,readonly) id publicId;
@property(nonatomic,readonly) id systemId;
@property(nonatomic,readonly) id internalSubset;
@end

#endif

0 comments on commit c546f21

Please sign in to comment.