diff --git a/SVGKit/DOM/Element/SKElement+DOM.h b/SVGKit/DOM/Element/SKElement+DOM.h index d1a2c27..fcdd661 100644 --- a/SVGKit/DOM/Element/SKElement+DOM.h +++ b/SVGKit/DOM/Element/SKElement+DOM.h @@ -24,16 +24,6 @@ - (void)removedFromParent; - (void)setValue:(NSString *)value forName:(NSString*)name; - (NSString*)stringForName:(NSString*)attributeName; -- (SKLength*)lengthForName:(NSString*)attributeName; -- (NSArray*)transformArrayForName:(NSString*)attributeName; -- (NSArray*)lengthArrayForName:(NSString*)attributeName; -- (SKPreserveAspectRatio*)preserveAspectRatioForName:(NSString*)attributeName; -- (NSArray*)stringArrayForName:(NSString*)attributeName; -- (NSArray*)classArrayForName:(NSString*)attributeName; -- (SKLiteral)literalForName:(NSString*)attributeName; -- (SKColor*)colorForName:(NSString*)attributeName; -- (NSNumber*)numberForName:(NSString*)attributeName; - @end /* @@ -56,6 +46,7 @@ call(scanner, &val);\ }\ if (val) [_attributes setObject:val forKey:name];\ + if (!number) SKWarn(@"scanner for %@ attribute not implemented", name);\ } #define SKAttribute__set(name)\ diff --git a/SVGKit/DOM/Element/SKElement.m b/SVGKit/DOM/Element/SKElement.m index b97c6fc..a613952 100644 --- a/SVGKit/DOM/Element/SKElement.m +++ b/SVGKit/DOM/Element/SKElement.m @@ -111,119 +111,14 @@ - (void)setValue:(NSString *)value forName:(NSString*)name; } } -// Common attribute types +// Get string from attribute - (NSString*)stringForName:(NSString*)attributeName { NSXMLNode *node = [_element attributeForName:attributeName]; if (node) return [node stringValue]; return nil; } -/* -- (SKLength*)lengthForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - struct SKQuantity length = SKMakeQuantity(0, SKNumber); - if (SKScanLength(scanner, &length)) - return [SKLength lengthWithQuantity:length]; - return nil; -} - -- (NSNumber*)numberForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return NULL; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - double number; - if (SKScanNumber(scanner, &number)) { - return [NSNumber numberWithDouble:number]; - } - return nil; -} - -- (NSArray*)transformArrayForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - NSArray *array = nil; - SKScanTransformArray(scanner, &array); - return array; -} - -- (NSArray*)lengthArrayForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - NSArray *array = nil; - SKScanLengthArray(scanner, &array); - return array; -} - -- (SKPreserveAspectRatio*)preserveAspectRatioForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - SKLiteralSet ratio; - if (SKScanPreserveAspectRatio(scanner, &ratio)) { - return [SKPreserveAspectRatio - preserveAspectRatioWithLiteralSet:ratio]; - } - return nil; -} - -- (NSArray*)stringArrayForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - - NSString *wsp = [[NSCharacterSet whitespaceCharacterSet] characters]; - NSString *sep = [wsp stringByAppendingString:@","]; - NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:sep]; - s = [s invertedSet]; - NSArray *array = nil; - SKScanStringArray(scanner, &array, s); - return array; -} - -- (NSArray*)classArrayForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - NSArray *array = nil; - SKScanStringArray(scanner, &array, [NSCharacterSet letterCharacterSet]); - return array; -} - -- (SKLiteral)literalForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return SKUnknownLiteral; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - SKLiteral literal; - if (SKScanLiteral(scanner, &literal)) { - return literal; - } - return SKUnknownLiteral; -} -- (SKColor*)colorForName:(NSString*)attributeName { - NSString *string = [self stringForName:attributeName]; - if (!string) return nil; - NSScanner *scanner = [NSScanner scannerWithString:string]; - [scanner setCharactersToBeSkipped:nil]; - NSUInteger color; - if (SKScanColor(scanner, &color)) { - return [SKColor colorWithColor:color]; - } - return [SKColor color]; -} -*/ #if 0 #pragma mark --- SKNode --- #endif diff --git a/SVGKit/DOM/Element/SKRoot.h b/SVGKit/DOM/Element/SKRoot.h index 2963064..61f8c88 100644 --- a/SVGKit/DOM/Element/SKRoot.h +++ b/SVGKit/DOM/Element/SKRoot.h @@ -15,12 +15,6 @@ @interface SKRoot : SKElement { SKDocument *_document; - - /* - contentScriptType - contentStyleType - */ - } #if 0 @@ -36,11 +30,7 @@ SKGraphicalEventAttrib__interface(); SKConditionalProcessingAttrib__interface(); SKPresentationAttrib__interface(); -SKAttribute__property(SKLength, *width); -SKAttribute__property(SKLength, *height); -SKAttribute__property(SKLength, *x); -SKAttribute__property(SKLength, *y); - +SKAttribute__property(SKLength, *width, *height, *x, *y); //SKAttribute__property(NSString, *version, *baseProfile); //SKAttribute__property(NSString, *contentScriptType, *contentStyleType); //SKAttribute__property(SKLength, *width, *height, *x, *y); diff --git a/SVGKit/DOM/SVGKit+Attribute.h b/SVGKit/DOM/SVGKit+Attribute.h index 5e36488..736c99b 100644 --- a/SVGKit/DOM/SVGKit+Attribute.h +++ b/SVGKit/DOM/SVGKit+Attribute.h @@ -6,6 +6,7 @@ __attribute__((constructor)) static void initialize_scannerForAttribute() { scannerForAttribute = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithUnsignedLong:(size_t)SKScanInnerColor],@"flood-color", + [NSNumber numberWithUnsignedLong:(size_t)SKScanDouble],@"flood-opacity", [NSNumber numberWithUnsignedLong:(size_t)SKScanColor],@"color", [NSNumber numberWithUnsignedLong:(size_t)SKScanStringArray],@"class", [NSNumber numberWithUnsignedLong:(size_t)SKScanTransformArray],@"transform", @@ -13,6 +14,7 @@ static void initialize_scannerForAttribute() { [NSNumber numberWithUnsignedLong:(size_t)SKScanLength],@"width", [NSNumber numberWithUnsignedLong:(size_t)SKScanLength],@"y", [NSNumber numberWithUnsignedLong:(size_t)SKScanLength],@"x", + [NSNumber numberWithUnsignedLong:(size_t)SKScanPreserveAspectRatio],@"preserveAspectRatio", [NSNumber numberWithUnsignedLong:(size_t)SKScanString],@"id", nil]; } diff --git a/SVGKit/DOM/SVGKit+DOM.m b/SVGKit/DOM/SVGKit+DOM.m index 975e3eb..51c93f7 100644 --- a/SVGKit/DOM/SVGKit+DOM.m +++ b/SVGKit/DOM/SVGKit+DOM.m @@ -122,6 +122,15 @@ BOOL SKScanArray(NSScanner* scanner, NSArray** ptr, @"xMinYMin", }; +BOOL SKLiteralInGroup(NSScanner *scanner, SKLiteral literal, SKLiteral *valid) { + while(*valid != SKUndefined) { + if (literal == *valid++) { + return YES; + } + } + return NO; +} + BOOL SKScanLiteral(NSScanner* scanner, SKLiteral* ptr, SKLiteral* valid) { NSUInteger location = scanner.scanLocation; SKScanWhitespaces(scanner, nil); @@ -139,7 +148,7 @@ BOOL SKScanLiteral(NSScanner* scanner, SKLiteral* ptr, SKLiteral* valid) { } SKLiteral SKNoneLiterals[] = { - SKNone, + SKNone,SKUndefined }; BOOL SKScanNone(NSScanner* scanner, SKLiteral* ptr) { @@ -147,7 +156,7 @@ BOOL SKScanNone(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKColor__typeLiterals[] = { - SKRGBA,SKRGB,SKHASH,SKCurrentColor, + SKRGBA,SKRGB,SKHASH,SKCurrentColor,SKUndefined }; BOOL SKScanTypeForColor(NSScanner* scanner, SKLiteral* ptr) { @@ -155,7 +164,7 @@ BOOL SKScanTypeForColor(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFont__styleLiterals[] = { - SKNormal,SKItalic,SKOblique,SKInherit, + SKNormal,SKItalic,SKOblique,SKInherit,SKUndefined }; BOOL SKScanStyleForFont(NSScanner* scanner, SKLiteral* ptr) { @@ -163,7 +172,7 @@ BOOL SKScanStyleForFont(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKPreserveAspectRatio__alignLiterals[] = { - SKXMinYMin,SKXMidYMin,SKXMaxYMin,SKXMinYMid,SKXMidYMid,SKXMaxYMid,SKXMinYMax,SKXMidYMax,SKXMaxYMax, + SKXMinYMin,SKXMidYMin,SKXMaxYMin,SKXMinYMid,SKXMidYMid,SKXMaxYMid,SKXMinYMax,SKXMidYMax,SKXMaxYMax,SKUndefined }; BOOL SKScanAlignForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) { @@ -171,7 +180,7 @@ BOOL SKScanAlignForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKNormalLiterals[] = { - SKNormal, + SKNormal,SKUndefined }; BOOL SKScanNormal(NSScanner* scanner, SKLiteral* ptr) { @@ -179,7 +188,7 @@ BOOL SKScanNormal(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKPreserveAspectRatio__deferLiterals[] = { - SKDefer, + SKDefer,SKUndefined }; BOOL SKScanDeferForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) { @@ -187,7 +196,7 @@ BOOL SKScanDeferForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKLength__unitLiterals[] = { - SKPercent,SKEM,SKEX,SKPX,SKIN,SKCM,SKMM,SKPT,SKPC, + SKPercent,SKEM,SKEX,SKPX,SKIN,SKCM,SKMM,SKPT,SKPC,SKUndefined }; BOOL SKScanUnitForLength(NSScanner* scanner, SKLiteral* ptr) { @@ -195,7 +204,7 @@ BOOL SKScanUnitForLength(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKPreserveAspectRatio__meetOrSliceLiterals[] = { - SKMeet,SKSlice, + SKMeet,SKSlice,SKUndefined }; BOOL SKScanMeetOrSliceForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) { @@ -203,7 +212,7 @@ BOOL SKScanMeetOrSliceForPreserveAspectRatio(NSScanner* scanner, SKLiteral* ptr) } SKLiteral SKInheritLiterals[] = { - SKInherit, + SKInherit,SKUndefined }; BOOL SKScanInherit(NSScanner* scanner, SKLiteral* ptr) { @@ -211,7 +220,7 @@ BOOL SKScanInherit(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFont__variantLiterals[] = { - SKNormal,SKSmallCaps,SKInherit, + SKNormal,SKSmallCaps,SKInherit,SKUndefined }; BOOL SKScanVariantForFont(NSScanner* scanner, SKLiteral* ptr) { @@ -219,7 +228,7 @@ BOOL SKScanVariantForFont(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKKerningLiterals[] = { - SKKerning, + SKKerning,SKUndefined }; BOOL SKScanKerning(NSScanner* scanner, SKLiteral* ptr) { @@ -227,7 +236,7 @@ BOOL SKScanKerning(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFrequency__unitLiterals[] = { - SKHZ,SKKHZ, + SKHZ,SKKHZ,SKUndefined }; BOOL SKScanUnitForFrequency(NSScanner* scanner, SKLiteral* ptr) { @@ -235,7 +244,7 @@ BOOL SKScanUnitForFrequency(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFont__weightLiterals[] = { - SKInherit,SKNormal,SKBold,SKBolder,SKLighter,SK100,SK200,SK300,SK400,SK500,SK600,SK700,SK800,SK900, + SKInherit,SKNormal,SKBold,SKBolder,SKLighter,SK100,SK200,SK300,SK400,SK500,SK600,SK700,SK800,SK900,SKUndefined }; BOOL SKScanWeightForFont(NSScanner* scanner, SKLiteral* ptr) { @@ -243,7 +252,7 @@ BOOL SKScanWeightForFont(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFont__stretchLiterals[] = { - SKNormal,SKWider,SKNarrower,SKUltraCondensed,SKExtraCondensed,SKCondensed,SKSemiCondensed,SKSemiExpanded,SKExpanded,SKExtraExpanded,SKUltraExpanded,SKInherit, + SKNormal,SKWider,SKNarrower,SKUltraCondensed,SKExtraCondensed,SKCondensed,SKSemiCondensed,SKSemiExpanded,SKExpanded,SKExtraExpanded,SKUltraExpanded,SKInherit,SKUndefined }; BOOL SKScanStretchForFont(NSScanner* scanner, SKLiteral* ptr) { @@ -251,7 +260,7 @@ BOOL SKScanStretchForFont(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKTransform__methodLiterals[] = { - SKMatrix,SKRotate,SKTranslate,SKScale,SKRotate,SKSkewX,SKSkewY, + SKMatrix,SKRotate,SKTranslate,SKScale,SKRotate,SKSkewX,SKSkewY,SKUndefined }; BOOL SKScanMethodForTransform(NSScanner* scanner, SKLiteral* ptr) { @@ -259,7 +268,7 @@ BOOL SKScanMethodForTransform(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKFont__literalLiterals[] = { - SKCaption,SKIcon,SKMenu,SKMessageBox,SKSmallCaption,SKStatusBar, + SKCaption,SKIcon,SKMenu,SKMessageBox,SKSmallCaption,SKStatusBar,SKUndefined }; BOOL SKScanLiteralForFont(NSScanner* scanner, SKLiteral* ptr) { @@ -267,7 +276,7 @@ BOOL SKScanLiteralForFont(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKAngle__unitLiterals[] = { - SKDEG,SKGRAD,SKRAD, + SKDEG,SKGRAD,SKRAD,SKUndefined }; BOOL SKScanUnitForAngle(NSScanner* scanner, SKLiteral* ptr) { @@ -275,7 +284,7 @@ BOOL SKScanUnitForAngle(NSScanner* scanner, SKLiteral* ptr) { } SKLiteral SKTextDecoration__decorationLiterals[] = { - SKUnderline,SKOverline,SKLineThrough,SKBlink, + SKUnderline,SKOverline,SKLineThrough,SKBlink,SKUndefined }; BOOL SKScanDecorationForTextDecoration(NSScanner* scanner, SKLiteral* ptr) { @@ -303,6 +312,32 @@ - (void)dealloc { [super dealloc]; } +- (NSString*)description { + if (self.type != SKUndefined && SKLiteralInGroup(type,SKInheritLiterals)) { + return [NSString stringWithFormat@"%@",SKLiteralString[self.type]]; + } + + if (self.type == SKHASH && self.value != nil) { + return [NSString stringWithFormat@"%@%@",SKLiteralString[self.type], + self.value]; + } + + if (self.array != nil && ([self.array count] == 4) && self.type == SKRGBA) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.type], + @"(", + [self.array componentsJoinedByString:@","], + @")"]; + } + + if (self.array != nil && ([self.array count] == 3) && self.type == SKRGB) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.type], + @"(", + [self.array componentsJoinedByString:@","], + @")"]; + } + +} + @end BOOL SKScanColor(NSScanner* scanner, SKColor** ptr) { @@ -312,8 +347,7 @@ BOOL SKScanColor(NSScanner* scanner, SKColor** ptr) { NSUInteger location = scanner.scanLocation; SKLiteral type0; - BOOL b0 = SKScanTypeForColor(scanner,&type0); - if (b0 && type0 != SKInherit) b0=NO; + BOOL b0 = SKScanInherit(scanner,&type0); if (b0) result.type = type0; if (b0) { @@ -347,12 +381,40 @@ BOOL SKScanColor(NSScanner* scanner, SKColor** ptr) { SKLiteral type0; BOOL b0 = SKScanTypeForColor(scanner,&type0); + if (b0 && type0 != SKRGBA) b0=NO; if (b0) result.type = type0; BOOL b1 = [scanner scanString:@"(" intoString:nil]; NSArray* array2; - BOOL b2 = SKScanArray(scanner,&array2,SKScanNumber,NULL); + BOOL b2 = SKScanArray(scanner,&array2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:4],nil]); + if (b2) result.array = array2; + + BOOL b3 = [scanner scanString:@")" intoString:nil]; + + if (b0 && b1 && b2 && b3) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } + { + SKColor* result = [[SKColor new] autorelease]; + NSUInteger location = scanner.scanLocation; + + SKLiteral type0; + BOOL b0 = SKScanTypeForColor(scanner,&type0); + if (b0 && type0 != SKRGB) b0=NO; + if (b0) result.type = type0; + + BOOL b1 = [scanner scanString:@"(" intoString:nil]; + + NSArray* array2; + BOOL b2 = SKScanArray(scanner,&array2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:3],nil]); if (b2) result.array = array2; BOOL b3 = [scanner scanString:@")" intoString:nil]; @@ -392,6 +454,29 @@ - (void)dealloc { [super dealloc]; } +- (NSString*)description { + if (self.type != SKUndefined && SKLiteralInGroup(type,SKInheritLiterals)) { + return [NSString stringWithFormat@"%@",SKLiteralString[self.type]]; + } + + if (self.type == SKCurrentColor) { + return [NSString stringWithFormat@"%@",SKLiteralString[self.type]]; + } + + if (self.type == SKHASH && self.value != nil) { + return [NSString stringWithFormat@"%@%@",SKLiteralString[self.type], + self.value]; + } + + if (self.array != nil && 1 && self.type != SKUndefined && SKLiteralInGroup(type,SKColor__typeLiterals)) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.type], + @"(", + [self.array componentsJoinedByString:@","], + @")"]; + } + +} + @end BOOL SKScanInnerColor(NSScanner* scanner, SKInnerColor** ptr) { @@ -401,7 +486,7 @@ BOOL SKScanInnerColor(NSScanner* scanner, SKInnerColor** ptr) { NSUInteger location = scanner.scanLocation; SKLiteral type0; - BOOL b0 = SKScanTypeForColor(scanner,&type0); + BOOL b0 = SKScanInherit(scanner,&type0); if (b0) result.type = type0; if (b0) { @@ -492,6 +577,18 @@ - (void)dealloc { [super dealloc]; } +- (NSString*)description { + if (self.unit != SKUndefined && SKLiteralInGroup(unit,SKLength__unitLiterals) && 1) { + return [NSString stringWithFormat@"%f%@",self.value, + SKLiteralString[self.unit]]; + } + + if (1) { + return [NSString stringWithFormat@"%f",self.value]; + } + +} + @end BOOL SKScanLength(NSScanner* scanner, SKLength** ptr) { @@ -514,6 +611,20 @@ BOOL SKScanLength(NSScanner* scanner, SKLength** ptr) { } scanner.scanLocation = location; } + { + SKLength* result = [[SKLength new] autorelease]; + NSUInteger location = scanner.scanLocation; + + double value0; + BOOL b0 = SKScanDouble(scanner,&value0); + if (b0) result.value = value0; + + if (b0) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } scanner.scanLocation = location; return NO; } @@ -543,6 +654,29 @@ - (void)dealloc { [super dealloc]; } +- (NSString*)description { + if (self.align != SKUndefined && SKLiteralInGroup(align,SKPreserveAspectRatio__alignLiterals)) { + return [NSString stringWithFormat@"%@",SKLiteralString[self.align]]; + } + + if (self.defer != SKUndefined && SKLiteralInGroup(defer,SKPreserveAspectRatio__deferLiterals) && self.align != SKUndefined && SKLiteralInGroup(align,SKPreserveAspectRatio__alignLiterals)) { + return [NSString stringWithFormat@"%@%@",SKLiteralString[self.defer], + SKLiteralString[self.align]]; + } + + if (self.defer != SKUndefined && SKLiteralInGroup(defer,SKPreserveAspectRatio__deferLiterals) && self.align != SKUndefined && SKLiteralInGroup(align,SKPreserveAspectRatio__alignLiterals) && self.meetOrSlice != SKUndefined && SKLiteralInGroup(meetOrSlice,SKPreserveAspectRatio__meetOrSliceLiterals)) { + return [NSString stringWithFormat@"%@%@%@",SKLiteralString[self.defer], + SKLiteralString[self.align], + SKLiteralString[self.meetOrSlice]]; + } + + if (self.align != SKUndefined && SKLiteralInGroup(align,SKPreserveAspectRatio__alignLiterals) && self.meetOrSlice != SKUndefined && SKLiteralInGroup(meetOrSlice,SKPreserveAspectRatio__meetOrSliceLiterals)) { + return [NSString stringWithFormat@"%@%@",SKLiteralString[self.align], + SKLiteralString[self.meetOrSlice]]; + } + +} + @end BOOL SKScanPreserveAspectRatio(NSScanner* scanner, SKPreserveAspectRatio** ptr) { @@ -646,6 +780,51 @@ - (void)dealloc { [super dealloc]; } +- (NSString*)description { + if (self.values != nil && ([self.values count] == 6) && self.method == SKMatrix) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + + if (self.values != nil && ([self.values count] == 1 || [self.values count] == 3) && self.method == SKRotate) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + + if (self.values != nil && ([self.values count] == 1 || [self.values count] == 2) && self.method == SKTranslate) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + + if (self.values != nil && ([self.values count] == 1 || [self.values count] == 2) && self.method == SKScale) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + + if (self.values != nil && ([self.values count] == 1) && self.method == SKSkewX) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + + if (self.values != nil && ([self.values count] == 1) && self.method == SKSkewY) { + return [NSString stringWithFormat@"%@%@%@%@",SKLiteralString[self.method], + @"(", + [self.values componentsJoinedByString:@","], + @")"]; + } + +} + @end BOOL SKScanTransform(NSScanner* scanner, SKTransform** ptr) { @@ -664,8 +843,7 @@ BOOL SKScanTransform(NSScanner* scanner, SKTransform** ptr) { NSArray* values2; BOOL b2 = SKScanArray(scanner,&values2,SKScanNumber, [NSArray arrayWithObjects: - [NSNumber numberWithInt:1], - [NSNumber numberWithInt:3],nil]); + [NSNumber numberWithInt:6],nil]); if (b2) result.values = values2; BOOL b3 = [scanner scanString:@")" intoString:nil]; @@ -702,6 +880,108 @@ BOOL SKScanTransform(NSScanner* scanner, SKTransform** ptr) { } scanner.scanLocation = location; } + { + SKTransform* result = [[SKTransform new] autorelease]; + NSUInteger location = scanner.scanLocation; + + SKLiteral method0; + BOOL b0 = SKScanMethodForTransform(scanner,&method0); + if (b0 && method0 != SKTranslate) b0=NO; + if (b0) result.method = method0; + + BOOL b1 = [scanner scanString:@"(" intoString:nil]; + + NSArray* values2; + BOOL b2 = SKScanArray(scanner,&values2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:1], + [NSNumber numberWithInt:2],nil]); + if (b2) result.values = values2; + + BOOL b3 = [scanner scanString:@")" intoString:nil]; + + if (b0 && b1 && b2 && b3) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } + { + SKTransform* result = [[SKTransform new] autorelease]; + NSUInteger location = scanner.scanLocation; + + SKLiteral method0; + BOOL b0 = SKScanMethodForTransform(scanner,&method0); + if (b0 && method0 != SKScale) b0=NO; + if (b0) result.method = method0; + + BOOL b1 = [scanner scanString:@"(" intoString:nil]; + + NSArray* values2; + BOOL b2 = SKScanArray(scanner,&values2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:1], + [NSNumber numberWithInt:2],nil]); + if (b2) result.values = values2; + + BOOL b3 = [scanner scanString:@")" intoString:nil]; + + if (b0 && b1 && b2 && b3) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } + { + SKTransform* result = [[SKTransform new] autorelease]; + NSUInteger location = scanner.scanLocation; + + SKLiteral method0; + BOOL b0 = SKScanMethodForTransform(scanner,&method0); + if (b0 && method0 != SKSkewX) b0=NO; + if (b0) result.method = method0; + + BOOL b1 = [scanner scanString:@"(" intoString:nil]; + + NSArray* values2; + BOOL b2 = SKScanArray(scanner,&values2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:1],nil]); + if (b2) result.values = values2; + + BOOL b3 = [scanner scanString:@")" intoString:nil]; + + if (b0 && b1 && b2 && b3) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } + { + SKTransform* result = [[SKTransform new] autorelease]; + NSUInteger location = scanner.scanLocation; + + SKLiteral method0; + BOOL b0 = SKScanMethodForTransform(scanner,&method0); + if (b0 && method0 != SKSkewY) b0=NO; + if (b0) result.method = method0; + + BOOL b1 = [scanner scanString:@"(" intoString:nil]; + + NSArray* values2; + BOOL b2 = SKScanArray(scanner,&values2,SKScanNumber, + [NSArray arrayWithObjects: + [NSNumber numberWithInt:1],nil]); + if (b2) result.values = values2; + + BOOL b3 = [scanner scanString:@")" intoString:nil]; + + if (b0 && b1 && b2 && b3) { + *ptr = result; + return YES; + } + scanner.scanLocation = location; + } scanner.scanLocation = location; return NO; } diff --git a/SVGKit/DOM/svg.py b/SVGKit/DOM/svg.py index b5a72d0..5d63bcf 100644 --- a/SVGKit/DOM/svg.py +++ b/SVGKit/DOM/svg.py @@ -109,6 +109,58 @@ def run_ltype(state, parameters): else: state["ltypes"][reference].update(state, parameters) +def contract_for_reference(state, reference, name): + if reference in state["ltypes"]: + return ("self.{0} != SKUndefined && SKLiteralInGroup({0},{1})" + .format(name,state["ltypes"][reference].astr())) + if reference in state["ctypes"]: + return state["ctypes"][reference].tstr()+"*" + if reference == "string": + return "self.{0} != nil".format(name) + if reference == "number": + return "self.{0} != nil".format(name) + if reference == "double": + return "1" + if "[" in reference and "]" in reference: + string = "self.{0} != nil && ".format(name) + match = re.match("(.+)\\[(.*)\\]", reference) + lengths = match.group(2) + if len(lengths) == 0: + string += "1" + else: + valid = [] + for l in lengths.split(","): + valid += ["[self.{0} count] == {1}".format(name, l)] + string += "(" + " || ".join(valid) + ")" + return string + +def format_character_for_reference(state, reference): + if reference in state["ltypes"]: + return "%@" + if reference in state["ctypes"]: + return "%@" + if reference == "string": + return "%@" + if reference == "number": + return "%@" + if reference == "double": + return "%f" + if "[" in reference and "]" in reference: + return "%@" + +def call_for_format(state, reference, name): + if reference in state["ltypes"]: + return "SKLiteralString[self."+name+"]" + if reference in state["ctypes"]: + return "self."+name; + if reference == "string": + return "self."+name; + if reference == "number": + return "self."+name; + if reference == "double": + return "self."+name + if "[" in reference and "]" in reference: + return "[self."+name+" componentsJoinedByString:@\",\"]" def type_for_reference(state, reference): if reference in state["ltypes"]: @@ -188,37 +240,59 @@ def __init__(self, state, parent, grammar): self.state = state self.ctype = parent self.grammar = grammar - def bstr(self): - return " && ".join(map(lambda i:"b"+str(i),range(0, len(self.grammar)))) - def __str__(self): - ivars = {item.name:item for item in self.ctype.ivars()} + self.contract = {} + self.content = "" + self._format_str = "" + self._format_args = [] + check = "" - content = "" + self.content = "" i = -1 for point in self.grammar: i = i + 1 var = re.match("^\\{(.+)\\}$", point) if var: name, type__op = var.group(1).split(":") - type = type__op + reference = type__op if "==" in type__op: - type, lit = type__op.split("==") + reference, lit = type__op.split("==") lit = self.state["literals"][lit].cstr() check = ("\n if (b"+str(i)+" && "+name+str(i)+" != "+lit+") b"+ str(i)+"=NO;") + self.contract[name] = "self.{0} == {1}".format(name,lit) + self._format_str += format_character_for_reference(state, reference) else: check = "" - content += """ + self.contract[name] = contract_for_reference(self.state, + reference, name) + self._format_str += format_character_for_reference(state, reference) + type = type_for_reference(self.state, reference) + self._format_args += [call_for_format(state, reference, name)] + self.content += """ {type} {name}{0}; BOOL b{0} = {scanner};{check} if (b{0}) result.{name} = {name}{0}; -""".format(str(i), name=name, type=ivars[name].tstr(), check=check, - scanner = call_scanner(self.state,ivars[name].reference, name+str(i))) +""".format(str(i), name=name, type=type, check=check, + scanner = call_scanner(self.state,reference, name+str(i))) else: - content += """ + self._format_str += "%@" + self._format_args += ["@\""+point+"\""] + self.content += """ BOOL b{0} = [scanner scanString:@"{point}" intoString:nil]; """.format(str(i), point=point) - return content + self.contract = " && ".join([self.contract[k] for k in self.contract]) + + def bstr(self): + return " && ".join(map(lambda i:"b"+str(i),range(0, len(self.grammar)))) + + def format(self): + return "@\""+self._format_str+"\""+","+",\n ".join(self._format_args) + + def __str__(self): + return self.content + + def is_state(self): + return self.contract class CompoundType: def __init__(self, state, reference, grammar): diff --git a/SVGKit/DOM/svg.pyc b/SVGKit/DOM/svg.pyc index 637831d..acbe63f 100644 Binary files a/SVGKit/DOM/svg.pyc and b/SVGKit/DOM/svg.pyc differ diff --git a/SVGKit/DOM/svg.ssv b/SVGKit/DOM/svg.ssv index dba15a4..9f34ff1 100644 --- a/SVGKit/DOM/svg.ssv +++ b/SVGKit/DOM/svg.ssv @@ -1,6 +1,6 @@ -// built-in types: number double string +// Built-in types: number double string -// svg literals +// SVG literals literal none inherit currentColor disable magnify defer meet slice xMinYMin literal xMidYMin xMaxYMin xMinYMid xMidYMid xMaxYMid xMinYMax xMidYMax xMaxYMax @@ -13,7 +13,7 @@ literal expanded extra-expanded ultra-expanded caption icon menu message-box literal small-caption status-bar kerning underline overline line-through blink literal rgba,SKRGBA rgb,SKRGB #,SKHASH -// literal group +// Literal groups ltype inherit inherit ltype none none @@ -38,27 +38,43 @@ ltype kerning kerning ltype text-decoration.decoration underline overline line-through blink ltype color.type rgba rgb # currentColor -// compound types +// Compound types +// All valid transforms +// The [...] syntax indicates what the valid array sizes are. +// Use [] if any array size is valid. +// [1,3] means array sized 1 or 3 is valid type transform {method:transform.method==matrix} ( {values:number[6]} ) type transform {method:transform.method==rotate} ( {values:number[1,3]} ) +type transform {method:transform.method==translate} ( {values:number[1,2]} ) +type transform {method:transform.method==scale} ( {values:number[1,2]} ) +type transform {method:transform.method==skewX} ( {values:number[1]} ) +type transform {method:transform.method==skewY} ( {values:number[1]} ) + +// There is ambiguity with the two length grammars. +// Put the one that is hardest to match first. type length {value:double} {unit:length.unit} +type length {value:double} type inner-color {type:inherit} type inner-color {type:color.type==currentColor} type inner-color {type:color.type==#} {value:string} type inner-color {type:color.type} ( {array:number[]} ) -type color {type:inherit==inherit} +// Cannot separate array into r, g, b, a components; +// Manually implement an additional category for SKColor to do this. +type color {type:inherit} type color {type:color.type==#} {value:string} -type color {type:color.type} ( {array:number[]} ) +type color {type:color.type==rgba} ( {array:number[4]} ) +type color {type:color.type==rgb} ( {array:number[3]} ) +// All combinations of preserveAspectRatio type preserveAspectRatio {align:preserveAspectRatio.align} type preserveAspectRatio {defer:preserveAspectRatio.defer} {align:preserveAspectRatio.align} type preserveAspectRatio {defer:preserveAspectRatio.defer} {align:preserveAspectRatio.align} {meetOrSlice:preserveAspectRatio.meetOrSlice} type preserveAspectRatio {align:preserveAspectRatio.align} {meetOrSlice:preserveAspectRatio.meetOrSlice} -// individual attributes +// Map attributes to types attribute id string attribute width length attribute height length @@ -68,3 +84,6 @@ attribute transform transform[] attribute class string[] attribute color color attribute flood-color inner-color +attribute flood-opacity double +attribute preserveAspectRatio preserveAspectRatio + diff --git a/SVGKit/DOM/templates/SVGKit+DOM.j.m b/SVGKit/DOM/templates/SVGKit+DOM.j.m index 8ebc3ed..6a5f88c 100644 --- a/SVGKit/DOM/templates/SVGKit+DOM.j.m +++ b/SVGKit/DOM/templates/SVGKit+DOM.j.m @@ -45,6 +45,15 @@ BOOL SKScanArray(NSScanner* scanner, NSArray** ptr, @"{{ lit }}",{% endfor %} }; +BOOL SKLiteralInGroup(NSScanner *scanner, SKLiteral literal, SKLiteral *valid) { + while(*valid != SKUndefined) { + if (literal == *valid++) { + return YES; + } + } + return NO; +} + BOOL SKScanLiteral(NSScanner* scanner, SKLiteral* ptr, SKLiteral* valid) { NSUInteger location = scanner.scanLocation; SKScanWhitespaces(scanner, nil); @@ -62,7 +71,7 @@ BOOL SKScanLiteral(NSScanner* scanner, SKLiteral* ptr, SKLiteral* valid) { } {% for ltype in ltypes %} SKLiteral {{ltype.astr()}}[] = { - {% for literal in ltype.literals %}{{literal.cstr()}},{% endfor %} + {% for literal in ltype.literals %}{{literal.cstr()}},{% endfor %}SKUndefined }; BOOL {{ltype.fstr()}}(NSScanner* scanner, SKLiteral* ptr) { @@ -87,6 +96,13 @@ - (void)dealloc { {% for ivar in ctype.ivars() %}{% if ivar.ptr() %} [super dealloc]; } +- (NSString*)description { {% for branch in ctype.branches %} + if ({{branch.is_state()}}) { + return [NSString stringWithFormat{{branch.format()}}]; + } + {% endfor %} +} + @end BOOL {{ctype.fstr()}}(NSScanner* scanner, {{ctype.tstr()}}** ptr) { diff --git a/SVGKit/SVGKit.m b/SVGKit/SVGKit.m index ac502cd..d3032b1 100644 --- a/SVGKit/SVGKit.m +++ b/SVGKit/SVGKit.m @@ -9,552 +9,4 @@ #import "SVGKit.h" #import "SVGKit+DOM.h" -/* -NSString* SKLiteralName[SKUnknownLiteral]; -__attribute__((constructor)) -static void initialize_SKLiteralName () { - SKLiteralName[SKSpecified]= @""; -} - -// Must Map to SKTransformMethod enum -NSUInteger SKTransformMaxArgCount[SKUnknownMethod] = {6,2,2,3,1,1}; -NSUInteger SKTransformMinArgCount[SKUnknownMethod] = {6,1,1,1,1,1}; -NSString* SKTransformName[SKUnknownMethod] = - {@"matrix",@"translate",@"scale",@"rotate",@"skewX",@"skewY"}; - -// Must Map to SKUnit enum -NSString* SKUnitName[SKUnknownUnit] = - {@"",@"",@"%",@"em",@"ex",@"px",@"in",@"cm",@"mm",@"pt",@"pc",@"deg",@"grad" - ,@"rad",@"hz",@"khz"}; - -// Must Map to SKAlign enum -//NSString* SKAlignName[SKUnknownAlign] = -//{@"none", @"xMinYMin", @"xMidYMin", @"xMaxYMin", @"xMinYMid", @"xMidYMid", -// @"xMaxYMid", @"xMinYMax", @"xMidYMax", @"xMaxYMax"}; - - -SKLiteralSet SKMakePreserveAspectRatio(BOOL defer, SKLiteral align, BOOL meet) { - SKLiteralSet literalSet; - if (defer) { - SKSetLiteral(&literalSet, SKDefer); - } - if (meet) { - SKSetLiteral(&literalSet, SKMeet); - } - else { - SKSetLiteral(&literalSet, SKSlice); - } - SKSetLiteral(&literalSet, align); - return literalSet; -} - -struct SKTransform SKMakeTransform(SKTransformMethod method, double* values, - size_t count) -{ - if (method != SKUnknownMethod) { - size_t max = SKTransformMaxArgCount[method]; - size_t min = SKTransformMinArgCount[method]; - assert(count >= min && count <= max); - } - struct SKTransform transform; - transform.method = method; - for (int i = 0; i < count; i++) { - transform.values[i]=values[i]; - } - transform.count = count; - return transform; -} - -struct SKQuantity SKMakeQuantity(double value, SKUnit unit) -{ - return (struct SKQuantity){value, unit}; -} - -NSUInteger SKMakeColor(uint8_t* arr, size_t size) -{ - uint8_t v[4] = {0, 0, 0, 255}; // r g b a - for (int i = 0; i < MIN(size, 4); i++) { - v[i] = arr[i]; - } - - // c = r | g << 8 | b << 16 | << 24 - // c >> 16 & 0xff // returns b - - NSUInteger value = v[0] | v[1] << 8 | v[2] << 16 | v[3] << 24; - return value; -} - -NSString* SKStringFromColor(NSUInteger color) { - uint8_t r, g, b; - double a; - r = color & 0xff; - g = color >> 8 & 0xff; - b = color >> 16 & 0xff; - a = (color >> 24 & 0xff)/255; - - return [NSString stringWithFormat:@"rgba(%d,%d,%d,%f)", r, g, b, a]; -} - -NSString* SKStringFromPreserveAspectRatio(struct SKPreserveAspectRatio ratio) { - - NSMutableString *string = [SKAlignName[ratio.align] mutableCopy]; - if (ratio.defer) { - [string insertString:@"defer " atIndex:0]; - } - if (ratio.meet) { - [string appendString:@"meet"]; - } - else { - [string appendString:@"slice"]; - } - return string; -} - -NSString* SKStringFromNumber(double value) -{ - NSMutableString *string = [NSMutableString stringWithFormat:@"%f", value]; - NSCharacterSet *z =[NSCharacterSet characterSetWithCharactersInString:@"0"]; - string = [[string stringByTrimmingCharactersInSet:z] mutableCopy]; - if ([string characterAtIndex:0] == '.') { - [string insertString:@"0" atIndex:0]; - } - if ([string characterAtIndex:[string length]-1] == '.') { - [string deleteCharactersInRange:NSMakeRange([string length]-1, 1)]; - } - return string; -} - -NSString* SKStringFromUnit(SKUnit unit) -{ - return SKUnitName[unit]; -} - -NSString* SKStringFromMethod(SKTransformMethod method) -{ - return SKTransformName[method]; -} - - -NSArray* SKArrayFromCArray(void** cArray, NSUInteger count) -{ - NSMutableArray *array = [NSMutableArray arrayWithCapacity:count]; - for (NSUInteger i; i < count; i++) { - [array addObject:(id)cArray[i]]; - } - return array; -} - -NSString* SKStringFromTransform(struct SKTransform transform) -{ - NSMutableString *string = [@"" mutableCopy]; - [string appendString:SKStringFromMethod(transform.method)]; - [string appendString:@"("]; - NSArray *values = SKArrayFromCArray((void**)transform.values, - transform.count); - [string appendString:SKStringFromNumberArray(values)]; - [string appendString:@")"]; - return string; -} - -NSString* SKStringFromQuantity(struct SKQuantity quantity) -{ - NSMutableString *string = [@"" mutableCopy]; - [string appendString:SKStringFromNumber(quantity.value)]; - [string appendString:SKStringFromUnit(quantity.unit)]; - return string; -} - -NSString* SKStringFromTransformArray(NSArray* array) { - return [array componentsJoinedByString:@" "]; -} - -NSString* SKStringFromNumberArray(NSArray* array) { - return [array componentsJoinedByString:@","]; -} - -NSString* SKStringFromQuantityArray(NSArray* array) { - return [array componentsJoinedByString:@","]; -} - -NSString* SKStringFromLiteral(SKLiteral literal) { - if (literal < SKUnknownLiteral) { - return SKLiteralName[literal]; - } - return nil; -} - -BOOL SKScanLiteral(NSScanner* scanner, SKLiteral *ptr) { - NSUInteger location = [scanner scanLocation]; - SKScanWhitespaces(scanner, nil); - for (SKLiteral u = 0; u < SKUnknownLiteral; u++) { - if ([scanner scanString:SKLiteralName[u] intoString:nil]) { - *ptr = u; - return YES; - } - } - [scanner setScanLocation:location]; - return NO; -} - -BOOL SKScanWhitespaces(NSScanner* scanner, NSString** ptr) -{ - return [scanner scanCharactersFromSet: - [NSCharacterSet whitespaceCharacterSet] - intoString:ptr]; -} - -BOOL SKScanSeparator(NSScanner *scanner, NSString** ptr) -{ - NSUInteger location = [scanner scanLocation]; - NSString *wsp = @""; - BOOL w = SKScanWhitespaces(scanner, &wsp); - NSString *cma = @""; - BOOL c = [scanner scanString:@"," intoString:&cma]; - if (w || c) { - if (ptr) { - *ptr = [NSString stringWithFormat:@"%@%@", wsp, cma]; - } - return YES; - } - [scanner setScanLocation:location]; - return NO; -} - -BOOL SKScanUnit(NSScanner* scanner, SKUnit* unit, SKUnit from, SKUnit to) -{ - SKScanWhitespaces(scanner, NULL); - *unit = SKNumber; - NSString *unitString; - for (SKUnit u = from; u <= to; u++) { - if ([scanner scanString:SKUnitName[u] intoString:&unitString]) { - *unit = u; - return YES; - } - } - return NO; -} - -BOOL SKScanNumber(NSScanner* scanner, double* value) -{ - SKScanWhitespaces(scanner, nil); - return [scanner scanDouble:value]; -} - - -BOOL SKScanPreserveAspectRatio(NSScanner* scanner, - SKLiteraLSet *ptr) { - NSUInteger location = [scanner scanLocation]; - struct SKPreserveAspectRatio ratio; - BOOL wsp; - SKScanWhitespaces(scanner, nil); - ratio.defer = [scanner scanString:@"defer" intoString:NULL]; - wsp = SKScanWhitespaces(scanner, NULL); - if (ratio.defer && !wsp) { - [scanner setScanLocation:location]; - return NO; - } - BOOL foundAlign = NO; - for (SKAlign u = 0; u < SKUnknownAlign; u++) { - if ([scanner scanString:SKAlignName[u] intoString:NULL]) { - ratio.align = u; - foundAlign = YES; - break; - } - } - if (!foundAlign) { // align is mandatory - [scanner setScanLocation:location]; - return NO; - } - location = [scanner scanLocation]; - wsp = SKScanWhitespaces(scanner, NULL); - if (wsp) { - BOOL meet, slice; - if ((meet = [scanner scanString:@"meet" intoString:NULL])) {} - else if ((slice = ![scanner scanString:@"slice" intoString:NULL])) {} - if (meet) ratio.meet = YES; - if (!meet && !slice) { - [scanner setScanLocation:location]; // undo read wsp - } - } - *ptr = ratio; - return YES; -} - -BOOL SKScanQuantity(NSScanner* scanner, struct SKQuantity* ptr, SKUnit from, - SKUnit to) -{ - SKScanWhitespaces(scanner, nil); - struct SKQuantity quantity = SKMakeQuantity(0, SKNumber); - if (!SKScanNumber(scanner, &quantity.value)) return NO; - SKScanUnit(scanner, &quantity.unit, from, to); - *ptr = quantity; - return YES; -} - - -BOOL SKScanMethod(NSScanner *scanner, SKTransformMethod *method) -{ - SKScanWhitespaces(scanner, nil); - SKTransformMethod init = SK_TRANSFORM_METHOD_FIRST; - SKTransformMethod last = SK_TRANSFORM_METHOD_LAST; - for (SKTransformMethod i = init; i <= last; i++) { - if ([scanner scanString:SKTransformName[i] intoString:nil]) { - *method = i; - return YES; - } - } - return NO; -} - - -BOOL SKScanColor(NSScanner* scanner, NSUInteger *ptr) { - // does not support keywords yet - // inherit, rgb(...) or rgba(...) - - NSUInteger location = [scanner scanLocation]; - SKScanWhitespaces(scanner, NULL); - NSUInteger valuesToScan = 0; - NSArray* values; - if ([scanner scanString:@"rgba" intoString:nil]) { - valuesToScan = 4; - } - else if ([scanner scanString:@"rgb" intoString:nil]) { - valuesToScan = 3; - } - else { - [scanner setScanLocation:location]; - return NO; - } - - SKScanWhitespaces(scanner, NULL); - if (![scanner scanString:@"(" intoString:nil]) { - [scanner setScanLocation:location]; - return NO; - } - - SKScanNumberArray(scanner, &values); - NSUInteger count = [values count]; - if (count != valuesToScan) { - [scanner setScanLocation:location]; - return NO; - } - - const NSUInteger alphaIndex = 3; - uint8_t chars[4]; - - for (int i = 0; i < count; i++) { - if (i != alphaIndex) { - chars[i] = [[values objectAtIndex:i] intValue]; - } - else { - chars[alphaIndex] = [[values objectAtIndex:i] doubleValue] * 255; - } - } - - if (![scanner scanString:@")" intoString:nil]) { - [scanner setScanLocation:location]; - return NO; - } - - *ptr = SKMakeColor(chars, 4); - - return YES; -} - - -BOOL SKScanTransform(NSScanner *scanner, struct SKTransform *ptr) -{ - NSUInteger location = [scanner scanLocation]; - SKScanWhitespaces(scanner, NULL); - struct SKTransform transform; - if (!SKScanMethod(scanner, &transform.method)) { - [scanner setScanLocation:location]; - return NO; - } - if (![scanner scanString:@"(" intoString:nil]) { - [scanner setScanLocation:location]; - return NO; - } - NSArray *values; - SKScanNumberArray(scanner, &values); - NSUInteger count = [values count]; - NSUInteger max = SKTransformMaxArgCount[transform.method]; - NSUInteger min = SKTransformMinArgCount[transform.method]; - for (int i = 0; i < max; i++) { - if (i < count) { - transform.values[i] = [[values objectAtIndex:i] doubleValue]; - } - else { - transform.values[i] = 0; - } - } - if (count > max || count < min) { - SKWarn(@"Transform method incorrect number of arguments (%d) " - @"for method %@; " - @"expected between %d and %d", count, min, max); - } - transform.count = count; - SKScanWhitespaces(scanner, NULL); - if (![scanner scanString:@")" intoString:nil]) { - [scanner setScanLocation:location]; - return NO; - } - *ptr = transform; - return YES; -} - -BOOL SKScanLength(NSScanner *scanner, struct SKQuantity* quantity) { - return SKScanQuantity(scanner, quantity, - SK_LENGTH_UNIT_FIRST, SK_LENGTH_UNIT_LAST); -} - -BOOL SKScanAngle(NSScanner *scanner, struct SKQuantity* quantity) { - return SKScanQuantity(scanner, quantity, - SK_ANGLE_UNIT_FIRST, SK_ANGLE_UNIT_LAST); -} - -BOOL SKScanFrequency(NSScanner *scanner, struct SKQuantity* quantity) { - return SKScanQuantity(scanner, quantity, - SK_FREQUENCY_UNIT_FIRST, SK_FREQUENCY_UNIT_LAST); -} - -void SKScanArray(NSScanner *scanner, NSArray **arr, - BOOL (*action)(NSScanner*,NSMutableArray*,void**),void** args) -{ - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:4]; - BOOL first = YES; - while (true) { - NSUInteger location = [scanner scanLocation]; - if (!first && !SKScanSeparator(scanner, nil)) { - break; - } - first = NO; - SKScanWhitespaces(scanner, nil); - if (action(scanner, array, args)) { - continue; - } - [scanner setScanLocation:location]; - break; - } - *arr = [array copy]; - [array release]; -} - -BOOL SKScanNumberIntoArray(NSScanner *scanner, NSMutableArray *array, - void**args) -{ - double value; - if (SKScanNumber(scanner, &value)) { - [array addObject:[NSNumber numberWithDouble:value]]; - return YES; - } - return NO; -} - -void SKScanNumberArray(NSScanner *scanner, NSArray **arr) -{ - return SKScanArray(scanner, arr, SKScanNumberIntoArray, NULL); -} - -BOOL SKScanStringIntoArray(NSScanner *scanner, NSMutableArray *array, - void**args) -{ - NSCharacterSet *characterSet = args[0]; - - NSString* value; - if ([scanner scanCharactersFromSet:characterSet intoString:&value]) { - [array addObject:value]; - return YES; - } - return NO; -} - -void SKScanStringArray(NSScanner *scanner, NSArray **arr, NSCharacterSet *set) -{ - void* args[1] = {set}; - return SKScanArray(scanner, arr, SKScanStringIntoArray, args); -} - -BOOL SKScanQuantityIntoArray(NSScanner *scanner, NSMutableArray* array, - void** args) -{ - SKUnit from = (SKUnit)args[0]; - SKUnit to = (SKUnit)args[1]; - Class target = (Class)args[2]; - SEL selector = (SEL)args[3]; - - struct SKQuantity quantity; - if (SKScanQuantity(scanner, &quantity, from, to)){ - id object = [target performSelector:selector - withObject:(id)&quantity]; - [array addObject:object]; - return YES; - } - return NO; -} - -void SKScanQuantityArray(NSScanner *scanner, NSArray **arr, SKUnit from, - SKUnit to, id target, SEL selector) -{ - void* args[4] = {(void*)from, (void*)to, (void*)target, (void*)selector}; - return SKScanArray(scanner, arr, SKScanQuantityIntoArray, args); -} - -BOOL SKQuantityEqualToQuantity(struct SKQuantity a, struct SKQuantity b) -{ - return a.value == b.value && a.unit == b.unit; -} - -BOOL SKQuantityIsLength(struct SKQuantity q) { - return (q.unit >= SK_LENGTH_UNIT_FIRST && q.unit <= SK_LENGTH_UNIT_LAST) - || q.unit == SKNumber; -} -BOOL SKQuantityIsAngle(struct SKQuantity q) { - return (q.unit >= SK_ANGLE_UNIT_FIRST && q.unit <= SK_ANGLE_UNIT_LAST) - || q.unit == SKNumber; -} -BOOL SKQuantityIsFrequency(struct SKQuantity q) { - return (q.unit>=SK_FREQUENCY_UNIT_FIRST && q.unit<=SK_FREQUENCY_UNIT_LAST) - || q.unit == SKNumber; -} - -BOOL SKScanTransformIntoArray(NSScanner *scanner, NSMutableArray* array, - void** args) -{ - struct SKTransform transform; - if (SKScanTransform(scanner, &transform)) { - [array addObject:[SKTransform transformWithTransform:transform]]; - return YES; - } - return NO; -} - -void SKScanTransformArray(NSScanner *scanner, NSArray **arr) -{ - return SKScanArray(scanner, arr, SKScanTransformIntoArray, NULL); -} - -void SKScanLengthArray(NSScanner *scanner, NSArray **arr) -{ - return SKScanQuantityArray(scanner, arr, - SK_LENGTH_UNIT_FIRST, SK_LENGTH_UNIT_LAST, - [SKLength class],@selector(lengthWithQuantity:)); -} - -void SKScanAngleArray(NSScanner *scanner, NSArray **arr) -{ - return SKScanQuantityArray(scanner, arr, - SK_ANGLE_UNIT_FIRST, SK_ANGLE_UNIT_LAST, - [SKAngle class], @selector(angleWithQuantity:)); -} - -void SKScanFrequencyArray(NSScanner *scanner, NSArray **arr) -{ - return SKScanQuantityArray(scanner, arr, - SK_FREQUENCY_UNIT_FIRST, SK_FREQUENCY_UNIT_LAST, - [SKFrequency class], - @selector(frequencyWithQuantity:)); -} - -*/ \ No newline at end of file diff --git a/SVGKitTests/SKCoreAttribTests.m b/SVGKitTests/SKCoreAttribTests.m index 8f49b82..7381a47 100644 --- a/SVGKitTests/SKCoreAttribTests.m +++ b/SVGKitTests/SKCoreAttribTests.m @@ -20,7 +20,7 @@ - (void)testIdentifier SKDocument *document = [[SKDocument alloc]initWithSVGString:svg error:nil]; SKRoot *root = document.root; - //STAssertEqualObjects(root.identifier, @"hello", @""); + STAssertEqualObjects(root.identifier, @"hello", @""); //STAssertEquals(root.zoomAndPan, SKMagnifyZoomAndPan, @""); } diff --git a/SVGKitTests/SKDocumentTests.m b/SVGKitTests/SKDocumentTests.m index 90fe563..096d17a 100644 --- a/SVGKitTests/SKDocumentTests.m +++ b/SVGKitTests/SKDocumentTests.m @@ -13,7 +13,7 @@ #import "SKRoot.h" @implementation SKDocumentTests -/* + - (void)testSimple { SKDocument *document = [SKDocument new]; @@ -22,7 +22,7 @@ - (void)testSimple [document release]; } -- (void)testWidthAttribute +- (void)testWidth { NSString *svg = @""; SKDocument *document = [[SKDocument alloc] initWithSVGString:svg error:nil]; @@ -31,7 +31,7 @@ - (void)testWidthAttribute STAssertEqualObjects(svg, [document.root XMLString], @""); [document release]; } -*/ + - (void)testParse { NSError *error; diff --git a/SVGKitTests/SVGKitTests.m b/SVGKitTests/SVGKitTests.m index 5f0d4a2..2029a05 100644 --- a/SVGKitTests/SVGKitTests.m +++ b/SVGKitTests/SVGKitTests.m @@ -73,16 +73,16 @@ - (void)testScanColor STAssertEqualObjects([color.array objectAtIndex:3], [NSNumber numberWithDouble:1.0], @""); } -/* - (void)testScanLength { NSString* string = @"3"; NSScanner *scanner = [NSScanner scannerWithString:string]; [scanner setCharactersToBeSkipped:nil]; - struct SKQuantity length; + SKLength* length; BOOL success = SKScanLength(scanner, &length); STAssertEquals(success, YES, @""); - STAssertEquals(length.unit, SKNumber, @""); + STAssertEquals(length.unit, SKUndefined, @""); + STAssertEquals(length.value, 3.0, @""); } - (void)testScanWhitespaces @@ -115,8 +115,8 @@ - (void)testScanMethod NSString *string = @" scale "; NSScanner *scanner = [NSScanner scannerWithString:string]; [scanner setCharactersToBeSkipped:nil]; - SKTransformMethod method; - BOOL success = SKScanMethod(scanner, &method); + SKLiteral method; + BOOL success = SKScanMethodForTransform(scanner, &method); string = [string substringFromIndex:[scanner scanLocation]]; STAssertEquals(success, YES, @"parse %@ failed ", string); } @@ -126,7 +126,7 @@ - (void)testScanTransform NSString *string = @"scale(1, 2)"; NSScanner *scanner = [NSScanner scannerWithString:string]; [scanner setCharactersToBeSkipped:nil]; - struct SKTransform transform; + SKTransform* transform; BOOL success = SKScanTransform(scanner, &transform); string = [string substringFromIndex:[scanner scanLocation]]; STAssertEquals(success, YES, string); @@ -142,5 +142,4 @@ - (void)testScanTransformArray SKScanTransformArray(scanner, &array); STAssertEquals([array count], (NSUInteger)4, string); } -*/ @end