Revision: 24430
          http://sourceforge.net/p/bibdesk/svn/24430
Author:   hofman
Date:     2019-12-08 15:34:08 +0000 (Sun, 08 Dec 2019)
Log Message:
-----------
Add parser for RSS containing PRISM and Dublin Core elements

Modified Paths:
--------------
    trunk/bibdesk/BDSKStringParser.h
    trunk/bibdesk/BDSKStringParser.m
    trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj

Added Paths:
-----------
    trunk/bibdesk/BDSKPRISMParser.h
    trunk/bibdesk/BDSKPRISMParser.m

Added: trunk/bibdesk/BDSKPRISMParser.h
===================================================================
--- trunk/bibdesk/BDSKPRISMParser.h                             (rev 0)
+++ trunk/bibdesk/BDSKPRISMParser.h     2019-12-08 15:34:08 UTC (rev 24430)
@@ -0,0 +1,43 @@
+//
+//  BDSKPRISMParser.h
+//  BibDesk
+//
+//  Created by Christiaan Hofman on 08/12/2019.
+/*
+This software is Copyright (c) 2019
+Christiaan Hofman. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+
+- Neither the name of Christiaan Hofman nor the names of any
+contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#import <Cocoa/Cocoa.h>
+#import "BDSKStringParser.h"
+
+@interface BDSKPRISMParser : NSObject <BDSKStringParser>
+@end

Added: trunk/bibdesk/BDSKPRISMParser.m
===================================================================
--- trunk/bibdesk/BDSKPRISMParser.m                             (rev 0)
+++ trunk/bibdesk/BDSKPRISMParser.m     2019-12-08 15:34:08 UTC (rev 24430)
@@ -0,0 +1,183 @@
+//
+//  BDSKPRISMParser.m
+//  BibDesk
+//
+//  Created by Christiaan Hofman on 08/12/2019.
+/*
+This software is Copyright (c) 2019
+Christiaan Hofman. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+
+- Neither the name of Christiaan Hofman nor the names of any
+contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#import "BDSKPRISMParser.h"
+#import <AGRegex/AGRegex.h>
+#import "BibItem.h"
+#import "BDSKStringConstants.h"
+
+
+@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.]+/?\""];
+    return nil != [regex findInString:string];
+}
+
+static NSString *joinedArrayComponents(NSArray *arrayOfXMLNodes, NSString 
*separator) {
+    NSArray *strings = [arrayOfXMLNodes valueForKeyPath:@"stringValue"];
+    return [strings componentsJoinedByString:separator];
+}
+
+static NSArray *dcOrPrismProperties(NSXMLNode *node, NSString *key) {
+    NSArray *array = [node nodesForXPath:[NSString stringWithFormat:@"dc:%@", 
key] error:NULL];
+    if ([array count] == 0)
+        array = [node nodesForXPath:[NSString stringWithFormat:@"prism:%@", 
key] error:NULL];
+    if ([array count] == 0)
+        array = [node nodesForXPath:key error:NULL];
+    return [array count] ? array : nil;
+}
+
+static NSString *yearFromDate(NSString *dateString) {
+    NSUInteger idx = [dateString rangeOfString:@"-"].location;
+    if (idx != NSNotFound)
+        return [dateString substringToIndex:idx];
+    return dateString;
+}
+
+static NSString *monthFromDate(NSString *dateString) {
+    NSUInteger idx = [dateString rangeOfString:@"-"].location;
+    if (idx != NSNotFound) {
+        NSUInteger endIdx = [dateString rangeOfString:@"-" options:0 
range:NSMakeRange(idx + 1, [dateString length] - idx - 1)].location;
+        if (endIdx != NSNotFound)
+            return [dateString substringWithRange:NSMakeRange(idx + 1, endIdx 
- idx - 1)];
+    }
+    return @"";
+}
+
++ (NSArray *)itemsFromString:(NSString *)xmlString error:(NSError **)outError {
+    if (nil == xmlString)
+        return [NSArray array];
+    
+    NSXMLDocument *doc = [[NSXMLDocument alloc] initWithXMLString:xmlString 
options:0 error:outError];
+    
+    if (nil == doc)
+        return nil;
+    
+    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];
+        NSMutableArray *authors = [NSMutableArray array];
+        NSArray *array;
+
+        [authors addObjectsFromArray:dcOrPrismProperties(node, @"creator")];
+        [authors addObjectsFromArray:dcOrPrismProperties(node, 
@"contributor")];
+        if ([authors count] == 0)
+            [authors addObjectsFromArray:dcOrPrismProperties(node, @"author")];
+        [pubDict setObject:joinedArrayComponents(authors, @" and ") 
forKey:BDSKAuthorString];
+        
+        if ((array = dcOrPrismProperties(node, @"title")) ||
+            (array = dcOrPrismProperties(node, @"publicationName")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKTitleString];
+        
+        if ((array = dcOrPrismProperties(node, @"subject")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKKeywordsString];
+        
+        if ((array = dcOrPrismProperties(node, @"publisher")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKPublisherString];
+        
+        if ((array = dcOrPrismProperties(node, @"location")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:@"Location"];
+        
+        if ((array = dcOrPrismProperties(node, @"date")) ||
+            (array = dcOrPrismProperties(node, @"coverDate"))) {
+            NSString *dateString = joinedArrayComponents(array, separator);
+            [pubDict setObject:dateString forKey:BDSKDateString];
+            [pubDict setObject:yearFromDate(dateString) forKey:BDSKYearString];
+            [pubDict setObject:monthFromDate(dateString) 
forKey:BDSKMonthString];
+        }
+
+        if ((array = dcOrPrismProperties(node, @"description"))) {
+            NSString *cleanString = joinedArrayComponents(array, separator);
+            cleanString = [cleanString 
stringByCollapsingAndTrimmingCharactersInSet:[NSCharacterSet 
whitespaceAndNewlineCharacterSet]];
+            if (cleanString)
+                [pubDict setObject:cleanString 
forKey:BDSKRssDescriptionString];
+        }
+        
+        if ((array = dcOrPrismProperties(node, @"url")) ||
+            (array = dcOrPrismProperties(node, @"relation")) ||
+            (array = dcOrPrismProperties(node, @"link")) )
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKUrlString];
+        
+        if ((array = dcOrPrismProperties(node, @"source")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKJournalString];
+        
+        if ((array = dcOrPrismProperties(node, @"volume")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKVolumeString];
+        
+        if ((array = dcOrPrismProperties(node, @"number")))
+            [pubDict setObject:joinedArrayComponents(array, separator) 
forKey:BDSKNumberString];
+        
+        if ((array = dcOrPrismProperties(node, @"doi")) ||
+            (array = dcOrPrismProperties(node, @"identifier"))) {
+            NSString *doi = joinedArrayComponents(array, separator);
+            if ([doi hasCaseInsensitivePrefix:@"doi:"])
+                doi = [doi substringFromIndex:4];
+            [pubDict setObject:doi forKey:BDSKDoiString];
+        }
+        
+        NSString *startingPage = nil;
+        NSString *endingPage = nil;
+
+        if ((array = dcOrPrismProperties(node, @"startingPage")))
+            startingPage = joinedArrayComponents(array, separator);
+        if ((array = dcOrPrismProperties(node, @"endingPage")))
+            endingPage = joinedArrayComponents(array, separator);
+        if (startingPage && endingPage)
+            [pubDict setObject:[NSString stringWithFormat:@"%@--%@", 
startingPage, endingPage] forKey:BDSKPagesString];
+        
+        BibItem *pub = [[BibItem alloc] initWithType:BDSKArticleString
+                                             citeKey:nil
+                                           pubFields:pubDict
+                                               isNew:YES];
+        [pubDict release];
+        [pubs addObject:pub];
+        [pub release];
+    }
+    
+    [doc release];
+    
+    return pubs;
+}
+ 
+@end

Modified: trunk/bibdesk/BDSKStringParser.h
===================================================================
--- trunk/bibdesk/BDSKStringParser.h    2019-12-08 07:30:35 UTC (rev 24429)
+++ trunk/bibdesk/BDSKStringParser.h    2019-12-08 15:34:08 UTC (rev 24430)
@@ -48,7 +48,8 @@
        BDSKStringTypeReferenceMiner,
        BDSKStringTypeJSTOR,
        BDSKStringTypeWOS,
-       BDSKStringTypeDublinCore,
+    BDSKStringTypeDublinCore,
+    BDSKStringTypePRISM,
     BDSKStringTypeRefer,
     BDSKStringTypeMODS,
     BDSKStringTypeSciFinder,

Modified: trunk/bibdesk/BDSKStringParser.m
===================================================================
--- trunk/bibdesk/BDSKStringParser.m    2019-12-08 07:30:35 UTC (rev 24429)
+++ trunk/bibdesk/BDSKStringParser.m    2019-12-08 15:34:08 UTC (rev 24430)
@@ -46,6 +46,7 @@
 #import "BDSKJSTORParser.h"
 #import "BDSKWebOfScienceParser.h"
 #import "BDSKDublinCoreXMLParser.h"
+#import "BDSKPRISMParser.h"
 #import "BDSKReferParser.h"
 #import "BDSKMODSParser.h"
 #import "BDSKSciFinderParser.h"
@@ -67,6 +68,7 @@
                case BDSKStringTypeJSTOR:           return [BDSKJSTORParser 
class];
         case BDSKStringTypeWOS:             return [BDSKWebOfScienceParser 
class];
         case BDSKStringTypeDublinCore:      return [BDSKDublinCoreXMLParser 
class];
+        case BDSKStringTypePRISM:           return [BDSKPRISMParser class];
         case BDSKStringTypeRefer:           return [BDSKReferParser class];
         case BDSKStringTypeMODS:            return [BDSKMODSParser class];
         case BDSKStringTypeSciFinder:       return [BDSKSciFinderParser class];
@@ -167,6 +169,8 @@
         return BDSKStringTypeSciFinder;
     if([BDSKPubMedXMLParser canParseString:self])
         return BDSKStringTypePubMedXML;
+    if([BDSKPRISMParser canParseString:self])
+        return BDSKStringTypePRISM;
     if([BDSKDOIParser canParseString:self])
         return BDSKStringTypeDOI;
        // don't check DC, as the check is too unreliable

Modified: trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
===================================================================
--- trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj     2019-12-08 07:30:35 UTC 
(rev 24429)
+++ trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj     2019-12-08 15:34:08 UTC 
(rev 24430)
@@ -548,6 +548,8 @@
                CE8D829E2353D63B0059D200 /* relaunch in Copy Files: relaunch */ 
= {isa = PBXBuildFile; fileRef = CE65AE022263784700465ECC /* relaunch */; 
settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
                CE8DAD901098976400896F69 /* BDSKMetadataCacheOperation.m in 
Sources */ = {isa = PBXBuildFile; fileRef = CE8DAD8E1098976400896F69 /* 
BDSKMetadataCacheOperation.m */; };
                CE8F5F840DEEB26800061148 /* ZoomValues.strings in Resources */ 
= {isa = PBXBuildFile; fileRef = CE8F5F830DEEB26800061148 /* ZoomValues.strings 
*/; };
+               CE8F75BA239D3F7F00511336 /* BDSKPRISMParser.h in Headers */ = 
{isa = PBXBuildFile; fileRef = CE8F75B8239D3F7F00511336 /* BDSKPRISMParser.h 
*/; };
+               CE8F75BB239D3F7F00511336 /* BDSKPRISMParser.m in Sources */ = 
{isa = PBXBuildFile; fileRef = CE8F75B9239D3F7F00511336 /* BDSKPRISMParser.m 
*/; };
                CE90BAFD103978D300992D50 /* BDSKURLSheetController.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = CE90BAFB103978D300992D50 /* 
BDSKURLSheetController.m */; };
                CE94C0D910A8F240002634D2 /* SkimNotesBase.framework in Copy 
Files: Frameworks */ = {isa = PBXBuildFile; fileRef = CE52E69D0E2D2B87007B6C62 
/* SkimNotesBase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; 
};
                CE94C0DA10A8F2A2002634D2 /* SkimNotesBase.framework in 
Frameworks */ = {isa = PBXBuildFile; fileRef = CE52E69D0E2D2B87007B6C62 /* 
SkimNotesBase.framework */; };
@@ -1581,6 +1583,8 @@
                CE8DAD8E1098976400896F69 /* BDSKMetadataCacheOperation.m */ = 
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; path = BDSKMetadataCacheOperation.m; sourceTree = "<group>"; 
};
                CE8F5F800DEEB24700061148 /* en */ = {isa = PBXFileReference; 
fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = 
en.lproj/ZoomValues.strings; sourceTree = "<group>"; };
                CE8F5F850DEEB27600061148 /* fr */ = {isa = PBXFileReference; 
fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = 
fr.lproj/ZoomValues.strings; sourceTree = "<group>"; };
+               CE8F75B8239D3F7F00511336 /* BDSKPRISMParser.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BDSKPRISMParser.h; 
sourceTree = "<group>"; };
+               CE8F75B9239D3F7F00511336 /* BDSKPRISMParser.m */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
BDSKPRISMParser.m; sourceTree = "<group>"; };
                CE90BAFA103978D300992D50 /* BDSKURLSheetController.h */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path 
= BDSKURLSheetController.h; sourceTree = "<group>"; };
                CE90BAFB103978D300992D50 /* BDSKURLSheetController.m */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; 
path = BDSKURLSheetController.m; sourceTree = "<group>"; };
                CE95A5790A88883300334DFA /* BDSKReadMeController.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
BDSKReadMeController.h; sourceTree = "<group>"; };
@@ -2462,6 +2466,8 @@
                                CEAE613D097FF60A000B618C /* BDSKJSTORParser.m 
*/,
                                CE34A5720B249E0B00755730 /* BDSKMARCParser.m */,
                                F9D0E5350BF92768001C6C22 /* BDSKMODSParser.m */,
+                               CE8F75B8239D3F7F00511336 /* BDSKPRISMParser.h 
*/,
+                               CE8F75B9239D3F7F00511336 /* BDSKPRISMParser.m 
*/,
                                F9022CA70758038000C3F701 /* BDSKPubMedParser.m 
*/,
                                CE73BACF0FB1CE9600A43716 /* 
BDSKPubMedXMLParser.m */,
                                F940D1080B5568E400B5917A /* BDSKReferParser.m 
*/,
@@ -3627,6 +3633,7 @@
                                CE2A09FD224599E100A8F31C /* BDSKFilePathCell.h 
in Headers */,
                                CE2A0A52224599F600A8F31C /* BDSKReferParser.h 
in Headers */,
                                CE5417E322D4DA9500867189 /* 
BDSKAuthenticationController.h in Headers */,
+                               CE8F75BA239D3F7F00511336 /* BDSKPRISMParser.h 
in Headers */,
                                CE2A0A03224599E900A8F31C /* BDSKFilter.h in 
Headers */,
                                CE2A0A9622459A3600A8F31C /* 
BDSKTypeSelectHelper.h in Headers */,
                                CE2A09D6224599B300A8F31C /* 
BDSKComplexStringFormatter.h in Headers */,
@@ -4284,6 +4291,7 @@
                                F9022C87075802E300C3F701 /* BibPref_AutoFile.m 
in Sources */,
                                CEEBC98D20D7F6E60008F2B7 /* BDSKInfo.m in 
Sources */,
                                F9022C88075802E300C3F701 /* BibPref_CiteKey.m 
in Sources */,
+                               CE8F75BB239D3F7F00511336 /* BDSKPRISMParser.m 
in Sources */,
                                F9022C8D0758034000C3F701 /* BibDocument_Menus.m 
in Sources */,
                                F9022C8E0758034000C3F701 /* 
BibDocument_Toolbar.m in Sources */,
                                F9022CAA0758038000C3F701 /* 
BDSKStringConstants.m in Sources */,

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