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