Revision: 28204
          http://sourceforge.net/p/bibdesk/svn/28204
Author:   hofman
Date:     2023-04-06 09:18:12 +0000 (Thu, 06 Apr 2023)
Log Message:
-----------
compare font weight rather than font

Modified Paths:
--------------
    trunk/bibdesk/BibDocument_Actions.m
    trunk/bibdesk/NSFont_BDSKExtensions.m

Modified: trunk/bibdesk/BibDocument_Actions.m
===================================================================
--- trunk/bibdesk/BibDocument_Actions.m 2023-04-03 21:55:20 UTC (rev 28203)
+++ trunk/bibdesk/BibDocument_Actions.m 2023-04-06 09:18:12 UTC (rev 28204)
@@ -98,6 +98,29 @@
 
 #define BDSKLyXPipePathKey @"BDSKLyXPipePath"
 
+@interface BDSKJournalName : NSObject {
+    NSString *name;
+    NSString *abbreviatedName;
+    NSString *dotlessAbbreviatedName;
+}
+- (id)initWithName:(NSString *)aName abbreviatedName:(NSString 
*)anAbbreviatedName;
+- (id)initWithDictionary:(NSDictionary *)dictionary;
+@property (nonatomic, readonly) NSString *name;
+@property (nonatomic, readonly) NSString *abbreviatedName;
+@property (nonatomic, readonly) NSString *dotlessAbbreviatedName;
+@property (nonatomic, readonly) NSDictionary *dictionaryValue;
+- (BOOL)isMatchedBy:(NSString *)name;
+@end
+
+@interface BDSKJournalNameManager : NSObject {
+    NSMutableArray *journalNames;
+}
++ (BDSKJournalNameManager *)sharedManager;
+@property (nonatomic, readonly) NSArray *journalNames;
+- (void)loadNames;
+- (BDSKJournalName *)journalNameForName:(NSString *)name;
+@end
+
 @implementation BibDocument (Actions)
 
 #pragma mark -
@@ -1665,6 +1688,38 @@
     }];
 }
 
+- (IBAction)normalizeJournalNames:(id)sender {
+    if ([self numberOfSelectedPubs] == 0 ||
+        [self displaysFileSearch] == NSMixedState ||
+        [self hasGroupTypeSelected:BDSKExternalGroupType] ||
+        [self commitPendingEdits] == NO) {
+        NSBeep();
+        return;
+    }
+    
+    BDSKJournalNameManager *journalNames = [BDSKJournalNameManager 
sharedManager];
+    NSInteger type = [sender tag];
+    BOOL didChange = NO;
+    NSMutableSet *unknownJournals = [NSMutableSet set];
+    
+    for (BibItem *pub in [self selectedPublications]) {
+        NSString *journal = [pub valueOfField:BDSKJournalString inherit:NO];
+        if ([NSString isEmptyString:journal]) continue;
+        
+        BDSKJournalName *journalName = [journalNames 
journalNameForName:journal];
+        if (journalName == nil) {
+            [unknownJournals addObject:journalName];
+            continue;
+        }
+        
+        NSString *newJournal = type == 0 ? [journalName name] : type == 1 ? 
[journalName abbreviatedName] : [journalName dotlessAbbreviatedName];
+        if ([journal isEqualToString:newJournal]) continue;
+        
+        [pub setField:BDSKJournalString toValue:newJournal];
+        didChange = YES;
+    }
+}
+
 #pragma mark Duplicate and Incomplete searching
 
 // select duplicates, then allow user to delete/copy/whatever
@@ -1841,3 +1896,115 @@
 }
 
 @end
+
+
+@implementation BDSKJournalName
+
+@synthesize name, abbreviatedName, dotlessAbbreviatedName;
+@dynamic dictionaryValue;
+
+- (id)initWithName:(NSString *)aName abbreviatedName:(NSString 
*)anAbbreviatedName {
+    self = [super init];
+    if (self) {
+        name = [aName retain];
+        abbreviatedName = [anAbbreviatedName retain];
+        dotlessAbbreviatedName = [[abbreviatedName 
stringByDeletingCharactersInSet:[NSCharacterSet 
characterSetWithCharactersInString:@"."]] retain];
+    }
+    return self;
+}
+
+- (id)initWithDictionary:(NSDictionary *)dictionary {
+    return [self initWithName:[dictionary objectForKey:@"name"] 
abbreviatedName:[dictionary objectForKey:@"abbreviated"]];
+}
+
+- (void)dealloc {
+    BDSKDESTROY(name);
+    BDSKDESTROY(abbreviatedName);
+    BDSKDESTROY(dotlessAbbreviatedName);
+    [super dealloc];
+}
+
+- (BOOL)isEqual:(id)other {
+    if (self == other)
+        return YES;
+    if (NO == [other isKindOfClass:[self class]])
+        return NO;
+    return [name isEqualToString:[(BDSKJournalName *)other name]] && 
[abbreviatedName isEqualToString:[other abbreviatedName]];
+}
+
+- (NSUInteger)hash {
+    return [name hash];
+}
+
+- (NSDictionary *)dictionaryValue {
+    return [NSDictionary dictionaryWithObjectsAndKeys:name, @"name", 
abbreviatedName, @"abbreviated", nil];
+}
+
+- (BOOL)isMatchedBy:(NSString *)aName {
+    return [aName isCaseInsensitiveEqual:[self name]] || [aName 
isCaseInsensitiveEqual:[self abbreviatedName]] || [aName 
isCaseInsensitiveEqual:[self dotlessAbbreviatedName]];
+}
+
+@end
+
+@implementation BDSKJournalNameManager
+
+@synthesize journalNames;
+
++ (BDSKJournalNameManager *)sharedManager {
+    static BDSKJournalNameManager *sharedManager = nil;
+    if (sharedManager == nil)
+        sharedManager = [[BDSKJournalNameManager alloc] init];
+    return sharedManager;
+}
+
+- (id)init {
+    self = [super init];
+    if (self) {
+        journalNames = [[NSMutableArray alloc] init];
+        [self loadNames];
+    }
+    return nil;
+}
+
+- (void)dealloc {
+    BDSKDESTROY(journalNames);
+    [super dealloc];
+}
+
+- (void)loadNames {
+    NSURL *namesURL = [[NSBundle mainBundle] 
URLForResource:@"JournalNames.plist" withExtension:nil];
+    NSArray *nameDicts = [NSArray arrayWithContentsOfURL:namesURL];
+    NSMutableArray *names = [NSMutableArray array];
+
+    [journalNames removeAllObjects];
+    for (NSDictionary *dict in nameDicts) {
+        BDSKJournalName *journal = [[BDSKJournalName alloc] 
initWithDictionary:dict];
+        [journalNames addObject:journal];
+        [names addObject:[[journal name] lowercaseString]];
+        [journal release];
+    }
+    
+    namesURL = [[[NSFileManager defaultManager] 
applicationSupportDirectoryURL] 
URLByAppendingPathComponent:@"JournalNames.plist" isDirectory:NO];
+    if ([namesURL checkResourceIsReachableAndReturnError:NULL]) {
+        nameDicts = [NSArray arrayWithContentsOfURL:namesURL];
+        for (NSDictionary *dict in nameDicts) {
+            BDSKJournalName *journal = [[BDSKJournalName alloc] 
initWithDictionary:dict];
+            NSUInteger i = [names indexOfObject:[[journal name] 
lowercaseString]];
+            if (i == NSNotFound)
+                [journalNames addObject:journal];
+            else
+                [journalNames replaceObjectAtIndex:i withObject:journal];
+            [journal release];
+        }
+    }
+}
+
+- (BDSKJournalName *)journalNameForName:(NSString *)name {
+    for (BDSKJournalName *journalName in journalNames) {
+        if ([journalName isMatchedBy:name])
+            return journalName;
+    }
+    return nil;
+}
+
+@end

Modified: trunk/bibdesk/NSFont_BDSKExtensions.m
===================================================================
--- trunk/bibdesk/NSFont_BDSKExtensions.m       2023-04-03 21:55:20 UTC (rev 
28203)
+++ trunk/bibdesk/NSFont_BDSKExtensions.m       2023-04-06 09:18:12 UTC (rev 
28204)
@@ -210,9 +210,10 @@
         while (weight < 8) {
             NSFont *bolderFont = [fm convertWeight:YES ofFont:font];
             NSInteger bolderWeight = [fm weightOfFont:bolderFont];
-            if (bolderWeight > 9 || [font isEqual:bolderFont])
+            if (bolderWeight > 9 || bolderWeight == weight)
                 break;
             font = bolderFont;
+            weight = bolderWeight;
         }
         if (demiFonts == nil)
             demiFonts = [[NSMutableDictionary alloc] init];

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



_______________________________________________
Bibdesk-commit mailing list
Bibdesk-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to