Revision: 24447
          http://sourceforge.net/p/bibdesk/svn/24447
Author:   hofman
Date:     2019-12-10 22:31:48 +0000 (Tue, 10 Dec 2019)
Log Message:
-----------
Look for both prism and dc namespace

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

Modified: trunk/bibdesk/BDSKPRISMParser.m
===================================================================
--- trunk/bibdesk/BDSKPRISMParser.m     2019-12-10 21:43:42 UTC (rev 24446)
+++ trunk/bibdesk/BDSKPRISMParser.m     2019-12-10 22:31:48 UTC (rev 24447)
@@ -45,7 +45,10 @@
 @implementation BDSKPRISMParser
 
 + (BOOL)canParseString:(NSString *)string {
-    AGRegex *regex = [AGRegex regexWithPattern:@"<rdf:RDF 
[^>]*xmlns:prism=\"http://(prismstandard\\.org/namespaces/basic|purl\\.org/dc/elements)/[0-9.]+/?\""];
+    AGRegex *regex = [AGRegex regexWithPattern:@"<rdf:RDF 
[^>]*xmlns:prism=\"http://prismstandard\\.org/namespaces/basic/[0-9.]+/?\"";];
+    if (nil == [regex findInString:string])
+        return NO;
+    regex = [AGRegex regexWithPattern:@"<rdf:RDF 
[^>]*xmlns:dc=\"http://purl\\.org/dc/elements/[0-9.]+/?\"";];
     return nil != [regex findInString:string];
 }
 
@@ -59,6 +62,12 @@
     return array;
 }
 
+static NSString *cleanCDATA(NSString *string) {
+    if ([string hasPrefix:@"<![CDATA["] && [string hasSuffix:@"]]"])
+        return [string substringWithRange:NSMakeRange(9, [string length] - 
11)];
+    return string;
+}
+
 + (NSArray *)itemsFromString:(NSString *)xmlString error:(NSError **)outError {
     if (nil == xmlString)
         return [NSArray array];
@@ -70,15 +79,13 @@
     
     NSMutableArray *pubs = [NSMutableArray array];
     
-    NSString *separator = [[NSUserDefaults standardUserDefaults] 
stringForKey:BDSKDefaultGroupFieldSeparatorKey];
-    
     NSArray *items = [[doc rootElement] nodesForXPath:@"./item" error:NULL];
     
     for (NSXMLNode *node in items) {
         NSMutableDictionary *pubDict = [[NSMutableDictionary alloc] 
initWithCapacity:5];
+        NSArray *array;
+        
         NSMutableArray *authors = [NSMutableArray array];
-        NSArray *array;
-
         [authors addObjectsFromArray:getProperties(node, @"dc:creator")];
         [authors addObjectsFromArray:getProperties(node, @"dc:contributor")];
         if ([authors count] == 0)
@@ -89,23 +96,23 @@
         if ((array = getProperties(node, @"dc:title")) ||
             (array = getProperties(node, @"title")) ||
             (array = getProperties(node, @"prism:publicationName")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKTitleString];
+            [pubDict setObject:cleanCDATA([array firstObject]) 
forKey:BDSKTitleString];
         
         if ((array = getProperties(node, @"prism:keyword")) ||
             (array = getProperties(node, @"dc:subject")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKKeywordsString];
+            [pubDict setObject:[array 
componentsJoinedByString:[[NSUserDefaults standardUserDefaults] 
stringForKey:BDSKDefaultGroupFieldSeparatorKey]] forKey:BDSKKeywordsString];
         
         if ((array = getProperties(node, @"dc:publisher")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKPublisherString];
+            [pubDict setObject:[array firstObject] forKey:BDSKPublisherString];
         
         if ((array = getProperties(node, @"dc:location")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:@"Location"];
+            [pubDict setObject:[array firstObject] forKey:@"Location"];
         
         if ((array = getProperties(node, @"prism:coverDate")) ||
             (array = getProperties(node, @"dc:date")) ||
             (array = getProperties(node, @"prism:publicationDate")) ||
             (array = getProperties(node, @"pubDate"))) {
-            NSString *dateString = [array componentsJoinedByString:separator];
+            NSString *dateString = [array firstObject];
             [pubDict setObject:dateString forKey:BDSKDateString];
             array = [dateString componentsSeparatedByString:@"-"];
             if ([array count] > 0)
@@ -117,8 +124,8 @@
         if ((array = getProperties(node, @"dc:description")) ||
             (array = getProperties(node, @"description")) ||
             (array = getProperties(node, @"content:endoded"))) {
-            NSString *cleanString = [array componentsJoinedByString:separator];
-            cleanString = [cleanString 
stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines];
+            NSString *cleanString = [array firstObject];
+            cleanString = cleanCDATA([cleanString 
stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines]);
             if (cleanString)
                 [pubDict setObject:cleanString forKey:BDSKAbstractString];
         }
@@ -127,22 +134,27 @@
             (array = getProperties(node, @"url")) ||
             (array = getProperties(node, @"link")) ||
             (array = getProperties(node, @"dc:relation")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKUrlString];
+            [pubDict setObject:[array firstObject] forKey:BDSKUrlString];
         
-        if ((array = getProperties(node, @"dc:source")) ||
-            (array = getProperties(node, @"prism:publicationName")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKJournalString];
+        NSString *journal = nil;
+        if ((array = getProperties(node, @"dc:source")))
+            journal = [array firstObject];
+        if ((array = getProperties(node, @"prism:publicationName")) &&
+            (journal == nil || [journal hasPrefix:[array firstObject]]))
+            journal = [array firstObject];
+        if (journal)
+            [pubDict setObject:journal forKey:BDSKJournalString];
         
         if ((array = getProperties(node, @"prism:volume")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKVolumeString];
+            [pubDict setObject:[array firstObject] forKey:BDSKVolumeString];
         
         if ((array = getProperties(node, @"prism:number")))
-            [pubDict setObject:[array componentsJoinedByString:separator] 
forKey:BDSKNumberString];
+            [pubDict setObject:[array firstObject] forKey:BDSKNumberString];
         
         if ((array = getProperties(node, @"prism:doi")) ||
             (array = getProperties(node, @"dc:identifier")) ||
             (array = getProperties(node, @"guid"))) {
-            NSString *doi = [array componentsJoinedByString:separator];
+            NSString *doi = [array firstObject];
             if ([doi hasCaseInsensitivePrefix:@"doi:"])
                 doi = [doi substringFromIndex:4];
             [pubDict setObject:doi forKey:BDSKDoiString];
@@ -150,16 +162,16 @@
         
         NSString *pages = nil;
         if ((array = getProperties(node, @"prism:startingPage"))) {
-            pages = [array componentsJoinedByString:separator];
+            pages = [array firstObject];
             if ((array = getProperties(node, @"prism:endingPage")))
-                pages = [NSString stringWithFormat:@"%@-%@", pages, [array 
componentsJoinedByString:separator]];
+                pages = [NSString stringWithFormat:@"%@-%@", pages, [array 
firstObject]];
             else if ((array = getProperties(node, @"prism:pageCount")))
-                pages = [NSString stringWithFormat:@"%@-%ld", pages, (unsigned 
long)([pages integerValue] + [[array componentsJoinedByString:separator] 
integerValue])];
+                pages = [NSString stringWithFormat:@"%@-%ld", pages, (unsigned 
long)([pages integerValue] + [[array firstObject] integerValue])];
             else
                 pages = nil;
         }
         if (pages == nil && (array = getProperties(node, @"prism:pageRange")))
-            pages = [array componentsJoinedByString:separator];
+            pages = [array firstObject];
         if (pages)
             [pubDict setObject:pages forKey:BDSKPagesString];
         

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