Index: src/OFXMLParser.h ================================================================== --- src/OFXMLParser.h +++ src/OFXMLParser.h @@ -27,13 +27,19 @@ didEndTagWithName: (OFString*)name prefix: (OFString*)prefix namespace: (OFString*)ns; - (BOOL)xmlParser: (OFXMLParser*)parser foundString: (OFString*)string; +- (OFString*)xmlParser: (OFXMLParser*)parser + foundUnknownEntityNamed: (OFString*)entity; +@end + +@protocol OFXMLUnescapingDelegate +- (OFString*)foundUnknownEntityNamed: (OFString*)entitiy; @end -@interface OFXMLParser: OFObject +@interface OFXMLParser: OFObject { OFObject *delegate; enum { OF_XMLPARSER_OUTSIDE_TAG, OF_XMLPARSER_TAG_OPENED, @@ -60,13 +66,9 @@ - setDelegate: (OFObject *)delegate; - parseBuffer: (const char*)buf withSize: (size_t)size; @end -@protocol OFXMLUnescapingDelegate -- (OFString*)foundUnknownEntityNamed: (OFString*)entitiy; -@end - @interface OFString (OFXMLUnescaping) - stringByXMLUnescaping; - stringByXMLUnescapingWithHandler: (OFObject *)h; @end Index: src/OFXMLParser.m ================================================================== --- src/OFXMLParser.m +++ src/OFXMLParser.m @@ -88,10 +88,12 @@ return self; } - (void)dealloc { + [delegate release]; + [cache release]; [name release]; [prefix release]; [ns release]; [attrs release]; @@ -134,11 +136,13 @@ if ([cache length] > 0) { OFString *str; pool = [[OFAutoreleasePool alloc] init]; - str = [cache stringByXMLUnescaping]; + str = [cache + stringByXMLUnescapingWithHandler: + self]; [delegate xmlParser: self foundString: str]; [pool release]; @@ -340,10 +344,12 @@ break; /* Looking for attribute value */ case OF_XMLPARSER_IN_ATTR_VALUE: if (buf[i] == delim) { + OFString *attr_val; + len = i - last; if (len > 0) [cache appendCString: buf + last withLength: len]; @@ -350,11 +356,13 @@ if (attrs == nil) attrs = [[OFMutableDictionary alloc] init]; pool = [[OFAutoreleasePool alloc] init]; - [attrs setObject: [cache stringByXMLUnescaping] + attr_val = [cache + stringByXMLUnescapingWithHandler: self]; + [attrs setObject: attr_val forKey: attr_name]; [pool release]; [cache setToCString: ""]; [attr_name release]; @@ -392,10 +400,16 @@ [cache appendCString: buf + last withLength: len]; return self; } + +- (OFString*)foundUnknownEntityNamed: (OFString*)entity +{ + return [delegate xmlParser: self + foundUnknownEntityNamed: entity]; +} @end @implementation OFString (OFXMLUnescaping) - stringByXMLUnescaping { Index: tests/OFXMLParser/OFXMLParser.m ================================================================== --- tests/OFXMLParser/OFXMLParser.m +++ tests/OFXMLParser/OFXMLParser.m @@ -66,17 +66,26 @@ { printf("STRING\n\"%s\"\n\n", [string cString]); return YES; } + +- (OFString*)xmlParser: (OFXMLParser*)parser + foundUnknownEntityNamed: (OFString*)entity +{ + if ([entity isEqual: @"foo"]) + return @"foobar"; + + return nil; +} @end int main() { const char *foo = "barfoo<bar" - "barquxbar"; + "barquxbar"; size_t len = strlen(foo); size_t i; OFXMLParser *parser = [OFXMLParser xmlParser]; [parser setDelegate: [[ParserDelegate alloc] init]];