Revision: 22459
          http://sourceforge.net/p/bibdesk/svn/22459
Author:   hofman
Date:     2018-07-23 17:25:19 +0000 (Mon, 23 Jul 2018)
Log Message:
-----------
dash (minus) can be escaped character

Modified Paths:
--------------
    trunk/bibdesk/BDSKFormatParser.m

Modified: trunk/bibdesk/BDSKFormatParser.m
===================================================================
--- trunk/bibdesk/BDSKFormatParser.m    2018-07-23 15:41:47 UTC (rev 22458)
+++ trunk/bibdesk/BDSKFormatParser.m    2018-07-23 17:25:19 UTC (rev 22459)
@@ -72,34 +72,9 @@
 static NSDictionary *textAttr = nil;
 static NSDictionary *errorAttr = nil;
 
-static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange 
range) {
-    NSUInteger i, iMax = [string length];
-    for (i = 0; i < iMax; i++) {
-        if (NSLocationInRange([string characterAtIndex:i], range) == NO)
-            return YES;
-    }
-    return NO;
-}
+static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange 
range);
 
-static BOOL scanOptArg(NSScanner *scanner, NSString **result) {
-    NSMutableString *tmpString = nil;
-    NSString *string = nil;
-    unichar escapeChar;
-    while (YES) {
-        if ([scanner scanUpToCharactersFromSet:optArgStopChars 
intoString:&string] && tmpString != nil)
-            [tmpString appendString:string];
-        if ([scanner scanString:@"%" intoString:NULL] == NO || [scanner 
scanCharacter:&escapeChar] == NO)
-            break;
-        if (tmpString == nil)
-            tmpString = [NSMutableString stringWithString:string ?: @""];
-        [tmpString appendFormat:@"%C", escapeChar];
-    }
-    if ([tmpString length] == 0 && [string length] == 0)
-        return NO;
-    if (result)
-        *result = tmpString ?: string;
-    return YES;
-}
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, NSString 
*defaultResult);
 
 + (void)initialize {
     BDSKINITIALIZE;
@@ -172,16 +147,8 @@
                                        NSString *etal = @"";
                     BOOL isLast = NO;
                                        if (NO == [scanner isAtEnd]) {
-                                               // look for [separator]
-                                               if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                                       if (NO == 
scanOptArg(scanner, &authSep)) authSep = @"";
-                                                       [scanner 
scanString:@"]" intoString:NULL];
-                                                       // look for [etal]
-                                                       if ([scanner 
scanString:@"[" intoString:NULL]) {
-                                                               if (NO == 
scanOptArg(scanner, &etal)) etal = @"";
-                                                               [scanner 
scanString:@"]" intoString:NULL];
-                                                       }
-                                               }
+                                               // look for [separator] and 
[etal]
+                        scanOptArg(scanner, &authSep, @"") && 
scanOptArg(scanner, &etal, @"");
                                                if ([scanner 
peekCharacter:&nextChar]) {
                                                        // look for #names
                             if (nextChar == '-') {
@@ -244,21 +211,8 @@
                                        NSString *etal = @"";
                     BOOL isLast = NO;
                                        if (NO == [scanner isAtEnd]) {
-                                               // look for [author separator]
-                                               if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                                       if (NO == 
scanOptArg(scanner, &authSep)) authSep = @"";
-                                                       [scanner 
scanString:@"]" intoString:NULL];
-                                                       // look for [name 
separator]
-                                                       if ([scanner 
scanString:@"[" intoString:NULL]) {
-                                                               if (NO == 
scanOptArg(scanner, &nameSep)) nameSep = @"";
-                                                               [scanner 
scanString:@"]" intoString:NULL];
-                                                               // look for 
[etal]
-                                                               if ([scanner 
scanString:@"[" intoString:NULL]) {
-                                                                       if (NO 
== scanOptArg(scanner, &etal)) etal = @"";
-                                                                       
[scanner scanString:@"]" intoString:NULL];
-                                                               }
-                                                       }
-                                               }
+                                               // look for [author separator], 
[name separator], and [etal]
+                        scanOptArg(scanner, &authSep, @"") && 
scanOptArg(scanner, &nameSep, @"") && scanOptArg(scanner, &etal, @"");
                                                if ([scanner 
peekCharacter:&nextChar]) {
                                                        // look for #names
                             if (nextChar == '-') {
@@ -340,13 +294,8 @@
                     NSUInteger smallWordLength = 3;
                     NSString *numString = nil;
                     NSString *title = [pub title];
-                    if ([scanner scanString:@"[" intoString:NULL]) {
-                        if (scanOptArg(scanner, &numString))
-                            smallWordLength = (NSUInteger)[numString 
integerValue];
-                        else
-                            smallWordLength = 0;
-                        [scanner scanString:@"]" intoString:NULL];
-                    }
+                    if (scanOptArg(scanner, &numString, @"0"))
+                        smallWordLength = (NSUInteger)[numString integerValue];
                                        if (NO == [scanner 
scanUnsignedInteger:&numWords]) numWords = 0;
                                        if ([NSString isEmptyString:title] == 
NO) {
                                                NSMutableArray *words = 
[NSMutableArray array];
@@ -430,17 +379,10 @@
                 case 'k':
                                {
                        // keywords
-                                       // look for [slash]
                                        NSString *slash = (isLocalFile) ? @"-" 
: @"/";
                                        NSString *sep = nil;
-                                       if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                               if (NO == scanOptArg(scanner, 
&slash)) slash = @"";
-                                               [scanner scanString:@"]" 
intoString:NULL];
-                        if ([scanner scanString:@"[" intoString:NULL]) {
-                            if (NO == scanOptArg(scanner, &sep)) sep = @"";
-                            [scanner scanString:@"]" intoString:NULL];
-                        }
-                                       }
+                    // look for [slash] and [sep]
+                    scanOptArg(scanner, &slash, @"") && scanOptArg(scanner, 
&sep, @"");
                     NSString *keywordsString = [pub 
stringValueOfField:BDSKKeywordsString];
                                        NSUInteger i, numWords = 0;
                     if (NO == [scanner scanUnsignedInteger:&numWords]) 
numWords = 0;
@@ -531,10 +473,7 @@
                                {
                        // old file extension without period
                     NSString *defaultExt = @"";
-                                       if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                               if (NO == scanOptArg(scanner, 
&defaultExt)) defaultExt = @"";
-                                               [scanner scanString:@"]" 
intoString:NULL];
-                                       }
+                                       scanOptArg(scanner, &defaultExt, @"");
                                        NSString *filename = nil;
                     if (file)
                                                filename = [[file URL] path];
@@ -572,10 +511,7 @@
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
                                                // look for [slash]
-                                               if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                                       if (NO == 
scanOptArg(scanner, &slash)) slash = @"";
-                                                       [scanner 
scanString:@"]" intoString:NULL];
-                                               }
+                                               scanOptArg(scanner, &slash, 
@"");
                         
                                                if (NO == [scanner 
scanUnsignedInteger:&numChars]) numChars = 0;
                                                if (NO == [fieldName 
isEqualToString:BDSKCiteKeyString] &&
@@ -612,20 +548,8 @@
                     if ([scanner scanString:@"{" intoString:NULL] &&
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
-                        // look for [sep]
-                        if ([scanner scanString:@"[" intoString:NULL]) {
-                            if (NO == scanOptArg(scanner, &sepChars)) sepChars 
= @" ";
-                            [scanner scanString:@"]" intoString:NULL];
-                            // look for [slash]
-                            if ([scanner scanString:@"[" intoString:NULL]) {
-                                if (NO == scanOptArg(scanner, &slash)) slash = 
@"";
-                                [scanner scanString:@"]" intoString:NULL];
-                                if ([scanner scanString:@"[" intoString:NULL]) 
{
-                                    if (NO == scanOptArg(scanner, &sep)) sep = 
@"";
-                                    [scanner scanString:@"]" intoString:NULL];
-                                }
-                            }
-                        }
+                        // look for [sep chars], [slash], and [sep]
+                        scanOptArg(scanner, &sepChars, @" ") && 
scanOptArg(scanner, &slash, @"") && scanOptArg(scanner, &sep, @"");
                         NSString *wordsString = [pub stringValueOfField:key];
                         NSUInteger i, numWords = 0;
                         if (NO == [scanner scanUnsignedInteger:&numWords]) 
numWords = 0;
@@ -696,21 +620,8 @@
                                        if ([scanner scanString:@"{" 
intoString:NULL] &&
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
-                                               // look for [yes value]
-                                               if ([scanner scanString:@"[" 
intoString:NULL]) {
-                                                       if (NO == 
scanOptArg(scanner, &yesValue)) yesValue = @"";
-                                                       [scanner 
scanString:@"]" intoString:NULL];
-                            // look for [no value]
-                            if ([scanner scanString:@"[" intoString:NULL]) {
-                                if (NO == scanOptArg(scanner, &noValue)) 
noValue = @"";
-                                [scanner scanString:@"]" intoString:NULL];
-                                // look for [mixed value]
-                                if ([scanner scanString:@"[" intoString:NULL]) 
{
-                                    if (NO == scanOptArg(scanner, 
&mixedValue)) mixedValue = @"";
-                                    [scanner scanString:@"]" intoString:NULL];
-                                }
-                            }
-                        }
+                                               // look for [yes value]m, [no 
value], and [mixed value]
+                        scanOptArg(scanner, &yesValue, @"") && 
scanOptArg(scanner, &noValue, @"") && scanOptArg(scanner, &mixedValue, @"");
                                                if (NO == [scanner 
scanUnsignedInteger:&numChars]) numChars = 0;
                         intValue = [pub integerValueOfField:key];
                         value = (intValue == 0 ? noValue : (intValue == 1 ? 
yesValue : mixedValue));
@@ -809,10 +720,7 @@
                                                uniqueSpecifier = specifier;
                                                prefixStr = parsedStr;
                                                parsedStr = [NSMutableString 
string];
-                        if ([scanner scanString:@"[" intoString:NULL]) {
-                            scanOptArg(scanner, &uniqueSeparator);
-                            [scanner scanString:@"]" intoString:NULL];
-                        }
+                        scanOptArg(scanner, &uniqueSeparator, nil);
                                                if (NO == [scanner 
scanUnsignedInteger:&uniqueNumber]) uniqueNumber = 1;
                                        }
                                        else {
@@ -1283,4 +1191,37 @@
        return [papersFolderPath stringByExpandingTildeInPath];
 }
 
+static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange 
range) {
+    NSUInteger i, iMax = [string length];
+    for (i = 0; i < iMax; i++) {
+        if (NSLocationInRange([string characterAtIndex:i], range) == NO)
+            return YES;
+    }
+    return NO;
+}
+
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, NSString 
*defaultResult) {
+    if ([scanner scanString:@"[" intoString:NULL] == NO)
+        return NO;
+    
+    NSMutableString *tmpString = nil;
+    NSString *string = nil;
+    unichar escapeChar;
+    while (YES) {
+        if ([scanner scanUpToCharactersFromSet:optArgStopChars 
intoString:&string] && tmpString != nil)
+            [tmpString appendString:string];
+        if ([scanner scanString:@"%" intoString:NULL] == NO || [scanner 
scanCharacter:&escapeChar] == NO)
+            break;
+        if (tmpString == nil)
+            tmpString = [NSMutableString stringWithString:string ?: @""];
+        [tmpString appendFormat:@"%C", escapeChar];
+    }
+    if (tmpString)
+        string = tmpString;
+    [scanner scanString:@"]" intoString:NULL];
+    if (result)
+        *result = [string length] > 0 ? string : defaultResult;
+    return YES;
+}
+
 @end

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


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to