Revision: 22472
http://sourceforge.net/p/bibdesk/svn/22472
Author: hofman
Date: 2018-07-26 16:12:17 +0000 (Thu, 26 Jul 2018)
Log Message:
-----------
Ignore escaped digit in etal optional argument
Modified Paths:
--------------
trunk/bibdesk/BDSKFormatParser.m
Modified: trunk/bibdesk/BDSKFormatParser.m
===================================================================
--- trunk/bibdesk/BDSKFormatParser.m 2018-07-26 08:54:48 UTC (rev 22471)
+++ trunk/bibdesk/BDSKFormatParser.m 2018-07-26 16:12:17 UTC (rev 22472)
@@ -74,7 +74,7 @@
static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange
range);
-static BOOL scanOptArg(NSScanner *scanner, NSString **result);
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, BOOL
*lastCharEscaped);
static BOOL scanSignedDigit(NSScanner *scanner, NSUInteger *resultDigit, BOOL
*resultSign);
+ (void)initialize {
@@ -147,9 +147,10 @@
NSString *authSep = @"";
NSString *etal = @"";
BOOL isLast = NO;
+ BOOL wasEscaped = NO;
if (NO == [scanner isAtEnd]) {
// look for [separator] and
[etal]
- scanOptArg(scanner, &authSep) && scanOptArg(scanner,
&etal);
+ scanOptArg(scanner, &authSep, NULL) &&
scanOptArg(scanner, &etal, &wasEscaped);
// look for #names and #chars per name
if (scanSignedDigit(scanner, &numAuth, &isLast)) {
if (NO == [scanner scanUnsignedInteger:&numChars])
numChars = 0;
@@ -164,7 +165,7 @@
}
if (numAuth == 0 || numAuth >
[authArray count]) {
numAuth = [authArray count];
- } else if (numAuth < [authArray count] && [[NSCharacterSet
decimalDigitCharacterSet] characterIsMember:[etal lastCharacter]]) {
+ } else if (numAuth < [authArray count] && wasEscaped == NO
&& [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[etal
lastCharacter]]) {
i = (NSUInteger)[[etal substringFromIndex:[etal
length] - 1] integerValue];
etal = [etal substringToIndex:[etal length] - 1];
if (i > 0 && i < numAuth)
@@ -197,9 +198,10 @@
NSString *nameSep = @".";
NSString *etal = @"";
BOOL isLast = NO;
+ BOOL wasEscaped = NO;
if (NO == [scanner isAtEnd]) {
// look for [author separator],
[name separator], and [etal]
- scanOptArg(scanner, &authSep) && scanOptArg(scanner,
&nameSep) && scanOptArg(scanner, &etal);
+ scanOptArg(scanner, &authSep, NULL) &&
scanOptArg(scanner, &nameSep, NULL) && scanOptArg(scanner, &etal, &wasEscaped);
// look for #names
scanSignedDigit(scanner, &numAuth, &isLast);
}
@@ -212,7 +214,7 @@
}
if (numAuth == 0 || numAuth >
[authArray count]) {
numAuth = [authArray count];
- } else if (numAuth < [authArray count] && [[NSCharacterSet
decimalDigitCharacterSet] characterIsMember:[etal lastCharacter]]) {
+ } else if (numAuth < [authArray count] && wasEscaped == NO
&& [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[etal
lastCharacter]]) {
i = (NSUInteger)[[etal substringFromIndex:[etal
length] - 1] integerValue];
etal = [etal substringToIndex:[etal length] - 1];
if (i > 0 && i < numAuth)
@@ -267,7 +269,7 @@
NSUInteger smallWordLength = 3;
NSString *numString = nil;
NSString *title = [pub title];
- if (scanOptArg(scanner, &numString))
+ if (scanOptArg(scanner, &numString, NULL))
smallWordLength = (NSUInteger)[numString integerValue];
if (NO == [scanner
scanUnsignedInteger:&numWords]) numWords = 0;
if ([NSString isEmptyString:title] ==
NO) {
@@ -355,7 +357,7 @@
NSString *slash = (isLocalFile) ? @"-"
: @"/";
NSString *sep = nil;
// look for [slash] and [sep]
- scanOptArg(scanner, &slash) && scanOptArg(scanner, &sep);
+ scanOptArg(scanner, &slash, NULL) && scanOptArg(scanner,
&sep, NULL);
NSString *keywordsString = [pub
stringValueOfField:BDSKKeywordsString];
NSUInteger i, numWords = 0;
if (NO == [scanner scanUnsignedInteger:&numWords])
numWords = 0;
@@ -446,7 +448,7 @@
{
// old file extension without period
NSString *defaultExt = @"";
- scanOptArg(scanner, &defaultExt);
+ scanOptArg(scanner, &defaultExt, NULL);
NSString *filename = nil;
if (file)
filename = [[file URL] path];
@@ -484,7 +486,7 @@
[scanner scanUpToString:@"}"
intoString:&key] &&
[scanner scanString:@"}"
intoString:NULL]) {
// look for [slash]
- scanOptArg(scanner, &slash);
+ scanOptArg(scanner, &slash,
NULL);
if (NO == [scanner
scanUnsignedInteger:&numChars]) numChars = 0;
if (NO == [fieldName
isEqualToString:BDSKCiteKeyString] &&
@@ -522,7 +524,7 @@
[scanner scanUpToString:@"}"
intoString:&key] &&
[scanner scanString:@"}"
intoString:NULL]) {
// look for [sep chars], [slash], and [sep]
- scanOptArg(scanner, &sepChars) && scanOptArg(scanner,
&slash) && scanOptArg(scanner, &sep);
+ scanOptArg(scanner, &sepChars, NULL) &&
scanOptArg(scanner, &slash, NULL) && scanOptArg(scanner, &sep, NULL);
if ([NSString isEmptyString:sepChars])
sepChars = @" ";
NSString *wordsString = [pub stringValueOfField:key];
@@ -596,7 +598,7 @@
[scanner scanUpToString:@"}"
intoString:&key] &&
[scanner scanString:@"}"
intoString:NULL]) {
// look for [yes value]m, [no
value], and [mixed value]
- scanOptArg(scanner, &yesValue) && scanOptArg(scanner,
&noValue) && scanOptArg(scanner, &mixedValue);
+ scanOptArg(scanner, &yesValue, NULL) &&
scanOptArg(scanner, &noValue, NULL) && scanOptArg(scanner, &mixedValue, NULL);
if (NO == [scanner
scanUnsignedInteger:&numChars]) numChars = 0;
intValue = [pub integerValueOfField:key];
value = (intValue == 0 ? noValue : (intValue == 1 ?
yesValue : mixedValue));
@@ -695,7 +697,7 @@
uniqueSpecifier = specifier;
prefixStr = parsedStr;
parsedStr = [NSMutableString
string];
- scanOptArg(scanner, &uniqueSeparator);
+ scanOptArg(scanner, &uniqueSeparator, NULL);
if (NO == [scanner
scanUnsignedInteger:&uniqueNumber]) uniqueNumber = 1;
}
else {
@@ -1175,7 +1177,7 @@
return NO;
}
-static BOOL scanOptArg(NSScanner *scanner, NSString **result) {
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, BOOL
*lastCharEscaped) {
if ([scanner scanString:@"[" intoString:NULL] == NO)
return NO;
@@ -1182,14 +1184,18 @@
NSMutableString *tmpString = nil;
NSString *string = nil;
unichar escapeChar;
+ BOOL wasEscaped = NO;
while (YES) {
- if ([scanner scanUpToCharactersFromSet:optArgStopChars
intoString:&string] && tmpString != nil)
+ if ([scanner scanUpToCharactersFromSet:optArgStopChars
intoString:&string] && tmpString != nil) {
[tmpString appendString:string];
+ wasEscaped = NO;
+ }
if ([scanner scanString:@"%" intoString:NULL] == NO || [scanner
scanCharacter:&escapeChar] == NO)
break;
if (tmpString == nil)
tmpString = [NSMutableString stringWithString:string ?: @""];
[tmpString appendFormat:@"%C", escapeChar];
+ wasEscaped = YES;
}
if (tmpString)
string = tmpString;
@@ -1196,6 +1202,8 @@
[scanner scanString:@"]" intoString:NULL];
if (result)
*result = string ?: @"";
+ if (lastCharEscaped)
+ *lastCharEscaped = wasEscaped;
return YES;
}
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