You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.3 KiB
77 lines
2.3 KiB
#import "RNSVGLength.h"
|
|
#import <Foundation/Foundation.h>
|
|
|
|
@implementation RNSVGLength
|
|
|
|
- (instancetype)init
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
_value = 0;
|
|
_unit = SVG_LENGTHTYPE_UNKNOWN;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
+ (instancetype)lengthWithNumber:(CGFloat)number
|
|
{
|
|
RNSVGLength *length = [[self alloc] init];
|
|
length.unit = SVG_LENGTHTYPE_NUMBER;
|
|
length.value = number;
|
|
return length;
|
|
}
|
|
|
|
+ (instancetype)lengthWithString:(NSString *)lengthString
|
|
{
|
|
NSString *length = [lengthString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
|
NSUInteger stringLength = [length length];
|
|
NSInteger percentIndex = stringLength - 1;
|
|
RNSVGLength *output = [RNSVGLength alloc];
|
|
if (stringLength == 0) {
|
|
output.unit = SVG_LENGTHTYPE_UNKNOWN;
|
|
output.value = 0;
|
|
return output;
|
|
} else if ([length characterAtIndex:percentIndex] == '%') {
|
|
output.unit = SVG_LENGTHTYPE_PERCENTAGE;
|
|
output.value = (CGFloat)[[length substringWithRange:NSMakeRange(0, percentIndex)] doubleValue];
|
|
} else {
|
|
NSInteger twoLetterUnitIndex = stringLength - 2;
|
|
RNSVGLengthUnitType unit = SVG_LENGTHTYPE_NUMBER;
|
|
if (twoLetterUnitIndex > 0) {
|
|
NSString *lastTwo = [length substringFromIndex:twoLetterUnitIndex];
|
|
NSUInteger end = twoLetterUnitIndex;
|
|
if ([lastTwo isEqualToString:@"px"]) {
|
|
unit = SVG_LENGTHTYPE_PX;
|
|
} else if ([lastTwo isEqualToString:@"em"]) {
|
|
unit = SVG_LENGTHTYPE_EMS;
|
|
} else if ([lastTwo isEqualToString:@"ex"]) {
|
|
unit = SVG_LENGTHTYPE_EXS;
|
|
} else if ([lastTwo isEqualToString:@"pt"]) {
|
|
unit = SVG_LENGTHTYPE_PT;
|
|
} else if ([lastTwo isEqualToString:@"pc"]) {
|
|
unit = SVG_LENGTHTYPE_PC;
|
|
} else if ([lastTwo isEqualToString:@"mm"]) {
|
|
unit = SVG_LENGTHTYPE_MM;
|
|
} else if ([lastTwo isEqualToString:@"cm"]) {
|
|
unit = SVG_LENGTHTYPE_CM;
|
|
} else if ([lastTwo isEqualToString:@"in"]) {
|
|
unit = SVG_LENGTHTYPE_IN;
|
|
} else {
|
|
end = stringLength;
|
|
}
|
|
output.value = (CGFloat)[[length substringWithRange:NSMakeRange(0, end)] doubleValue];
|
|
} else {
|
|
output.value = (CGFloat)[length doubleValue];
|
|
}
|
|
output.unit = unit;
|
|
}
|
|
return output;
|
|
}
|
|
|
|
- (BOOL)isEqualTo:(RNSVGLength *)other
|
|
{
|
|
return self.unit == other.unit && self.value == other.value;
|
|
}
|
|
|
|
@end
|