Revision: 3003
          http://skim-app.svn.sourceforge.net/skim-app/?rev=3003&view=rev
Author:   hofman
Date:     2007-10-01 06:07:20 -0700 (Mon, 01 Oct 2007)

Log Message:
-----------
Support for larger/smaller comparisons in condition template tags.

Modified Paths:
--------------
    trunk/SKTemplateParser.m

Modified: trunk/SKTemplateParser.m
===================================================================
--- trunk/SKTemplateParser.m    2007-10-01 11:43:32 UTC (rev 3002)
+++ trunk/SKTemplateParser.m    2007-10-01 13:07:20 UTC (rev 3003)
@@ -48,6 +48,10 @@
 #define CONDITIONTAG_CLOSE_DELIM @"?>"
 #define CONDITIONTAG_EQUAL @"="
 #define CONDITIONTAG_CONTAIN @"~"
+#define CONDITIONTAG_SMALLER @"<"
+#define CONDITIONTAG_SMALLER_OR_EQUAL @"<="
+#define CONDITIONTAG_LARGER @">"
+#define CONDITIONTAG_LARGER_OR_EQUAL @">="
 
 /*
        single tag: <$key/>
@@ -59,8 +63,26 @@
                or: <$key=value?> <?$key?> </$key?>
                or: <$key~value?> </$key?>
                or: <$key~value?> <?$key?> </$key?>
+               or: <$key<value?> </$key?>
+               or: <$key<value?> <?$key?> </$key?>
+               or: <$key<=value?> </$key?>
+               or: <$key<=value?> <?$key?> </$key?>
+               or: <$key>value?> </$key?>
+               or: <$key>value?> <?$key?> </$key?>
+               or: <$key>=value?> </$key?>
+               or: <$key>=value?> <?$key?> </$key?>
 */
 
+enum {
+    SKConditionTagMatchOther,
+    SKConditionTagMatchEqual,
+    SKConditionTagMatchContain,
+    SKConditionTagMatchSmaller,
+    SKConditionTagMatchSmallerOrEqual,
+    SKConditionTagMatchLarger,
+    SKConditionTagMatchLargerOrEqual
+};
+
 @implementation SKTemplateParser
 
 
@@ -130,29 +152,70 @@
 }
 
 static NSMutableDictionary *equalConditionDict = nil;
-static inline NSString *equalConditionTagWithTag(NSString *tag){
-    if(nil == equalConditionDict)
-        equalConditionDict = [[NSMutableDictionary alloc] init];
-    
-    NSString *equalTag = [equalConditionDict objectForKey:tag];
-    if(nil == equalTag){
-        equalTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_EQUAL];
-        [equalConditionDict setObject:equalTag forKey:tag];
-    }
-    return equalTag;
-}
-
 static NSMutableDictionary *containConditionDict = nil;
-static inline NSString *containConditionTagWithTag(NSString *tag){
-    if(nil == containConditionDict)
-        containConditionDict = [[NSMutableDictionary alloc] init];
-    
-    NSString *containTag = [containConditionDict objectForKey:tag];
-    if(nil == containTag){
-        containTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_CONTAIN];
-        [containConditionDict setObject:containTag forKey:tag];
+static NSMutableDictionary *smallerConditionDict = nil;
+static NSMutableDictionary *smallerOrEqualConditionDict = nil;
+static NSMutableDictionary *largerConditionDict = nil;
+static NSMutableDictionary *largerOrEqualConditionDict = nil;
+static inline NSString *compareConditionTagWithTag(NSString *tag, int 
matchType){
+    NSString *altTag = nil;
+    switch (matchType) {
+        case SKConditionTagMatchEqual:
+            if(nil == equalConditionDict)
+                equalConditionDict = [[NSMutableDictionary alloc] init];
+            altTag = [equalConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_EQUAL];
+                [equalConditionDict setObject:altTag forKey:tag];
+            }
+            break;
+        case SKConditionTagMatchContain:
+            if(nil == containConditionDict)
+                containConditionDict = [[NSMutableDictionary alloc] init];
+            altTag = [containConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_CONTAIN];
+                [containConditionDict setObject:altTag forKey:tag];
+            }
+            break;
+        case SKConditionTagMatchSmaller:
+            if(nil == smallerConditionDict)
+                smallerConditionDict = [[NSMutableDictionary alloc] init];
+            altTag = [smallerConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_SMALLER];
+                [smallerConditionDict setObject:altTag forKey:tag];
+            }
+            break;
+        case SKConditionTagMatchSmallerOrEqual:
+            if(nil == smallerOrEqualConditionDict)
+                smallerOrEqualConditionDict = [[NSMutableDictionary alloc] 
init];
+            altTag = [smallerOrEqualConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_SMALLER_OR_EQUAL];
+                [smallerOrEqualConditionDict setObject:altTag forKey:tag];
+            }
+            break;
+        case SKConditionTagMatchLarger:
+            if(nil == largerConditionDict)
+                largerConditionDict = [[NSMutableDictionary alloc] init];
+            altTag = [largerConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_LARGER];
+                [largerConditionDict setObject:altTag forKey:tag];
+            }
+            break;
+        case SKConditionTagMatchLargerOrEqual:
+            if(nil == largerOrEqualConditionDict)
+                largerOrEqualConditionDict = [[NSMutableDictionary alloc] 
init];
+            altTag = [largerOrEqualConditionDict objectForKey:tag];
+            if(nil == altTag){
+                altTag = [NSString stringWithFormat:@"[EMAIL PROTECTED]@%@", 
SEPTAG_OPEN_DELIM, tag, CONDITIONTAG_LARGER_OR_EQUAL];
+                [largerOrEqualConditionDict setObject:altTag forKey:tag];
+            }
+            break;
     }
-    return containTag;
+    return altTag;
 }
 
 static inline NSRange altTemplateTagRange(NSString *template, NSString 
*altTag, NSString *endDelim, NSString **argString){
@@ -271,17 +334,32 @@
             } else {
                 
                 NSString *matchString = nil;
-                BOOL matchEqual = NO;
-                BOOL matchContain = NO;
+                int matchType = SKConditionTagMatchOther;
                 
                 if ([scanner scanString:CONDITIONTAG_EQUAL intoString:nil]) {
                     if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
                         matchString = @"";
-                    matchEqual = YES;
+                    matchType = SKConditionTagMatchEqual;
                 } else if ([scanner scanString:CONDITIONTAG_CONTAIN 
intoString:nil]) {
                     if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
                         matchString = @"";
-                    matchContain = YES;
+                    matchType = SKConditionTagMatchContain;
+                } else if ([scanner scanString:CONDITIONTAG_SMALLER_OR_EQUAL 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchSmallerOrEqual;
+                } else if ([scanner scanString:CONDITIONTAG_SMALLER 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchSmaller;
+                } else if ([scanner scanString:CONDITIONTAG_LARGER_OR_EQUAL 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchLargerOrEqual;
+                } else if ([scanner scanString:CONDITIONTAG_LARGER 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchLarger;
                 }
                 
                 if ([scanner scanString:CONDITIONTAG_CLOSE_DELIM 
intoString:nil]) {
@@ -313,8 +391,8 @@
                         subTemplates = [[NSMutableArray alloc] init];
                         matchStrings = [[NSMutableArray alloc] 
initWithObjects:matchString ? matchString : @"", nil];
                         
-                        if (matchEqual || matchContain) {
-                            altTag = matchEqual ? 
equalConditionTagWithTag(tag) : containConditionTagWithTag(tag);
+                        if (matchType != SKConditionTagMatchOther) {
+                            altTag = compareConditionTagWithTag(tag, 
matchType);
                             altTagRange = altTemplateTagRange(subTemplate, 
altTag, CONDITIONTAG_CLOSE_DELIM, &matchString);
                             while (altTagRange.location != NSNotFound) {
                                 [subTemplates addObject:[subTemplate 
substringToIndex:altTagRange.location]];
@@ -335,12 +413,30 @@
                         count = [matchStrings count];
                         subTemplate = nil;
                         for (i = 0; i < count; i++) {
-                            isMatch = [keyValue isNotEmpty];
                             matchString = [matchStrings objectAtIndex:i];
-                            if (matchEqual) {
-                                isMatch = [matchString isEqualToString:@""] ? 
NO == isMatch : [[keyValue stringDescription] 
caseInsensitiveCompare:matchString] == NSOrderedSame;
-                            } else if (matchContain) {
-                                isMatch = [matchString isEqualToString:@""] ? 
NO == isMatch : [[keyValue stringDescription] rangeOfString:matchString 
options:NSCaseInsensitiveSearch].location != NSNotFound;
+                            int comparison = [[keyValue stringDescription] 
localizedCaseInsensitiveNumericCompare:matchString];
+                            switch (matchType) {
+                                 case SKConditionTagMatchEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedSame;
+                                    break;
+                                case SKConditionTagMatchContain:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : [[keyValue 
stringDescription] rangeOfString:matchString 
options:NSCaseInsensitiveSearch].location != NSNotFound;
+                                    break;
+                                case SKConditionTagMatchSmaller:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedAscending;
+                                    break;
+                                case SKConditionTagMatchSmallerOrEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison != 
NSOrderedDescending;
+                                    break;
+                                case SKConditionTagMatchLarger:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedDescending;
+                                    break;
+                                case SKConditionTagMatchLargerOrEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison != 
NSOrderedAscending;
+                                    break;
+                                default:
+                                    isMatch = [keyValue isNotEmpty];
+                                    break;
                             }
                             if (isMatch) {
                                 subTemplate = [subTemplates objectAtIndex:i];
@@ -479,17 +575,32 @@
             } else {
                 
                 NSString *matchString = nil;
-                BOOL matchEqual = NO;
-                BOOL matchContain = NO;
+                int matchType = SKConditionTagMatchOther;
                 
                 if ([scanner scanString:CONDITIONTAG_EQUAL intoString:nil]) {
                     if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
                         matchString = @"";
-                    matchEqual = YES;
+                    matchType = SKConditionTagMatchEqual;
                 } else if ([scanner scanString:CONDITIONTAG_CONTAIN 
intoString:nil]) {
                     if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
                         matchString = @"";
-                    matchContain = YES;
+                    matchType = SKConditionTagMatchContain;
+                } else if ([scanner scanString:CONDITIONTAG_SMALLER_OR_EQUAL 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchSmallerOrEqual;
+                } else if ([scanner scanString:CONDITIONTAG_SMALLER 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchSmaller;
+                } else if ([scanner scanString:CONDITIONTAG_LARGER_OR_EQUAL 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchLargerOrEqual;
+                } else if ([scanner scanString:CONDITIONTAG_LARGER 
intoString:nil]) {
+                    if([scanner scanUpToString:CONDITIONTAG_CLOSE_DELIM 
intoString:&matchString] == NO)
+                        matchString = @"";
+                    matchType = SKConditionTagMatchLarger;
                 }
                 
                 if ([scanner scanString:CONDITIONTAG_CLOSE_DELIM 
intoString:nil]) {
@@ -523,8 +634,8 @@
                         subTemplates = [[NSMutableArray alloc] init];
                         matchStrings = [[NSMutableArray alloc] 
initWithObjects:matchString ? matchString : @"", nil];
                         
-                        if (matchEqual || matchContain) {
-                            altTag = matchEqual ? 
equalConditionTagWithTag(tag) : containConditionTagWithTag(tag);
+                        if (matchType != SKConditionTagMatchOther) {
+                            altTag = compareConditionTagWithTag(tag, 
matchType);
                             altTagRange = altTemplateTagRange([subTemplate 
string], altTag, CONDITIONTAG_CLOSE_DELIM, &matchString);
                             while (altTagRange.location != NSNotFound) {
                                 [subTemplates addObject:[subTemplate 
attributedSubstringFromRange:NSMakeRange(0, altTagRange.location)]];
@@ -546,12 +657,30 @@
                         count = [matchStrings count];
                         subTemplate = nil;
                         for (i = 0; i < count; i++) {
-                            isMatch = [keyValue isNotEmpty];
                             matchString = [matchStrings objectAtIndex:i];
-                            if (matchEqual) {
-                                isMatch = [matchString isEqualToString:@""] ? 
NO == isMatch : [[keyValue stringDescription] 
caseInsensitiveCompare:matchString] == NSOrderedSame;
-                            } else if (matchContain) {
-                                isMatch = [matchString isEqualToString:@""] ? 
NO == isMatch : [[keyValue stringDescription] rangeOfString:matchString 
options:NSCaseInsensitiveSearch].location != NSNotFound;
+                            int comparison = [[keyValue stringDescription] 
localizedCaseInsensitiveNumericCompare:matchString];
+                            switch (matchType) {
+                                 case SKConditionTagMatchEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedSame;
+                                    break;
+                                case SKConditionTagMatchContain:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : [[keyValue 
stringDescription] rangeOfString:matchString 
options:NSCaseInsensitiveSearch].location != NSNotFound;
+                                    break;
+                                case SKConditionTagMatchSmaller:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedAscending;
+                                    break;
+                                case SKConditionTagMatchSmallerOrEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison != 
NSOrderedDescending;
+                                    break;
+                                case SKConditionTagMatchLarger:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison == 
NSOrderedDescending;
+                                    break;
+                                case SKConditionTagMatchLargerOrEqual:
+                                    isMatch = [matchString 
isEqualToString:@""] ? NO == [keyValue isNotEmpty] : comparison != 
NSOrderedAscending;
+                                    break;
+                                default:
+                                    isMatch = [keyValue isNotEmpty];
+                                    break;
                             }
                             if (isMatch) {
                                 subTemplate = [subTemplates objectAtIndex:i];


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to