Revision: 30047
http://sourceforge.net/p/bibdesk/svn/30047
Author: hofman
Date: 2026-02-23 17:43:21 +0000 (Mon, 23 Feb 2026)
Log Message:
-----------
implement functions before method using it to avoid predeclaring them
Modified Paths:
--------------
trunk/bibdesk/BDSKConverter.m
Modified: trunk/bibdesk/BDSKConverter.m
===================================================================
--- trunk/bibdesk/BDSKConverter.m 2026-02-23 17:41:29 UTC (rev 30046)
+++ trunk/bibdesk/BDSKConverter.m 2026-02-23 17:43:21 UTC (rev 30047)
@@ -47,9 +47,6 @@
@property (nonatomic, copy) NSDictionary *texifyAccents;
@property (nonatomic, copy) NSDictionary *detexifyAccents;
@property (nonatomic, copy) NSCharacterSet *baseCharacterSetForTeX;
-
-static BOOL convertComposedCharacterToTeX(NSMutableString *charString,
NSCharacterSet *baseCharacterSetForTeX, NSCharacterSet *accentCharSet,
NSDictionary *texifyAccents);
-static BOOL convertTeXStringToComposedCharacter(NSMutableString *texString,
NSDictionary *detexifyAccents);
@end
@implementation BDSKConverter
@@ -138,6 +135,44 @@
[self setDetexifyAccents:[wholeDict
objectForKey:TEX_TO_ROMAN_ACCENTS_KEY]];
}
+static BOOL convertComposedCharacterToTeX(NSMutableString *charString,
NSCharacterSet *baseCharacterSetForTeX, NSCharacterSet *accentCharSet,
NSDictionary *texifyAccents)
+{
+ // decompose to canonical form
+ CFStringNormalize((__bridge CFMutableStringRef)charString,
kCFStringNormalizationFormD);
+ NSUInteger decomposedLength = [charString length];
+
+ // first check if we can convert this, we should have a base character +
an accent we know
+ if (decomposedLength == 0 || [baseCharacterSetForTeX
characterIsMember:[charString characterAtIndex:0]] == NO)
+ return NO;
+ // no-op; this case will likely never happen
+ else if (decomposedLength == 1)
+ return YES;
+ // @@ we could allow decomposedLength > 2, it doesn't break TeX (though it
gives funny results)
+ else if (decomposedLength > 2 || [accentCharSet
characterIsMember:[charString characterAtIndex:1]] == NO)
+ return NO;
+
+ // isolate accent
+ NSString *accentChar = [charString substringWithRange:NSMakeRange(1, 1)];
+ NSString *accent = [texifyAccents objectForKey:accentChar];
+
+ // isolate character
+ NSString *character = [charString substringWithRange:NSMakeRange(0, 1)];
+
+ // handle i and j (others as well?)
+ if (([character isEqualToString:@"i"] || [character isEqualToString:@"j"])
&&
+ ![accent isEqualToString:@"c "] && ![accent isEqualToString:@"d "] &&
![accent isEqualToString:@"b "] && ![accent isEqualToString:@"k "]) {
+ character = [@"\\" stringByAppendingString:character];
+ }
+
+ // [accent length] == 2 in some cases, and the 'character' may or may not
have \\ prepended, so we'll just replace the entire string rather than trying
to catch all of those cases by recomputing lengths
+ [charString replaceCharactersInRange:NSMakeRange(0, decomposedLength)
withString:@"{\\"];
+ [charString appendString:accent];
+ [charString appendString:character];
+ [charString appendString:@"}"];
+
+ return YES;
+}
+
- (NSString *)copyStringByTeXifyingString:(NSString *)s{
if([NSString isEmptyString:s]){
@@ -200,111 +235,16 @@
return convertedSoFar ?: s;
}
-static BOOL convertComposedCharacterToTeX(NSMutableString *charString,
NSCharacterSet *baseCharacterSetForTeX, NSCharacterSet *accentCharSet,
NSDictionary *texifyAccents)
-{
- // decompose to canonical form
- CFStringNormalize((__bridge CFMutableStringRef)charString,
kCFStringNormalizationFormD);
- NSUInteger decomposedLength = [charString length];
-
- // first check if we can convert this, we should have a base character +
an accent we know
- if (decomposedLength == 0 || [baseCharacterSetForTeX
characterIsMember:[charString characterAtIndex:0]] == NO)
- return NO;
- // no-op; this case will likely never happen
- else if (decomposedLength == 1)
- return YES;
- // @@ we could allow decomposedLength > 2, it doesn't break TeX (though it
gives funny results)
- else if (decomposedLength > 2 || [accentCharSet
characterIsMember:[charString characterAtIndex:1]] == NO)
- return NO;
-
- // isolate accent
- NSString *accentChar = [charString substringWithRange:NSMakeRange(1, 1)];
- NSString *accent = [texifyAccents objectForKey:accentChar];
-
- // isolate character
- NSString *character = [charString substringWithRange:NSMakeRange(0, 1)];
-
- // handle i and j (others as well?)
- if (([character isEqualToString:@"i"] || [character isEqualToString:@"j"])
&&
- ![accent isEqualToString:@"c "] && ![accent isEqualToString:@"d
"] && ![accent isEqualToString:@"b "] && ![accent isEqualToString:@"k "]) {
- character = [@"\\" stringByAppendingString:character];
- }
-
- // [accent length] == 2 in some cases, and the 'character' may or may not
have \\ prepended, so we'll just replace the entire string rather than trying
to catch all of those cases by recomputing lengths
- [charString replaceCharactersInRange:NSMakeRange(0, decomposedLength)
withString:@"{\\"];
- [charString appendString:accent];
- [charString appendString:character];
- [charString appendString:@"}"];
-
- return YES;
-}
-
-- (NSString *)copyStringByDeTeXifyingString:(NSString *)s{
-
- if([NSString isEmptyString:s]){
- return s;
- }
-
- NSUInteger start, length = [s length];
- NSRange range = [s rangeOfString:@"{\\" options:0 range:NSMakeRange(0,
length)];
-
- if (range.length == 0){
- return s;
- }
-
- NSMutableString *tmpConv = nil;
- NSString *TEXString = nil;
- NSRange closingRange, replaceRange;
- NSMutableString *convertedSoFar = [s mutableCopy];
- BOOL converted = NO;
-
- while (range.length > 0) {
-
- start = NSMaxRange(range);
- closingRange = [convertedSoFar rangeOfString:@"}" options:0
range:NSMakeRange(start, length - start)];
-
- if (closingRange.length) {
-
- replaceRange = NSMakeRange(range.location, closingRange.location -
range.location + 1);
- CFStringRef tmpString = CFStringCreateWithSubstring(NULL,
(__bridge CFStringRef)convertedSoFar, CFRangeMake(replaceRange.location,
replaceRange.length));
- tmpConv = [(__bridge NSString *)tmpString mutableCopy];
- CFRelease(tmpString);
-
- // see if the dictionary has a conversion, or try Unicode
composition
- if(TEXString = [detexifyConversions objectForKey:tmpConv]){
- [convertedSoFar replaceCharactersInRange:replaceRange
withString:TEXString];
- converted = YES;
- }else if(convertTeXStringToComposedCharacter(tmpConv,
detexifyAccents)) {
- [convertedSoFar replaceCharactersInRange:replaceRange
withString:tmpConv];
- converted = YES;
- }
-
- // advance the starting search range by a single character, so if
replacement failed we don't start at {\ again
- // this is inside the if() since if there were no closing braces,
there's no point in repeating the search
- length = [convertedSoFar length];
- range = [convertedSoFar rangeOfString:@"{\\" options:0
range:NSMakeRange(replaceRange.location + 1, length - replaceRange.location -
1)];
- } else {
- NSLog(@"missing brace in string %@", convertedSoFar);
- range = NSMakeRange(NSNotFound, 0);
- }
- }
- BDSKPOSTCONDITION(nil != convertedSoFar);
- if (converted) {
- return convertedSoFar;
- } else {
- return s;
- }
-}
-
// takes a sequence such as "{\'i}" or "{\v S}" (no quotes) and converts to
appropriate composed characters
// returns nil if unable to convert
static BOOL convertTeXStringToComposedCharacter(NSMutableString *texString,
NSDictionary *detexifyAccents)
-{
+{
// check this before creating a scanner
if (nil == texString)
return NO;
- NSString *texAccent = nil;
- NSString *accent = nil;
+ NSString *texAccent = nil;
+ NSString *accent = nil;
CFIndex idx = 0, length = [texString length];
CFStringInlineBuffer inlineBuffer;
@@ -322,7 +262,7 @@
accent = [detexifyAccents objectForKey:texAccent];
if (nil == accent)
- return NO;
+ return NO;
// get the character immediately following the accent
ch = CFStringGetCharacterFromInlineBuffer(&inlineBuffer, idx);
@@ -377,6 +317,63 @@
return NO;
}
+- (NSString *)copyStringByDeTeXifyingString:(NSString *)s{
+
+ if([NSString isEmptyString:s]){
+ return s;
+ }
+
+ NSUInteger start, length = [s length];
+ NSRange range = [s rangeOfString:@"{\\" options:0 range:NSMakeRange(0,
length)];
+
+ if (range.length == 0){
+ return s;
+ }
+
+ NSMutableString *tmpConv = nil;
+ NSString *TEXString = nil;
+ NSRange closingRange, replaceRange;
+ NSMutableString *convertedSoFar = [s mutableCopy];
+ BOOL converted = NO;
+
+ while (range.length > 0) {
+
+ start = NSMaxRange(range);
+ closingRange = [convertedSoFar rangeOfString:@"}" options:0
range:NSMakeRange(start, length - start)];
+
+ if (closingRange.length) {
+
+ replaceRange = NSMakeRange(range.location, closingRange.location -
range.location + 1);
+ CFStringRef tmpString = CFStringCreateWithSubstring(NULL,
(__bridge CFStringRef)convertedSoFar, CFRangeMake(replaceRange.location,
replaceRange.length));
+ tmpConv = [(__bridge NSString *)tmpString mutableCopy];
+ CFRelease(tmpString);
+
+ // see if the dictionary has a conversion, or try Unicode
composition
+ if(TEXString = [detexifyConversions objectForKey:tmpConv]){
+ [convertedSoFar replaceCharactersInRange:replaceRange
withString:TEXString];
+ converted = YES;
+ }else if(convertTeXStringToComposedCharacter(tmpConv,
detexifyAccents)) {
+ [convertedSoFar replaceCharactersInRange:replaceRange
withString:tmpConv];
+ converted = YES;
+ }
+
+ // advance the starting search range by a single character, so if
replacement failed we don't start at {\ again
+ // this is inside the if() since if there were no closing braces,
there's no point in repeating the search
+ length = [convertedSoFar length];
+ range = [convertedSoFar rangeOfString:@"{\\" options:0
range:NSMakeRange(replaceRange.location + 1, length - replaceRange.location -
1)];
+ } else {
+ NSLog(@"missing brace in string %@", convertedSoFar);
+ range = NSMakeRange(NSNotFound, 0);
+ }
+ }
+ BDSKPOSTCONDITION(nil != convertedSoFar);
+ if (converted) {
+ return convertedSoFar;
+ } else {
+ return s;
+ }
+}
+
@end
@implementation NSString (BDSKConverter)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit