www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 032e0439a1ebfa51cde5b9e4f0c9281bb02dc024
parent 6a3c62c23c446d2906f58da737e578506bc4a1ca
Author: Simon Kornblith <simon@simonster.com>
Date:   Thu, 11 Sep 2008 04:40:07 +0000

commit translators as separate files, combine CiteBase translators, and modify SPIE translator


Diffstat:
Atranslators/A Contra Corriente.js | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ABC-CLIO Serials Web.js | 142++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ACM.js | 139+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ACS Publications.js | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AGU Journals.js | 258+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AJHG.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AMS Journals.js | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AMS MathSciNet.js | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AMS Online Journals - Allenpress.js | 294+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/APA PsycNET.js | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ARTFL Encyclopedie.js | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ARTstor.js | 258+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ASCE.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AcademicJournals.net.js | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AdvoCAT.js | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/African Journals Online.js | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AfroEuropa.js | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Agencia del ISBN.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Alexander Street Press.js | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AlterNet.js | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Aluka.js | 192+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Amazon.com.js | 209+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/American Institute of Aeronautics and Astronautics.js | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Ancestry.com US Federal Census.js | 236+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Archeion.js | 157+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Archives Canada-France.js | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Archives Canada.js | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Archives Network of Alberta.js | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Artefacts Canada.js | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/AustLII and NZLII.js | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Australian Dictionary of Biography.js | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BAILII.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BBC.js | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BC Archival Information Network.js | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BIBSYS.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BIUM.js | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Berkeley Electronic Press.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Berkeley Library Catalog.js | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BibTeX.js | 1994+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Biblio.com.js | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Bibliotheque UQAM.js | 235+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Bibliotheque et Archives Nationale du Quebec (Pistard).js | 152++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Bibliothèque et Archives nationales du Québec.js | 265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BioInfoBank.js | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BioMed Central and More.js | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BioOne.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Blackwell Compass.js | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Blackwell Synergy.js | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Blogger.js | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Bracero History Archive.js | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Bryn Mawr Classical Review.js | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Business Standard.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/BusinessWeek.js | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CABI - CAB Abstracts.js | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CARLABRC OAI Harvester.js | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/COinS.js | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CSIRO Publishing.js | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cambridge Journals Online.js | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cambridge Scientific Abstracts.js | 188+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CanLII.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Canada.com.js | 154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Canadian Letters and Images.js | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Canadiana.org.js | 181+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cell Press.js | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Champlain Society - Collection.js | 168+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Christian Science Monitor.js | 151+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CiNii.js | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CiteBase.js | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CiteSeer.js | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CiteULike.js | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Civilization.ca.js | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Code4Lib Journal.js | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Columbia University Press.js | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Common-Place.js | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Copernicus.js | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Copernicus2.js | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cornell LII.js | 209+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cornell University Press.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/CrossRef.js | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Cyberpresse.js | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/DBLP Computer Science Bibliography.js | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/DSpace.js | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Davidson College Library.js | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Digital Humanities Quarterly.js | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/EBSCOhost.js | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ERIC.js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ESA Journals.js | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ESpacenet.js | 175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Early English Books Online.js | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Education Week.js | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Edutopia.js | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Eighteenth Century Collections Online.js | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Embedded RDF.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Emerald Publishing.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Engineering Village.js | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Epicurious.js | 151+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/European Educational Research Journal.js | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Factiva.js | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Flickr.js | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Florida University Libraries (Endeca 1).js | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/FreePatentsOnline.js | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/GPO Access e-CFR.js | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/GSA Journals Online.js | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Gale - Cengage Learning.js | 142++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Gale Literature Resource Center.js | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Getty Research Library Catalog.js | 256+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Glenbow Library.js | 266+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Gmail.js | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Google Books.js | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Google Patents.js | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Google Scholar.js | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Gulag Many Days, Many Lives.js | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/HeinOnline.js | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Helsinki University of Technology.js | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/HighWire.js | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Hindawi Publishing Corporation.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/History Cooperative.js | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Hurricane Digital Memory Bank.js | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/IEEE Xplore.js | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/IRIS translator.js | 316+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ISI Web of Knowledge.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/InderScience.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/InfoTrac OneFile.js | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/InfoTrac.js | 215+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Informaworld.js | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/IngentaConnect.js | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Innovate Online.js | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Institute of Physics.js | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Institute of Pure and Applied Physics.js | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Inter-Research Science Center.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/International Herald Tribune.js | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Internet Archive.js | 265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Investigative Ophthalmology and Visual Science.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/J-Stage.js | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/JSTOR.js | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Journal of Electronic Publishing.js | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Journal of Vision.js | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/JurPC.js | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/KOBV.js | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/LA Times.js | 225+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Le Devoir.js | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/LexisNexis.js | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (Aleph).js | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (DRA).js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (Dynix).js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (GEAC).js | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (InnoPAC).js | 200+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (SIRSI).js | 347+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (TLCYouSeeMore).js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (VTLS).js | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (Voyager).js | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Library Catalog (X-OPAC).js | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/MAB2.js | 360+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/MARC.js | 420+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/MIT Press Journals.js | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/MODS.js | 616+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Max Planck Institute for the History of Science Virtual Laboratory Library.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Melvyl.js | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/MetaPress.js | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Musee du Louvre.js | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/NAA RecordSearch.js | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/NASA ADS.js | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/NCBI PubMed.js | 205+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/NCSU Library (Endeca 2).js | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/NYTimes.com.js | 152++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Archives of South Africa.js | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Bureau of Economic Research.js | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Gallery of Art - U.S.A..js | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Library of Australia (new catalog).js | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Library of Australia.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Library of New Zealand.js | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/National Post.js | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Nature.js | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/New Zealand Herald.js | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/OAIster.js | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/OCLC WorldCat FirstSearch.js | 208+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/OSTI Energy Citations.js | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Old Bailey Online.js | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Open WorldCat (Search).js | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Open WorldCat (Web).js | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/OpenJudis - Indian Supreme Court cases.js | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Optical Society of America.js | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Optics Express.js | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Osterreichischer Bibliothekenverbund.js | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Ovid.js | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Oxford Music and Art Online.js | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/PEI Archival Information Network.js | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/PLoS Biology and Medicine.js | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/PLoS Journals.js | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/PROLA.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Patents - USPTO.js | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Persée.js | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Philosopher's Imprint.js | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Pion Journals.js | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ProQuest.js | 213+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Probing the Past.js | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Progress of Theoretical Physics.js | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Project Gutenberg.js | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Project MUSE.js | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Protein Data Bank.js | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/PubMed Central.js | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/RDF.js | 595+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/RIS.js | 523+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/RSC Publishing.js | 439+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/RePEc.js | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ReferBibIX.js | 286+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ReliefWeb.js | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Reuters.js | 38++++++++++++++++++++++++++++++++++++++
Atranslators/Revues.org.js | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Royal Historical Society.js | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Royal Society Publishing.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SAE International.js | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SPIE Digital Library.js | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SPIRES.js | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SSRN.js | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Sage Journals Online.js | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SciELO.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Science Links Japan.js | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ScienceDirect.js | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/ScientificCommons.js | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Scitation.js | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Scopus.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SlideShare.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/SpringerLink.js | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Stuff.co.nz.js | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Sudoc.js | 201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Sydney Morning Herald.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Age.js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Australian.js | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Boston Globe.js | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Chronicle of Higher Education.js | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Economist.js | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Free Dictionary.js | 30++++++++++++++++++++++++++++++
Atranslators/The Globe and Mail.js | 222+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Hamilton Spectator.js | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Hindu.js | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Microfinance Gateway.js | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The New York Review of Books.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/The Open Library.js | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Time-Blog.com.js | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Time.com.js | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Toronto Star.js | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/UBC Library Catalog.js | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/US National Archives Research Catalog.js | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Universiteit van Amsterdam.js | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/University of Chicago.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Unqualified Dublin Core RDF.js | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Vanderbilt eJournals.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Verniana-Jules Verne Studies.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Wikipedia Citation Templates.js | 338+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Wildlife Biology in Practice.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Wiley InterScience.js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Winnipeg Free Press.js | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Women in Judaism.js | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/World History Connected.js | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Worldcat.org.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/YouTube.js | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/Zotero RDF.js | 457+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/arXiv.org.js | 184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/eMJA.js | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/informIT database.js | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/unAPI.js | 254+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atranslators/washingtonpost.com.js | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
264 files changed, 36943 insertions(+), 0 deletions(-)

diff --git a/translators/A Contra Corriente.js b/translators/A Contra Corriente.js @@ -0,0 +1,48 @@ +{ + "translatorID":"bbf1617b-d836-4665-9aae-45f223264460", + "translatorType":4, + "label":"A Contra Corriente", + "creator":"Michael Berkowitz", + "target":"http://www.ncsu.edu/project/acontracorriente", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-03 19:40:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr[td[1]//img][td[3]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var arts = doc.evaluate('//tr[td[1]//img][td[3]]', doc, null, XPathResult.ANY_TYPE, null); + var art; + var selectList = new Object(); + var items = new Object(); + while (art = arts.iterateNext()) { + var item = new Object(); + var title = doc.evaluate('.//a', art, null, XPathResult.ANY_TYPE, null).iterateNext(); + item['title'] = Zotero.Utilities.trimInternal(title.textContent); + item['pdfurl'] = title.href; + item['author'] = doc.evaluate('.//strong', art, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + selectList[item.title] = item.title; + items[item.title] = item; + } + var selected = Zotero.selectItems(selectList); + var voliss = Zotero.Utilities.trimInternal(doc.evaluate('//td[@class="red01"]/font[2]/strong', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + voliss = voliss.match(/Vol\.\s+(\d+),\s+No\.\s+(\d+)\.\s+([^|]+)|/); + Zotero.debug(voliss); + for each (var title in selected) { + var item = new Zotero.Item("journalArticle"); + var olditem = items[title]; + item.title = olditem.title; + item.creators = [Zotero.Utilities.cleanAuthor(olditem.author, "author")]; + item.volume = voliss[1]; + item.issue = voliss[2] + item.date = Zotero.Utilities.trimInternal(voliss[3]); + item.complete(); + } +} +\ No newline at end of file diff --git a/translators/ABC-CLIO Serials Web.js b/translators/ABC-CLIO Serials Web.js @@ -0,0 +1,141 @@ +{ + "translatorID":"a07bb62a-4d2d-4d43-ba08-d9679a0122f8", + "translatorType":4, + "label":"ABC-CLIO Serials Web", + "creator":"Simon Kornblith", + "target":"https?://[^/]*serials\\.abc-clio\\.com[^/]*/active/go/ABC-Clio-Serials_v4", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-09 20:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var result = doc.evaluate('//table[@class="rc_main"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(result) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var availableItems = new Array(); + var availableAttachments = new Array(); + + var elmts = doc.evaluate('//table[@class="rc_main"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var elmt; + while(elmt = elmts.iterateNext()) { + var title = doc.evaluate('./tbody/tr/td[b/text() = "Title:"]', + elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var checkbox = doc.evaluate('.//input[@type = "checkbox"]', + elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(title, checkbox) { + checkbox = checkbox.name; + availableItems[checkbox] = Zotero.Utilities.cleanString(title.textContent).substr(6); + + var links = doc.evaluate('./tbody/tr/td[b/text() = "Fulltext: ["]/a', + elmt, nsResolver, XPathResult.ANY_TYPE, null); + var link; + + var attach = new Array(); + while(link = links.iterateNext()) { + attach.push({url:link.href, title:Zotero.Utilities.cleanString(link.textContent)+" Full Text", + mimeType:"text/html"}); + } + availableAttachments[checkbox] = attach; + } + } + + var items = Zotero.selectItems(availableItems); + + if(!items) { + return true; + } + + var postString = "_defaultoperation=Download+Options&research_field=&research_value=&jumpto="; + var attachments = new Array(); + for(var i in availableItems) { + postString += "&_checkboxname="+i+(items[i] ? "&"+i+"=1" : ""); + if(items[i]) { + attachments.push(availableAttachments[i]); + } + } + + Zotero.Utilities.HTTP.doPost(url, postString, function(text) { + Zotero.Utilities.HTTP.doPost(url, "_appname=serials&_defaultoperation=Download+Documents&_formname=download&download_format=citation&download_which=tagged&download_where=ris&mailto=&mailreplyto=&mailsubject=&mailmessage=", + function(text) { + // get link + var linkRe = /<a\s+class="button"\s+href="([^"]+)"\s+id="resource_link"/i; + var m = linkRe.exec(text); + if(!m) { + throw("regular expression failed!"); + } + Zotero.Utilities.HTTP.doGet(m[1], function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes && item.notes[0]) { + item.extra = item.notes[0].note; + + delete item.notes; + item.notes = undefined; + } + + // grab uni data from thesis + if(item.itemType == "thesis") { + var re = /^(.+?) ([0-9]{4})\. ([0-9]+) pp\.(.*)$/; + var m = re.exec(item.extra); + if(m) { + item.publisher = m[1]; + item.date = m[2]; + item.pages = m[3]; + item.extra = m[4]; + } + } + + // fix periods + for(var i in item.creators) { + var nameLength = item.creators[i].firstName.length; + + if(item.creators[i].firstName[nameLength-1] == ".") { + item.creators[i].firstName = item.creators[i].firstName.substr(0, nameLength-1); + } + } + for(var i in item.tags) { + var tagLength = item.tags[i].length; + + if(item.tags[i][tagLength-1] == ".") { + item.tags[i] = item.tags[i].substr(0, tagLength-1); + } + } + + // fix title + item.title = Zotero.Utilities.superCleanString(item.title); + + // add attachments + item.attachments = attachments.shift(); + + item.complete(); + }); + translator.translate(); + Zotero.done(); + }); + }); + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ACM.js b/translators/ACM.js @@ -0,0 +1,138 @@ +{ + "translatorID":"e78d20f7-488-4023-831-dfe39679f3f", + "translatorType":4, + "label":"ACM", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://[^/]*portal\\.acm\\.org[^/]*/(?:results\\.cfm|citation\\.cfm)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-06 08:45:00" +} + +function detectWeb(doc, url) { + if(url.indexOf("/results.cfm") != -1) { + var items = Zotero.Utilities.getItemArray(doc, doc, '^https?://[^/]+/citation.cfm\\?[^#]+$'); + // hack to return multiple if there are items + for(var i in items) { + return "multiple"; + } + } else { + var onClick = doc.evaluate('//a[substring(text(), 5, 7) = "EndNote"]', doc, null, XPathResult.ANY_TYPE, + null).iterateNext().getAttribute("onClick"); + if(onClick.match("proceeding.article")) { + return "conferencePaper"; + } else { + return "journalArticle"; + } + } +} + +var urls = new Array(); + +// this handles sequential loading, since first we need to process a document (to get the abstract), then +// get the Refer metadata, then process the next document, etc. +function getNext() { + if(urls.length) { + var url = urls.shift(); + Zotero.Utilities.processDocuments([url], function(doc) { scrape(doc); }); + } else { + Zotero.done(); + } +} + +function scrape(doc) { + var onClick = doc.evaluate('//a[substring(text(), 5, 7) = "EndNote"]', doc, null, XPathResult.ANY_TYPE, + null).iterateNext().getAttribute("onClick"); + var m = onClick.match(/'([^']+)'/); + + if (doc.evaluate('//div[@class="abstract"]/p[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var abstract = doc.evaluate('//div[@class="abstract"]/p[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + if (!abstract.textContent.match(/\w+/)) { + var abstract = doc.evaluate('//div[@class="abstract"]/p[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + } + if(abstract) abstract = Zotero.Utilities.cleanString(abstract.textContent); + } + var snapshot = doc.location.href; + + var attachments = new Array(); + var url; + var typeLinks = doc.evaluate('//td[@class="smaller-text"]/a[img]', doc, null, + XPathResult.ANY_TYPE, null); + var typeLink; + while(typeLink = typeLinks.iterateNext()) { + var linkText = typeLink.textContent.toLowerCase(); + if(linkText == "pdf") { + attachments.push({title:"ACM Full Text PDF", mimeType:"application/pdf", url:typeLink.href}); + url = typeLink.href; + } else if(linkText == "html") { + url = snapshot = typeLink.href; + } + } + + attachments.push({title:"ACM Snapshot", mimeType:"text/html", url:snapshot}); + + var keywords = new Array(); + var keywordLinks = doc.evaluate('//p[@class="keywords"]/a', doc, null, + XPathResult.ANY_TYPE, null); + var keywordLink; + while(keywordLink = keywordLinks.iterateNext()) { + keywords.push(Zotero.Utilities.trimInternal(keywordLink.textContent.toLowerCase())); + } + var doi = ""; + var doiElmt = doc.evaluate('/html/body/div/table/tbody/tr[4]/td/table/tbody/tr/td/table/tbody/tr[3]/td[2][@class="small-text"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext() + if (doiElmt){ + var match = doiElmt.textContent.match(/org\/(.*)/); + if (match){ + doi = match[1]; + } + } + + Zotero.Utilities.HTTP.doGet("http://portal.acm.org/"+m[1], function(text) { + // split() may no longer be necessary + var m = text.split(/<\/?pre[^>]*>/ig); + if (m[1]) { + var text = m[1]; + } + // unescape HTML for extended characters + function unescapeHTML(str, p1){ + return Zotero.Utilities.unescapeHTML("&#"+p1); + } + text = text.replace(/\\&\\#([^;]+;)/g, unescapeHTML); + // load Refer translator + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(abstract) item.abstractNote = abstract; + item.attachments = attachments; + item.tags = keywords; + item.DOI = doi; + item.url = doc.location.href; + item.complete(); + }); + translator.translate(); + + getNext(); + }); +} + +function doWeb(doc, url) { + if(url.indexOf("/results.cfm") != -1) { + var items = Zotero.Utilities.getItemArray(doc, doc, '^https?://[^/]+/citation.cfm\\?[^#]+$'); + + items = Zotero.selectItems(items); + if(!items) return true; + + for(var url in items) { + urls.push(url); + } + + getNext(); + } else { + scrape(doc); + } + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ACS Publications.js b/translators/ACS Publications.js @@ -0,0 +1,126 @@ +{ + "translatorID":"938ebe32-2b2e-4349-a5b3-b3a05d3de627", + "translatorType":4, + "label":"ACS Publications", + "creator":"Sean Takats and Michael Berkowitz", + "target":"http://[^/]*pubs3?.acs.org[^/]*/(?:wls/journals/query/(?:subscriberResults|query)\\.html|acs/journals/toc.page|cgi-bin/(?:article|abstract|sample|asap).cgi)?", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-06 08:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.evaluate('//input[@name="jid"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//jid', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } + return false; +} + +function handleRequests(requests, pdfs) { + if(requests.length == 0) { + Zotero.done(); + return; + } + + var request = requests.shift(); + + Zotero.Utilities.HTTP.doGet("http://pubs.acs.org/wls/journals/citation2/Citation?"+request.jid, function() { + Zotero.Utilities.HTTP.doPost("http://pubs.acs.org/wls/journals/citation2/Citation", + "includeAbstract=citation-abstract&format=refmgr&submit=1&mode=GET", function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pdf = pdfs.shift(); + if(pdf) { + item.attachments.push({ + title:"ACS Full Text PDF", + url:pdf, mimeType:"application/pdf" + }); + } + if (!item.attachments[0].title) + item.attachments[0].title = "ACS Snapshot"; + item.complete(); + }); + translator.translate(); + + handleRequests(requests); + }); + }); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var pdfs = new Array(); + var requests = new Array(); + + if (detectWeb(doc, url) == "multiple") { + // search page + var items = new Array(); + if (doc.evaluate('//form[@name="citationSelect"]//tbody/tr[1]//span[@class="textbold"][1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//form[@name="citationSelect"]//tbody/tr[1]//span[@class="textbold"][1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (doc.evaluate('//form/div[@class="artBox"]/div[@class="artBody"]/div[@class="artTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//form/div[@class="artBox"]/div[@class="artBody"]/div[@class="artTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + if (doc.evaluate('//form[@name="citationSelect"]//input[@name="jid"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var jids = doc.evaluate('//form[@name="citationSelect"]//input[@name="jid"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (doc.evaluate('//div[@id="content"]/form/div[@class="artBox"]/div[@class="artHeadBox"]/div[@class="artHeader"]/input', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var jids = doc.evaluate('//div[@id="content"]/form/div[@class="artBox"]/div[@class="artHeadBox"]/div[@class="artHeader"]/input', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + var links = doc.evaluate('//form[@name="citationSelect"]//tbody/tr[2]//a[@class="link"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var jid; + var id; + var link; + while ((title = titles.iterateNext()) && (jid = jids.iterateNext())){ + id = jid.value + items[id] = Zotero.Utilities.trimInternal(title.textContent); + + var link = doc.evaluate('../../..//a[contains(text(), "PDF")]', title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(link) { + links[id] = link.href.replace("searchRedirect.cgi", "article.cgi"); + } + } + + items = Zotero.selectItems(items); + if(!items) return true; + + var getstring = ""; + for(var i in items) { + getstring = getstring + "jid=" + encodeURIComponent(i) + "&"; + pdfs.push(links[i]+"?sessid="); + } + requests.push({jid:getstring}); + } else { + // single page + var jid = doc.evaluate('//jid', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + jid = jid.substr(jid.indexOf("/")+1); + var pdf = doc.evaluate('/html/body//a[contains(text(), "PDF")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (!pdf) { + var pdf = doc.evaluate('/html/body//a[contains(@href, "/pdf/")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } + if (pdf) { + pdf = pdf.href; + pdf = pdf.replace("searchRedirect.cgi", "article.cgi"); + pdfs.push(pdf+"?sessid="); + } + var requests = [{jid:"jid=" + encodeURIComponent(jid)}]; + } + handleRequests(requests, pdfs); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/AGU Journals.js b/translators/AGU Journals.js @@ -0,0 +1,258 @@ +{ + "translatorID":"9220fa99-b936-430e-a8ea-43ca6cb04145", + "translatorType":4, + "label":"AGU Journals", + "creator":"Ben Parr", + "target":"^https?://(?:www.)?agu.org", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath; + + //abstract + xpath='//p[@id="citation"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { return "journalArticle"; } + + //full text + xpath='//frameset[@rows="98, *"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { return "journalArticle"; } + + //issue page + xpath='//tr/td/p[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { return "multiple"; } + + //Search Page + if(doc.title.indexOf("Query Results")>-1) + {return "multiple";} +} + + +function fixCaps(s) +{ + if(s!='') + { + words=Zotero.Utilities.cleanString(s).toLowerCase().split(" "); + for (var j = 0 ; j < words.length ; j++) + { + if (j==0||(words[j][0] ==words[j][0].toLowerCase()&&words[j]!="or"&&words[j]!="and"&&words[j]!="of"&&words[j]!="in")) + { words[j]= words[j][0].toUpperCase() +words[j].substr(1); } + } + return words.join(" "); + } + return ''; +} + +function scrape(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem=new Zotero.Item("journalArticle"); + var temp; + var xpath; + var row; + var rows; + + newItem.url = doc.location.href; + + xpath='//p[@id="title"]'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + {newItem.title=temp.textContent;} + + xpath='//span[@id="published"]'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + { + temp=Zotero.Utilities.cleanString(temp.textContent).split(" ");; + newItem.date=temp[1]+" "+temp[0]+", "+temp[2]; + } + + xpath='//p[@class="author"]'; + rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var count=0; + while(row=rows.iterateNext()) + {newItem.creators.push(Zotero.Utilities.cleanAuthor(row.textContent,"author")); + count++;} + + xpath='//tr/td/p'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var temp2=temp.iterateNext(); + if(temp2) + { + for(var n=0;n<(3+2*count);n++) + {temp2=temp.iterateNext();} + newItem.abstractNote=Zotero.Utilities.cleanString(temp2.textContent); + } + + xpath='//p[@id="runhead"]'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + { + temp=Zotero.Utilities.cleanString(temp.textContent).split(", "); + newItem.publicationTitle=fixCaps(temp[0]); + for(var n=1;temp[n];n++) + { + if(temp[n].indexOf("VOL")>-1) + {newItem.volume=temp[n].replace('VOL. ','');} + else if(temp[n].indexOf("NO.")>-1) + {newItem.issue=temp[n].replace('NO. ','');} + else if(temp[n].indexOf("doi:")>-1) + {newItem.DOI=temp[n].replace('doi:','');} + else if(temp[n+1]) + {newItem.pages=temp[n];} + } + } + + xpath='//p[@id="keywords"]'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + { + temp=Zotero.Utilities.cleanString(temp.textContent.replace('Keywords:','')); + newItem.tags=temp.replace('.','').split('; '); + } + xpath='//p[@id="citation"]/span[@id="journal"]'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + {newItem.journalAbbreviation=temp.textContent;} + + newItem.complete(); +} + + +function processList(items) +{ + items = Zotero.selectItems(items); + var uris=new Array(); + + if (!items) + {return true;} + + for (var i in items) + {uris.push(i);} + + Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); }); + Zotero.wait(); + + return true; +} + +function doWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + //abstract + var xpath='//p[@id="citation"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { + scrape(doc,url); + return true; + } + + //full text + xpath='//frameset[@rows="98, *"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { + Zotero.Utilities.processDocuments(url+"0.shtml", scrape, function(){ Zotero.done(); }); + Zotero.wait(); + + return true; + } + + //issue page + xpath='//tr/td/p[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { + var titlerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + xpath='//tr/td/p[@class="pubdate"]/a'; + var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + + var titlerow; + var linkrow; + var items=new Array(); + + while(titlerow=titlerows.iterateNext()) + { + linkrow=linkrows.iterateNext(); + while(linkrow.textContent.indexOf("Abstract")<0) + {linkrow=linkrows.iterateNext();} + items[linkrow.href]=titlerow.textContent; + } + + return processList(items); + } + + + //Search page + if(doc.title.indexOf("Query Results")>-1) + { + //FASTFind Search + + xpath='//tr/td/h2'; + var tt=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext().textContent; + if(tt.indexOf("FASTFIND")>-1) + { + xpath='//tr/td[1]/font'; + var citerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + xpath='//tr/td[2]/font/a'; + var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + + var citerow; + var linkrow; + var items=new Array(); + var temp; + var title; + + while(citerow=citerows.iterateNext()) + { + linkrow=linkrows.iterateNext(); + items[linkrow.href]=Zotero.Utilities.cleanString(citerow.textContent); + } + return processList(items); + } + else + { + //Advanced Search + + xpath='//tr/td[1]/font/a'; + var titlerows=doc.evaluate(xpath, doc,nsResolver,XPathResult.ANY_TYPE, null); + xpath='//tr/td[2]/font/a'; + var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + + var titlerow; + var linkrow; + var items=new Array(); + var temp; + + while(titlerow=titlerows.iterateNext()) + { + linkrow=linkrows.iterateNext(); + while(linkrow.textContent.indexOf("Abstract")<0) + {linkrow=linkrows.iterateNext();} + + items[linkrow.href]=titlerow.textContent; + } + return processList(items); + } + } + +} diff --git a/translators/AJHG.js b/translators/AJHG.js @@ -0,0 +1,84 @@ +{ + "translatorID":"0a01d85e-483c-4998-891b-24707728d83e", + "translatorType":4, + "label":"AJHG", + "creator":"Michael Berkowitz", + "target":"http://(www.)?ajhg.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-14 23:15:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="article_links"]/a[1]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("abstract") != -1 || url.indexOf("fulltext") != -1) { + return "journalArticle"; + } +} + +function getID(str) { + str = str.match(/\/([^/]+)$/)[1]; + if (str.indexOf("#") != -1) { + str = str.substr(0, str.length - 1); + } + return str; +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title.indexOf("Search Results") != -1) { + var xpath = '//table[@id="search_results"]/tbody/tr/td[1]'; + var titlex = './strong'; + var linkx = './div/a[1]'; + } else { + var xpath = '//div[@id="main_toc"]/dl'; + var titlex = './dt'; + var linkx = './dd/div/a[1]'; + } + var blocks = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_block; + while (next_block = blocks.iterateNext()) { + var title = doc.evaluate(titlex, next_block, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate(linkx, next_block, null, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(getID(i)); + } + } else { + articles = [getID(url)]; + } + Zotero.debug(articles); + for (var i in articles) { + var poststr = 'format=cite-abs&citation-type=RIS&pii=' + articles[i] + '&action=download&Submit=Export'; + var pdfurl = 'http://download.ajhg.org/AJHG/pdf/PII' + articles[i].replace(/(\(|\)|\-)/g, "") + '.pdf'; + var newurl = 'http://www.ajhg.org/AJHG/fulltext/' + articles[i]; + Zotero.Utilities.HTTP.doPost('http://ajhg.org/AJHG/citationexport', poststr, function(text) { + var trans = Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:newurl, title:"AJHG Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"AJHG Full Text PDF", mimeType:"application/pdf"} + ]; + + if (item.notes[0]["note"]) { + item.abstractNote = item.notes[0]["note"]; + } + item.notes = []; + item.complete(); + }); + trans.translate(); + Zotero.done(); + }); + } + Zotero.wait(); + +} +\ No newline at end of file diff --git a/translators/AMS Journals.js b/translators/AMS Journals.js @@ -0,0 +1,79 @@ +{ + "translatorID":"bdaac15c-b0ee-453f-9f1d-f35d00c7a994", + "translatorType":4, + "label":"AMS Journals", + "creator":"Michael Berkowitz", + "target":"http://www.ams.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (url.match(/jour(nals|search)/)) { + return "multiple"; + } else if (url.match(/\d{4}\-\d{2}\-\d{2}/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (url.match(/joursearch/)) { + var titlex = '//table/tbody/tr/td/span[@class="searchResultsArticleTitle"]'; + var linkx = '//table/tbody/tr[td/span[@class="searchResultsArticleTitle"]]//a[contains(text(), "Abstract")]'; + } else { + var titlex = '//div[@class="contentList"]/dl/dt[@class="articleTitleInAbstract"]'; + var linkx = '//div[@class="contentList"]/dl/dd/a[contains(text(), "Abstract")]' + } + var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate(linkx, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title, link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(decodeURIComponent(i)); + } + } else { + articles = [url]; + } + Zotero.debug(articles); + Zotero.Utilities.processDocuments(articles, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.publicationTitle = doc.title; + item.ISSN = doc.evaluate('//span[@class="journalISSN"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\(e\)\s+ISSN:?\s+(.*)\(p\)/)[1]; + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//p[@class="articleTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var data = Zotero.Utilities.trimInternal(doc.evaluate('//p[span[@class="bibDataTag"]][1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + data = data.replace(/(Journal|MSC|Posted|Retrieve)/g, "\n$1"); + Zotero.debug(data); + var authors = data.match(/Author\(s\):\s+(.*)\n/)[1].split(/;\s+/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + var journalinfo = data.match(/Journal:\s+(.*)\n/)[1].match(/^([^\d]+)(\d+)\s+\((\d+)\),\s+(.*)$/); + item.journalAbbreviation = journalinfo[1]; + item.volume = journalinfo[2]; + item.pages = journalinfo[4]; + item.date = Zotero.Utilities.trimInternal(data.match(/Posted:\s+(.*)\n/)[1]); + item.url = doc.location.href; + item.issue = item.url.match(/(\d+)\/S/)[1]; + var pdfurl = item.url.replace(/([^/]+)\/home.html$/, "$1/$1.pdf"); + item.attachments = [ + {url:item.url, title:item.journalAbbreviation + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.journalAbbreviation + " PDF", mimeType:"application/pdf"} + ]; + item.abstract = Zotero.Utilities.trimInternal(doc.evaluate('//td[@class="bottomCell"]/p[4]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(10)); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/AMS MathSciNet.js b/translators/AMS MathSciNet.js @@ -0,0 +1,98 @@ +{ + "translatorID":"a354331-981b-43de-a61-bc26dd1be3a9", + "translatorType":4, + "label":"AMS MathSciNet", + "creator":"Simon Kornblith", + "target":"^https?://www\\.ams\\.org[^/]*/mathscinet/search/(?:publications\\.html|publdoc\\.html)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-24 22:20:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var tableRows = doc.evaluate('//div[@id="content"]/form/div[@class="headline"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + if(tableRows.iterateNext()) { + return "multiple" + } else if(doc.evaluate('//div[@id="titleSeparator"]/div[@class="navbar"]/span[@class="PageLink"]/a[text() = "Up"]', + doc, nsResolver, XPathResult.ANY_TYPE, null)) { + return "journalArticle"; + } + + return false; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var pub = "http://www.ams.org/mathscinet/search/publications.html?fmt=bibtex"; + + var tableRows = doc.evaluate('//div[@id="content"]/form/div[@class="headline"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var tableRow = tableRows.iterateNext(); + if(tableRow) { + // search page + var items = new Object(); + var links = new Object(); + + do { + var id = doc.evaluate('.//input[@type="checkbox"]', tableRow, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().value; + items[id] = doc.evaluate('./div[@class="headlineText"]/span[@class="title"]', tableRow, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().textContent; + links[id] = doc.evaluate('.//a', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().href; + } while(tableRow = tableRows.iterateNext()) + + + items = Zotero.selectItems(items); + if(!items) return true; + + var docLinks = new Array(); + for(var id in items) { + pub += "&b="+id; + docLinks.push(links[id]); + } + } else { + var MR = doc.evaluate('//div[@id="content"]/div[@class="doc"]/div[@class="headline"]/strong', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + pub += "&b="+MR.replace(/^MR0*/, ""); + } + + Zotero.Utilities.HTTP.doGet(pub, function(text) { + var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g); + var bibTeXString = ""; + for each(var citation in m) { + // kill pre tags + citation = citation.substring(5, citation.length-6); + bibTeXString += citation; + } + + // import using BibTeX + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + translator.setString(bibTeXString); + translator.setHandler("itemDone", function(obj, item) { + if(docLinks) { + item.attachments.push({title:"MathSciNet Snapshot", url:docLinks.shift(), mimeType:"text/html"}); + } else { + item.attachments.push({title:"MathSciNet Snapshot", document:doc}); + } + + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); +} +\ No newline at end of file diff --git a/translators/AMS Online Journals - Allenpress.js b/translators/AMS Online Journals - Allenpress.js @@ -0,0 +1,293 @@ +{ + "translatorID":"dbb5d4bc-3b21-47a2-9751-5dcbb65b902a", + "translatorType":4, + "label":"AMS Online Journals - Allenpress", + "creator":"Ben Parr", + "target":"^http://ams.allenpress.com/", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath; + + //Homepage=AMS Top 20 + var temp=url.split("request=")[1]; + if(temp) + { + if(temp.substr(0,10)=="index-html") + { return "multiple"; } + } + + + //browse page + xpath='//div[@class="group"]/p[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { return "multiple"; } + + //second browse page format + xpath='//div[@class="toc include j"]/p/span[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { return "multiple"; } + + + //search page + xpath='//td[@class="search"]/span[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { return "multiple"; } + + //single page + xpath='//ul/li/a'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + + while(row=rows.iterateNext()) + { + if(row.textContent=="Create Reference") + { return "journalArticle"; } + } + +} + +function parseRIS(temp,PDFs) +{ + Zotero.Utilities.HTTP.doGet(temp, function(text){ + + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + + translator.setHandler("itemDone", function(obj, newItem) { + //get doi of the item we're currently saving from RIS file + var doi=newItem.DOI; + if(!doi) + {doi=newItem.url.replace('http://dx.doi.org/','');} + else + {doi=doi.replace("doi%3A","");} + + var urlstring=''; + var volume=newItem.volume; + var issue=newItem.issue; + var d=newItem.pages.split("-")[0]; + + var pdf = PDFs.shift(); + if(pdf) + { + if(pdf=="0") + { + var b=doi.split("/"); + if(b.length>1) + {b=b[1];} + else + {b=doi.split("%2F")[1];} + b=b.split("(")[0]; + b=b.split("%28")[0]; + if(!b||b.length!=9) + {b="1520-0477";} + urlstring="http://ams.allenpress.com/archive/"+b+"/"+volume+"/"+issue+"/pdf/i"+b+"-"+volume+"-"+issue+"-"+d+".pdf"; + } + else if(pdf=="1") + { + while(volume.length<3) + {volume="0"+volume;} + while(issue.length<2) + {issue="0"+issue;} + while(d.length<4) + {d="0"+d;} + + urlstring="http://docs.lib.noaa.gov/rescue/mwr/"+volume+"/mwr-"+volume+"-"+issue+"-"+d+".pdf"; + } + } + newItem.attachments[0]={ + title:"AMS Journals Full Text PDF", + url:urlstring, mimeType:"application/pdf"} + + if(Zotero.Utilities.cleanString(newItem.abstractNote).toLowerCase()=="no abstract available.") + {newItem.abstractNote='';} + newItem.complete(); + }); + + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + + +function createLink(link) +{ + var url="http://ams.allenpress.com/perlserv/?request=download-citation&t=refman&doi="; + url+=getdoi(link); + url+="&site=amsonline"; + return url; +} + +function getdoi(link) +{ + doi=link.split("doi%3A")[1]; + if(!doi) + { + doi=link.split("doi=")[1]; + return doi; + } + return doi; +} + +function getType(text) +{ + if(text.indexOf("(")>-1) + {return "0";} + else + {return "1";} +} + +function doWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var doi; + var PDFs=new Array(); + var xpath='//ul/li/a'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + + while(row=rows.iterateNext()) + { + if(row.textContent=="Create Reference") + { + //single page + + var thelink=createLink(row.href); + xpath='//div[@class="mainPadding"]/div/div/div/div/div/p/a'; + rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + while(row=rows.iterateNext()) + { + if(row.textContent.toLowerCase().indexOf("pdf")>-1) + {PDFs.push(getType(row.textContent));} + } + parseRIS(thelink,PDFs); + + return null; + } + } + + var items=new Array(); + + xpath='//div[@class="group"]/p[@class="title"]'; + var xpath1=''; + var xpath2=''; + + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { + //browse page + + xpath1='//div[@class="group"]/p[@class="title"]'; + xpath2='//p[@class="link"]/a'; + } + else + { + xpath='//td[@class="search"]/span[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { + //search page + + xpath1='//td[@class="search"]/span[@class="title"]'; + xpath2='//tr/td/a'; + } + else + { + xpath='//div[@class="toc include j"]/p/span[@class="title"]'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { + //second browse format + + xpath1='//div[@class="toc include j"]/p/span[@class="title"]'; + xpath2='//div[@class="toc include j"]/p/a'; + } + } + } + + if(xpath1!='') + { + var rows1=doc.evaluate(xpath1, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row1; + + var rows2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row2=rows2.iterateNext(); + + var rows3=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row3; + + var tPDFs=new Array(); + var nextType; + + var link; + var lastdoi; + + while(row1=rows1.iterateNext()) + { + while(row3=rows3.iterateNext()) + { + if(row3.textContent.toLowerCase().indexOf("pdf")>-1) + {tPDFs.push(getType(row3.textContent));} + } + while(getdoi(row2.href)==lastdoi || !getdoi(row2.href)) + {row2=rows2.iterateNext()} + + lastdoi=getdoi(row2.href); + link=createLink(row2.href); + + nextType=tPDFs.shift(); + if(!nextType) + {nextType="none";} + items[nextType+link]=row1.textContent; + } + } + else + { + var t=url.split("request=")[1]; + if(t) + { + if(t.substr(0,10)=="index-html") + { + //Homepage=AMS Top 20 + + xpath='//div/p/a[@style="font-size: 85%;"]'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + + while(row=rows.iterateNext()) + {items["0"+createLink(row.href)]=row.textContent;} + } + + } + } + + items = Zotero.selectItems(items); + + if(!items) + {return true;} + + var urls = new Array(); + for(var i in items) + { + PDFs.push(i[0]); + urls.push(i.substr(1)); + } + + parseRIS(urls,PDFs); +} +\ No newline at end of file diff --git a/translators/APA PsycNET.js b/translators/APA PsycNET.js @@ -0,0 +1,82 @@ +{ + "translatorID":"1e1e35be-6264-45a0-ad2e-7212040eb984", + "translatorType":4, + "label":"APA PsycNET", + "creator":"Michael Berkowitz", + "target":"http://psycnet\\.apa\\.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-23 16:45:00" +} + +function detectWeb(doc, url) { + if (url.match(/search\.searchResults/)) { + return "multiple"; + } else if (url.match(/search\.displayRecord/)) { + return "journalArticle"; + } +} + +function associateXPath(xpath, doc, ns) { + return Zotero.Utilities.trimInternal(doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//div[@class="srhcTitle"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var newurl = doc.location.href; + if (doc.evaluate('//input[@name="id"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var id = doc.evaluate('//input[@name="id"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var lstSelectedUIDs = doc.evaluate('//input[@name="lstUIDs"][@id="srhLstUIDs"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var get = 'http://psycnet.apa.org/index.cfm?fa=search.export&id=' + id + '&lstSelectedUIDs=' + lstSelectedUIDs + '&lstUIDs=&records=selected&displayFormat=&exportFormat=referenceSoftware&printDoc=0'; + Zotero.Utilities.HTTP.doGet(get, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = newurl; + item.attachments = [{url:newurl, title:"APA PsycNET Snapshot", mimeType:"text/html"}]; + item.complete(); + }); + translator.translate(); + }); + } else { + var item = new Zotero.Item("journalArticle"); + item.title = associateXPath('//div[@id="rdcTitle"]', doc, nsResolver); + var authors = associateXPath('//div[@id="rdcAuthors"]', doc, nsResolver).split(/;\s+/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author", true)); + } + var voliss = associateXPath('//div[@id="rdcSource"]', doc, nsResolver).match(/^([^\.]+)\.\s+(\d+\s+\w+)\s+Vol\s+(\d+)\((\d+)\)\s+(.*)$/); + item.publicationTitle = voliss[1]; + item.date = voliss[2]; + item.volume = voliss[3]; + item.issue = voliss[4]; + item.pages = voliss[5]; + item.abstractNote = associateXPath('//div[@id="rdRecord"]/div[@class="rdRecordSection"][2]', doc, nsResolver); + item.complete(); + } + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ARTFL Encyclopedie.js b/translators/ARTFL Encyclopedie.js @@ -0,0 +1,169 @@ +{ + "translatorID":"72cb2536-3211-41e0-ae8b-974c0385e085", + "translatorType":4, + "label":"ARTFL Encyclopedie", + "creator":"Sean Takats", + "target":"/cgi-bin/philologic31/(getobject\\.pl\\?c\\.[0-9]+:[0-9]+\\.encyclopedie|search3t\\?dbname=encyclopedie0507)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("getobject.pl") != -1){ + return "encyclopediaArticle"; + } else { + return "multiple"; + } +} + +function reconcileAuthor(author){ + var authorMap = { + "Venel":"Venel, Gabriel-François", + "d'Aumont":"d'Aumont, Arnulphe", + "de La Chapelle":"de La Chapelle, Jean-Baptiste", + "Bourgelat":"Bourgelat, Claude", + "Dumarsais":"Du Marsais, César Chesneau", + "Mallet":"Mallet, Edme-François", + "Toussaint":"Toussaint, François-Vincent", + "Daubenton":"Daubenton, Louis-Jean-Marie", + "d'Argenville": "d'Argenville, Antoine-Joseph Desallier", + "Tarin":"Tarin, Pierre", + "Vandenesse":"de Vandenesse, Urbain", + "Blondel": "Blondel, Jacques-François", + "Le Blond":"Le Blond, Guillaume", + "Rousseau":"Rousseau, Jean-Jacques", + "Eidous":"Eidous, Marc-Antoine", + "d'Alembert":"d'Alembert, Jean le Rond", + "Louis":"Louis, Antoine", + "Bellin":"Bellin, Jacques-Nicolas", + "Diderot":"Diderot, Denis", + "Diderot1":"Diderot, Denis", + "Diderot2":"Diderot, Denis", + "de Jaucourt":"de Jaucourt, Chevalier Louis", + "Jaucourt":"de Jaucourt, Chevalier Louis", + "d'Holbach":"d'Holbach, Baron" + /* not yet mapped + Yvon + Forbonnais + Douchet and Beauzée + Boucher d'Argis + Lenglet Du Fresnoy + Cahusac + Pestré + Daubenton, le Subdélégué + Goussier + de Villiers + Barthès + Morellet + Malouin + Ménuret de Chambaud + Landois + Le Roy + */ + } + if(authorMap[author]) { + author = authorMap[author]; + } + // remove ARTFL's trailing 5 for odd contributors (e.g. Turgot5) + if (author.substr(author.length-1, 1)=="5"){ + author = author.substr(0, author.length-1); + } + return author; +} + +function scrape (doc){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var url = doc.location.href; + var newItem = new Zotero.Item("encyclopediaArticle"); + var xpath = '/html/body/div[@class="text"]/font'; + var titleElmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (titleElmt) { + var title = titleElmt.textContent; + } else { + xpath = '/html/body/div[@class="text"]/b'; + var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + newItem.title = title; + newItem.encyclopediaTitle = "Encyclopédie, ou Dictionnaire raisonné des sciences, des arts et des métiers"; + newItem.shortTitle = "Encyclopédie"; + newItem.date = "1751-1772"; + newItem.publisher = "Briasson"; + newItem.place = "Paris"; + newItem.url = url; + + newItem.attachments.push({title:"ARTFL Snapshot", mimeType:"text/html", url:url, snapshot:true}); + + // get author and tags + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + var hMatch = hostRegexp.exec(url); + var host = hMatch[1]; + var getString1 = "/cgi-bin/philologic31/search3t?dbname=encyclopedie0507&word=&dgdivhead="; + var getString2 = "&dgdivocauthor=&dgdivocplacename=&dgdivocsalutation=&dgdivocclassification=&dgdivocpartofspeech=&dgdivtype=&CONJUNCT=PHRASE&DISTANCE=3&PROXY=or+fewer&OUTPUT=conc&POLESPAN=5&KWSS=1&KWSSPRLIM=500"; + + Zotero.Utilities.HTTP.doGet(host+getString1+title+getString2, function(text){ + var tagRe = new RegExp('>'+title+'</a>[^\[]*\\[([^\\]]*)\]', 'i'); + var m = tagRe.exec(text); + if(m[1] != "unclassified"){ + var tagstring = m[1].replace("&amp;", "&", "g"); + var tags = tagstring.split(";") + for(var j in tags) { + newItem.tags.push(Zotero.Utilities.cleanString(tags[j])); + } + } + var authorRe = new RegExp('>'+title+'</a>,([^,]*),', "i"); + var m = authorRe.exec(text); + var author = m[1]; + author = Zotero.Utilities.cleanString(author); + // reconcile author + author = reconcileAuthor(author); + if (author!="NA"){ // ignore unknown authors + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true)); + } + newItem.creators.push({firstName:"Denis", lastName:"Diderot", creatorType:"editor"}); + newItem.creators.push({firstName:"Jean le Rond", lastName:"d'Alembert", creatorType:"editor"}); + newItem.complete(); + }, function() {Zotero.done();}, null); + Zotero.wait(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (url.indexOf("getobject.pl") != -1){ + // single article + scrape(doc); + } else { + //search page + var items = new Object(); + var xpath = '/html/body/div[@class="text"]/p/a'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + while (elmt = elmts.iterateNext()){ + var title = elmt.textContent; + var link = elmt.href; + if (title && link){ + items[link] = title; + } + } + var items = Zotero.selectItems(items); + if(!items) { + return true; + } + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } + +} +\ No newline at end of file diff --git a/translators/ARTstor.js b/translators/ARTstor.js @@ -0,0 +1,257 @@ +{ + "translatorID":"5278b20c-7c2c-4599-a785-12198ea648bf", + "translatorType":4, + "label":"ARTstor", + "creator":"Ameer Ahmed and Michael Berkowitz", + "target":"http://[^/]artstor.org[^/]*", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:55:00" +} + +function detectWeb(doc, url) { + if (url.match(/(S|s)earch/) && (doc.evaluate('//div[@id="thumbContentWrap"]/div', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\w+/))) return "multiple" +} + +function doWeb(doc, url) { + if (url.indexOf("|")!=-1){ + scrape(doc, url); + } +} + +function scrape(doc, url){ + var savedItems = new Array(); + var saved = 0; + var urlstub = url.substring(url.indexOf('.org/')+5,url.length); + urlstub = url.substring(0,url.indexOf('.org/')+5) + urlstub.substring(0, urlstub.indexOf('/')+1) + var suburl = url.substring(url.indexOf('|')+1, url.length); + var groupname = suburl.substring(0, suburl.indexOf("|")); + var searchterm = '//*[@id="thumbSubTitle"]'; + var stt = doc.evaluate(searchterm, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var st = stt.firstChild.nodeValue; + var pageNn = '//*[@id="pageNo"]'; + var stt = doc.evaluate(pageNn, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var pg; + if (stt.value==1){ + pg = 1; + } else if (stt.value==2){ + pg = 25; + } else { + pg = ((stt.value-1) * 24) + 1; + } + var groupid; + //check if user is on search page if not construct the query using the 2nd pattern + if (groupname.indexOf("search")!=-1){ + groupid = "1/" + pg + "/24/0?tn=1&name=&id=all&kw=" +st + "&type=1"; + }else { + groupid = suburl.substring(suburl.indexOf('|')+1, suburl.indexOf('||')) + "//thumbnails/" + pg + "/24/0"; + } + // Initial query to get results from the service - primary purpose is to get objectids. which in turn are required for the 2nd service call, which exposes the actual metadata + Zotero.Utilities.HTTP.doGet(urlstub + "secure/" + groupname + "//" + groupid, function(text) { + json = eval("(" + text + ")"); + items = new Object(); + for(var i=0; i<json.thumbnails.length; i++) { + child = json.thumbnails[i]; + var tmpUrl = urlstub + "secure/metadata/" + child.objectId + "?_method=Infolder"; + //here we are saving the url service call to get each objects metadata + savedItems[saved] = tmpUrl; + items[tmpUrl]=child.objectId; + saved++; + } + // GET VALUES FROM THE WEB + var xpath = '//div[@id="thumbContentWrap"]'; + var elmts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var webitems = new Object(); + var selectedNums = new Array(); + var si=0; + var c = elmts.getElementsByTagName('*'); + var title = ""; + for(var i=0; i<c.length; i++) { + var child = c[i]; + if (child.id.indexOf("_imageHolder")!=-1){ + var csss = child.style; + var glow = csss.getPropertyValue('border'); + } + if (child.id.indexOf("_thumb1")!=-1){ + title = child.title; + } + if (child.id.indexOf("_thumb2")!=-1){ + title+= " :: " + child.title; + } + if (child.id.indexOf("_thumb3")!=-1){ + var childtitle = child.title; + var dialogTitle = title; + if (childtitle.length>1) { + dialogTitle+=" " + childtitle; + } + var sitem = child.id.substring(6,child.id.indexOf("_")); + webitems[sitem-1] = dialogTitle; + if (glow.indexOf(75)!=-1){ + selectedNums[si]=sitem-1; + si++; + } + title = null; + } + } + // GET VALUES FROM THE WEB + var tcount=0; + var newitems = null; + if (selectedNums.length>0){ + newitems = new Object(); + for (j=0; j<selectedNums.length;j++){ + var numnum = selectedNums[j]; + for (var x in items){ + if (numnum==tcount){ + newitems[x] = webitems[tcount]; + tcount=0; + break; + } else { + tcount++; + } + } + } + } else { + tcount = 0; + for (var x in items){ + items[x] = webitems[tcount]; + tcount++; + } + } + if (newitems!=null){ + items = newitems; + } + //show dialogbox + var items = Zotero.selectItems(items); + if(!items) { + return true; + } + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + //this gets called when an object is selected in the dialog box, fires off a get on the service url + Zotero.Utilities.HTTP.doGet(urls, function(text) { + json = eval("(" + text + ")"); + var newArticle = new Zotero.Item('artwork'); + for (var i=0; i<json.metaData.length; i++) { + child = json.metaData[i]; + // MISSING CULTURE!!! + if (child.fieldName.indexOf("Title")!=-1){ + if (newArticle.title!=null){ + newArticle.title+= ";" + child.fieldValue; + } else { + newArticle.title = child.fieldValue; + } + } + if (child.fieldName.indexOf("Creator")!=-1){ + if (child.fieldValue != "") { + if (child.fieldValue.match(/,/)) { + var aut = child.fieldValue.match(/^([^,]+),\s+(.*)$/); + if (aut[1].match(/\s/)) { + newArticle.notes.push({note:"Artist information: " + aut[2]}); + newArticle.creators.push(Zotero.Utilities.cleanAuthor(aut[1], "artist")); + } else { + var extras = aut[2].match(/^([^,]+),\s+(.*)$/); + newArticle.creators.push({firstName:extras[1], lastName:aut[1], creatorType:"author"}); + newArticle.notes.push({note:"Artist information: " + extras[2]}); + } + } else { + newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "artist")); + } + } + } + if (child.fieldName.indexOf("Culture")!=-1){ + newArticle.creators.push(Zotero.Utilities.cleanAuthor(child.fieldValue, "producer", true)); + } + if (child.fieldName.indexOf("Rights")!=-1){ + if (newArticle.rights!=null){ + newArticle.rights+= ";" + child.fieldValue.replace(/<wbr\/>/g, ""); + } else { + newArticle.rights = child.fieldValue.replace(/<wbr\/>/g, ""); + } + } + if (child.fieldName.indexOf("Subject")!=-1){ + newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue)); + } + if (child.fieldName.indexOf("Location")!=-1){ + newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue)); + } + if (child.fieldName.indexOf("Style Period")!=-1){ + newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue)); + } + if (child.fieldName.indexOf("Work Type")!=-1){ + newArticle.tags.push(Zotero.Utilities.trimInternal(child.fieldValue)); + } + if (child.fieldName.indexOf("Material")!=-1 || child.fieldName.indexOf("Technique")!=-1 ){ + if (newArticle.artworkMedium!=null){ + newArticle.artworkMedium+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.artworkMedium = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + if (child.fieldName.indexOf("Measurements")!=-1){ + if (newArticle.artworkSize!=null){ + newArticle.artworkSize+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.artworkSize = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + if (child.fieldName.indexOf("Date")!=-1){ + if (newArticle.date!=null){ + newArticle.date+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + //bug here!! when date parser fails, entire object is not saved in Zotero - works in Scaffold, fails in Zotero! to patch remove all occurrences of B.C + newArticle.date = Zotero.Utilities.trimInternal(child.fieldValue.replace(/B.C./i, "")); + } + } + if (child.fieldName.indexOf("Repository")!=-1){ + if (newArticle.repository!=null){ + newArticle.repository+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.repository = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + if (child.fieldName.indexOf("Source")!=-1){ + if (newArticle.archiveLocation!=null){ + newArticle.archiveLocation+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.archiveLocation = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + if (child.fieldName.indexOf("Description")!=-1){ + if (newArticle.abstractNote!=null){ + newArticle.abstractNote+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.abstractNote = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + if (child.fieldName.indexOf("Collection")!=-1){ + if (newArticle.extra!=null){ + newArticle.extra+= ";" + Zotero.Utilities.trimInternal(child.fieldValue); + } else { + newArticle.extra = Zotero.Utilities.trimInternal(child.fieldValue); + } + } + } + var objectId = json.objectId; + //this is called to get the url stub for the ARTstor viewer + Zotero.Utilities.HTTP.doGet(urlstub + "secure/metadata/" + objectId + "?_method=FpHtml", function(dom) { + var testurl = dom.substring(dom.lastIndexOf('<td class="data">')+21,dom.lastIndexOf('</td>')); + var t2 = "http://www.artstor.org"; + var tmp2 = testurl.replace(/<wbr\/>/g, ""); + tmp2 = tmp2.substring(0, tmp2.indexOf("&userId")); + //build ARTstorImageURL + artstorimgurl = t2+tmp2; + newArticle.url = artstorimgurl; + newArticle.callNumber = objectId; + newArticle.complete(); + Zotero.done(); + }); + Zotero.wait(); + }); + Zotero.wait(); +}); +Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ASCE.js b/translators/ASCE.js @@ -0,0 +1,76 @@ +{ + "translatorID":"303bdfc5-11b8-4107-bca1-63ca97701a0f", + "translatorType":4, + "label":"ASCE", + "creator":"Michael Berkowitz", + "target":"^http://ascelibrary.aip.org/.+", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-09-06 19:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@id="sr-content-wrap"]//div[@class="sr-right"]/p[@class="sr-art-title"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function getRIS(doc, url) { + var newx = '//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'; + var key = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value; + Zotero.debug(key); + var citation = 'http://ascelibrary.aip.org/getabs/servlet/GetCitation?source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=' + key + '&fn=open_refworks&downloadcitation=+Go+'; + Zotero.Utilities.HTTP.doGet(citation, function(text) { + var translator = Zotero.loadTranslator("import"); + text = text.replace(/RT/, "TY"); + text = text.replace(/VO/, "VL"); + text = text.replace(/LK/, "UR"); + text = text.replace(/YR/, "PY"); + Zotero.debug(text); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - ")); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:item.url, title:"ASCE Snapshot", mimeType:"text/html"}, + {url:"http://ascelibrary.aip.org/getpdf/servlet/GetPDFServlet?filetype=pdf&id=" + key + "&idtype=cvips&prog=search", title:"EAS Full Text PDF", mimeType:"application/pdf"} + ]; + //item.itemType = "journalArticle"; + item.complete(); + }); + translator.translate(); + Zotero.wait(); + Zotero.done(); + }); +} + +function doWeb(doc, url) { + var articles = new Array(); + var items = new Object(); + var xpath = '//div[@class="sr-right"]/p[@class="sr-art-title"]/a'; + if (doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + while (new_title = titles.iterateNext()) { + items[new_title.href] = new_title.textContent; + } + + items = Zotero.selectItems(items); + + for (var i in items) { + articles.push(i) + } + } else { + var newx = '//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'; + var stuff = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value; + Zotero.debug(stuff); + articles.push(url); + } + + Zotero.debug(articles); + Zotero.Utilities.processDocuments(articles, getRIS, function() {Zotero.done}); + Zotero.wait(); + +} diff --git a/translators/AcademicJournals.net.js b/translators/AcademicJournals.net.js @@ -0,0 +1,91 @@ +{ + "translatorID":"252c6a50-0900-41c5-a66b-ec456137c43c", + "translatorType":4, + "label":"AcademicJournals.net", + "creator":"Michael Berkowitz", + "target":"http://www.academicjournals.net/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (url.match('articleno=')) { + return "journalArticle"; + } else if (url.match('issueno=') || url.match('current.php')) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return prefix; else return null; + } : namespace; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//tr[2]/td//table/tbody/tr[1]/td[2]/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var links = doc.evaluate('//tr[4]/td[2]/div/a[@class="links"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.url = doc.location.href; + //title + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//td[2]/table/tbody/tr/td/div/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + + //voliss, etc. + var voliss = doc.evaluate('//table/tbody/tr/td[2]/font/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + voliss = voliss.match(/^([^\d]+)(\d+)\s+\((\d+)\):\s+([\d\-]+),\s+(\d+)/); + Zotero.debug(voliss); + item.publicationTitle = voliss[1]; + item.volume = voliss[2]; + item.issue = voliss[3]; + item.pages = voliss[4]; + item.date = voliss[5]; + + //authors + var authorsx = doc.evaluate('//td[2]/font/a[@class="links"]/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var author; + var authors = new Array(); + while (author = authorsx.iterateNext()) { + authors.push(author.textContent); + } + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//table/tbody/tr/td/div/table/tbody/tr/td[2]/div/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + + //attachments + var pdfurl = doc.evaluate('//a[contains(@href, ".pdf")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + item.attachments = [ + {url:item.url, title:"AcademicJournals.net Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"AcademicJournals.net PDF", mimeType:"application/pdf"} + ]; + + //tags + var tagspath = doc.evaluate('//tbody/tr/td/table/tbody/tr[2]/td/font/a[@class="links"]/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tag; + var tags = new Array(); + while (tag = tagspath.iterateNext()) { + tags.push(tag.textContent); + } + item.tags = tags; + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/AdvoCAT.js b/translators/AdvoCAT.js @@ -0,0 +1,117 @@ +{ + "translatorID":"138de272-0d2a-4ab5-8cfb-0fd879958d04", + "translatorType":4, + "label":"AdvoCAT", + "creator":"Adam Crymble", + "target":"^http://(142.57.32.51|library.lsuc.on.ca)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-25 17:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("Search_Code")) { + return "multiple"; + } else if (doc.title.match("Record View")) { + return "book"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//table[2]/tbody/tr/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//table[2]/tbody/tr/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//table[2]/tbody/tr/td', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + if (!fieldTitle.match(/\w/)) { + fieldTitle = "Blank" + i; + } + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + if (dataTags["MainAuthor:"]) { + var author = dataTags["MainAuthor:"]; + if (author.match(", ") && !author.match(":")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["Published:"]) { + + if (dataTags["Published:"].match(": ")) { + var place1 = dataTags["Published:"].indexOf(": "); + newItem.place = dataTags["Published:"].substr(0, place1); + var publisher1 = dataTags["Published:"].substr(place1 + 2); + + if (publisher1.match(", ")) { + var date1 = publisher1.lastIndexOf(", "); + newItem.date = publisher1.substr(date1 +2); + newItem.publisher = publisher1.substr(0, date1); + } else { + newItem.publisher = publisher1; + } + } else { + newItem.publisher = publisher1; + } + } + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Database:", "repository"); + associateData (newItem, dataTags, "Description:", "pages"); + associateData (newItem, dataTags, "Edition:", "edition"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//form[2]/table/tbody/tr/td[3]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/African Journals Online.js b/translators/African Journals Online.js @@ -0,0 +1,71 @@ +{ + "translatorID":"9d822257-2eec-4674-b6d0-2504f54c8890", + "translatorType":4, + "label":"African Journals Online", + "creator":"Michael Berkowitz", + "target":"http://www.ajol.info", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-18 08:55:00" +} + +function detectWeb(doc, url) { + if (url.match(/viewarticle.php/)) { + return "journalArticle"; + } else if (url.match(/search.php/) || url.match(/viewissue.php/)) { + return "multiple"; + } +} + +function getID(str) { + return str.match(/(&|\?)id=(\d+)&?/)[2]; +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + if (url.match(/search.php/)) { + var items = Zotero.Utilities.getItemArray(doc, doc, "viewarticle.php?"); + } else if (url.match("viewissue.php")) { + var items = new Object(); + var titles = doc.evaluate('//span[@class="toctitle"]', doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//a[text() = "Abstract"]', doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(getID(i)); + } + } else { + articles = [getID(url)]; + } + Zotero.debug(articles); + for each (var id in articles) { + var getstr = 'http://www.ajol.info/rst/rst.php?op=capture_cite&id=' + id + '&cite=refman'; + Zotero.Utilities.HTTP.doGet(getstr, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pubinfo = item.publicationTitle.match(/(.*);([^;]+)$/); + item.publicationTitle = pubinfo[1]; + var voliss = pubinfo[2].toLowerCase(); + if (voliss.match(/v/)) item.volume = voliss.match(/v(ol\.)?\s+(\d+)/)[2]; + if (voliss.match(/n/)) item.issue = voliss.match(/n(o\.)?\s+(\d+)/)[2]; + if (voliss.match(/p(age)?/)) item.pages = voliss.match(/\d+\-\d+/)[0]; + item.date = voliss.match(/\(([^)]+)\)/)[1]; + item.attachments[0].title = "African Journals Online Snapshot"; + item.attachments[0].mimeType = "text/html"; + item.complete(); + }); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/AfroEuropa.js b/translators/AfroEuropa.js @@ -0,0 +1,87 @@ +{ + "translatorID":"4f62425a-c99f-4ce1-b7c1-5a3ac0d636a3", + "translatorType":4, + "label":"AfroEuropa", + "creator":"Michael Berkowitz", + "target":"http://journal.afroeuropa.eu/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-20 19:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr[td/a[2]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/article\/view\//)) { + return "journalArticle"; + } +} + +function makeExport(site, str) { + var nums = str.match(/\d+(\/\d+)?/)[0]; + if (!nums.match(/\//)) nums += "/0"; + return site + 'rt/captureCite/' + nums + '/referenceManager'; +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var site = url.match(/^http:\/\/([^/]*\/)+index\.php\/[^/]*\//)[0]; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var xpath = '//tr[td/a]'; + if (url.match(/search/)) { + var titlex = './td[2]'; + var linkx = './td[3]/a[1]'; + } else if (url.match(/issue/)) { + var titlex = './td[1]'; + var linkx = './td[2]/a[1]'; + } + var items = new Object(); + var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[makeExport(site, link)] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [makeExport(cite, url)]; + } + Zotero.Utilities.HTTP.doGet(arts, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.title = Zotero.Utilities.capitalizeTitle(item.title); + var voliss = item.publicationTitle.split(/;\s+/); + item.publicationTitle = Zotero.Utilities.trimInternal(voliss[0]); + voliss = voliss[1].match(/(\d+),\s+No\s+(\d+)\s+\((\d+)\)/); + item.volume = voliss[1]; + item.issue = voliss[2]; + item.date = voliss[3]; + var auts = new Array(); + for each (var aut in item.creators) { + auts.push(aut.lastName); + } + item.creators = new Array(); + for each (var aut in auts) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.attachments[0].mimeType = "text/html"; + item.attachments[0].title = "AfroEuropa Snapshot"; + item.complete(); + }); + translator.translate(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Agencia del ISBN.js b/translators/Agencia del ISBN.js @@ -0,0 +1,65 @@ +{ + "translatorID":"b8a86e36-c270-48c9-bdd1-22aaa167ef46", + "translatorType":4, + "label":"Agencia del ISBN", + "creator":"Michael Berkowitz", + "target":"http://www.mcu.es/webISBN", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-08 23:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="isbnResultado"]/div[@class="isbnResDescripcion"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//div[@class="fichaISBN"]/div[@class="cabecera"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +function doWeb(doc, url) { + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var boxes = doc.evaluate('//div[@class="isbnResultado"]/div[@class="isbnResDescripcion"]', doc, null, XPathResult.ANY_TYPE, null); + var box; + while (box = boxes.iterateNext()) { + var book = doc.evaluate('./p/span/strong/a', box, null, XPathResult.ANY_TYPE, null).iterateNext(); + items[book.href] = book.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i); + } + } else { + books = [url]; + } + Zotero.Utilities.processDocuments(books, function(newDoc) { + var data = new Object(); + var rows = newDoc.evaluate('//div[@class="fichaISBN"]/table/tbody/tr', newDoc, null, XPathResult.ANY_TYPE, null); + var next_row; + while (next_row = rows.iterateNext()) { + var heading = newDoc.evaluate('./th', next_row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var value = newDoc.evaluate('./td', next_row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + data[heading.replace(/\W/g, "")] = value; + } + var isbn = Zotero.Utilities.trimInternal(newDoc.evaluate('//span[@class="cabTitulo"]/strong', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var item = new Zotero.Item("book"); + item.ISBN = isbn; + item.title = Zotero.Utilities.trimInternal(data['Ttulo']); + + author = data['Autores']; + if (author) { + var authors = author.match(/\b.*,\s+\w+[^([]/g); + for each (aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author", true)); + } + } + if (data['Publicacin']) item.publisher = Zotero.Utilities.trimInternal(data['Publicacin']); + if (data['FechaEdicin']) item.date = Zotero.Utilities.trimInternal(data['FechaEdicin']); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Alexander Street Press.js b/translators/Alexander Street Press.js @@ -0,0 +1,197 @@ +{ + "translatorID":"0a84a653-79ea-4c6a-8a68-da933e3b504a", + "translatorType":4, + "label":"Alexander Street Press", + "creator":"John West and Michael Berkowitz", + "target":"http://(?:www\\.)alexanderstreet", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-28 16:30:00" +} + +function detectWeb(doc, url) { + if( url.indexOf("object.details.aspx") != -1 ) { + var zitemtype = doc.getElementById("ctl00_ctl00_MasterContentBody_ContentPlaceHolder1_txtZType").value; + switch (zitemtype.toLowerCase()) { + case "book": + return "book"; + break; + case "chapter": + return "bookSection"; + break; + case "journal": + return "journalArticle"; + break; + case "manuscript": + return "manuscript"; + break; + case "audio": + return "audioRecording"; + break; + case "video": + return "videoRecording"; + break; + case "issue": + return "journalArticle"; + break; + case "article": + return "journalArticle"; + break; + case "series": + return "interview"; + break; + case "session": + return "interview"; + break; + default: + return "document"; + } + } else if (url.indexOf("results.aspx") != -1) { + return "multiple"; + } +} + +function scrape(doc, url) { + // set prefix for serverside control + var p = "ctl00_ctl00_MasterContentBody_ContentPlaceHolder1_txtZ"; + + // get values from hidden inputs + var ztype = GetItemType(doc.getElementById(p+"Type").value); + var ztitle = doc.getElementById(p+"Title").value; + var zbooktitle = doc.getElementById(p+"BookTitle").value; + var znotes = doc.getElementById(p+"Notes").value; + var zurl = doc.getElementById(p+"URL").value; + var zrights = doc.getElementById(p+"Rights").value; + var zseries = doc.getElementById(p+"Series").value; + var zvolume = doc.getElementById(p+"Volume").value; + var zissue = doc.getElementById(p+"Issue").value; + var zedition = doc.getElementById(p+"Edition").value; + var zplace = doc.getElementById(p+"Place").value; + var zpublisher = doc.getElementById(p+"Publisher").value; + var zpages = doc.getElementById(p+"Pages").value; + var zrepository = doc.getElementById(p+"Repository").value; + var zlabel = doc.getElementById(p+"Label").value; + var zrunningTime = doc.getElementById(p+"RunningTime").value; + var zlanguage = doc.getElementById(p+"Language").value; + var zauthor = doc.getElementById(p+"Author").value; + var zeditor = doc.getElementById(p+"Editor").value; + var ztranslator = doc.getElementById(p+"Translator").value; + var zinterviewee = doc.getElementById(p+"Interviewee").value; + var zinterviewer = doc.getElementById(p+"Interviewer").value; + var zrecipient = doc.getElementById(p+"Recipient").value; + var zdirector = doc.getElementById(p+"Director").value; + var zscriptwriter = doc.getElementById(p+"ScriptWriter").value; + var zproducer = doc.getElementById(p+"Producer").value; + var zcastMember = doc.getElementById(p+"CastMember").value; + var zperformer = doc.getElementById(p+"Performer").value; + var zcomposer = doc.getElementById(p+"Composer").value; + + // create Zotero item + var newArticle = new Zotero.Item(ztype); + + // populate Zotero item + newArticle.title = ztitle; + newArticle.bookTitle = zbooktitle; + newArticle.notes = znotes; + newArticle.url = zurl; + newArticle.place = zplace; + newArticle.publisher = zpublisher; + newArticle.pages = zpages; + newArticle.rights = zrights; + newArticle.series = zseries; + newArticle.volume = zvolume; + newArticle.issue = zissue; + newArticle.edition = zedition; + newArticle.repository = zrepository; + newArticle.label = zlabel; + newArticle.runningTime = zrunningTime; + newArticle.language = zlanguage; + newArticle.editor = zeditor; + newArticle.translator = ztranslator; + newArticle.interviewee = zinterviewee; + newArticle.interviewer = zinterviewer; + newArticle.recipient = zrecipient; + newArticle.director = zdirector; + newArticle.scriptwriter = zscriptwriter; + newArticle.producer = zproducer; + newArticle.castMember = zcastMember; + newArticle.performer = zperformer; + newArticle.composer = zcomposer; + var aus = zauthor.split(";"); + for (var i=0; i< aus.length ; i++) { + newArticle.creators.push(Zotero.Utilities.cleanAuthor(aus[i], "author", true)); + } + + newArticle.attachments = [{url:doc.location.href, title:"Alexander Street Press Snapshot", mimeType:"text/html"}]; + if (doc.evaluate('//a[contains(@href, "get.pdf")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var pdfurl = doc.evaluate('//a[contains(@href, "get.pdf")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + newArticle.attachments.push({url:pdfurl, title:"Alexander Street Press PDF", mimeType:"application/pdf"}); + } else if (doc.evaluate('//a[contains(@href, "get.jpg")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var imgurl = doc.evaluate('//a[contains(@href, "get.jpg")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/.{2}$/, "01"); + newArticle.attachments.push({url:imgurl, title:"Alexander Street Press Pg 1", mimeType:"image/jpg"}); + newArticle.notes = [{note:"Further page images can be found by following the URL of the 'Alexander Street Press Pg 1' attachment and iterating the final digits of the URL"}]; + } + // save Zotero item + newArticle.complete(); + +} + +function GetItemType(zitemtype) { + switch (zitemtype.toLowerCase()) { + case "book": + return "book"; + break; + case "chapter": + return "bookSection"; + break; + case "journal": + return "journalArticle"; + break; + case "manuscript": + return "manuscript"; + break; + case "audio": + return "audioRecording"; + break; + case "video": + return "videoRecording"; + break; + case "issue": + return "journalArticle"; + break; + case "article": + return "journalArticle"; + break; + case "series": + return "interview"; + break; + case "session": + return "interview"; + break; + default: + return "document"; + } +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//tbody/tr/td[2][@class="data"]/a[1]'; + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/AlterNet.js b/translators/AlterNet.js @@ -0,0 +1,182 @@ +{ + "translatorID":"ea531652-cdeb-4ec2-940e-627d4b107263", + "translatorType":4, + "label":"AlterNet", + "creator":"Jesse Johnson", + "target":"^http://(?:www\\.)alternet.org", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-10 06:15:00" +} + +function detectWeb(doc, url) { + // identifies articles according to the presence of an article ID + // number in the URL + var index = url.toString().indexOf('.org/') + 5; + index += url.toString().substr(index).indexOf('/'); + if (index != -1) { + // ordinary aritcle + var id = url.toString().substr(index + 1, 5); + Zotero.Utilities.cleanString(id); + if (Number(id)) { + return "magazineArticle"; + } + //columnist or blog article + index += url.toString().substr(index + 1).indexOf('/'); + id = url.toString().substr(index + 2, 5); + Zotero.Utilities.cleanString(id); + if (Number(id) && url.toString().search('blog') == -1) { + return "magazineArticle"; + } + else if (Number(id)) { + return "blogPost"; + } + } + + return null; +} + +function scrape(doc, url, title) { + var index = url.toString().indexOf('.org/') + 5; + index += url.toString().substr(index).indexOf('/'); + if (index != -1) { + // ordinary aritcle + var id = url.toString().substr(index + 1, 5); + Zotero.Utilities.cleanString(id); + if (Number(id)) { + var newItem = new Zotero.Item("magazineArticle"); + } + //columnist or blog article + index += url.toString().substr(index + 1).indexOf('/'); + id = url.toString().substr(index + 2, 5); + Zotero.Utilities.cleanString(id); + if (Number(id) && url.toString().search('blog') == -1) { + var newItem = new Zotero.Item("magazineArticle"); + } + else if (Number(id)) { + var newItem = new Zotero.Item("blogPost"); + } + } + + newItem.url = url; + newItem.title = title; + + if (newItem.itemType == "magazineArticle") { + newItem.publicationTitle = "AlterNet"; + newItem.repository = "alternet.org"; + } + else if (newItem.itemType == "blogPost") { + newItem.websiteType = "AlterNet Blog"; + } + + + // general scraping variables + var xpath; + + + // author + if (newItem.itemType == "magazineArticle") { + xpath = '//p[@class="storybyline"]//a[contains(@href,"author")]'; + } + else if (newItem.itemType == "blogPost") { + xpath = '//p[@class="storybyline"]//a[contains(@href,"bloggers")]'; + } + temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + if (temp) { + var author = Zotero.Utilities.trimInternal(temp.textContent); + if(author.substr(0, 3).toLowerCase() == "by ") { + author = author.substr(3); + } + + var authors = author.split(","); + for each (var author in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + // date + if (newItem.itemType == "magazineArticle") { + xpath = '//p[@class="storybyline"]//a[contains(@href,"date")]'; + temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var date = Zotero.Utilities.strToDate(temp.textContent); + } + else if (newItem.itemType == "blogPost") { + xpath = '//p[@class="storybyline"]/b'; + temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var begin = temp.textContent.lastIndexOf(" on "); + temp = temp.textContent.substr(begin + 4); + var date = Zotero.Utilities.strToDate(temp.substr(0, temp.length - 1)); + } + if (date != null) { + var strdate; + + date.month = date.month + 1; + + strdate = date.year + '-'; + if (date.month < 10) { + strdate += '0' + date.month; + } + else { + strdate += date.month; + } + if (date.day > 10) { + strdate += '-' + date.day; + } + else { + strdate += '-0' + date.day; + } + + newItem.date = strdate; + } + + // abstract + xpath = '//div[@class="teaser"]//div[contains(@class,"teaser")]'; + temp = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + if (temp) { + newItem.abstractNote = Zotero.Utilities.trimInternal(temp.textContent); + } + + // article snapshot + // grabs 5-digit article code from url and uses it to derive printable page url for use in article snapshot + var index = url.toString().indexOf('.org/') + 5; + index += url.toString().substr(index).indexOf('/'); + if (index != -1) { + var printurl; + // ordinary article + var id = url.toString().substr(index + 1, 5); + if (Number(id)) { + printurl = "http://www.alternet.org/module/printversion/" + id; + newItem.attachments.push({url:printurl, title:"AlterNet Article Snapshot", mimeType:"text/html"}); + } + // columnist article + else { + index += url.toString().substr(index + 1).indexOf('/'); + id = url.toString().substr(index + 2, 5); + Zotero.Utilities.cleanString(id); + if (Number(id)) { + printurl = "http://www.alternet.org/module/printversion/" + id; + if (newItem.itemType == "blogPost") { + printurl += "/?type=blog"; + } + newItem.attachments.push({url:printurl, title:"AlterNet Article Snapshot", mimeType:"text/html"}); + } + } + } + + newItem.complete(); +} + + + +function doWeb(doc, url) { + // ordinary and columnist articles + var xpath = '//p[@class="storyheadline"]'; + var title; + if (title = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + scrape(doc, url, title.textContent); + } + + return null; +} +\ No newline at end of file diff --git a/translators/Aluka.js b/translators/Aluka.js @@ -0,0 +1,191 @@ +{ + "translatorID":"e8fc7ebc-b63d-4eb3-a16c-91da232f7220", + "translatorType":4, + "label":"Aluka", + "creator":"Sean Takats", + "target":"https?://(?:www\\.)aluka.org/action/(?:showMetadata\\?doi=[^&]+|doSearch\\?|doBrowseResults\\?)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-12 10:00:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//a[@class="title"]'; + + if (url.match(/showMetadata\?doi=[^&]+/)){ + return "document"; + } else if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +// Aluka types we can import +// TODO: Improve support for other Aluka item types? +// Correspondence, Circulars, Newsletters, Interviews, Pamphlets, Policy Documents, Posters, Press Releases, Reports, Testimonies, Transcripts +var typeMap = { + "Books":"book", + "Aluka Essays":"report", + "photograph":"artwork", + "Photographs":"artwork", + "Panoramas":"artwork", + "Journals (Periodicals)":"journalArticle", + "Articles":"journalArticle", + "Correspondence":"letter", + "Interviews":"interview", + "Reports":"report" +} + +function doWeb(doc, url){ + var urlString = "http://www.aluka.org/action/showPrimeXML?doi=" ; + var uris = new Array(); + var m = url.match(/showMetadata\?doi=([^&]+)/); + if (m) { //single page + uris.push(urlString+ m[1]); + } else { //search results page + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//a[@class="title"]'; + var items = new Object(); + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + while (elmt = elmts.iterateNext()) { + var title = elmt.textContent; + var link = elmt.href; + var m = link.match(/showMetadata\?doi=([^&]+)/); + if (title && m){ + items[m[1]] = title; + } + } + + var items = Zotero.selectItems(items); + if(!items) { + return true; + } + + for(var i in items) { + uris.push(urlString + i); + } + } + // http://www.aluka.org/action/showPrimeXML?doi=10.5555/AL.SFF.DOCUMENT.cbp1008 + + Zotero.Utilities.HTTP.doGet(uris, function(text) { + text = text.replace(/<\?xml[^>]*\?>/, ""); // strip xml header + text = text.replace(/(<[^>\.]*)\.([^>]*>)/g, "$1_$2"); // replace dots in tags with underscores + var xml = new XML(text); + var metadata = xml..MetadataDC; + var itemType = "Unknown"; + if (metadata.length()){ + itemType = "document"; + if (metadata[0].Type.length()){ + var value = metadata[0].Type[0].text().toString(); + if(typeMap[value]) { + itemType = typeMap[value]; + } else { + Zotero.debug("Unmapped Aluka Type: " + value); + } + } + var newItem = new Zotero.Item(itemType); + var title = ""; + if (metadata[0].Title.length()){ + var title = Zotero.Utilities.trimInternal(metadata[0].Title[0].text().toString()); + if (title == ""){ + title = " "; + } + newItem.title = title; + } + if (metadata[0].Title_Alternative.length()){ + newItem.extra = Zotero.Utilities.trimInternal(metadata[0].Title_Alternative[0].text().toString()); + } + for(var i=0; i<metadata[0].Subject_Enriched.length(); i++) { + newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Subject_Enriched[i].text().toString())); + } + for(var i=0; i<metadata[0].Coverage_Spatial.length(); i++) { + newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Coverage_Spatial[i].text().toString())); + } + for(var i=0; i<metadata[0].Coverage_Temporal.length(); i++) { + newItem.tags.push(Zotero.Utilities.trimInternal(metadata[0].Coverage_Temporal[i].text().toString())); + } +// TODO: decide whether to uncomment below code to import species data as tags +// for(var i=0; i<xml..TopicName.length(); i++) { +// newItem.tags.push(Zotero.Utilities.trimInternal(xml..TopicName[i].text().toString())); +// } + + if (metadata[0].Date.length()){ + var date = metadata[0].Date[0].text().toString(); + if (date.match(/^\d{8}$/)){ + date = date.substr(0, 4) + "-" + date.substr(4, 2) + "-" + date.substr(6, 2); + } + newItem.date = date; + } + if (metadata[0].Creator.length()){ + var authors = metadata[0].Creator; + var type = "author"; + for(var j=0; j<authors.length(); j++) { + Zotero.debug("author: " + authors[j]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true)); + } + } + if (metadata[0].Contributor.length()){ + var authors = metadata[0].Contributor; + var type = "contributor"; + for(var j=0; j<authors.length(); j++) { + Zotero.debug("author: " + authors[j]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true)); + } + } + if (metadata[0].Publisher.length()){ + newItem.publisher = Zotero.Utilities.trimInternal(metadata[0].Publisher[0].text().toString()); + } + if (metadata[0].Format_Medium.length()){ + newItem.medium = Zotero.Utilities.trimInternal(metadata[0].Format_Medium[0].text().toString()); + } + if (metadata[0].Language.length()){ + newItem.language = Zotero.Utilities.trimInternal(metadata[0].Language[0].text().toString()); + } + if (metadata[0].Description.length()){ + newItem.abstractNote = metadata[0].Description[0].text().toString(); + } + if (metadata[0].Format_Extent.length()){ + newItem.pages = Zotero.Utilities.trimInternal(metadata[0].Format_Extent[0].text().toString()); + } + var doi = xml..DOI; + if (doi.length()){ + newItem.DOI = doi[0]; + var newUrl = "http://www.aluka.org/action/showMetadata?doi=" + doi[0]; + newItem.attachments.push({title:"Aluka Link", snapshot:false, mimeType:"text/html", url:newUrl}); + var pdfUrl = "http://ts-den.aluka.org/delivery/aluka-contentdelivery/pdf/" + doi[0] + "?type=img&q=high"; + newItem.attachments.push({url:pdfUrl}); + newItem.url = newUrl; + } + var rights = xml..Rights.Attribution; + if (rights.length()){ + newItem.rights = rights[0]; + } + if (metadata[0].Rights.length()){ + newItem.rights = Zotero.Utilities.trimInternal(metadata[0].Rights[0].text().toString()); + } + if (metadata[0].Source.length()){ + newItem.repository = "Aluka: " + Zotero.Utilities.trimInternal(metadata[0].Source[0].text().toString()); + } + if (metadata[0].Relation.length()){ + newItem.callNumber = Zotero.Utilities.trimInternal(metadata[0].Relation[0].text().toString()); + } + newItem.complete(); + } else { + Zotero.debug("No Dublin Core XML data"); + return false; + } + Zotero.done(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Amazon.com.js b/translators/Amazon.com.js @@ -0,0 +1,208 @@ +{ + "translatorID":"96b9f483-c44d-5784-cdad-ce21b984fe01", + "translatorType":4, + "label":"Amazon.com", + "creator":"Sean Takats and Michael Berkowitz", + "target":"^https?://(?:www\\.)?amazon", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-22 20:30:00" +} + +function detectWeb(doc, url) { + + var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/"); + var suffixMatch = suffixRe.exec(url); + var suffix = suffixMatch[1]; + var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/)'); + if(searchRe.test(doc.location.href)) { + return "multiple"; + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//input[@name="ASIN"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var elmt = doc.evaluate('//input[@name="storeID"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(elmt) { + var storeID = elmt.value; + Zotero.debug("store id: " + storeID); + if (storeID=="books"){ + return "book"; + } + else if (storeID=="music"){ + return "audioRecording"; + } + else if (storeID=="dvd"|storeID=="video"){ + return "videoRecording"; + } + else { + return "book"; + } + } + else { + return "book"; + } + } + } +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + + var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/"); + var suffixMatch = suffixRe.exec(url); + var suffix = suffixMatch[1]; + + var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/)'); + var m = searchRe.exec(doc.location.href); + var uris = new Array(); + if (suffix == "co.jp"){ + suffix = "jp"; + } + if (suffix == ".com") suffix = "com"; + if(m) { + var xpath = '//div[@class="productTitle"]/a | //a[span[@class="srTitle"]]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + var asins = new Array(); + var availableItems = new Array(); + var i = 0; + var asinRe = new RegExp('/(dp|product)/([^/]+)/'); + do { + var link = elmt.href; + var searchTitle = elmt.textContent; + if (asinRe.exec(link)) { + var asinMatch = asinRe.exec(link); + availableItems[i] = searchTitle; + asins[i] = asinMatch[2]; + i++; + } + } while (elmt = elmts.iterateNext()); + var items = Zotero.selectItems(availableItems); + + if(!items) { + return true; + } + + for(var i in items) { + uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asins[i] + "&ResponseGroup=ItemAttributes"); + } + + } else { + var elmts = doc.evaluate('//input[@name = "ASIN"]', doc, + nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + while(elmt = elmts.iterateNext()) { + var asin = elmt.value; + } + uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asin + "&ResponseGroup=ItemAttributes"); + } + Zotero.Utilities.HTTP.doGet(uris, function(text) { + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + var texts = text.split("<Items>"); + texts = texts[1].split("</ItemLookupResponse>"); + text = "<Items>" + texts[0]; + var xml = new XML(text); + var publisher = ""; + + if (!xml..Errors.length()) { + if (xml..Publisher.length()){ + publisher = Zotero.Utilities.cleanString(xml..Publisher[0].text().toString()); + } + + var binding = ""; + if (xml..Binding.length()){ + binding = Zotero.Utilities.cleanString(xml..Binding[0].text().toString()); + } + + var productGroup = ""; + if (xml..ProductGroup.length()){ + productGroup = Zotero.Utilities.cleanString(xml..ProductGroup[0].text().toString()); + } + + if (productGroup=="Book") { + var newItem = new Zotero.Item("book"); + newItem.publisher = publisher; + } + else if (productGroup == "Music") { + var newItem = new Zotero.Item("audioRecording"); + newItem.label = publisher; + newItem.audioRecordingType = binding; + for(var i=0; i<xml..Artist.length(); i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Artist[i].text().toString(), "performer")); + } + } + else if (productGroup == "DVD" | productGroup == "Video") { + var newItem = new Zotero.Item("videoRecording"); + newItem.studio = publisher; + newItem.videoRecordingType = binding; + for(var i=0; i<xml..Actor.length(); i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Actor[i].text().toString(), "castMember")); + } + for(var i=0; i<xml..Director.length(); i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Director[i].text().toString(), "director")); + } + } + else{ + var newItem = new Zotero.Item("book"); + newItem.publisher = publisher; + } + + if(xml..RunningTime.length()){ + newItem.runningTime = Zotero.Utilities.cleanString(xml..RunningTime[0].text().toString()); + } + + // Retrieve authors and other creators + for(var i=0; i<xml..Author.length(); i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Author[i].text().toString(), "author")); + } + if (newItem.creators.length == 0){ + for(var i=0; i<xml..Creator.length(); i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Creator[i].text().toString())); + } + } + + if (xml..PublicationDate.length()){ + newItem.date = Zotero.Utilities.cleanString(xml..PublicationDate[0].text().toString()); + } else if (xml..ReleaseDate.length()){ + newItem.date = Zotero.Utilities.cleanString(xml..ReleaseDate[0].text().toString()); + } + if (xml..Edition.length()){ + newItem.edition = Zotero.Utilities.cleanString(xml..Edition[0].text().toString()); + } + if (xml..ISBN.length()){ + newItem.ISBN = Zotero.Utilities.cleanString(xml..ISBN[0].text().toString()); + } +// Uncomment when numPages field is added to schema +// if (xml..NumberOfPages.length()){ +// newItem.numPages = Zotero.Utilities.cleanString(xml..NumberOfPages[0].text().toString()); +// } + var title = Zotero.Utilities.cleanString(xml..Title[0].text().toString()); + if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) { + title = title.substring(0, title.lastIndexOf("(")-1); + } + if (xml..ASIN.length()){ + var url = "http://www.amazon." + suffix + "/dp/" + Zotero.Utilities.cleanString(xml..ASIN[0].text().toString()); + newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url}); + } + + if (xml..OriginalReleaseDate.length()){ + newItem.extra = Zotero.Utilities.cleanString(xml..OriginalReleaseDate[0].text().toString()); + } + + newItem.title = title; + newItem.complete(); + } + }, function() {Zotero.done;}, null); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/American Institute of Aeronautics and Astronautics.js b/translators/American Institute of Aeronautics and Astronautics.js @@ -0,0 +1,96 @@ +{ + "translatorID":"75edc5a1-6470-465a-a928-ccb77d95eb72", + "translatorType":4, + "label":"American Institute of Aeronautics and Astronautics", + "creator":"Michael Berkowitz", + "target":"http://www.aiaa.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-12 19:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td/div[@class="title"]/b/div[@class="centerHeadlines"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var items = new Object(); + var oldItems = doc.evaluate('//table/tbody/tr/td[div[@class="title"]]', doc, ns, XPathResult.ANY_TYPE, null); + var nextItem; + while (nextItem = oldItems.iterateNext()) { + var data = new Object(); + data['title'] = Zotero.Utilities.trimInternal(doc.evaluate('./div[@class="title"]//div[@class="centerHeadlines"]', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + data['pages'] = Zotero.Utilities.trimInternal(doc.evaluate('./div[@class="title"]//div[@class="centerHeadlinesSub2"]', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/[\d\w]+\-[\d\w]+/)[0]); + data['authors'] = Zotero.Utilities.trimInternal(doc.evaluate('./ul/i', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var extra = Zotero.Utilities.trimInternal(doc.evaluate('./ul', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var extra = extra.replace(data['authors'], ""); + data['extra'] = Zotero.Utilities.trimInternal(extra); + var pdf = doc.evaluate('.//a', nextItem, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.debug(pdf); + data['pdfurl'] = pdf; + items[data['title']] = data; + } + var volume; + var issue; + var date; + if (doc.evaluate('//td[2]/table/tbody/tr/td[1]/strong', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var voliss = Zotero.Utilities.trimInternal(doc.evaluate('//td[2]/table/tbody/tr/td[1]/strong', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + voliss = voliss.match(/(\d+)\s+vol\.\s*(\d+)\s+no\.\s*(\d+)/); + volume = voliss[2]; + issue = voliss[3]; + date = voliss[1]; + } else if (doc.evaluate('//select', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var voliss = Zotero.Utilities.trimInternal(doc.evaluate('//select[@name="volume"]/option[@selected]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var issue = Zotero.Utilities.trimInternal(doc.evaluate('//select[@name="issue"]/option[@selected]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + voliss = voliss.match(/vol\.\s*(\d+)\s*\-\s*(\d+)/); + volume = voliss[1]; + date = voliss[2]; + } + if (doc.evaluate('//tr[1]/td/b/div[@class="centerHeadlines"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var journal = Zotero.Utilities.trimInternal(doc.evaluate('//tr[1]/td/b/div[@class="centerHeadlines"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var ISSN = Zotero.Utilities.trimInternal(doc.evaluate('//tr[1]/td/font[@class="centerHeadlinesSub2"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/(\(|\))/g, "")); + } else if (doc.evaluate('//div[@class="centerHeadlinesTitle"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var journal = Zotero.Utilities.trimInternal(doc.evaluate('//div[@class="centerHeadlinesTitle"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var ISSN = Zotero.Utilities.trimInternal(doc.evaluate('//tr/td[1]/table/tbody/tr[2]/td/div', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/ISSN\s*([\d\-]+)/)[1]); + } + var searchItems = new Array(); + for (var i in items) { + searchItems.push(i); + } + + searchItems = Zotero.selectItems(searchItems); + for (var i in items) { + for each (var title in searchItems) { + if (i == title) { + var data = items[i]; + var item = new Zotero.Item("journalArticle"); + item.volume = volume; + item.issue = issue; + item.date = date; + item.title = data['title']; + item.pages = data['pages']; + item.publicationTitle = Zotero.Utilities.capitalizeTitle(journal); + item.ISSN = ISSN; + if (data['authors'].match(/\w+/)) { + var authors = data['authors'].split(/(\band\b|,|;)/); + for each (var aut in authors) { + if (aut.match(/\w+/) && aut != "and") { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + } + item.attachments = [{url:data['pdfurl'], title:"AIAA PDF (first page)", mimeType:"application/pdf"}]; + item.complete(); + } + } + } +} +\ No newline at end of file diff --git a/translators/Ancestry.com US Federal Census.js b/translators/Ancestry.com US Federal Census.js @@ -0,0 +1,235 @@ +{ + "translatorID":"0dda3f89-15de-4479-987f-cc13f1ba7999", + "translatorType":4, + "label":"Ancestry.com US Federal Census", + "creator":"Elena Razlogova", + "target":"^https?://search.ancestry.com/(.*)usfedcen|1890orgcen|1910uscenindex", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-24 02:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var result = doc.evaluate('//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + + var rows = doc.evaluate('//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrow record"]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var row; + while(row = rows.iterateNext()) { + links = doc.evaluate('.//a', row, nsResolver, XPathResult.ANY_TYPE, null); + var linkNo=0; + while(link=links.iterateNext()) { + linkNo=linkNo+1; + } + break; + } + + if(result && linkNo == 2) { + return "multiple"; + } else { + var indivRe = /indiv=1/; + var m = indivRe.exec(doc.location.href); + var indiv = 0; + if(m) { + indiv = 1; + } + + checkURL = doc.location.href.replace("pf=", "").replace("&h=", ""); + if(doc.location.href == checkURL && indiv == 1) { + return "bookSection"; + } + } +} + +// this US Federal Census scraper is a hack - so far there is no proper item type in Zotero for this kind of data (added to trac as a low priority ticket) +// this scraper creates proper citation for the census as a whole (should be cited as book) +// but also adds name, city, and state for a particular individual to the citation to make scanning for names & places easier in the middle pane +// (that's why the resulting item type is a book section) +// it also adds all searchable text as a snapshot and a scan of the census record as an image + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // get initial census data; a proper census record item type should have separate fields for all of these except perhaps dbid + var info = doc.evaluate('//div[@class="facets"][@id="connect"]/div[@class="g_box"]/p/a', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + if(info) { + + info = info.toString(); + var data = new Array(); + var parts = info.split(/[?&]/); + for each(var part in parts) { + var index = part.indexOf("="); + if(index !== -1) { + data[part.substr(0, index)] = part.substr(index+1); + } + } + + if(data.ln) { + var lastName = data.ln.replace(/\+/g, " "); + var firstName = data.fn.replace(/\+/g, " "); + } else { + var lastName = data.fn.replace(/\+/g, " "); + var firstName = ""; + } + var dOb = data.by; // this does not get saved yet because no field is available; the info is in the snapshot + if(data.rfd) { + var yearRe = /([0-9]{4})/; + var m = yearRe.exec(data.rfd); + if(m) { + var year = m[1]; + } + } else { var year = data.ry; } + var state = data.rs.replace(/\+/g, " "); + var county = data.rcnty.replace(/\+/g, " "); // this does not get saved yet because no field is available; the info is in the snapshot + var city = data.rcty.replace(/\+/g, " "); + var dbid = data.dbid; + } + + // set census number for citation - let me know if this can be done in a better way + var censusYear = 0; + var censusNo = ""; + var censusNos = new Array("1790", "First", "1800", "Second", "1810", "Third", "1820", "Fourth", "1830", "Fifth", "1840", "Sixth", "1850", "Seventh", "1860", "Eighth", "1870", "Ninth", + "1880", "Tenth", "1890", "Eleventh", "1900", "Twelfth", "1910", "Thirteenth", "1920", "Fourteenth", "1930", "Fifteenth") + for(var i in censusNos) { + if(censusYear == 1) { censusNo = censusNos[i] }; + if(censusNos[i] == year) { censusYear = 1 } else {censusYear= 0 }; + } + + //begin adding item + var newItem = new Zotero.Item("bookSection"); + newItem.title = city+", "+state; // this is not proper citation but is needed to easily scan for placenames in middle pane + newItem.publicationTitle = censusNo+" Census of the United States, "+year; + newItem.publisher = "National Archives and Records Administration"; + newItem.place = "Washington, DC"; + newItem.date = year; + + // get snapshot with all searchable text and a simplified link to the record for the URL field + var dbRe = /db=([0-9a-z]+)/; + var m = dbRe.exec(doc.location.href); + if(m) { + db = m[1]; + } + var snapshotRe = /recid=([0-9]+)/; + var m = snapshotRe.exec(doc.location.href); + if(m) { + snapshotURL = "http://search.ancestry.com/cgi-bin/sse.dll?db="+db+"&indiv=1&pf=1&recid="+m[1]; + newItem.attachments.push({title:"Ancestry.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true}); + cleanURL = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&recid="+m[1]; + newItem.url = cleanURL; + } + + // add particular individual being surveyed as contributor - this is not proper citation but is needed so one could easily scan for names in middle pane + var creator = new Array(); + creator.firstName = firstName; + creator.lastName = lastName; + creator.creatorType = "author"; + newItem.creators.push(creator); + + //add proper author for citation + var creator = new Array(); + creator.lastName = "United States of America, Bureau of the Census"; + creator.creatorType = "contributor"; + newItem.creators.push(creator); + + // get scan of the census image + var scanInfo = doc.evaluate('//div[@id="record-main"]/table[@class="p_recTable"]/tbody/tr/td[2][@class="recordTN"]/a', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + if(scanInfo) { + var scanRe = /iid=([A-Z0-9_-]+)/; + var m = scanRe.exec(scanInfo); + if(m) { + scanURL = "http://content.ancestry.com/Browse/print_u.aspx?dbid="+dbid+"&iid="+m[1]; + Zotero.debug("scan url: " + scanURL); + } + } + + if(scanURL){ + Zotero.Utilities.HTTP.doGet(scanURL, function(text) { + Zotero.debug("running doGet"); + Zotero.debug(text); + var imageRe = /950 src="([^"]+)"/; + var m = imageRe.exec(text); + if(m) { + imageURL = m[1]; + Zotero.debug("image url: " + imageURL); + newItem.attachments.push({title:"Ancestry.com Image", mimeType:"image/jpeg", url:imageURL, snapshot:true}); + } + + newItem.complete(); + Zotero.done(); + }); + } else { + newItem.complete(); + Zotero.done(); + } +} + +function doWeb(doc, url) { + var resultsRegexp = /recid=/; + if(resultsRegexp.test(url)) { + scrape(doc); + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // get census year for links to items + var yearRe = /db=([0-9]+)/; + var m = yearRe.exec(doc.location.href); + if(m) { + year = m[1]; + } + + var dbRe = /db=([0-9a-z]+)/; + var m = dbRe.exec(doc.location.href); + if(m) { + db = m[1]; + } + + //select items + var items = new Array(); + var listElts = doc.evaluate('//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrowalt record"] | //div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrow record"]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var recid; + var link; + var name; + while (listElt = listElts.iterateNext()) { + recInfo = doc.evaluate('.//a', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var recidRe = /recid=([0-9]+)/; + var m = recidRe.exec(recInfo); + if(m) { + recid = m[1]; + } + link = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&recid="+recid; + name = doc.evaluate('.//span[@class="srchHit"]', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + items[link] = Zotero.Utilities.cleanString(name); + } + + items = Zotero.selectItems(items); + if(!items) return true; + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + + } +} +\ No newline at end of file diff --git a/translators/Archeion.js b/translators/Archeion.js @@ -0,0 +1,157 @@ +{ + "translatorID":"f6717cbb-2771-4043-bde9-dbae19129bb3", + "translatorType":4, + "label":"Archeion", + "creator":"Adam Crymble", + "target":"http://archeion-aao", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:15:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td[@class="full"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//div[@class="main"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +//Archeion translator. code by Adam Crymble +//The way the site is formatted, I can't split the creators up logically. I have left them off for now. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + newItem = new Zotero.Item("book"); + + var xPathHeadings = doc.evaluate('//th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContent = doc.evaluate('//table[@class="results"]/tbody/tr/td', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var fieldTitle; + var dataTags = new Object(); + var multiAuthorCheck = new Array(); + + + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle=xPathHeadings.iterateNext().textContent.replace(/\s+/g, ''); + + //This was Michael Berkowitz's suggested Fix. + + /*var ts = doc.getElementsByTagName(("table"), 1) = ts.length, ar = []; + while ((i--)) { + if (ts[i].className&&ts[i].className.match("results")) { + ar[ar.length] = ts[i].getElementsByTagName("td")[0].split(/\<br\>/); + } + } + Zotero.debug(ar[0][0]); */ + + //COULDN"T SPLIT BY ("\n") TO SEPARATE MULTIPLE CREATORS. + if (fieldTitle == "Creator:" | fieldTitle == "Créateur:") { + fieldTitle == "Creator:"; + + var authorContent = xPathContent.iterateNext().textContent; + //Zotero.debug(authorContent); + + //if (authorContent.match(' (*) ')) { + // Zotero.debug(doc.title); + //} + + + + //var test = authorContent.split(/\<br\>/); + //Zotero.debug(test); + + authors = authorContent.match(/\w+,?\s+[\w\(\)\.]+/g); + + //Zotero.debug(authors); + + + for (i = 0; i < authors.length; i++) { + + var author = authors[i].split(", "); + + if (author.length < 2) { + + dataTags["Creator:"] = author[0]; + newItem.creators.push({lastName: dataTags["Creator:"], creatorType: "creator"}); + + } else { + + dataTags["Creator:"] = (author[1] + (" ") + author[0]); + //Zotero.debug(authorArranged); + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Creator:"], "creator")); + } + } + + } else { + + + + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent); + //Zotero.debug(fieldTitle); + } + } + + associateData (newItem, dataTags, "Datesofmaterial:", "date"); + associateData (newItem, dataTags, "Repository:", "repository"); + associateData (newItem, dataTags, "ReferenceNumber:", "callNumber"); + associateData (newItem, dataTags, "PhysicalDescription:", "extra"); + associateData (newItem, dataTags, "Scopeandcontent", "abstractNote"); + + associateData (newItem, dataTags, "Dates:", "date"); + associateData (newItem, dataTags, "Centred'archives:", "repository"); + associateData (newItem, dataTags, "Numéroderéférence:", "callNumber"); + associateData (newItem, dataTags, "Descriptionmatérielle:", "extra"); + associateData (newItem, dataTags, "Portéeetcontenu", "abstractNote"); + + newItem.title = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xPathLinks = doc.evaluate('//td[@class="full"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var linksCounter = doc.evaluate('count (//td[@class="full"]/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathTitles = doc.evaluate('//table[@class="results"]/tbody/tr[1]/td', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_link; + for (var i = 0; i < linksCounter.numberValue; i++) { + next_link = xPathLinks.iterateNext().href; + items[next_link] = xPathTitles.iterateNext().textContent; + + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); + +} diff --git a/translators/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js b/translators/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js @@ -0,0 +1,75 @@ +{ + "translatorID":"dedcae51-073c-48fb-85ce-2425e97f128d", + "translatorType":4, + "label":"Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC)", + "creator":"Michael Berkowitz", + "target":"http://archivesic.ccsd.cnrs.fr/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-18 08:55:00" +} + +function detectWeb(doc, url) { + if (doc.title.toLowerCase().match("fulltext search")) { + return "multiple"; + } else if (url.match(/sic_\d+/)) { + return "journalArticle"; + } +} + +var metaTags = { + "DC.relation":"url", + "DC.date":"date", + "DC.description":"abstractNote", + "DC.creator":"creators", + "DC.title":"title" +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, /sic_\d+\/fr\//); + items = Zotero.selectItems(items) + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, function(doc) { + var xpath = '//meta[@name]'; + var data = new Object(); + var metas = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var meta; + while (meta = metas.iterateNext()) { + if (data[meta.name]) { + data[meta.name] = data[meta.name] + ";" + meta.content; + } else { + data[meta.name] = meta.content; + } + } + Zotero.debug(data); + var item = new Zotero.Item("journalArticle"); + for (var tag in metaTags) { + if (tag == "DC.creator") { + var authors = data['DC.creator'].split(";"); + for each (var aut in authors) { + aut = aut.replace(/^([^,]+),\s+(.*)$/, "$2 $1"); + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } else { + item[metaTags[tag]] = data[tag]; + } + } + var pdfurl = doc.evaluate('//a[contains(@href, ".pdf")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/url=([^&]+)&/)[1]; + Zotero.debug(pdfurl); + item.attachments = [ + {url:item.url, title:"AOSIC Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"AOSIC Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Archives Canada-France.js b/translators/Archives Canada-France.js @@ -0,0 +1,148 @@ +{ + "translatorID":"d9a16cf3-8b86-4cab-8610-dbd913ad1a44", + "translatorType":4, + "label":"Archives Canada-France", + "creator":"Adam Crymble", + "target":"http://bd.archivescanadafrance.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:30:00" +} + +function detectWeb(doc, url) { + + if (doc.location.href.match("doc.xsp?")) { + return "book"; + } else if (doc.evaluate('//li/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//td[1][@class="icones"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + var xPathHeaders = '//td[2]/div[@class="ead-c"]/div[@class="ead-did"]/table[@class="ead-did"]/tbody/tr/td[1]'; + + if (doc.evaluate(xPathHeaders, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var headers = doc.evaluate(xPathHeaders, doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td[2][@class="did-content"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (fieldTitle = headers.iterateNext()) { + fieldTitle = fieldTitle.textContent.replace(/\s+/g, ''); + if (fieldTitle == "Origination" || fieldTitle == "Origine") { + fieldTitle = "Origination"; + } + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + if (dataTags["Origination"]) { + var author = dataTags["Origination"]; + if (!author.match(", ")) { + newItem.creators.push({lastName: author, creatorType: "author"}); + } else { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + } + + + if (doc.evaluate('//h1[@class="doc-title"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//h1[@class="doc-title"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else if (doc.evaluate('//td[2]/div[@class="notice"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//td[2]/div[@class="notice"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + newItem.title = doc.title + " Title Not Found"; + } + + associateData (newItem, dataTags, "PhysicalDescription", "pages"); + associateData (newItem, dataTags, "Descriptionmatérielle", "pages"); + + associateData (newItem, dataTags, "Repository", "repository"); + associateData (newItem, dataTags, "Lieudeconservation", "repository"); + + associateData (newItem, dataTags, "LanguageoftheMaterial", "language"); + associateData (newItem, dataTags, "Langue", "language"); + + associateData (newItem, dataTags, "Identifier", "callNumber"); + associateData (newItem, dataTags, "Cote", "callNumber"); + + associateData (newItem, dataTags, "Datesextrêmes", "date"); + associateData (newItem, dataTags, "Dates", "date"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + + var items = new Object(); + + if (doc.evaluate('//td[1][@class="icones"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//td[2][@class="ressource"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titlesCount = doc.evaluate('count (//td[2][@class="ressource"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//td[1][@class="icones"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_link; + + for (var i = 0; i < titlesCount.numberValue; i++) { + next_link = links.iterateNext().href; + if (!next_link.match("doc.xsp")) { + next_link = links.iterateNext().href; + } + items[next_link] = titles.iterateNext().textContent; + } + } + + if (doc.evaluate('//li/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//li/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + + } else if (doc.evaluate('//div[@class="ancestor"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var link = doc.evaluate('//div[@class="ancestor"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + + articles = [link]; + } else { + articles = [url] + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Archives Canada.js b/translators/Archives Canada.js @@ -0,0 +1,126 @@ +{ + "translatorID":"18bc329c-51af-497e-a7cf-aa572fae363d", + "translatorType":4, + "label":"Archives Canada", + "creator":"Adam Crymble", + "target":"http://(www.)?archivescanada.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb (doc, url) { + if (doc.location.href.match("RouteRqst")) { + return "multiple"; + } else if (doc.location.href.match("ItemDisplay")) { + return "book"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var cainNo; + var newItem = new Zotero.Item("book"); + + var data = doc.evaluate('//td/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + var dataCount = doc.evaluate('count (//td/p)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<dataCount.numberValue; i++) { + data1 = data.iterateNext().textContent.replace(/^\s*|\s*$/g, '').split(":"); + fieldTitle = data1[0].replace(/\s+/g, ''); + + if (fieldTitle == "PROVENANCE") { + + var multiAuthors = data1[1].split(/\n/); + + for (var j = 0; j < multiAuthors.length; j++) { + if (multiAuthors[j].match(",")) { + + var authorName = multiAuthors[j].replace(/^\s*|\s*$/g, '').split(","); + + authorName[0] = authorName[0].replace(/\s+/g, ''); + dataTags["PROVENANCE"] = (authorName[1] + (" ") + authorName[0]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["PROVENANCE"], "author")); + + } else { + + newItem.creators.push({lastName: multiAuthors[j].replace(/^\s*|\s*$/g, ''), creatorType: "creator"}); + } + } + + } else if (fieldTitle == "SUBJECTS" | fieldTitle == "MATIÈRES") { + tagsContent = data1[1].split(/\n/); + + } else { + + dataTags[fieldTitle] = data1[1]; + } + } + + if (doc.evaluate('//tr[3]/td/table/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + cainNo = doc.evaluate('//tr[3]/td/table/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.extra = cainNo.replace(/^\s*|\s*$/g, ''); + } + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i].replace(/^\s*|\s*$/g, ''); + } + + associateData (newItem, dataTags, "TITLE", "title" ); + associateData (newItem, dataTags, "REPOSITORY", "repository" ); + associateData (newItem, dataTags, "RETRIEVALNUMBER", "callNumber" ); + associateData (newItem, dataTags, "DATES", "date" ); + associateData (newItem, dataTags, "SCOPEANDCONTENT", "abstractNote" ); + associateData (newItem, dataTags, "LANGUAGE", "language" ); + + associateData (newItem, dataTags, "LANGUE", "language" ); + associateData (newItem, dataTags, "TITRE", "title" ); + associateData (newItem, dataTags, "CENTRED'ARCHIVES", "repository" ); + associateData (newItem, dataTags, "NUMÉROD'EXTRACTION", "callNumber" ); + associateData (newItem, dataTags, "PORTÉEETCONTENU", "abstractNote" ); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[3]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Archives Network of Alberta.js b/translators/Archives Network of Alberta.js @@ -0,0 +1,152 @@ +{ + "translatorID":"f39dbd1c-229e-4abb-8414-a09fdbda37b7", + "translatorType":4, + "label":"Archives Network of Alberta", + "creator":"Adam Crymble", + "target":"http://208.38.46.62:8080/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-29 21:10:00" +} + +function detectWeb(doc, url) { + + var xPathH3 = doc.evaluate('//h3', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if (xPathH3.match("Search Results")) { + return "multiple"; + } else if (xPathH3.match("Display")) { + return "book"; + } +} + +//Archives Network of Alberta translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + + var dataTags = new Object(); + var manyAuthors = new Array(); + var tagsContent = new Array(); + var tagsContent1 = new Array(); + + var xPathHeaders = doc.evaluate('//td[1][@class="datalabel"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContent = doc.evaluate('//td[2][@class="datatext"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//td[1][@class="datalabel"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = xPathHeaders.iterateNext().textContent.replace(/\s+/g, ''); + + if (fieldTitle =="Provenance:") { + + dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + + if (dataTags[fieldTitle].match("; ")) { + manyAuthors = dataTags[fieldTitle].split("; "); + } else { + manyAuthors.push(dataTags[fieldTitle]); + } + Zotero.debug(manyAuthors); + + for (var j = 0; j < manyAuthors.length; j++) { + if (manyAuthors[j].match(", ")) { + var authorName = manyAuthors[j].split(","); + authorName[0] = authorName[0].replace(/^\s*|\s*$/g, ''); + authorName[1] = authorName[1].replace(/^\s*|\s*$/g, ''); + newItem.creators.push(Zotero.Utilities.cleanAuthor((authorName[1] + (" ") + authorName[0]), "author")); + } else { + newItem.creators.push({lastName: manyAuthors[j], creatorType: "creator"}); + } + } + + } else if (fieldTitle == "Partof:") { + + dataTags[fieldTitle] = ("Part of " + Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''))); + + } else if (fieldTitle == "OnlineFindingAid:") { + dataTags[fieldTitle] = ("Online Finding Aid: " + xPathContent.iterateNext().textContent); + Zotero.debug(dataTags["OnlineFindingAid:"]); + + } else if (fieldTitle == "Names:") { + dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + tagsContent = dataTags[fieldTitle].split(";"); + + } else if (fieldTitle == "Topic:") { + dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + tagsContent1 = dataTags[fieldTitle].split(", "); + + } else { + + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + } + + for (i = 0; i < tagsContent.length; i++) { + tagsContent[i] = tagsContent[i].replace(/^\s*|\s*$/g, ''); + newItem.tags[i] = tagsContent[i]; + } + + for (i = 0; i < tagsContent1.length; i++) { + + newItem.tags.push(tagsContent1[i]); + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Dates:", "date"); + associateData (newItem, dataTags, "Physicaldesc.:", "pages"); + associateData (newItem, dataTags, "Repository:", "repository"); + associateData (newItem, dataTags, "Scope/Content:", "abstractNote"); + associateData (newItem, dataTags, "Partof:", "series"); + associateData (newItem, dataTags, "OnlineFindingAid:", "extra"); + associateData (newItem, dataTags, "Language:", "language"); + associateData (newItem, dataTags, "RecordNo.:", "callNumber"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var xPathTitles = doc.evaluate('//tr[1]/td[2][@class="datatext"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var nextTitle; + + var xPathLinks = doc.evaluate('//td[1][@class="dataleft"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + + while (nextTitle = xPathTitles.iterateNext()) { + items[xPathLinks.iterateNext().href] = nextTitle.textContent; + } + + items = Zotero.selectItems(items); + for (var i in items) { + + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Artefacts Canada.js b/translators/Artefacts Canada.js @@ -0,0 +1,160 @@ +{ + "translatorID":"661fc39a-2500-4710-8285-2d67ddc00a69", + "translatorType":4, + "label":"Artefacts Canada", + "creator":"Adam Crymble", + "target":"http://daryl.chin.gc.ca", + "minVersion":"1.0", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:55:00" +} + +function detectWeb(doc, url) { + var multi1 = ''; + var single1 = ''; + + if (doc.evaluate('//div[@id="mainContent"]/table/tbody/tr/td[1]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + + multi1 = doc.evaluate('//div[@id="mainContent"]/table/tbody/tr/td[1]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var xpath = '//tbody/tr[1]/td[2]/span'; + if (doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + single1 = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (multi1.match("Search Results") || multi1.match("Résultats de recherche")) { + return "multiple"; + } else if (single1.match("Document") || single1.match("Enregistrement")) { + return "artwork"; + } + +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("artwork"); + + var headers = doc.evaluate('//td[1][@class="leftResTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td[2][@class="pageText"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (fieldTitle = headers.iterateNext()) { + fieldTitle = fieldTitle.textContent.replace(/\s+/g, ''); + if (fieldTitle == "Titre:") { + fieldTitle = "Title:"; + } else if (fieldTitle == "Nomdel'objet:") { + fieldTitle = "NameofObject:"; + } else if (fieldTitle == "Sujetouimage:") { + fieldTitle = "Subject/Image:"; + } else if (fieldTitle == "Numérod'accession:") { + fieldTitle = "AccessionNumber:"; + } else if (fieldTitle == "Artisteouartisan:") { + fieldTitle = "Artist/Maker:"; + } else if (fieldTitle == "Fabricant:") { + fieldTitle = "Manufacturer:"; + } + + dataTags[fieldTitle] = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '') + } + + Zotero.debug(dataTags); + + if (dataTags["Artist/Maker:"]) { + if (dataTags["Artist/Maker:"].match(", ")) { + var authors = dataTags["Artist/Maker:"].split(", "); + authors = authors[0] + ' ' + authors[1]; + newItem.creators.push(authors, "creator"); + } else { + newItem.creators.push(dataTags["Artist/Make:"], "creator"); + } + } + + if (dataTags["Manufacturer:"]) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Manufacturer:"], "creator")); + } + + if (dataTags["AccessionNumber:"]) { + newItem.locInArchive = "Accession Number: " + dataTags["AccessionNumber:"]; + } + + if (dataTags["Subject/Image:"]) { + if (dataTags["Subject/Image:"].match(/\n/)) { + var subjects = dataTags["Subject/Image:"].split(/\n/); + for (var i = 0; i < subjects.length; i++) { + newItem.tags[i] = subjects[i]; + } + } else { + newItem.tags[0] = dataTags["Subject/Image:"].match(/\n/); + } + } + + if (dataTags["Title:"]) { + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "NameofObject:", "medium"); + } else if (dataTags["NameofObject:"]) { + associateData (newItem, dataTags, "NameofObject:", "title"); + } else { + newItem.title = "No Title Found"; + } + + associateData (newItem, dataTags, "LatestProductionDate:", "date"); + associateData (newItem, dataTags, "Datedefindeproduction:", "date"); + + associateData (newItem, dataTags, "Institution:", "repository"); + associateData (newItem, dataTags, "Établissement:", "repository"); + + associateData (newItem, dataTags, "Description:", "description"); + + associateData (newItem, dataTags, "Medium:", "medium"); + associateData (newItem, dataTags, "Médium:", "medium"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//tr[1]/td[2][@class="pageText"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//td/a[@class="moreInfoink"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + + items[links.iterateNext().href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} diff --git a/translators/AustLII and NZLII.js b/translators/AustLII and NZLII.js @@ -0,0 +1,80 @@ +{ + "translatorID":"5ed5ab01-899f-4a3b-a74c-290fb2a1c9a4", + "translatorType":4, + "label":"AustLII and NZLII", + "creator":"Bill McKinney", + "target":"http:\\/\\/www\\.(?:austlii\\.edu\\.au|nzlii\\.org)\\/(?:\\/cgi-bin\\/disp\\.pl\\/)?(?:au|nz)\\/cases\\/.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-18 18:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/ + if(austliiRegexp.test(url)) { + return "book"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + + +function scrape(doc) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("case"); + newItem.title = doc.title; + newItem.url = doc.location.href; + + var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(\w+)\s(\d+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/ + var titleMatch = titleRegexp .exec(doc.title); + if (titleMatch ) { + newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3] + " " + titleMatch[4]; + newItem.dateDecided = titleMatch[7] + " " + titleMatch[6] + " " + titleMatch[5]; + newItem.court = titleMatch[3]; + } else { + newItem.caseName = doc.title; + newItem.dateDecided = "not found"; + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/ + if(austliiRegexp.test(url)) { + scrape(doc); + } else { + + var items = Zotero.Utilities.getItemArray(doc, doc, austliiRegexp); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/Australian Dictionary of Biography.js b/translators/Australian Dictionary of Biography.js @@ -0,0 +1,78 @@ +{ + "translatorID":"0aea3026-a246-4201-a4b5-265f75b9a6a7", + "translatorType":4, + "label":"Australian Dictionary of Biography", + "creator":"Tim Sherratt and Michael Berkowitz", + "target":"http://www.adb.online.anu.edu.au", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-30 08:00:00" +} + +function detectWeb(doc, url) { + if (url.match(/adbp-ent_search|browse_people|browse_authors/)) { + return "multiple"; + } else if (url.match(/biogs\/AS*\d+b.htm/)) { + return "bookSection"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + if (detectWeb(doc, url) == "multiple") { + var records = new Array(); + var items = new Object(); + if (url.match(/browse_people/)) { + var titles = doc.evaluate('//ul[@class="pb-results"]/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//ul[@class="pb-results"]/li/a[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (url.match(/browse_authors/)) { + var titles = doc.evaluate('//div[@id="content"]/dl/dd', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//div[@id="content"]/dl/dd/a[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (url.match(/adbp-ent_search/)) { + var titles = doc.evaluate('//div[@id="content"]/ol/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//div[@id="content"]/ol/li//a[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + var title; + var link; + while ((link = links.iterateNext()) && (title = titles.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + + items = Zotero.selectItems(items); + for (var i in items) { + records.push(i); + } + } else { + records = [url]; + } + Zotero.Utilities.processDocuments(records, function(doc) { + var item = new Zotero.Item("bookSection"); + var author = Zotero.Utilities.cleanString(doc.evaluate('//div[@id="content"]/p[strong="Author"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + item.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + item.title = Zotero.Utilities.cleanString(doc.evaluate('//h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var pubdetails = Zotero.Utilities.cleanString(doc.evaluate('//div[@id="content"]/p[strong="Print Publication Details"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + pubdetails = pubdetails.match(/Volume (\d+), ([\w ]+), (\d{4}), p+\.*\s+([\d-]+)/); + item.volume = RegExp.$1; + item.publisher = RegExp.$2; + item.date = RegExp.$3; + item.pages = RegExp.$4; + item.url = doc.location.href; + item.bookTitle = "Australian Dictionary of Biography"; + item.place = "Melbourne"; + item.repository = "Australian Dictionary of Biography"; + var tags = doc.evaluate('//li/a[starts-with(@title, "find people with the occupation")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (tag = tags.iterateNext()) { + item.tags.push(tag.textContent); + } + item.attachments = [ + {url:item.url, title: "Snapshot - " + item.title, mimeType:"text/html"}, + ]; + item.complete(); + + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/BAILII.js b/translators/BAILII.js @@ -0,0 +1,106 @@ +{ + "translatorID":"5ae63913-669a-4792-9f45-e089a37de9ab", + "translatorType":4, + "label":"BAILII", + "creator":"Bill McKinney", + "target":"http:\\/\\/www\\.bailii\\.org(?:\\/cgi\\-bin\\/markup\\.cgi\\?doc\\=)?\\/\\w+\\/cases\\/.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-18 18:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var liiRegexp= /^http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/ + if(liiRegexp.test(url)) { + return "book"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + +function scrape(doc) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("case"); + newItem.title = doc.title; + newItem.url = doc.location.href; + + var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(.+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/ + var titleMatch = titleRegexp .exec(doc.title); + if (titleMatch ) { + newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3]; + newItem.dateDecided = titleMatch[4] + " " + titleMatch[5] + " " + titleMatch[6]; + } else { + newItem.caseName = doc.title; + newItem.dateDecided = "not found"; + } + + var courtRegexp = /cases\/([^\/]+)\/([^\/]+)\// + var courtMatch = courtRegexp.exec(doc.location.href); + if (courtMatch) { + var divRegexp = /\w+/ + var divMatch = divRegexp.exec(courtMatch[2]); + if (divMatch) { + newItem.court = courtMatch[1] + " (" + courtMatch[2] + ")"; + } else { + newItem.court = courtMatch[1]; + } + } else { + newItem.court = "not found"; + } + + // judge + var panel = doc.getElementsByTagName("PANEL"); + if (panel.length > 0) { + var tmp = panel[0].innerHTML; + newItem.creators.push({lastName:tmp, creatorType:"judge", fieldMode:true}); + + } + // citation + var cite = doc.getElementsByTagName("CITATION"); + if (cite.length > 0) { + var tmpc = cite[0].childNodes[0].innerHTML; + newItem.notes.push({note:tmpc}); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var liiRegexp= /http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/ + if(liiRegexp.test(url)) { + scrape(doc); + } else { + + var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/BBC.js b/translators/BBC.js @@ -0,0 +1,116 @@ +{ + "translatorID":"f4130157-93f7-4493-8f24-a7c85549013d", + "translatorType":4, + "label":"BBC", + "creator":"Ben Parr", + "target":"^https?://(?:www|news?)\\.bbc\\.co.uk", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-08-27 05:00:00" +} + +function detectWeb(doc, url) +{ + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath; + + xpath='//meta[@name="Headline"]'; + if(content=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { return "newspaperArticle"; } + + xpath='//font[@class="poshead"]/b'; + if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { return "newspaperArticle"; } + + return null; +} + +function scrape(doc,url,title) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + + newItem.url=url; + newItem.repository="bbc.co.uk"; + newItem.publicationTitle="BBC"; + newItem.title=title; + + xpath='//meta[@name="OriginalPublicationDate"]/@content'; + var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext(); + if(temp) + { + temp=temp.value; + temp=temp.split(" ")[0]; + newItem.date=temp; + } + else + { + xpath='//font[@class="postxt"][@size="1"]'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + while(row=rows.iterateNext()) + { + temp=row.textContent; + if(temp.substr(0,9)=="Created: ") + { + newItem.date=temp.substr(9); + break; + } + } + } + + xpath='//meta[@name="Section"]/@content'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext(); + if(temp) + { newItem.section=temp.value; } + + xpath='//meta[@name="Description"]/@content'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext(); + if(temp) + { newItem.abstractNote=temp.value; } + else + { + xpath='//meta[@name="description"]/@content'; + temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext(); + if(temp) + { newItem.abstractNote=temp.value; } + } + + newItem.attachments.push({url:url, title:"BBC News Snapshot",mimeType:"text/html"}); + + newItem.complete(); +} + + + +function doWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath='//meta[@name="Headline"]/@content'; + var title; + if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { scrape(doc,url,title.value) } + else + { + xpath='//font[@class="poshead"]/b'; + if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext()) + { scrape(doc,url,title.textContent) } + } + + +} +\ No newline at end of file diff --git a/translators/BC Archival Information Network.js b/translators/BC Archival Information Network.js @@ -0,0 +1,147 @@ +{ + "translatorID":"c76d6c19-b4c6-4e51-bd7a-0a81752305ae", + "translatorType":4, + "label":"BC Archival Information Network", + "creator":"Adam Crymble", + "target":"http://(mayne.)?aabc.bc.ca/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + + var entryType = (doc.evaluate('/html/body/h3', doc, nsResolver, XPathResult.ANY_TYPE, null)); + if (entryType.iterateNext()) { + var entryType1 = entryType.iterateNext().textContent; + + if (entryType1.match("Search") && entryType1 != ("Search Results - BCAUL Repositories")) { + return "multiple"; + } else if (entryType1.match("Display") && entryType1 != ("Display - BCAUL Repositories") && doc.location.href.match("display")) { + return "book"; + } + } +} + +//BCAIN translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + + var dataTags = new Object(); + var manyAuthors = new Array(); + var tagsContent = new Array(); + + var xPathHeaders = doc.evaluate('//td[1][@class="datalabel"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContent = doc.evaluate('//td[2][@class="datatext"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//td[1][@class="datalabel"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + + Zotero.debug(xPathCount.numberValue); + + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = xPathHeaders.iterateNext().textContent.replace(/\s+/g, ''); + + if (fieldTitle =="Provenance:") { + + dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + + if (dataTags[fieldTitle].match("; ")) { + manyAuthors = dataTags[fieldTitle].split("; "); + } else { + manyAuthors.push(dataTags[fieldTitle]); + } + + for (var j = 0; j < manyAuthors.length; j++) { + if (manyAuthors[j].match(", ")) { + var authorName = manyAuthors[j].split(","); + authorName[0] = authorName[0].replace(/^\s*|\s*$/g, ''); + newItem.creators.push(Zotero.Utilities.cleanAuthor((authorName[1] + (" ") + authorName[0]), "author")); + } else { + newItem.creators.push({lastName: dataTags["Provenance:"], creatorType: "creator"}); + } + } + + } else if (fieldTitle == "Partof:") { + + dataTags[fieldTitle] = ("Part of " + Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''))); + + } else if (fieldTitle == "OnlineFindingAid:") { + dataTags[fieldTitle] = ("Online Finding Aid: " + xPathContent.iterateNext().textContent); + Zotero.debug(dataTags["OnlineFindingAid:"]); + + } else if (fieldTitle == "Names:") { + dataTags[fieldTitle] = (xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + tagsContent = dataTags[fieldTitle].split(";"); + + } else { + + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + } + + for (var i = 0; i < tagsContent.length; i++) { + tagsContent[i] = tagsContent[i].replace(/^\s*|\s*$/g, ''); + newItem.tags[i] = tagsContent[i]; + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Dates:", "date"); + associateData (newItem, dataTags, "Physicaldesc.:", "pages"); + associateData (newItem, dataTags, "Repository:", "repository"); + associateData (newItem, dataTags, "Scope/Content:", "abstractNote"); + associateData (newItem, dataTags, "Partof:", "series"); + associateData (newItem, dataTags, "OnlineFindingAid:", "extra"); + + newItem.notes.push({title:"Title", note:"To view this entry in your browser, please go to'http://aabc.bc.ca/WWW.aabc.archbc/access' and search for the entry Title "}); + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var xPathTitles = doc.evaluate('//tr[1]/td[2][@class="datatext"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var nextTitle; + + var xPathLinks = doc.evaluate('//td[1][@class="dataleft"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var nextLink; + + while (nextTitle = xPathTitles.iterateNext()) { + items[xPathLinks.iterateNext().href] = nextTitle.textContent; + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/BIBSYS.js b/translators/BIBSYS.js @@ -0,0 +1,66 @@ +{ + "translatorID":"ab961e61-2a8a-4be1-b8a3-044f20d52d78", + "translatorType":4, + "label":"BIBSYS", + "creator":"Ramesh Srigiriraju", + "target":"^http://ask\\.bibsys\\.no/ask/action", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc, url) { + var multireg=new RegExp("^http://ask\.bibsys\.no/ask/action/result"); + if(multireg.test(url)) + return "multiple"; + var singlereg=new RegExp("^http://ask\.bibsys\.no/ask/action/show"); + if(singlereg.test(url)) + return "book"; +} + +function doWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var multireg=new RegExp("http://ask\.bibsys\.no/ask/action/result"); + if(multireg.test(url)) { + var titlpath='//tr/td[@width="49%"][@align="left"][@valign="top"]/a/text()'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var codepath='//tr/td/input[@type="checkbox"][@name="valg"]/@value'; + var codes=doc.evaluate(codepath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items=new Array(); + var title; + titles.iterateNext(); + while(title=titles.iterateNext()) + items[codes.iterateNext().nodeValue]=title.nodeValue; + items=Zotero.selectItems(items); + var string="http://ask.bibsys.no/ask/action/result?control=ctr_top"; + for(var codes in items) + string+="&valg="+codes; + string+="&control=ctr_bottom&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.translate(); + Zotero.done(); + }); + Zotero.wait(); + } + var singlereg=new RegExp("http://ask\.bibsys\.no/ask/action/show"); + if(singlereg.test(url)) { + var urlstring="http://ask.bibsys.no/ask/action/show"; + var data="visningsformat=fortekst_m_eksemplarer&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil"; + Zotero.Utilities.HTTP.doPost(urlstring, data, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.translate(); + Zotero.done(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/BIUM.js b/translators/BIUM.js @@ -0,0 +1,97 @@ +{ + "translatorID":"cae7d3ec-bc8d-465b-974f-8b0dcfe24290", + "translatorType":4, + "label":"BIUM", + "creator":"Michael Berkowitz", + "target":"http://hip.bium.univ-paris5.fr/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td/a[@class="itemTitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//td[1]/span[@class="uportal-channel-strong"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +function makeMARCurl(link, rsId, rrsId, query) { + return 'http://hip.bium.univ-paris5.fr/uPortal/Print?link=' + link + '&xslFileName=com/dynix/hip/uportal/channels/standard/FullMarc.xsl&F=/searching/getmarcdata&responseSessionId=' + rsId + '&responseResultSetId=' + rrsId + '&searchGroup=BIUM-13&query=' + query + '&searchTargets=16&locale=fr_FR'; +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//a[@class="itemTitle"]', doc, ns, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.trimInternal(link.textContent); + } + items = Zotero.selectItems(items); + var rsId = doc.evaluate('//input[@name="responseSessionId"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value; + var rrsId = doc.evaluate('//input[@name="responseResultSetId"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value; + var query = doc.evaluate('//input[@name="query"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().value; + var linkRE = new RegExp("'([^']+)'", "g"); + for (var i in items) { + var link = linkRE.exec(i)[1]; + Zotero.debug(link); + books.push(makeMARCurl(link, rsId, rrsId, query)); + } + } else { + var link = url.match(/link=([^&]+)/)[1]; + var rsId = url.match(/responseSessionId=([^&]+)/)[1]; + var rrsId = url.match(/responseResultSetId=([^&]+)/)[1]; + var query = url.match(/query=([^&]+)/)[1]; + books = [makeMARCurl(link, rsId, rrsId, query)]; + } + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(books, function(doc) { + var rows = doc.evaluate('//center/table/tbody/tr', doc, ns, XPathResult.ANY_TYPE, null); + var row; + var record = new marc.record(); + while (row = rows.iterateNext()) { + var field = Zotero.Utilities.trimInternal(doc.evaluate('./td[1]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(":", "")); + if (field) { + var value = doc.evaluate('./td[2]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]); + if (field == "LDR") { + record.leader = value; + } else if (field != "FMT") { + value = value.replace(/\¤([a-z])/g, marc.subfieldDelimiter+ "$1"); + var code = field.substring(0, 3); + var ind = ""; + if (field.length > 3) { + ind = field[3]; + if (field.length > 4) { + ind += field[4]; + } + } + record.addField(code, ind, value); + } + } + } + var item = new Zotero.Item(); + record.translate(item); + + var oldauthors = item.creators; + var newauthors = new Array(); + for each (var aut in oldauthors) { + if (aut.lastName.match(/^[A-Z][^\s]+\s[^\s]+/)) newauthors.push(Zotero.Utilities.cleanAuthor(aut.lastName.match(/^[A-Z][^\s]+\s[^\s]+/)[0].replace(/^([^\s]+)\s+(.*)$/, "$2 $1"), "author")); + } + item.creators = newauthors; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Berkeley Electronic Press.js b/translators/Berkeley Electronic Press.js @@ -0,0 +1,84 @@ +{ + "translatorID":"2a5dc3ed-ee5e-4bfb-baad-36ae007e40ce", + "translatorType":4, + "label":"Berkeley Electronic Press", + "creator":"Michael Berkowitz", + "target":"http://www.bepress.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-01 04:50:00" +} + +function detectWeb(doc, url) { + if (url.match("cgi/query.cgi")) { + return "multiple"; + } else if (url.match(/vol[\d+]\/iss[\d]+/)) { + return "journalArticle"; + } +} + +var tagMap = { + journal_title:"publicationTitle", + title:"title", + date:"date", + volume:"volume", + issue:"issue", + abstract_html_url:"url", + doi:"DOI" +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//table[@id="query"]/tbody/tr/td[4]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.debug(articles); + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var metatags = new Object(); + var metas = newDoc.evaluate('//meta[contains(@name, "bepress_citation")]', newDoc, null, XPathResult.ANY_TYPE, null); + var next_meta; + while (next_meta = metas.iterateNext()) { + metatags[next_meta.name.replace("bepress_citation_", "")] = next_meta.content; + } + var item = new Zotero.Item("journalArticle"); + + //regularly mapped tags + for (var tag in tagMap) { + if (metatags[tag]) { + item[tagMap[tag]] = metatags[tag]; + } + } + + //authors + var authors = metatags['authors'].split(";"); + for each (var author in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + //attachments + item.attachments = [ + {url:item.url, title:item.title, mimeType:"text/html"}, + {url:metatags['pdf_url'], title:"Berkeley Electronic Press Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Berkeley Library Catalog.js b/translators/Berkeley Library Catalog.js @@ -0,0 +1,95 @@ +{ + "translatorID":"9c335444-a562-4f88-b291-607e8f46a9bb", + "translatorType":4, + "label":"Berkeley Library Catalog", + "creator":"Simon Kornblith", + "target":"^https?://[^/]*berkeley.edu[^/]*/WebZ/(?:html/results.html|FETCH)\\?.*sessionid=", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-02 11:00:00" +} + +function detectWeb(doc, url) { + var resultsRegexp = /\/WebZ\/html\/results.html/i + if(resultsRegexp.test(url)) { + return "multiple"; + } else { + return "book"; + } +} + +function reformURL(url) { + return url.replace(/fmtclass=[^&]*/, "")+":fmtclass=marc"; +} + +function doWeb(doc, url) { + var resultsRegexp = /\/WebZ\/html\/results.html/i + + if(resultsRegexp.test(url)) { + var items = Zotero.Utilities.getItemArray(doc, doc, "/WebZ/FETCH", "^[0-9]*$"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(reformURL(i)); + } + } else { + var urls = [reformURL(url)]; + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + Zotero.Utilities.processDocuments(urls, function(newDoc) { + var uri = newDoc.location.href; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var elmts = newDoc.evaluate('//table/tbody/tr[@valign="top"]', + newDoc, nsResolver, XPathResult.ANY_TYPE, null); + + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + var value = newDoc.evaluate('./TD[2]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + // remove spacing + value = value.replace(/^\s+/, ""); + value = value.replace(/\s+$/, ""); + if(field == 0) { + record.leader = "00000"+value; + } else { + var ind = value[3]+value[5]; + if (value.match(/^\d{1,2}\s{3}/)) value = Zotero.Utilities.cleanString(value.replace(/^\d{1,2}\s{3}/, "")); + value = value.replace(/\$([a-z0-9]) /g, marc.subfieldDelimiter+"$1"); + if(value[0] != marc.subfieldDelimiter) { + value = marc.subfieldDelimiter+"a"+value; + } + record.addField(field, ind, value); + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + var oldTags = newItem.tags; + var newTags = new Array(); + for each (var tag in oldTags) { + if (newTags.indexOf(tag) == -1) newTags.push(tag) + } + newItem.tags = newTags; + newItem.repository = "Berkeley Library Catalog"; + + newItem.complete(); + }, function() { Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/BibTeX.js b/translators/BibTeX.js @@ -0,0 +1,1993 @@ +{ + "translatorID":"9cb70025-a888-4a29-a210-93ec52da40d4", + "translatorType":3, + "label":"BibTeX", + "creator":"Simon Kornblith", + "target":"bib", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":200, + "inRepository":true, + "lastUpdated":"2008-08-06 13:00:00" +} + +Zotero.configure("dataMode", "block"); +Zotero.addOption("exportCharset", "UTF-8"); + +function detectImport() { + var block = ""; + var read; + + var re = /^\s*@[a-zA-Z]+[\(\{]/; + var lines_read = 0; + while(read = Zotero.read(1)) { + if(read == "%") { + // read until next newline + block = ""; + while((read = Zotero.read(1)) && read != "\r" && read != "\n") {} + } else if((read == "\n" || read == "\r") && block) { + // check if this is a BibTeX entry + if(re.test(block)) { + return true; + } + + block = ""; + } else if(" \n\r\t".indexOf(read) == -1) { + block += read; + } + } +} + +//%a = first author surname +//%y = year +//%t = first word of title +var citeKeyFormat = "%a_%t_%y"; + +var fieldMap = { + address:"place", + chapter:"section", + edition:"edition", +// number:"issue", + type:"type", + series:"series", + title:"title", + volume:"volume", + copyright:"rights", + isbn:"ISBN", + issn:"ISSN", + lccn:"callNumber", + location:"archiveLocation", + url:"url", + doi:"DOI", + "abstract":"abstractNote" +}; + +var inputFieldMap = { + booktitle :"publicationTitle", + school:"publisher", + institution:"publisher", + publisher:"publisher" +}; + +var zotero2bibtexTypeMap = { + "book":"book", + "bookSection": function (item) { + var hasAuthor = false; + var hasEditor = false; + for each(var creator in item.creators) { + if (creator.creatorType == "editor") { hasEditor = true; } + if (creator.creatorType == "author") { hasAuthor = true; } + } + if (hasAuthor && hasEditor) { return "incollection"; } + return "inbook"; + }, + "journalArticle":"article", + "magazineArticle":"article", + "newspaperArticle":"article", + "thesis":"phdthesis", + "letter":"misc", + "manuscript":"unpublished", + "interview":"misc", + "film":"misc", + "artwork":"misc", + "webpage":"misc", + "conferencePaper":"inproceedings", + "report":"techreport" +}; + +var bibtex2zoteroTypeMap = { + "book":"book", // or booklet, proceedings + "inbook":"bookSection", + "incollection":"bookSection", + "article":"journalArticle", // or magazineArticle or newspaperArticle + "phdthesis":"thesis", + "unpublished":"manuscript", + "inproceedings":"conferencePaper", // check for conference also + "techreport":"report", + "booklet":"book", + "incollection":"bookSection", + "manual":"book", + "mastersthesis":"thesis", + "misc":"book", + "proceedings":"book" +}; + +/* + * three-letter month abbreviations. i assume these are the same ones that the + * docs say are defined in some appendix of the LaTeX book. (i don't have the + * LaTeX book.) + */ +var months = ["jan", "feb", "mar", "apr", "may", "jun", + "jul", "aug", "sep", "oct", "nov", "dec"] + +/* + * new mapping table based on that from Matthias Steffens, + * then enhanced with some fields generated from the unicode table. + */ + +var mappingTable = { + "\u00A0":"~", // NO-BREAK SPACE + "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK + "\u00A2":"{\\textcent}", // CENT SIGN + "\u00A3":"{\\textsterling}", // POUND SIGN + "\u00A5":"{\\textyen}", // YEN SIGN + "\u00A6":"{\\textbrokenbar}", // BROKEN BAR + "\u00A7":"{\\textsection}", // SECTION SIGN + "\u00A8":"{\\textasciidieresis}", // DIAERESIS + "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN + "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR + "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + "\u00AC":"{\\textlnot}", // NOT SIGN + "\u00AD":"-", // SOFT HYPHEN + "\u00AE":"{\\textregistered}", // REGISTERED SIGN + "\u00AF":"{\\textasciimacron}", // MACRON + "\u00B0":"{\\textdegree}", // DEGREE SIGN + "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN + "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO + "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE + "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT + "\u00B5":"{\\textmu}", // MICRO SIGN + "\u00B6":"{\\textparagraph}", // PILCROW SIGN + "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT + "\u00B8":"{\\c\\ }", // CEDILLA + "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE + "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR + "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER + "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF + "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS + "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK + "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE + "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH + "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN + "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN + "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S + "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE + "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH + "\u00F7":"{\\textdiv}", // DIVISION SIGN + "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN + "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I + "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ + "\u0133":"ij", // LATIN SMALL LIGATURE IJ + "\u0138":"k", // LATIN SMALL LETTER KRA + "\u0149":"'n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG + "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG + "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE + "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE + "\u017F":"s", // LATIN SMALL LETTER LONG S + "\u02B9":"'", // MODIFIER LETTER PRIME + "\u02BB":"'", // MODIFIER LETTER TURNED COMMA + "\u02BC":"'", // MODIFIER LETTER APOSTROPHE + "\u02BD":"'", // MODIFIER LETTER REVERSED COMMA + "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT + "\u02C8":"'", // MODIFIER LETTER VERTICAL LINE + "\u02C9":"-", // MODIFIER LETTER MACRON + "\u02CC":",", // MODIFIER LETTER LOW VERTICAL LINE + "\u02D0":":", // MODIFIER LETTER TRIANGULAR COLON + "\u02DA":"o", // RING ABOVE + "\u02DC":"\\~{}", // SMALL TILDE + "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT + "\u0374":"'", // GREEK NUMERAL SIGN + "\u0375":",", // GREEK LOWER NUMERAL SIGN + "\u037E":";", // GREEK QUESTION MARK + "\u2000":" ", // EN QUAD + "\u2001":" ", // EM QUAD + "\u2002":" ", // EN SPACE + "\u2003":" ", // EM SPACE + "\u2004":" ", // THREE-PER-EM SPACE + "\u2005":" ", // FOUR-PER-EM SPACE + "\u2006":" ", // SIX-PER-EM SPACE + "\u2007":" ", // FIGURE SPACE + "\u2008":" ", // PUNCTUATION SPACE + "\u2009":" ", // THIN SPACE + "\u2010":"-", // HYPHEN + "\u2011":"-", // NON-BREAKING HYPHEN + "\u2012":"-", // FIGURE DASH + "\u2013":"{\\textendash}", // EN DASH + "\u2014":"{\\textemdash}", // EM DASH + "\u2015":"--", // HORIZONTAL BAR + "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE + "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE + "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK + "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK + "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK + "\u201B":"'", // SINGLE HIGH-REVERSED-9 QUOTATION MARK + "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK + "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK + "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK + "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK + "\u2020":"{\\textdagger}", // DAGGER + "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER + "\u2022":"{\\textbullet}", // BULLET + "\u2023":">", // TRIANGULAR BULLET + "\u2024":".", // ONE DOT LEADER + "\u2025":"..", // TWO DOT LEADER + "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS + "\u2027":"-", // HYPHENATION POINT + "\u202F":" ", // NARROW NO-BREAK SPACE + "\u2030":"{\\textperthousand}", // PER MILLE SIGN + "\u2032":"'", // PRIME + "\u2033":"'", // DOUBLE PRIME + "\u2034":"'''", // TRIPLE PRIME + "\u2035":"`", // REVERSED PRIME + "\u2036":"``", // REVERSED DOUBLE PRIME + "\u2037":"```", // REVERSED TRIPLE PRIME + "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK + "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + "\u203C":"!!", // DOUBLE EXCLAMATION MARK + "\u203E":"-", // OVERLINE + "\u2043":"-", // HYPHEN BULLET + "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH + "\u2048":"?!", // QUESTION EXCLAMATION MARK + "\u2049":"!?", // EXCLAMATION QUESTION MARK + "\u204A":"7", // TIRONIAN SIGN ET + "\u2070":"$^{0}$", // SUPERSCRIPT ZERO + "\u2074":"$^{4}$", // SUPERSCRIPT FOUR + "\u2075":"$^{5}$", // SUPERSCRIPT FIVE + "\u2076":"$^{6}$", // SUPERSCRIPT SIX + "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN + "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT + "\u2079":"$^{9}$", // SUPERSCRIPT NINE + "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN + "\u207B":"$^{-}$", // SUPERSCRIPT MINUS + "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN + "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS + "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS + "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N + "\u2080":"$_{0}$", // SUBSCRIPT ZERO + "\u2081":"$_{1}$", // SUBSCRIPT ONE + "\u2082":"$_{2}$", // SUBSCRIPT TWO + "\u2083":"$_{3}$", // SUBSCRIPT THREE + "\u2084":"$_{4}$", // SUBSCRIPT FOUR + "\u2085":"$_{5}$", // SUBSCRIPT FIVE + "\u2086":"$_{6}$", // SUBSCRIPT SIX + "\u2087":"$_{7}$", // SUBSCRIPT SEVEN + "\u2088":"$_{8}$", // SUBSCRIPT EIGHT + "\u2089":"$_{9}$", // SUBSCRIPT NINE + "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN + "\u208B":"$_{-}$", // SUBSCRIPT MINUS + "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN + "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS + "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS + "\u20AC":"{\\texteuro}", // EURO SIGN + "\u2100":"a/c", // ACCOUNT OF + "\u2101":"a/s", // ADDRESSED TO THE SUBJECT + "\u2103":"{\\textcelsius}", // DEGREE CELSIUS + "\u2105":"c/o", // CARE OF + "\u2106":"c/u", // CADA UNA + "\u2109":"F", // DEGREE FAHRENHEIT + "\u2113":"l", // SCRIPT SMALL L + "\u2116":"{\\textnumero}", // NUMERO SIGN + "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT + "\u2120":"{\\textservicemark}", // SERVICE MARK + "\u2121":"TEL", // TELEPHONE SIGN + "\u2122":"{\\texttrademark}", // TRADE MARK SIGN + "\u2126":"{\\textohm}", // OHM SIGN + "\u212A":"K", // KELVIN SIGN + "\u212B":"A", // ANGSTROM SIGN + "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL + "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD + "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS + "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH + "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS + "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS + "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS + "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH + "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS + "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH + "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS + "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS + "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS + "\u215F":" 1/", // FRACTION NUMERATOR ONE + "\u2160":"I", // ROMAN NUMERAL ONE + "\u2161":"II", // ROMAN NUMERAL TWO + "\u2162":"III", // ROMAN NUMERAL THREE + "\u2163":"IV", // ROMAN NUMERAL FOUR + "\u2164":"V", // ROMAN NUMERAL FIVE + "\u2165":"VI", // ROMAN NUMERAL SIX + "\u2166":"VII", // ROMAN NUMERAL SEVEN + "\u2167":"VIII", // ROMAN NUMERAL EIGHT + "\u2168":"IX", // ROMAN NUMERAL NINE + "\u2169":"X", // ROMAN NUMERAL TEN + "\u216A":"XI", // ROMAN NUMERAL ELEVEN + "\u216B":"XII", // ROMAN NUMERAL TWELVE + "\u216C":"L", // ROMAN NUMERAL FIFTY + "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED + "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED + "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND + "\u2170":"i", // SMALL ROMAN NUMERAL ONE + "\u2171":"ii", // SMALL ROMAN NUMERAL TWO + "\u2172":"iii", // SMALL ROMAN NUMERAL THREE + "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR + "\u2174":"v", // SMALL ROMAN NUMERAL FIVE + "\u2175":"vi", // SMALL ROMAN NUMERAL SIX + "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN + "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT + "\u2178":"ix", // SMALL ROMAN NUMERAL NINE + "\u2179":"x", // SMALL ROMAN NUMERAL TEN + "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN + "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE + "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY + "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED + "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED + "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND + "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW + "\u2191":"{\\textuparrow}", // UPWARDS ARROW + "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW + "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW + "\u2194":"<->", // LEFT RIGHT ARROW + "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW + "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW + "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW + "\u2212":"-", // MINUS SIGN + "\u2215":"/", // DIVISION SLASH + "\u2216":"\\", // SET MINUS + "\u2217":"*", // ASTERISK OPERATOR + "\u2218":"o", // RING OPERATOR + "\u2219":".", // BULLET OPERATOR + "\u221E":"$\\infty$", // INFINITY + "\u2223":"|", // DIVIDES + "\u2225":"||", // PARALLEL TO + "\u2236":":", // RATIO + "\u223C":"\\~{}", // TILDE OPERATOR + "\u2260":"/=", // NOT EQUAL TO + "\u2261":"=", // IDENTICAL TO + "\u2264":"<=", // LESS-THAN OR EQUAL TO + "\u2265":">=", // GREATER-THAN OR EQUAL TO + "\u226A":"<<", // MUCH LESS-THAN + "\u226B":">>", // MUCH GREATER-THAN + "\u2295":"(+)", // CIRCLED PLUS + "\u2296":"(-)", // CIRCLED MINUS + "\u2297":"(x)", // CIRCLED TIMES + "\u2298":"(/)", // CIRCLED DIVISION SLASH + "\u22A2":"|-", // RIGHT TACK + "\u22A3":"-|", // LEFT TACK + "\u22A6":"|-", // ASSERTION + "\u22A7":"|=", // MODELS + "\u22A8":"|=", // TRUE + "\u22A9":"||-", // FORCES + "\u22C5":".", // DOT OPERATOR + "\u22C6":"*", // STAR OPERATOR + "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO + "\u22D8":"<<<", // VERY MUCH LESS-THAN + "\u22D9":">>>", // VERY MUCH GREATER-THAN + "\u22EF":"...", // MIDLINE HORIZONTAL ELLIPSIS + "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET + "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET + "\u2400":"NUL", // SYMBOL FOR NULL + "\u2401":"SOH", // SYMBOL FOR START OF HEADING + "\u2402":"STX", // SYMBOL FOR START OF TEXT + "\u2403":"ETX", // SYMBOL FOR END OF TEXT + "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION + "\u2405":"ENQ", // SYMBOL FOR ENQUIRY + "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE + "\u2407":"BEL", // SYMBOL FOR BELL + "\u2408":"BS", // SYMBOL FOR BACKSPACE + "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION + "\u240A":"LF", // SYMBOL FOR LINE FEED + "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION + "\u240C":"FF", // SYMBOL FOR FORM FEED + "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN + "\u240E":"SO", // SYMBOL FOR SHIFT OUT + "\u240F":"SI", // SYMBOL FOR SHIFT IN + "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE + "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE + "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO + "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE + "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR + "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE + "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE + "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK + "\u2418":"CAN", // SYMBOL FOR CANCEL + "\u2419":"EM", // SYMBOL FOR END OF MEDIUM + "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE + "\u241B":"ESC", // SYMBOL FOR ESCAPE + "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR + "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR + "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR + "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR + "\u2420":"SP", // SYMBOL FOR SPACE + "\u2421":"DEL", // SYMBOL FOR DELETE + "\u2423":"{\\textvisiblespace}", // OPEN BOX + "\u2424":"NL", // SYMBOL FOR NEWLINE + "\u2425":"///", // SYMBOL FOR DELETE FORM TWO + "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO + "\u2460":"(1)", // CIRCLED DIGIT ONE + "\u2461":"(2)", // CIRCLED DIGIT TWO + "\u2462":"(3)", // CIRCLED DIGIT THREE + "\u2463":"(4)", // CIRCLED DIGIT FOUR + "\u2464":"(5)", // CIRCLED DIGIT FIVE + "\u2465":"(6)", // CIRCLED DIGIT SIX + "\u2466":"(7)", // CIRCLED DIGIT SEVEN + "\u2467":"(8)", // CIRCLED DIGIT EIGHT + "\u2468":"(9)", // CIRCLED DIGIT NINE + "\u2469":"(10)", // CIRCLED NUMBER TEN + "\u246A":"(11)", // CIRCLED NUMBER ELEVEN + "\u246B":"(12)", // CIRCLED NUMBER TWELVE + "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN + "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN + "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN + "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN + "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN + "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN + "\u2472":"(19)", // CIRCLED NUMBER NINETEEN + "\u2473":"(20)", // CIRCLED NUMBER TWENTY + "\u2474":"(1)", // PARENTHESIZED DIGIT ONE + "\u2475":"(2)", // PARENTHESIZED DIGIT TWO + "\u2476":"(3)", // PARENTHESIZED DIGIT THREE + "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR + "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE + "\u2479":"(6)", // PARENTHESIZED DIGIT SIX + "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN + "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT + "\u247C":"(9)", // PARENTHESIZED DIGIT NINE + "\u247D":"(10)", // PARENTHESIZED NUMBER TEN + "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN + "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE + "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN + "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN + "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN + "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN + "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN + "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN + "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN + "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY + "\u2488":"1.", // DIGIT ONE FULL STOP + "\u2489":"2.", // DIGIT TWO FULL STOP + "\u248A":"3.", // DIGIT THREE FULL STOP + "\u248B":"4.", // DIGIT FOUR FULL STOP + "\u248C":"5.", // DIGIT FIVE FULL STOP + "\u248D":"6.", // DIGIT SIX FULL STOP + "\u248E":"7.", // DIGIT SEVEN FULL STOP + "\u248F":"8.", // DIGIT EIGHT FULL STOP + "\u2490":"9.", // DIGIT NINE FULL STOP + "\u2491":"10.", // NUMBER TEN FULL STOP + "\u2492":"11.", // NUMBER ELEVEN FULL STOP + "\u2493":"12.", // NUMBER TWELVE FULL STOP + "\u2494":"13.", // NUMBER THIRTEEN FULL STOP + "\u2495":"14.", // NUMBER FOURTEEN FULL STOP + "\u2496":"15.", // NUMBER FIFTEEN FULL STOP + "\u2497":"16.", // NUMBER SIXTEEN FULL STOP + "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP + "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP + "\u249A":"19.", // NUMBER NINETEEN FULL STOP + "\u249B":"20.", // NUMBER TWENTY FULL STOP + "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A + "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B + "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C + "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D + "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E + "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F + "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G + "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H + "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I + "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J + "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K + "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L + "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M + "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N + "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O + "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P + "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q + "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R + "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S + "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T + "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U + "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V + "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W + "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X + "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y + "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z + "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A + "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B + "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C + "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D + "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E + "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F + "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G + "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H + "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I + "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J + "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K + "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L + "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M + "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N + "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O + "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P + "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q + "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R + "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S + "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T + "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U + "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V + "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W + "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X + "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y + "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z + "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A + "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B + "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C + "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D + "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E + "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F + "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G + "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H + "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I + "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J + "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K + "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L + "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M + "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N + "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O + "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P + "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q + "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R + "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S + "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T + "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U + "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V + "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W + "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X + "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y + "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z + "\u24EA":"(0)", // CIRCLED DIGIT ZERO + "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL + "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL + "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL + "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL + "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL + "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL + "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL + "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL + "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL + "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL + "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL + "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL + "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT + "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY + "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT + "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT + "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT + "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY + "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT + "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT + "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT + "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY + "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT + "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT + "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT + "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY + "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT + "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT + "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT + "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT + "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY + "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY + "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT + "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT + "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT + "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT + "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY + "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY + "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT + "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT + "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT + "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY + "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY + "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL + "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT + "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT + "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY + "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY + "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL + "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT + "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT + "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT + "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT + "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT + "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT + "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT + "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT + "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY + "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY + "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY + "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY + "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL + "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL + "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL + "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL + "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL + "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL + "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT + "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT + "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT + "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT + "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT + "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL + "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT + "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT + "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT + "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS + "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT + "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN + "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT + "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN + "\u25CB":"o", // WHITE CIRCLE + "\u25E6":"{\\textopenbullet}", // WHITE BULLET + "\u2605":"*", // BLACK STAR + "\u2606":"*", // WHITE STAR + "\u2612":"X", // BALLOT BOX WITH X + "\u2613":"X", // SALTIRE + "\u2639":":-(", // WHITE FROWNING FACE + "\u263A":":-)", // WHITE SMILING FACE + "\u263B":"(-:", // BLACK SMILING FACE + "\u266D":"b", // MUSIC FLAT SIGN + "\u266F":"$\\#$", // MUSIC SHARP SIGN + "\u2701":"$\\%<$", // UPPER BLADE SCISSORS + "\u2702":"$\\%<$", // BLACK SCISSORS + "\u2703":"$\\%<$", // LOWER BLADE SCISSORS + "\u2704":"$\\%<$", // WHITE SCISSORS + "\u270C":"V", // VICTORY HAND + "\u2713":"v", // CHECK MARK + "\u2714":"V", // HEAVY CHECK MARK + "\u2715":"x", // MULTIPLICATION X + "\u2716":"x", // HEAVY MULTIPLICATION X + "\u2717":"X", // BALLOT X + "\u2718":"X", // HEAVY BALLOT X + "\u2719":"+", // OUTLINED GREEK CROSS + "\u271A":"+", // HEAVY GREEK CROSS + "\u271B":"+", // OPEN CENTRE CROSS + "\u271C":"+", // HEAVY OPEN CENTRE CROSS + "\u271D":"+", // LATIN CROSS + "\u271E":"+", // SHADOWED WHITE LATIN CROSS + "\u271F":"+", // OUTLINED LATIN CROSS + "\u2720":"+", // MALTESE CROSS + "\u2721":"*", // STAR OF DAVID + "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK + "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK + "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK + "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK + "\u2726":"+", // BLACK FOUR POINTED STAR + "\u2727":"+", // WHITE FOUR POINTED STAR + "\u2729":"*", // STRESS OUTLINED WHITE STAR + "\u272A":"*", // CIRCLED WHITE STAR + "\u272B":"*", // OPEN CENTRE BLACK STAR + "\u272C":"*", // BLACK CENTRE WHITE STAR + "\u272D":"*", // OUTLINED BLACK STAR + "\u272E":"*", // HEAVY OUTLINED BLACK STAR + "\u272F":"*", // PINWHEEL STAR + "\u2730":"*", // SHADOWED WHITE STAR + "\u2731":"*", // HEAVY ASTERISK + "\u2732":"*", // OPEN CENTRE ASTERISK + "\u2733":"*", // EIGHT SPOKED ASTERISK + "\u2734":"*", // EIGHT POINTED BLACK STAR + "\u2735":"*", // EIGHT POINTED PINWHEEL STAR + "\u2736":"*", // SIX POINTED BLACK STAR + "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR + "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR + "\u2739":"*", // TWELVE POINTED BLACK STAR + "\u273A":"*", // SIXTEEN POINTED ASTERISK + "\u273B":"*", // TEARDROP-SPOKED ASTERISK + "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK + "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK + "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE + "\u273F":"*", // BLACK FLORETTE + "\u2740":"*", // WHITE FLORETTE + "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE + "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR + "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK + "\u2744":"*", // SNOWFLAKE + "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE + "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE + "\u2747":"*", // SPARKLE + "\u2748":"*", // HEAVY SPARKLE + "\u2749":"*", // BALLOON-SPOKED ASTERISK + "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK + "\uFB00":"ff", // LATIN SMALL LIGATURE FF + "\uFB01":"fi", // LATIN SMALL LIGATURE FI + "\uFB02":"fl", // LATIN SMALL LIGATURE FL + "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI + "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL + "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T + "\uFB06":"st", // LATIN SMALL LIGATURE ST +/* Derived accented characters */ + "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE + "\u00C1":"\\'{A}", // LATIN CAPITAL LETTER A WITH ACUTE + "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX + "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE + "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS + "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA + "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE + "\u00C9":"\\'{E}", // LATIN CAPITAL LETTER E WITH ACUTE + "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX + "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS + "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE + "\u00CD":"\\'{I}", // LATIN CAPITAL LETTER I WITH ACUTE + "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX + "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS + "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE + "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE + "\u00D3":"\\'{O}", // LATIN CAPITAL LETTER O WITH ACUTE + "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX + "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE + "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS + "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE + "\u00DA":"\\'{U}", // LATIN CAPITAL LETTER U WITH ACUTE + "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX + "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS + "\u00DD":"\\'{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE + "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE + "\u00E1":"\\'{a}", // LATIN SMALL LETTER A WITH ACUTE + "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX + "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE + "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS + "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA + "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE + "\u00E9":"\\'{e}", // LATIN SMALL LETTER E WITH ACUTE + "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX + "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS + "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE + "\u00ED":"\\'{i}", // LATIN SMALL LETTER I WITH ACUTE + "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX + "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS + "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE + "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE + "\u00F3":"\\'{o}", // LATIN SMALL LETTER O WITH ACUTE + "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX + "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE + "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS + "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE + "\u00FA":"\\'{u}", // LATIN SMALL LETTER U WITH ACUTE + "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX + "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS + "\u00FD":"\\'{y}", // LATIN SMALL LETTER Y WITH ACUTE + "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS + "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON + "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON + "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE + "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE + "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK + "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK + "\u0106":"\\'{C}", // LATIN CAPITAL LETTER C WITH ACUTE + "\u0107":"\\'{c}", // LATIN SMALL LETTER C WITH ACUTE + "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX + "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX + "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE + "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE + "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON + "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON + "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON + "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON + "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON + "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON + "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE + "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE + "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE + "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE + "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK + "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK + "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON + "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON + "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX + "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX + "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE + "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE + "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE + "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE + "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA + "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA + "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX + "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX + "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE + "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE + "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON + "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON + "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE + "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE + "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK + "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK + "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE + "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX + "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX + "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA + "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA + "\u0139":"\\'{L}", // LATIN CAPITAL LETTER L WITH ACUTE + "\u013A":"\\'{l}", // LATIN SMALL LETTER L WITH ACUTE + "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA + "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA + "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON + "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON + "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE + "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE + "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA + "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA + "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON + "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON + "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON + "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON + "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE + "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE + "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE + "\u0154":"\\'{R}", // LATIN CAPITAL LETTER R WITH ACUTE + "\u0155":"\\'{r}", // LATIN SMALL LETTER R WITH ACUTE + "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA + "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA + "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON + "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON + "\u015A":"\\'{S}", // LATIN CAPITAL LETTER S WITH ACUTE + "\u015B":"\\'{s}", // LATIN SMALL LETTER S WITH ACUTE + "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX + "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX + "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA + "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA + "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON + "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON + "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA + "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA + "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON + "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON + "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE + "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE + "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON + "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON + "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE + "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE + "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE + "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK + "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK + "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX + "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX + "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX + "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS + "\u0179":"\\'{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE + "\u017A":"\\'{z}", // LATIN SMALL LETTER Z WITH ACUTE + "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE + "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE + "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON + "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON + "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON + "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON + "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON + "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON + "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON + "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON + "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON + "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON + "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON + "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON + "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON + "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON + "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK + "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK + "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON + "\u01F4":"\\'{G}", // LATIN CAPITAL LETTER G WITH ACUTE + "\u01F5":"\\'{g}", // LATIN SMALL LETTER G WITH ACUTE + "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE + "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE + "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW + "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW + "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW + "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW + "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE + "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE + "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW + "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW + "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW + "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW + "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA + "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA + "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE + "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE + "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON + "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON + "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE + "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE + "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW + "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW + "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS + "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS + "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA + "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA + "\u1E30":"\\'{K}", // LATIN CAPITAL LETTER K WITH ACUTE + "\u1E31":"\\'{k}", // LATIN SMALL LETTER K WITH ACUTE + "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW + "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW + "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW + "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW + "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW + "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW + "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW + "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW + "\u1E3E":"\\'{M}", // LATIN CAPITAL LETTER M WITH ACUTE + "\u1E3F":"\\'{m}", // LATIN SMALL LETTER M WITH ACUTE + "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE + "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE + "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW + "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW + "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE + "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE + "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW + "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW + "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW + "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW + "\u1E54":"\\'{P}", // LATIN CAPITAL LETTER P WITH ACUTE + "\u1E55":"\\'{p}", // LATIN SMALL LETTER P WITH ACUTE + "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE + "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE + "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE + "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE + "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW + "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW + "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW + "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW + "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE + "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE + "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW + "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW + "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE + "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE + "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW + "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW + "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW + "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW + "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE + "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE + "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW + "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW + "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE + "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE + "\u1E82":"\\'{W}", // LATIN CAPITAL LETTER W WITH ACUTE + "\u1E83":"\\'{w}", // LATIN SMALL LETTER W WITH ACUTE + "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS + "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS + "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE + "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE + "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW + "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW + "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE + "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE + "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS + "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS + "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE + "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE + "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX + "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW + "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW + "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW + "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW + "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW + "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS + "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW + "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW + "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW + "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW + "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE + "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE + "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW + "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW + "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW + "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW + "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW + "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW + "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE + "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE + "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW + "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW + "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE + "\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE + +}; + +/* unfortunately the mapping isn't reversible - hence this second table - sigh! */ +var reversemappingTable = { + "\u00A0":"~", // NO-BREAK SPACE + "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK + "\u00A2":"{\\textcent}", // CENT SIGN + "\u00A3":"{\\textsterling}", // POUND SIGN + "\u00A5":"{\\textyen}", // YEN SIGN + "\u00A6":"{\\textbrokenbar}", // BROKEN BAR + "\u00A7":"{\\textsection}", // SECTION SIGN + "\u00A8":"{\\textasciidieresis}", // DIAERESIS + "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN + "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR + "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + "\u00AC":"{\\textlnot}", // NOT SIGN + "\u00AE":"{\\textregistered}", // REGISTERED SIGN + "\u00AF":"{\\textasciimacron}", // MACRON + "\u00B0":"{\\textdegree}", // DEGREE SIGN + "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN + "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO + "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE + "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT + "\u00B5":"{\\textmu}", // MICRO SIGN + "\u00B6":"{\\textparagraph}", // PILCROW SIGN + "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT + "\u00B8":"{\\c\\ }", // CEDILLA + "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE + "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR + "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER + "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF + "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS + "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK + "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE + "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH + "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN + "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN + "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S + "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE + "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH + "\u00F7":"{\\textdiv}", // DIVISION SIGN + "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN + "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I + "\u0149":"'n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG + "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG + "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE + "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE + "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT + "\u02DC":"\\~{}", // SMALL TILDE + "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT + "\u2013":"{\\textendash}", // EN DASH + "\u2014":"{\\textemdash}", // EM DASH + "\u2015":"--", // HORIZONTAL BAR + "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE + "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE + "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK + "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK + "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK + "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK + "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK + "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK + "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK + "\u2020":"{\\textdagger}", // DAGGER + "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER + "\u2022":"{\\textbullet}", // BULLET + "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS + "\u2030":"{\\textperthousand}", // PER MILLE SIGN + "\u2034":"'''", // TRIPLE PRIME + "\u201D":"''", // RIGHT DOUBLE QUOTATION MARK (could be a double prime) + "\u201C":"``", // LEFT DOUBLE QUOTATION MARK (could be a reversed double prime) + "\u2037":"```", // REVERSED TRIPLE PRIME + "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK + "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + "\u203C":"!!", // DOUBLE EXCLAMATION MARK + "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH + "\u2048":"?!", // QUESTION EXCLAMATION MARK + "\u2049":"!?", // EXCLAMATION QUESTION MARK + "\u2070":"$^{0}$", // SUPERSCRIPT ZERO + "\u2074":"$^{4}$", // SUPERSCRIPT FOUR + "\u2075":"$^{5}$", // SUPERSCRIPT FIVE + "\u2076":"$^{6}$", // SUPERSCRIPT SIX + "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN + "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT + "\u2079":"$^{9}$", // SUPERSCRIPT NINE + "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN + "\u207B":"$^{-}$", // SUPERSCRIPT MINUS + "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN + "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS + "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS + "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N + "\u2080":"$_{0}$", // SUBSCRIPT ZERO + "\u2081":"$_{1}$", // SUBSCRIPT ONE + "\u2082":"$_{2}$", // SUBSCRIPT TWO + "\u2083":"$_{3}$", // SUBSCRIPT THREE + "\u2084":"$_{4}$", // SUBSCRIPT FOUR + "\u2085":"$_{5}$", // SUBSCRIPT FIVE + "\u2086":"$_{6}$", // SUBSCRIPT SIX + "\u2087":"$_{7}$", // SUBSCRIPT SEVEN + "\u2088":"$_{8}$", // SUBSCRIPT EIGHT + "\u2089":"$_{9}$", // SUBSCRIPT NINE + "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN + "\u208B":"$_{-}$", // SUBSCRIPT MINUS + "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN + "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS + "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS + "\u20AC":"{\\texteuro}", // EURO SIGN + "\u2100":"a/c", // ACCOUNT OF + "\u2101":"a/s", // ADDRESSED TO THE SUBJECT + "\u2103":"{\\textcelsius}", // DEGREE CELSIUS + "\u2105":"c/o", // CARE OF + "\u2106":"c/u", // CADA UNA + "\u2116":"{\\textnumero}", // NUMERO SIGN + "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT + "\u2120":"{\\textservicemark}", // SERVICE MARK + "\u2121":"{TEL}", // TELEPHONE SIGN + "\u2122":"{\\texttrademark}", // TRADE MARK SIGN + "\u2126":"{\\textohm}", // OHM SIGN + "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL + "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD + "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS + "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH + "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS + "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS + "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS + "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH + "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS + "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH + "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS + "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS + "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS + "\u215F":" 1/", // FRACTION NUMERATOR ONE + "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW + "\u2191":"{\\textuparrow}", // UPWARDS ARROW + "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW + "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW + "\u2194":"<->", // LEFT RIGHT ARROW + "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW + "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW + "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW + "\u221E":"$\\infty$", // INFINITY + "\u2225":"||", // PARALLEL TO + "\u223C":"\\~{}", // TILDE OPERATOR + "\u2260":"/=", // NOT EQUAL TO + "\u2264":"<=", // LESS-THAN OR EQUAL TO + "\u2265":">=", // GREATER-THAN OR EQUAL TO + "\u226A":"<<", // MUCH LESS-THAN + "\u226B":">>", // MUCH GREATER-THAN + "\u2295":"(+)", // CIRCLED PLUS + "\u2296":"(-)", // CIRCLED MINUS + "\u2297":"(x)", // CIRCLED TIMES + "\u2298":"(/)", // CIRCLED DIVISION SLASH + "\u22A2":"|-", // RIGHT TACK + "\u22A3":"-|", // LEFT TACK + "\u22A6":"|-", // ASSERTION + "\u22A7":"|=", // MODELS + "\u22A8":"|=", // TRUE + "\u22A9":"||-", // FORCES + "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO + "\u22D8":"<<<", // VERY MUCH LESS-THAN + "\u22D9":">>>", // VERY MUCH GREATER-THAN + "\u22EF":"...", // MIDLINE HORIZONTAL ELLIPSIS + "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET + "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET + "\u2423":"{\\textvisiblespace}", // OPEN BOX + "\u2425":"///", // SYMBOL FOR DELETE FORM TWO + "\u25E6":"{\\textopenbullet}", // WHITE BULLET + "\u2639":":-(", // WHITE FROWNING FACE + "\u263A":":-)", // WHITE SMILING FACE + "\u263B":"(-:", // BLACK SMILING FACE + "\u266F":"$\\#$", // MUSIC SHARP SIGN + "\u2701":"$\\%<$", // UPPER BLADE SCISSORS + "\u2702":"$\\%<$", // BLACK SCISSORS + "\u2703":"$\\%<$", // LOWER BLADE SCISSORS + "\u2704":"$\\%<$", // WHITE SCISSORS +/* Derived accented characters */ + "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE + "\u00C1":"\\'{A}", // LATIN CAPITAL LETTER A WITH ACUTE + "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX + "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE + "\u00C4":"\\\"{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS + "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA + "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE + "\u00C9":"\\'{E}", // LATIN CAPITAL LETTER E WITH ACUTE + "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX + "\u00CB":"\\\"{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS + "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE + "\u00CD":"\\'{I}", // LATIN CAPITAL LETTER I WITH ACUTE + "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX + "\u00CF":"\\\"{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS + "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE + "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE + "\u00D3":"\\'{O}", // LATIN CAPITAL LETTER O WITH ACUTE + "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX + "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE + "\u00D6":"\\\"{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS + "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE + "\u00DA":"\\'{U}", // LATIN CAPITAL LETTER U WITH ACUTE + "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX + "\u00DC":"\\\"{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS + "\u00DD":"\\'{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE + "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE + "\u00E1":"\\'{a}", // LATIN SMALL LETTER A WITH ACUTE + "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX + "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE + "\u00E4":"\\\"{a}", // LATIN SMALL LETTER A WITH DIAERESIS + "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA + "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE + "\u00E9":"\\'{e}", // LATIN SMALL LETTER E WITH ACUTE + "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX + "\u00EB":"\\\"{e}", // LATIN SMALL LETTER E WITH DIAERESIS + "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE + "\u00ED":"\\'{i}", // LATIN SMALL LETTER I WITH ACUTE + "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX + "\u00EF":"\\\"{i}", // LATIN SMALL LETTER I WITH DIAERESIS + "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE + "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE + "\u00F3":"\\'{o}", // LATIN SMALL LETTER O WITH ACUTE + "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX + "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE + "\u00F6":"\\\"{o}", // LATIN SMALL LETTER O WITH DIAERESIS + "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE + "\u00FA":"\\'{u}", // LATIN SMALL LETTER U WITH ACUTE + "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX + "\u00FC":"\\\"{u}", // LATIN SMALL LETTER U WITH DIAERESIS + "\u00FD":"\\'{y}", // LATIN SMALL LETTER Y WITH ACUTE + "\u00FF":"\\\"{y}", // LATIN SMALL LETTER Y WITH DIAERESIS + "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON + "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON + "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE + "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE + "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK + "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK + "\u0106":"\\'{C}", // LATIN CAPITAL LETTER C WITH ACUTE + "\u0107":"\\'{c}", // LATIN SMALL LETTER C WITH ACUTE + "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX + "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX + "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE + "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE + "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON + "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON + "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON + "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON + "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON + "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON + "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE + "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE + "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE + "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE + "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK + "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK + "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON + "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON + "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX + "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX + "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE + "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE + "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE + "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE + "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA + "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA + "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX + "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX + "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE + "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE + "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON + "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON + "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE + "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE + "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK + "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK + "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE + "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX + "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX + "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA + "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA + "\u0139":"\\'{L}", // LATIN CAPITAL LETTER L WITH ACUTE + "\u013A":"\\'{l}", // LATIN SMALL LETTER L WITH ACUTE + "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA + "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA + "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON + "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON + "\u0143":"\\'{N}", // LATIN CAPITAL LETTER N WITH ACUTE + "\u0144":"\\'{n}", // LATIN SMALL LETTER N WITH ACUTE + "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA + "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA + "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON + "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON + "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON + "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON + "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE + "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE + "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE + "\u0154":"\\'{R}", // LATIN CAPITAL LETTER R WITH ACUTE + "\u0155":"\\'{r}", // LATIN SMALL LETTER R WITH ACUTE + "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA + "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA + "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON + "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON + "\u015A":"\\'{S}", // LATIN CAPITAL LETTER S WITH ACUTE + "\u015B":"\\'{s}", // LATIN SMALL LETTER S WITH ACUTE + "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX + "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX + "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA + "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA + "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON + "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON + "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA + "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA + "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON + "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON + "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE + "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE + "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON + "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON + "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE + "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE + "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE + "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK + "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK + "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX + "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX + "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX + "\u0178":"\\\"{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS + "\u0179":"\\'{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE + "\u017A":"\\'{z}", // LATIN SMALL LETTER Z WITH ACUTE + "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE + "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE + "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON + "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON + "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON + "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON + "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON + "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON + "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON + "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON + "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON + "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON + "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON + "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON + "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON + "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON + "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK + "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK + "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON + "\u01F4":"\\'{G}", // LATIN CAPITAL LETTER G WITH ACUTE + "\u01F5":"\\'{g}", // LATIN SMALL LETTER G WITH ACUTE + "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE + "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE + "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW + "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW + "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW + "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW + "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE + "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE + "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW + "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW + "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW + "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW + "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA + "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA + "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE + "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE + "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON + "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON + "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE + "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE + "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW + "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW + "\u1E26":"\\\"{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS + "\u1E27":"\\\"{h}", // LATIN SMALL LETTER H WITH DIAERESIS + "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA + "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA + "\u1E30":"\\'{K}", // LATIN CAPITAL LETTER K WITH ACUTE + "\u1E31":"\\'{k}", // LATIN SMALL LETTER K WITH ACUTE + "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW + "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW + "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW + "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW + "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW + "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW + "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW + "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW + "\u1E3E":"\\'{M}", // LATIN CAPITAL LETTER M WITH ACUTE + "\u1E3F":"\\'{m}", // LATIN SMALL LETTER M WITH ACUTE + "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE + "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE + "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW + "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW + "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE + "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE + "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW + "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW + "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW + "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW + "\u1E54":"\\'{P}", // LATIN CAPITAL LETTER P WITH ACUTE + "\u1E55":"\\'{p}", // LATIN SMALL LETTER P WITH ACUTE + "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE + "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE + "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE + "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE + "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW + "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW + "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW + "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW + "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE + "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE + "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW + "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW + "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE + "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE + "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW + "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW + "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW + "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW + "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE + "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE + "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW + "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW + "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE + "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE + "\u1E82":"\\'{W}", // LATIN CAPITAL LETTER W WITH ACUTE + "\u1E83":"\\'{w}", // LATIN SMALL LETTER W WITH ACUTE + "\u1E84":"\\\"{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS + "\u1E85":"\\\"{w}", // LATIN SMALL LETTER W WITH DIAERESIS + "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE + "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE + "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW + "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW + "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE + "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE + "\u1E8C":"\\\"{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS + "\u1E8D":"\\\"{x}", // LATIN SMALL LETTER X WITH DIAERESIS + "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE + "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE + "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX + "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX + "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW + "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW + "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW + "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW + "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW + "\u1E97":"\\\"{t}", // LATIN SMALL LETTER T WITH DIAERESIS + "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW + "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW + "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW + "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW + "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE + "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE + "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW + "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW + "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW + "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW + "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW + "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW + "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE + "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE + "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW + "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW + "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE + "\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE + +}; + +var alwaysMap = { + "|":"{\\textbar}", + "<":"{\\textless}", + ">":"{\\textgreater}", + "~":"{\\textasciitilde}", + "^":"{\\textasciicircum}", + "\\":"{\\textbackslash}" +}; + +var strings = new Object(); +var keyRe = /[a-zA-Z0-9\-]/; + +function processField(item, field, value) { + if(fieldMap[field]) { + item[fieldMap[field]] = value; + } else if(inputFieldMap[field]) { + item[inputFieldMap[field]] = value; + } else if(field == "journal") { + if(item.publicationTitle) { + // we already had an fjournal + item.journalAbbreviation = value + } else { + item.publicationTitle = value; + } + } else if(field == "fjournal") { + if(item.publicationTitle) { + // move publicationTitle to abbreviation + item.journalAbbreviation = value; + } + item.publicationTitle = value; + } else if(field == "author" || field == "editor") { + // parse authors/editors + var names = value.split(" and "); + for each(var name in names) { + item.creators.push(Zotero.Utilities.cleanAuthor(name, field, + (name.indexOf(",") != -1))); + } + } else if(field == "institution" || field == "organization") { + item.backupPublisher = value; + } else if(field == "number"){ // fix for techreport + if (item.itemType == "report") { + item.reportNumber = value; + } else { + item.issue = value; + } + } else if(field == "month") { + var monthIndex = months.indexOf(value.toLowerCase()); + if(monthIndex != -1) { + value = Zotero.Utilities.formatDate({month:monthIndex}); + } else { + value += " "; + } + + if(item.date) { + if(value.indexOf(item.date) != -1) { + // value contains year and more + item.date = value; + } else { + item.date = value+item.date; + } + } else { + item.date = value; + } + } else if(field == "year") { + if(item.date) { + if(item.date.indexOf(value) == -1) { + // date does not already contain year + item.date += value; + } + } else { + item.date = value; + } + } else if(field == "pages") { + item.pages = value.replace(/--/g, "-"); + } else if(field == "note" || field == "annote") { + item.extra += "\n"+value; + } else if(field == "howpublished") { + if(value.length >= 7) { + var str = value.substr(0, 7); + if(str == "http://" || str == "https:/" || str == "mailto:") { + item.url = value; + } else { + item.extra += "\nPublished: "+value; + } + } + } else if(field == "keywords") { + if(value.indexOf(",") == -1) { + // keywords/tags + item.tags = value.split(" "); + } else { + item.tags = value.split(/, ?/g); + } + } else if (field == "comment") { + item.notes.push({note:value}); + } else if(field == "pdf") { // new code to handle PDF import. absolute file path should be specified in bibtex + item.attachments = [{url:"file://"+value, mimeType:"application/pdf"}]; + } +} + +function getFieldValue(read) { + var value = ""; + // now, we have the first character of the field + if(read == "{") { + // character is a brace + var openBraces = 1; + while(read = Zotero.read(1)) { + if(read == "{" && value[value.length-1] != "\\") { + openBraces++; + value += "{"; + } else if(read == "}" && value[value.length-1] != "\\") { + openBraces--; + if(openBraces == 0) { + break; + } else { + value += "}"; + } + } else { + value += read; + } + } + } else if(read == '"') { + var openBraces = 0; + while(read = Zotero.read(1)) { + if(read == "{" && value[value.length-1] != "\\") { + openBraces++; + value += "{"; + } else if(read == "}" && value[value.length-1] != "\\") { + openBraces--; + value += "}"; + } else if(read == '"' && openBraces == 0) { + break; + } else { + value += read; + } + } + } + + if(value.length > 1) { + // replace accented characters (yucky slow) + value = value.replace(/{(\\[`"'^~=a-z])([A-Za-z])}/g, "$1{$2}"); + for (var i in reversemappingTable) { // really really slow! + var mapped = reversemappingTable[i]; + if (value.indexOf(mapped) != -1) { + Zotero.debug("Replace " + mapped + " in " + value + " with " + i); + value = value.replace(mapped, i, "g"); + } + mapped = mapped.replace(/[{}]/, ""); + if (value.indexOf(mapped) != -1) { + Zotero.debug("Replace(2) " + mapped + " in " + value + " with " + i); + value = value.replace(mapped, i, "g"); + } + } + + // kill braces + value = value.replace(/([^\\])[{}]+/g, "$1"); + if(value[0] == "{") { + value = value.substr(1); + } + + // chop off backslashes + value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2"); + value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2"); + if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) { + value = value.substr(1); + } + if(value[value.length-1] == "\\" && "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) { + value = value.substr(0, value.length-1); + } + value = value.replace(/\\\\/g, "\\"); + value = value.replace(/\s+/g, " "); + } + + return value; +} + +function beginRecord(type, closeChar) { + type = Zotero.Utilities.cleanString(type.toLowerCase()); + if(type != "string") { + var zoteroType = bibtex2zoteroTypeMap[type]; + if (!zoteroType) { + Zotero.debug("discarded item from BibTeX; type was "+type); + } + var item = new Zotero.Item(zoteroType); + + item.extra = ""; + } + + var field = ""; + + // by setting dontRead to true, we can skip a read on the next iteration + // of this loop. this is useful after we read past the end of a string. + var dontRead = false; + + while(dontRead || (read = Zotero.read(1))) { + dontRead = false; + + if(read == "=") { // equals begin a field + // read whitespace + var read = Zotero.read(1); + while(" \n\r\t".indexOf(read) != -1) { + read = Zotero.read(1); + } + + if(keyRe.test(read)) { + // read numeric data here, since we might get an end bracket + // that we should care about + value = ""; + value += read; + + // character is a number + while((read = Zotero.read(1)) && keyRe.test(read)) { + value += read; + } + + // don't read the next char; instead, process the character + // we already read past the end of the string + dontRead = true; + + // see if there's a defined string + if(strings[value]) value = strings[value]; + } else { + var value = getFieldValue(read); + } + + if(item) { + processField(item, field.toLowerCase(), value); + } else if(type == "string") { + strings[field] = value; + } + field = ""; + } else if(read == ",") { // commas reset + field = ""; + } else if(read == closeChar) { + if(item) { + if(item.extra) item.extra = item.extra.substr(1); // chop \n + item.complete(); + } + return; + } else if(" \n\r\t".indexOf(read) == -1) { // skip whitespace + field += read; + } + } +} + +function doImport() { + var read = "", text = "", recordCloseElement = false; + var type = false; + + while(read = Zotero.read(1)) { + if(read == "@") { + type = ""; + } else if(type !== false) { + if(type == "comment") { + type = false; + } else if(read == "{") { // possible open character + beginRecord(type, "}"); + type = false; + } else if(read == "(") { // possible open character + beginRecord(type, ")"); + type = false; + } else { + type += read; + } + } + } +} + +// some fields are, in fact, macros. If that is the case then we should not put the +// data in the braces as it will cause the macros to not expand properly +function writeField(field, value, isMacro) { + if(!value) return; + value = value + ""; // convert integers to strings + Zotero.write(",\n\t"+field+" = "); + if(!isMacro) Zotero.write("{"); + // I hope these are all the escape characters! + value = value.replace(/[|\<\>\~\^\\]/g, mapEscape).replace(/([\#\$\%\&\_])/g, "\\$1"); + if (!Zotero.getOption("UTF8")) { + value = value.replace(/[\u0080-\uFFFF]/g, mapAccent); + } + Zotero.write(value); + if(!isMacro) Zotero.write("}"); +} + +function mapEscape(character) { + return alwaysMap[character]; +} + +function mapAccent(character) { + return (mappingTable[character] ? mappingTable[character] : "?"); +} + +var numberRe = /^[0-9]+/; +// this is a list of words that should not appear as part of the citation key +var citeKeyTitleBannedRe = /(\s+|\b)(a|an|from|does|how|it\'s|its|on|some|the|this|why)(\s+|\b)/g; +var citeKeyConversionsRe = /%([a-zA-Z])/; +var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g; + +var citeKeyConversions = { + "a":function (flags, item) { + if(item.creators && item.creators[0] && item.creators[0].lastName) { + return item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,""); + } + return ""; + }, + "t":function (flags, item) { + if (item["title"]) { + return item["title"].toLowerCase().replace(citeKeyTitleBannedRe, "").split(" ")[0]; + } + return ""; + }, + "y":function (flags, item) { + if(item.date) { + var date = Zotero.Utilities.strToDate(item.date); + if(date.year && numberRe.test(date.year)) { + return date.year; + } + } + return "????"; + } +} + + +function buildCiteKey (item,citekeys) { + var basekey = ""; + var counter = 0; + citeKeyFormatRemaining = citeKeyFormat; + while (citeKeyConversionsRe.test(citeKeyFormatRemaining)) { + if (counter > 100) { + Zotero.debug("Pathological BibTeX format: " + citeKeyFormat); + break; + } + var m = citeKeyFormatRemaining.match(citeKeyConversionsRe); + if (m.index > 0) { + //add data before the conversion match to basekey + basekey = basekey + citeKeyFormatRemaining.substr(0, m.index); + } + var flags = ""; // for now + var f = citeKeyConversions[m[1]]; + if (typeof(f) == "function") { + var value = f(flags, item); + Zotero.debug("Got value " + value + " for %" + m[1]); + //add conversion to basekey + basekey = basekey + value; + } + citeKeyFormatRemaining = citeKeyFormatRemaining.substr(m.index + m.length); + counter++; + } + if (citeKeyFormatRemaining.length > 0) { + basekey = basekey + citeKeyFormatRemaining; + } + + // for now, remove any characters not explicitly known to be allowed; + // we might want to allow UTF-8 citation keys in the future, depending + // on implementation support. + // + // no matter what, we want to make sure we exclude + // " # % ' ( ) , = { } ~ and backslash + + basekey = basekey.replace(citeKeyCleanRe, ""); + var citekey = basekey; + var i = 0; + while(citekeys[citekey]) { + i++; + citekey = basekey + "-" + i; + } + citekeys[citekey] = true; + return citekey; +} + +function doExport() { + //Zotero.write("% BibTeX export generated by Zotero "+Zotero.Utilities.getVersion()); + // to make sure the BOM gets ignored + Zotero.write("\n"); + + var first = true; + var citekeys = new Object(); + var item; + while(item = Zotero.nextItem()) { + // determine type + var type = zotero2bibtexTypeMap[item.itemType]; + if (typeof(type) == "function") { type = type(item); } + if(!type) type = "misc"; + + // create a unique citation key + var citekey = buildCiteKey(item, citekeys); + + // write citation key + Zotero.write((first ? "" : ",\n\n") + "@"+type+"{"+citekey); + first = false; + + for(var field in fieldMap) { + if(item[fieldMap[field]]) { + writeField(field, item[fieldMap[field]]); + } + } + + if(item.reportNumber || item.issue) { + writeField("number", item.reportNumber || item.issue); + } + + if(item.publicationTitle) { + if(item.itemType == "bookSection" || item.itemType == "conferencePaper") { + writeField("booktitle", item.publicationTitle); + } else { + writeField("journal", item.publicationTitle); + } + } + + if(item.publisher) { + if(item.itemType == "thesis") { + writeField("school", item.publisher); + } else if(item.itemType =="report") { + writeField("institution", item.publisher); + } else { + writeField("publisher", item.publisher); + } + } + + if(item.creators && item.creators.length) { + // split creators into subcategories + var author = ""; + var editor = ""; + for each(var creator in item.creators) { + var creatorString = creator.lastName; + + if (creator.firstName) { + creatorString = creator.firstName + " " + creator.lastName; + } + + if (creator.creatorType == "editor") { + editor += " and "+creatorString; + } else { + author += " and "+creatorString; + } + } + + if(author) { + writeField("author", author.substr(5)); + } + if(editor) { + writeField("editor", editor.substr(5)); + } + } + + if(item.date) { + var date = Zotero.Utilities.strToDate(item.date); + // need to use non-localized abbreviation + if(date.month) { + writeField("month", months[date.month], true); + } + if(date.year) { + writeField("year", date.year); + } + } + + if(item.extra) { + writeField("note", item.extra); + } + + if(item.tags && item.tags.length) { + var tagString = ""; + for each(var tag in item.tags) { + tagString += ","+tag.tag; + } + writeField("keywords", tagString.substr(1)); + } + + if(item.pages) { + writeField("pages", item.pages.replace("-","--")); + } + + if(item.itemType == "webpage") { + writeField("howpublished", item.url); + } + if (item.notes) { + for each (var note in item.notes) { + writeField("comment", note["note"]); + } + } + Zotero.write("\n}"); + } +} +\ No newline at end of file diff --git a/translators/Biblio.com.js b/translators/Biblio.com.js @@ -0,0 +1,125 @@ +{ + "translatorID":"9932d1a7-cc6d-4d83-8462-8f6658b13dc0", + "translatorType":4, + "label":"Biblio.com", + "creator":"Adam Crymble and Michael Berkowitz", + "target":"http://www.biblio.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-07 14:50:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("bookseller_search") || doc.location.href.match("bookstores") || doc.location.href.match("textbooks")) { + + } else if (doc.location.href.match("search")) { + return "multiple"; + } else if (doc.location.href.match("books")) { + return "book"; + } +} + +//Biblio.com translator. Code by Adam Crymble. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var contents = new Array(); + var multiAuthors = new Array(); + var fieldTitle; + var author1; + + var newItem = new Zotero.Item("book"); + + var content = doc.evaluate('//div[@class="smalltext1"][@id="infobox"]/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@class="smalltext1"][@id="infobox"]/ul/li)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + + contents = content.iterateNext().textContent.split(": "); + fieldTitle = contents[0].replace(/\s*/g, ''); + dataTags[fieldTitle] = contents[1].replace(/^\s*|\s*$/g, ''); + } + + //Authors + if (doc.evaluate('//td[2]/h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var authors = doc.evaluate('//td[2]/h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (authors.match(/\w/)) { + if (authors.match(/^ by/)) { + authors = authors.substr(4); + if (authors.match(/;/)) { + multiAuthors = authors.split(";"); + Zotero.debug(multiAuthors); + for each (var aut in multiAuthors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(aut, "author", true)); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author", true)); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author")); + } + } + + } + + //extra + if (dataTags["Quantityavailable"]) { + newItem.extra = "Quantity Available: " + dataTags["Quantityavailable"]; + } + + associateData (newItem, dataTags, "Publisher", "publisher"); + associateData (newItem, dataTags, "Place", "place"); + associateData (newItem, dataTags, "Datepublished", "date"); + associateData (newItem, dataTags, "ISBN10", "ISBN"); + associateData (newItem, dataTags, "ISBN13", "ISBN"); + associateData (newItem, dataTags, "Pages", "pages"); + associateData (newItem, dataTags, "Edition", "edition"); + + newItem.title = doc.evaluate('//tbody/tr[1]/td[2]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s&+/g, ''); + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//table[@class="search-result"]/tbody/tr/td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.textContent.match(/\w/)) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Bibliotheque UQAM.js b/translators/Bibliotheque UQAM.js @@ -0,0 +1,234 @@ +{ + "translatorID":"39ea814e-8fdb-486c-a88d-59479f341066", + "translatorType":4, + "label":"Bibliotheque UQAM", + "creator":"Adam Crymble", + "target":"http://www.manitou.uqam.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:15:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//center/table/tbody/tr[1]/td/input', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.title.match("détails")) { + return "book"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + + var dataTags = new Object(); + var tagsContent = new Array(); + var contents; + var newItemAuthors1 = new Array(); + var newItemAuthors2 = new Array(); + + var xPathHeadings = doc.evaluate('//p/table/tbody/tr/td[1]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContents = doc.evaluate('//p/table/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//p/table/tbody/tr/td[1]/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var dump = xPathHeadings.iterateNext(); + + for (i=0; i<xPathCount.numberValue-1; i++) { + + fieldTitle=xPathHeadings.iterateNext().textContent.replace(/\s+/g, ''); + contents = xPathContents.iterateNext().textContent; + + if (fieldTitle == "Titres:") { + fieldTitle = "Titre:"; + } + + //determines media type + if (fieldTitle == "Titre:") { + + dataTags[fieldTitle] = contents.replace(/^\s*|\s*$/g, ''); + + if (contents.match("enregistrement sonore")) { + var newItem = new Zotero.Item("audioRecording"); + } else if (contents.match("musique")) { + var newItem = new Zotero.Item("audioRecording"); + } else if (contents.match("enregistrement vidéo")) { + var newItem = new Zotero.Item("videoRecording"); + } else { + var newItem = new Zotero.Item("book"); + } + } + + //gets author(s). + if (fieldTitle == "Auteur:") { + fieldTitle = "author"; + + dataTags[fieldTitle] = contents; + if (dataTags[fieldTitle].match(",")) { + var authorName = dataTags["author"].split(","); + authorName[0] = authorName[0].replace(/^\s*|\s*$/g, ''); + dataTags["author"] = (authorName[1] + (" ") + authorName[0]); + } else { + var parenthesis = dataTags["author"].indexOf("("); + if (parenthesis > 0) { + dataTags["author"] = dataTags["author"].substr(0, parenthesis); + } + dataTags["author"] = dataTags["author"].replace(/^\s*|\s*$/g, ''); + } + + } else if (fieldTitle == "Auteurs:") { + + dataTags[fieldTitle] = contents; + + var multiAuthors = dataTags["Auteurs:"].split(/\n/); + for (var j = 0; j < multiAuthors.length; j++) { + var parenthesis = multiAuthors[j].indexOf("("); + + if (parenthesis > 0) { + multiAuthors[j] = multiAuthors[j].substr(0, parenthesis); + } + + if (multiAuthors[j] != "" && multiAuthors[j] != ' ') { + if (multiAuthors[j].match(", ")) { + var authorName = multiAuthors[j].split(","); + newItemAuthors1.push(authorName[1] + (" ") + authorName[0]); + } else { + newItemAuthors2.push(multiAuthors[j]); + } + } + } + + } else if (fieldTitle == "Éditeur:") { + dataTags[fieldTitle] = contents; + var imprintSplit = dataTags["Éditeur:"].split(": "); + if (imprintSplit.length > 1) { + newItem.place = imprintSplit[0].replace(/^\s*|\s*$/g, ''); + var publisherDate = imprintSplit[1].split(", "); + + newItem.publisher = publisherDate[0].replace(/^\s*|\s*$/g, ''); + + if (publisherDate.length > 1) { + + newItem.date = publisherDate[1].replace(/^\s*|\s*$/g, ''); + } + } else { + newItem.publisher = dataTags["Éditeur:"]; + } + + } else if (fieldTitle == "Sujet:") { + dataTags[fieldTitle] = contents; + + if (dataTags["Sujet:"].match("\n")) { + + tagsContent = (dataTags["Sujet:"].split(/\n/)); + + } + + } else { + + dataTags[fieldTitle] = contents.replace(/^\s*|\s*$/g, ''); + } + } + +//pushes tags + + for (var y = 0; y < tagsContent.length; y++) { + if (tagsContent[y]!='' && tagsContent[y]!= " ") { + var parenthesis = tagsContent[y].indexOf("("); + if (parenthesis > 0) { + tagsContent[y] = tagsContent[y].substr(0, parenthesis); + } + newItem.tags[y] = tagsContent[y]; + } + } + +//because newItem is not defined until after the authors have, authors must be put into Zotero outside the main for loop. + if (dataTags["author"]) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["author"], "author")); + } + + for (var i = 0; i < newItemAuthors1.length; i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(newItemAuthors1[i], "author")); + } + + for (var i = 0; i < newItemAuthors2.length; i++) { + newItem.creators.push({lastName: newItemAuthors2[i], creatorType: "creator"}); + } + +//trims title as best as possible + if (dataTags["Titre:"].match(/\[/)) { + var splitter = dataTags["Titre:"].indexOf("["); + } + + if (dataTags["Titre:"].match("/")) { + var splitter1 = dataTags["Titre:"].indexOf("/"); + } + + if (splitter1 > -1 && splitter > -1) { + if (splitter1 > splitter) { + dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter); + } else { + dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter1); + } + } else if (splitter1 > -1) { + dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter1); + } else if (splitter > -1) { + dataTags["Titre:"] = dataTags["Titre:"].substr(0, splitter); + } + + associateData (newItem, dataTags, "Titre:", "title"); + associateData (newItem, dataTags, "Numéro:", "ISBN"); + associateData (newItem, dataTags, "Description:", "pages"); + associateData (newItem, dataTags, "Banque:", "repository"); + associateData (newItem, dataTags, "Langue:", "language"); + associateData (newItem, dataTags, "Localisation:", "Loc. in Archive"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('/html/body/table/tbody/tr/td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i = 0; i < 4; i++) { + var dump = titles.iterateNext(); + } + + var next_title; + + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + Zotero.debug(next_title.href); + Zotero.debug(next_title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Bibliotheque et Archives Nationale du Quebec (Pistard).js b/translators/Bibliotheque et Archives Nationale du Quebec (Pistard).js @@ -0,0 +1,151 @@ +{ + "translatorID":"1eb5eb03-26ab-4015-bd0d-65487734744a", + "translatorType":4, + "label":"Bibliotheque et Archives Nationale du Quebec (Pistard)", + "creator":"Adam Crymble", + "target":"http://pistard.banq.qc.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb (doc, url) { + + if (doc.title.match("Liste détaillée des fonds")) { + return "multiple"; + } else if (doc.title.match("Description fonds")) { + return "book"; + } +} + +//Bibliotheque et Archives National du Quebec. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var tagsContent= new Array(); + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//strong', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//strong)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//div[@id="Content"]/div/table', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var headersArray = new Array(); + var oneHeader = ''; + + if (xPathCount.numberValue > 1) { + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + headersArray.push(fieldTitle); + } + } else { + oneHeader = (headers.iterateNext().textContent); + } + + var contentsArray = new Array(); + var j = 0; + + if (oneHeader.length<1) { + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.indexOf(headersArray[i]); + var removeHeader = headersArray[i].length; + + contentsArray.push(contents.substr(fieldIndex)); + contents = contents.substr(0, fieldIndex); + fieldTitle = headersArray[i].replace(/\s+/g, ''); + + dataTags[fieldTitle] = contentsArray[j].substr(removeHeader).replace(/^\s*|\s+$/g, ''); + j++; + } + } + Zotero.debug(dataTags); + + if (dataTags["Titre,Dates,Quantité"]) { + if (dataTags["Titre,Dates,Quantité"].match(/\n/)) { + var splitTitle = dataTags["Titre,Dates,Quantité"].split(/\n/); + if (splitTitle[0].match(/\w/)) { + newItem.title = splitTitle[0].replace(/^\s*|\s+$/g, ''); + } + for (var i = 0; i < splitTitle.length; i++) { + if (splitTitle[i].match("/ ")) { + var author = splitTitle[i].replace(/^\s*|\s+$/g, '').substr(2); + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + } + } else { + newItem.title = doc.title; + } + + + var k = 0; + if (dataTags["Termesrattachés"]) { + + if (dataTags["Termesrattachés"].match(/\n/)) { + tagsContent = dataTags["Termesrattachés"].split(/\n/); + for (var i in tagsContent) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[k] = tagsContent[i].replace(/^\s+|\s*$/g, ''); + k++; + } + } + } else { + newItem.tags[0] = dataTags["Termesrattachés"]; + } + } + + associateData (newItem, dataTags, "Languedesdocuments", "language"); + associateData (newItem, dataTags, "Cote:", "callNumber"); + associateData (newItem, dataTags, "Collation", "pages"); + associateData (newItem, dataTags, "Centre:", "place"); + associateData (newItem, dataTags, "Portéeetcontenu", "abstractNote"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.href.match("description_fonds")) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Bibliothèque et Archives nationales du Québec.js b/translators/Bibliothèque et Archives nationales du Québec.js @@ -0,0 +1,264 @@ +{ + "translatorID":"59cce211-9d77-4cdd-876d-6229ea20367f", + "translatorType":4, + "label":"Bibliothèque et Archives nationales du Québec", + "creator":"Adam Crymble", + "target":"http://catalogue.banq.qc.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("Search")) { + return "multiple"; + } else if (doc.title.match("Recherche")) { + return "multiple"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("book")) { + return "book"; + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mmusic")) { + return "book"; + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("manalytic")) { + return "book"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("msdisc")) { + return "audioRecording"; + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("msound")) { + return "audioRecording"; + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mscas")) { + return "audioRecording"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mvdisc")) { + return "videoRecording"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mpaint")) { + return "artwork"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mserial")) { + return "report"; + + } else if (doc.evaluate('//td[2]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src.match("mcomponent")) { + return "newspaperArticle"; + } +} + + + +//Bibliotheque et Archives National du Quebec. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var contents; + var descriptionField; + var tagsContent= new Array(); + var inField = 0; + + //determines media type + if (detectWeb(doc, url) == "book") { + var newItem = new Zotero.Item("book"); + descriptionField = "pages"; + } else if (detectWeb(doc, url) == "audioRecording") { + var newItem = new Zotero.Item("audioRecording"); + descriptionField = "runningTime"; + } else if (detectWeb(doc, url) == "videoRecording") { + var newItem = new Zotero.Item("videoRecording"); + descriptionField = "runningTime"; + } else if (detectWeb(doc, url) == "artwork") { + var newItem = new Zotero.Item("artwork"); + descriptionField = "artworkSize"; + } else if (detectWeb(doc, url) == "report") { + var newItem = new Zotero.Item("report"); + descriptionField = "pages"; + } else if (detectWeb(doc, url) == "newspaperArticle") { + var newItem = new Zotero.Item("newspaperArticle"); + descriptionField = "pages" + } + +//determines language + var lang = doc.evaluate('//td[2]/a/img', doc, nsResolver, XPathResult.ANY_TYPE, null); + var langCount = doc.evaluate('count (//td[2]/a/img)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var lang1 = lang.iterateNext().src; + + if (langCount.numberValue > 1) { + lang1 = lang.iterateNext().src; + + if (lang1.match("lfre")) { + newItem.language = "French"; + } else if (lang1.match("leng")) { + newItem.language = "English"; + } + } + +//scraping XPaths + var xPathHeadings = doc.evaluate('//td/table/tbody/tr/td[2]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContents = doc.evaluate('//td[2]/table/tbody/tr/td/table/tbody/tr/td[4]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//td/table/tbody/tr/td[2]/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + if (doc.evaluate('//td/table/tbody/tr/td[2]/b', doc, nsResolver, XPathResult.ANY_TYPE, null)) { + + for (i=0; i<xPathCount.numberValue; i++) { + + fieldTitle = xPathHeadings.iterateNext().textContent.replace(/\s+/g, ''); + contents = xPathContents.iterateNext().textContent; + + if (contents.match("[*]") && fieldTitle!= "Publisher" && fieldTitle!= "Éditeur") { + var removeTagExcess = contents.indexOf("["); + contents = contents.substr(0, removeTagExcess); + } + + if (fieldTitle == "Author" | fieldTitle == "Auteur") { + fieldTitle = "Author"; + dataTags[fieldTitle] = (contents); + var authorName = dataTags["Author"].split(","); + authorName[0] = authorName[0].replace(/\s+/g, ''); + + dataTags["Author"] = (authorName[1] + (" ") + authorName[0]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author")); + + //publishing info + } else if (fieldTitle == "Publisher" | fieldTitle == "Éditeur") { + fieldTitle = "Publisher"; + + dataTags["Publisher"] = (contents); + + if (dataTags["Publisher"].match(":")) { + + var place1 = dataTags["Publisher"].split(":"); + dataTags["Place"] = place1[0].replace(/^\s*|\[|\]/g,''); + + var publish = place1[1].split(","); + dataTags["Publish"] = (publish[0].replace(/^\s*|\[|\]/g,'')); + + place1[1] = place1[1].replace(/^\s*|\s*$|\[|\]/g, ''); + if (place1[1].match("/?")) { + var dateLength = place1[1].length-5; + } else { + var dateLength = place1[1].length-4; + } + dataTags["Date"] = place1[1].substr(dateLength); + } else { + dataTags["Date"] = (contents); + } + + //tags + } else if (fieldTitle == "Subjects" | fieldTitle == "Sujets") { + fieldTitle = "Subjects"; + tagsContent = contents.split("\n"); + + //source + } else if (fieldTitle == "Source") { + dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, '')); + dataTags["Source"] = ("Source: " + dataTags["Source"]); + Zotero.debug(doc.title); + //normal + } else { + dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, '')); + } + } + + //series + if (fieldTitle == "Series" | fieldTitle == "Collection") { + fieldTitle = "Series"; + dataTags[fieldTitle] = (contents.replace(/\s\s\s*/g, '')); + } + + //makes tags + for (i = 0; i < tagsContent.length; i++) { + if (tagsContent[i] != ("") && tagsContent[i] !=(" ")) { + newItem.tags[i] = tagsContent[i]; + } + } + + associateData (newItem, dataTags, "Description", descriptionField); + + associateData (newItem, dataTags, "Title", "title"); + associateData (newItem, dataTags, "Place", "place"); + associateData (newItem, dataTags, "Publish", "publisher"); + associateData (newItem, dataTags, "Date", "date"); + associateData (newItem, dataTags, "Source", "extra"); + associateData (newItem, dataTags, "ISBN", "ISBN"); + associateData (newItem, dataTags, "Localinf.", "rights"); + associateData (newItem, dataTags, "Series", "series"); + associateData (newItem, dataTags, "Notes", "abstractNote"); + associateData (newItem, dataTags, "Numbering", "reportNumber"); + + associateData (newItem, dataTags, "Titre", "title"); + associateData (newItem, dataTags, "Numérotation", "reportNumber"); + + } + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var next_title = new Array(); + var links1 = new Array(); + var y = 0; + var next_title1 = new Array(); + + var titlesCount = doc.evaluate('count (//p/table/tbody/tr/td/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var numAndTitle= doc.evaluate('//p/table/tbody/tr/td/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//p/table/tbody/tr/td/a[img]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var multipleTest = 0; + + for (j=0; j < titlesCount.numberValue; j++) { + + next_title[j] = numAndTitle.iterateNext().textContent; + next_title[j] = next_title[j].substr(0, next_title[j].length-1); + + if (/^\d*$/.test(next_title[j])) { + multipleTest = 0; + } else if (multipleTest < 1) { + multipleTest++; + next_title1[y] = next_title[j]; + y++; + Zotero.debug(next_title1[0]); + + } else if (multipleTest > 1) { + multipleTest = 0; + } + } + + for (j = 0; j < 10; j++) { + links1[j] = links.iterateNext().href; + //Zotero.debug(links1[0]); + items[links1] = next_title1[j]; + } + + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); + +} +\ No newline at end of file diff --git a/translators/BioInfoBank.js b/translators/BioInfoBank.js @@ -0,0 +1,121 @@ +{ + "translatorID":"4c9dbe33-e64f-4536-a02f-f347fa1f187d", + "translatorType":4, + "label":"BioInfoBank", + "creator":"Michael Berkowitz", + "target":"http://lib.bioinfo.pl/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-03 19:45:00" +} + +function detectWeb(doc, url) { + return "multiple"; +} + +function doWeb(doc, url) { + var pmids = new Array(); + var items = new Object(); + var titles = doc.evaluate('//div[@class="css_pmid"]/div[@class="css_pmid_title"]/a', doc, null, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + pmids.push(i.match(/pmid:(\d+)/)[1]); + } + var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+pmids.join(","); + Zotero.Utilities.HTTP.doGet(newUri, function(text) { + // Remove xml parse instruction and doctype + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + + var xml = new XML(text); + for(var i=0; i<xml.PubmedArticle.length(); i++) { + var newItem = new Zotero.Item("journalArticle"); + + var citation = xml.PubmedArticle[i].MedlineCitation; + + var PMID = citation.PMID.text().toString(); + newItem.extra = "PMID: "+PMID; + // add attachments + if(doc) { + newItem.attachments.push({document:doc, title:"PubMed Snapshot"}); + } else { + var url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids="+PMID; + newItem.attachments.push({url:url, title:"PubMed Snapshot", + mimeType:"text/html"}); + } + + var article = citation.Article; + if(article.ArticleTitle.length()) { + var title = article.ArticleTitle.text().toString(); + if(title.substr(-1) == ".") { + title = title.substring(0, title.length-1); + } + newItem.title = title; + } + + if (article.Pagination.MedlinePgn.length()){ + newItem.pages = article.Pagination.MedlinePgn.text().toString(); + } + + if(article.Journal.length()) { + var issn = article.Journal.ISSN.text().toString(); + if(issn) { + newItem.ISSN = issn.replace(/[^0-9]/g, ""); + } + + newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString()); + if(article.Journal.Title.length()) { + newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString()); + } else if(citation.MedlineJournalInfo.MedlineTA.length()) { + newItem.publicationTitle = newItem.journalAbbreviation; + } + + if(article.Journal.JournalIssue.length()) { + newItem.volume = article.Journal.JournalIssue.Volume.text().toString(); + newItem.issue = article.Journal.JournalIssue.Issue.text().toString(); + if(article.Journal.JournalIssue.PubDate.length()) { // try to get the date + if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString(); + } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString(); + } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString(); + } + } + } + } + + if(article.AuthorList.length() && article.AuthorList.Author.length()) { + var authors = article.AuthorList.Author; + for(var j=0; j<authors.length(); j++) { + var lastName = authors[j].LastName.text().toString(); + var firstName = authors[j].FirstName.text().toString(); + if(firstName == "") { + var firstName = authors[j].ForeName.text().toString(); + } + if(firstName || lastName) { + newItem.creators.push({lastName:lastName, firstName:firstName}); + } + } + } + + + if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) { + var keywords = citation.MeshHeadingList.MeshHeading; + for (var k = 0 ; k < keywords.length() ; k++) { + newItem.tags.push(keywords[k].DescriptorName.text().toString()); + } + } + newItem.abstractNote = article.Abstract.AbstractText.toString() + + newItem.complete(); + } + + Zotero.done(); + }); +} +\ No newline at end of file diff --git a/translators/BioMed Central and More.js b/translators/BioMed Central and More.js @@ -0,0 +1,140 @@ +{ + "translatorID":"1a3e63b2-0adf-4c8e-928b-c58c2594b45d", + "translatorType":4, + "label":"BioMed Central and More", + "creator":"Ben Parr", + "target":"http://[^/]*(jcmr-online|respiratory-research|bio-diglib|nuclear-receptor|medimmunol|kinetoplastids|filariajournal|cellandchromosome|actavetscand|aidsrestherapy|almob|ann-clinmicrob|annals-general-psychiatry|asir-journal|arthritis-research|apfmj|anzhealthpolicy|behavioralandbrainfunctions|biodatamining|biology-direct|biomagres|biomedical-engineering-online|bpsmedicine|biotechnologyforbiofuels|biomedcentral|breast-cancer-research|cancerci|cbmjournal|cardiab|cardiovascularultrasound|casesjournal|lipidsignaling.cbdjournals|biosignaling|celldiv|cerebrospinalfluidresearch|journal.chemistrycentral|capmh|cmjournal|chiroandosteo|clinicalmolecularallergy|cpementalhealth|comparative-hepatology|conflictandhealth|resource-allocation|coughjournal|ccforum|cytojournal|diagnosticpathology|dynamic-med|ete-online|ehjournal|epi-perspectives|epigeneticsandchromatin|fibrogenesis|frontiersinzoology|gvt-journal|genomebiology|genomemedicine|geochemicaltransactions|globalizationandhealth|gutpathogens|harmreductionjournal|head-face-med|hqlo|health-policy-systems|human-resources-health|immunityageing|immunome-research|implementationscience|infectagentscancer|intarchmed|internationalbreastfeedingjournal|equityhealthj|ijbnpa|ij-healthgeographics|ijmhs|issoonline|jautoimdis|jbioleng|jbiol|j-biomed-discovery|jbppni|carcinogenesis|cardiothoracicsurgery|jcmr-online|jcircadianrhythms|ethnobiomed|jexpclinassistreprod|jeccr|jfootankleres|jhoonline|jibtherapies|journal-inflammation|jmedicalcasereports|jmolecularsignaling|jnanobiotechnology|jnrbm|jneuroengrehab|jneuroinflammation|occup-med|josr-online|jissn|translational-medicine|traumamanagement|lipidworld|malariajournal|microbialcellfactories|molecularbrain|molecular-cancer|molecularcytogenetics|molecularneurodegeneration|molecularpain|neuraldevelopment|nonlinearbiomedphys|nutritionandmetabolism|nutritionj|ojrd|om-pc|parasitesandvectors|particleandfibretoxicology|pathogeneticsjournal|pssjournal|ped-rheum|peh-med|plantmethods|pophealthmetrics|proteomesci|ro-journal|rbej|reproductive-health-journal|respiratory-research|retrovirology|salinesystems|the-scientist|scoliosisjournal|scfbm|substanceabusepolicy|tbiomed|thrombosisjournal|thyroidresearchjournal|tobaccoinduceddiseases|trialsjournal|urooncologyjournal|virologyj|wjes|wjso)\\.(com|org|net)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-15 19:45:00" +} + +function detectWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var xpath='//meta[@name="citation_fulltext_html_url"]'; + + //Single + if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + {return "journalArticle";} + + + //Multiple + xpath='//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'; + xpath+=' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'; + xpath+=' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'; + + var rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var row; + var link; + while(row=rows.iterateNext()) + { + link=row.href; + if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0) + {return "multiple";} + } + +} + +function parseRIS(getURL) +{ + Zotero.Utilities.HTTP.doGet(getURL, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator ("import"); + translator.setHandler("itemDone", function(obj, newItem) { + var doi = newItem.DOI; + var splitURL = newItem.url.split('/'); + + if(splitURL.length>=3 && doi){ + var doiSuffix = doi.slice(doi.indexOf('/')+1); + var pdfURL = splitURL[0] + '/' + splitURL[1] + '/' + splitURL[2]; + pdfURL += '/content/pdf/' + doiSuffix + '.pdf'; + var source = splitURL[2].replace(/^www./i,'').replace(/\.[\w]+$/i,''); + newItem.attachments = [ + //{url:newItem.url+'/abstract', title:source + " Abstract Snapshot", mimeType:"text/html"}, + {url:newItem.url, title:source + " Snapshot", mimeType:"text/html"}, + {url:pdfURL, title:source + " PDF", mimeType:"application/pdf"} + ]; + } + newItem.complete(); + }); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }, function() {}); + + Zotero.wait(); +} + +function doWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var xpath='//meta[@name="citation_fulltext_html_url"]/@content'; + var rows; + var row=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (row) + { + //Single Article + var url=row.textContent+"/citation/"; + Zotero.Utilities.HTTP.doPost(url, 'include=cit&format=refman&direct=on&submit=Download+references&action=submit', function(text) + {parseRIS(url+'?include=cit&format=refman&direct=on&submit=Download+references&action=submit');}); + + Zotero.wait(); + return true; + } + + + //Multiple + xpath='//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'; + xpath+=' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'; + xpath+=' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'; + xpath+=' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'; + + rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items=new Array(); + var link; + var t; + while(row=rows.iterateNext()) + { + link=row.href; + if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0) + { + t=link.split('/'); + if(t[t.length-1].indexOf("comments#")>-1) + {link=t.slice(0,t.length-1).join('/');} + items[link.replace("/abstract","")+"/citation"]=row.textContent; + } + } + + items = Zotero.selectItems(items); + var uris=new Array(); + if (!items) + {return true;} + + for (var i in items) + {uris.push(i);} + + Zotero.Utilities.HTTP.doPost(uris, "include=cit&format=refman&direct=on&submit=Download+references&action=submit", function(text) + { + for (var j = 0 ; j < uris.length ; j++) + {parseRIS(uris[j] + "?include=cit&format=refman&direct=on&submit=Download+references&action=submit");} + }); + + Zotero.wait(); +} diff --git a/translators/BioOne.js b/translators/BioOne.js @@ -0,0 +1,66 @@ +{ + "translatorID":"7cb0089b-9551-44b2-abca-eb03cbf586d9", + "translatorType":4, + "label":"BioOne", + "creator":"Michael Berkowitz", + "target":"http://[^/]*www.bioone.org[^/]*/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("searchtype") != -1) { + return "multiple"; + } else if (url.indexOf("get-document") != -1 || url.indexOf("get-abstract") != -1) { + return "journalArticle"; + } +} + +function createCitationURL(str) { + str = str.match(/doi=([^&]+)/)[1]; + return "http://www.bioone.org/perlserv/?request=cite-builder&doi=" + str; +} + +function doWeb(doc, url) { + var host = doc.location.host; + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var results = doc.evaluate('//div[@class="content"]/table/tbody/tr/td[3][@class="group"]', doc, null, XPathResult.ANY_TYPE, null); + var next_result; + while (next_result = results.iterateNext()) { + var title = doc.evaluate('.//span[@class="title"]', next_result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate('.//tr[4]/td/a[1]', next_result, null, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(createCitationURL(i)); + } + } else { + articles = [createCitationURL(url)]; + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var newlink = newDoc.evaluate('//a[contains(@href, "refman")]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.Utilities.HTTP.doGet(newlink, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = decodeURIComponent(item.url); + item.DOI = item.url.match(/http:\/\/dx\.doi\.org\/(.*)$/)[1]; + var pdfurl = 'http://' + host + '/perlserv/?request=get-pdf&doi=' + item.DOI; + item.attachments = [ + {url:item.url, title:item.title, mimeType:"text/html"}, + {url:pdfurl, title:"BioOne Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Blackwell Compass.js b/translators/Blackwell Compass.js @@ -0,0 +1,68 @@ +{ + "translatorID":"60d97c99-47f0-4323-98b6-5699faf827b1", + "translatorType":4, + "label":"Blackwell Compass", + "creator":"Michael Berkowitz", + "target":"http://www.blackwell-compass.com/subject/[^/]+/.+", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-09 20:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("search_results") != -1 || url.indexOf("section_home") != -1) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var URIs = new Array(); + var items = new Object(); + if (detectWeb(doc, url) == "multiple") { + + var xpath = '//div[@class="article-holder"]//h4[@class="article"]/a'; + var articles = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null); + var next_art = articles.iterateNext(); + while (next_art) { + items[next_art.href] = next_art.textContent; + next_art = articles.iterateNext(); + } + items = Zotero.selectItems(items); + + for (var i in items) { + URIs.push(i); + } + } else { + URIs.push(url); + } + + Zotero.Utilities.processDocuments(URIs, function(doc, urll) { + var doi = doc.evaluate('//div[@id="content"]/p/span[@class="guide"]/a[substring(@href, 1, 4) = "http"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/doi\/[^/]*\/([^&]*)/)[1]; + Zotero.Utilities.HTTP.doGet('http://www.blackwell-synergy.com/action/downloadCitation?doi=' + doi + '&include=cit&format=refman&direct=on&submit=Download+references', function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:item.url, title:"Blackwell Compass Snapshot", mimeType:"text/html"}, + {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"Blackwell Compass Full Text PDF", mimeType:"application/pdf"} + ]; + + item.complete(); + + }); + + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Blackwell Synergy.js b/translators/Blackwell Synergy.js @@ -0,0 +1,91 @@ +{ + "translatorID":"cb48083-4d9-4ed-ac95-2e93dceea0ec", + "translatorType":4, + "label":"Blackwell Synergy", + "creator":"Michael Berkowitz", + "target":"https?://www\\.blackwell-synergy\\.com[^/]*/(?:action/doSearch|doi/|links/doi/)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-28 17:50:00" +} + +function detectWeb(doc, url) { + if(url.indexOf("doSearch") != -1) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function titleCase(str) { + var skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", "down", "as"]; + var words = str.toLowerCase().split(/\s+/); + var newstr = ""; + for each (var word in words) { + if (skipWords.indexOf(word.replace(/[^a-zA-Z]+/, "")) != -1) { + newstr += " " + word; + } else if (word.indexOf("-") != -1) { + newword = word.split("-"); + newstr += " " + newword[0][0].toUpperCase() + newword[0].substr(1) + "-" + newword[1][0].toUpperCase() + newword[1].substr(1); + } else { + newstr += " " + word[0].toUpperCase() + word.substr(1); + } + } + return Zotero.Utilities.trimInternal(newstr); +} + +function doWeb(doc, url) { + var host = doc.location.host; + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var rows = doc.evaluate('//div[@class="toc_item"]', doc, null, XPathResult.ANY_TYPE, null); + var row; + while (row = rows.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate('.//label', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var id = doc.evaluate('.//input[@name="doi"]', row, null, XPathResult.ANY_TYPE, null).iterateNext().value; + items[id] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [decodeURIComponent(url).match(/doi\/(abs\/)?([^\?]+)(\?|$)/)[2]]; + } + + var post = ""; + for each (var doi in articles) { + post += "doi=" + encodeURIComponent(doi) + "&" + } + post += "include=abs&format=refman&submit=Download+references"; + Zotero.Utilities.HTTP.doPost('http://www.blackwell-synergy.com/action/downloadCitation', post, function(text) { + text = text.replace(/(Y1\s+\-\s+)(\d{4}\/\d{2}).*\n/, "$1$2\n"); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.DOI = Zotero.Utilities.trimInternal(item.notes[0]['note'].substr(4)); + item.notes = new Array(); + item.attachments = [ + {url:item.url, title:"Blackwell Synergy Snapshot", mimeType:"text/html"}, + {url:item.url.replace(/\/\/[^/]*/, "//" + host).replace("/doi/abs", "/doi/pdf"), title:"Blackwell Synergy Full Text PDF", mimeType:"application/pdf"} + ]; + // use fulltext if possible + var oldCreators = item.creators; + item.creators = [] + for each (var author in oldCreators) { + if (author["lastName"] != "") { + item.creators.push({firstName:titleCase(author.firstName), lastName:titleCase(author.lastName), creatorType:"author"}); + } + } + item.title = titleCase(item.title); + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); +} +\ No newline at end of file diff --git a/translators/Blogger.js b/translators/Blogger.js @@ -0,0 +1,127 @@ +{ + "translatorID":"6f9aa90d-6631-4459-81ef-a0758d2e3921", + "translatorType":4, + "label":"Blogger", + "creator":"Adam Crymble", + "target":"blogspot.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:15:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//h3[@class="post-title entry-title"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var entryCount = doc.evaluate('count (//h3[@class="post-title entry-title"]/a)', doc, null, XPathResult.ANY_TYPE, null); + } + + if (entryCount.numberValue == 1) { + return "blogPost"; + } else if (entryCount.numberValue > 1) { + return "multiple"; + } + +} + +//Blogger translator. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var tagsContent = new Array(); + + var newItem = new Zotero.Item("blogPost"); + + //title + if (doc.evaluate('//h3[@class="post-title entry-title"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + newItem.title = doc.evaluate('//h3[@class="post-title entry-title"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + newItem.title = doc.title; + } + + //author, if available + if (doc.evaluate('//span[@class="post-author vcard"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//span[@class="post-author vcard"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + var author = author.toLowerCase(); + + if (author.match(/\sby\s/)) { + var shortenAuthor = author.indexOf(" by"); + author = author.substr(shortenAuthor + 3).replace(/^\s*|\s$/g, ''); + } + var words = author.split(/\s/); + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + //date, if available + if (doc.evaluate('//h2[@class="date-header"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.date = doc.evaluate('//h2[@class="date-header"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + } + + //tags, if available + if (doc.evaluate('//span[@class="post-labels"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var tags = doc.evaluate('//span[@class="post-labels"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var tags1; + while (tags1 = tags.iterateNext()) { + tagsContent.push(tags1.textContent); + } + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } + + var blogTitle1 = doc.title.split(":"); + newItem.blogTitle = blogTitle1[0]; + + newItem.url = doc.location.href; + + newItem.complete(); +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//h3[@class="post-title entry-title"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titles1 = doc.evaluate('//li[@class="archivedate expanded"]/ul[@class="posts"]/li/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + + while (next_title = titles1.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Bracero History Archive.js b/translators/Bracero History Archive.js @@ -0,0 +1,171 @@ +{ + "translatorID":"f9373e49-e6ac-46f7-aafe-bb24a2fbc3f0", + "translatorType":4, + "label":"Bracero History Archive", + "creator":"Adam Crymble", + "target":"http://braceroarchive.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("Item")) { + return "book"; + } else if (doc.evaluate('//div[@class="item-meta"]/h2/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +//Bracero History Archive translator; Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var contents1; + + var headers = doc.evaluate('//h3', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//div[@class="field"]/div', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@class="field"]/div)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue -1; i++) { + + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + contents1 = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + + if (contents1.match("Empty")) { + contents1 = ''; + } + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents1); + } + + //media type? + if (dataTags["TypeName"]) { + if (dataTags["TypeName"].match("Oral History")) { + Zotero.debug(doc.title); + var newItem = new Zotero.Item("audioRecording"); + } else { + var newItem = new Zotero.Item("book"); + } + } else { + var newItem = new Zotero.Item("book"); + } + + //creators + if (dataTags["Interviewee"] && dataTags["Interviewee"] != '') { + if (dataTags["Interviewee"].match(", ")) { + var authors = dataTags["Interviewee"].split(", "); + authors = authors[1] + ' ' + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "interviewee")); + } else { + newItem.creators.push({lastName: dataTags["Interviewee"], creatorType: "interviewee"}); + } + } + + if (dataTags["Interviewer"] && dataTags["Interviewer"] != '') { + if (dataTags["Interviewer"].match(", ")) { + var authors = dataTags["Interviewer"].split(", "); + authors = authors[1] + ' ' + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "interviewer")); + } else { + newItem.creators.push({lastName: dataTags["Interviewee"], creatorType: "interviewer"}); + } + } + + if (dataTags["Creator"] && dataTags["Creator"] != '') { + if (dataTags["Creator"].match(", ")) { + var authors = dataTags["Creator"].split(", "); + authors = authors[1] + ' ' + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "creator")); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Creator"], "creator")); + } + } + + if (dataTags["AdditionalCreator"] && dataTags["AdditionalCreator"] != '') { + if (dataTags["AdditionalCreator"].match(", ")) { + var authors = dataTags["AdditionalCreator"].split(", "); + authors = authors[1] + ' ' + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "creator")); + } else { + newItem.creators.push({lastName: dataTags["AdditionalCreator"], creatorType: "creator"}); + } + } + + //associate + associateData (newItem, dataTags, "Description", "abstractNote"); + associateData (newItem, dataTags, "Date", "date"); + associateData (newItem, dataTags, "Publisher", "publisher"); + associateData (newItem, dataTags, "Source", "place"); + associateData (newItem, dataTags, "Location", "place"); + associateData (newItem, dataTags, "RightsHolder", "rights"); + associateData (newItem, dataTags, "Language", "lang"); + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "FileNameIdentifier", "callNumber"); + + //tags + var tags1; + var tagsContent = new Array(); + + if (doc.evaluate('//li[@class="tag"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathTags = doc.evaluate('//li[@class="tag"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (tags1 = xPathTags.iterateNext()) { + tagsContent.push(tags1.textContent); + } + } + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + + //title + newItem.title = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + var fullRecord = "view=full"; + var extraChar = "?"; + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//div[@class="item-meta"]/h2/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href + extraChar + fullRecord] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Bryn Mawr Classical Review.js b/translators/Bryn Mawr Classical Review.js @@ -0,0 +1,85 @@ +{ + "translatorID":"635c1246-e0c8-40a0-8799-a73a0b013ad8", + "translatorType":4, + "label":"Bryn Mawr Classical Review", + "creator":"Michael Berkowitz", + "target":"http://ccat.sas.upenn.edu/bmcr/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-09 23:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/by_reviewer/) || url.match(/by_author/) || url.match(/recent.html/) || url.match(/\/\d{4}\/$/)) { + return "multiple"; + } else if (url.match(/[\d\-]+\.html$/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var ns = doc.documentElement.namespaceURI; + var nsResolver = ns ? function(prefix) { + if (prefix == 'x') return ns; else return null; + } : null; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//table/tbody/tr/td/ul/li/i', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var boxes = doc.evaluate('//table/tbody/tr/td/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var box; + while (box = boxes.iterateNext()) { + var link = doc.evaluate('./a', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var title = doc.evaluate('./i', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + items[link] = title; + } + } else if (doc.evaluate('//table/tbody/tr/td/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var title = doc.evaluate('//table/tbody/tr/td/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next; + while (next = title.iterateNext()) { + items[next.href] = Zotero.Utilities.trimInternal(next.textContent); + } + } else if (url.match(/google\.com/)) { + var titles = doc.evaluate('//h2[@class="r"]/a[@class="l"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + var title = doc.evaluate('//h3/i', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.title = "Review of: " + Zotero.Utilities.trimInternal(title); + var data = doc.evaluate('//h3[i]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var title = title.replace("(", "\\(").replace(")", "\\)"); + var author = doc.evaluate('//b[contains(text(), "Reviewed")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Reviewed by\s+([^,]+),/)[1]; + item.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + var splitRe = new RegExp(title); + var authors = data.split(splitRe)[0].replace(/\([^)]+\)/, "").split(/(,|and)\s+/); + Zotero.debug(authors); + Zotero.debug(authors); + for each (var aut in authors) { + if (aut.match(/\w/) && (aut != "and")) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "reviewedAuthor")); + } + } + item.url = doc.location.href; + item.attachments = [{url:item.url, title:item.title, mimeType:"text/html"}]; + if (doc.evaluate('/html/body/center/table/tbody/tr/td/center/table/tbody/tr/td/center/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + item.date = Zotero.Utilities.trimInternal(doc.evaluate('/html/body/center/table/tbody/tr/td/center/table/tbody/tr/td/center/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Bryn Mawr Classical Review ", "").replace(/\./g, "/")); + } else { + item.date = Zotero.Utilities.trimInternal(doc.evaluate('/html/body/h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Bryn Mawr Classical Review ", "").replace(/\./g, "/")) + } + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Business Standard.js b/translators/Business Standard.js @@ -0,0 +1,67 @@ +{ + "translatorID":"e8d40f4b-c4c9-41ca-a59f-cf4deb3d3dc5", + "translatorType":4, + "label":"Business Standard", + "creator":"Prashant Iyengar and Michael Berkowitz", + "target":"http://www.business-standard.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + if (url.match(/googlesearch/)) { + return "multiple"; + } else if (url.match(/common/)) { + return "newspaperArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var links = doc.evaluate('//a[@class="NewsHead"]', doc, null, XPathResult.ANY_TYPE, null); + var link; + var items = new Object(); + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.cleanTags(link.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The Business Standard"; + newItem.url = doc.location.href; + newItem.websiteTitle="The Business Standard"; + newItem.edition="Online"; + newItem.title = Zotero.Utilities.cleanTags(doc.title); + + + if (doc.evaluate('//td[@class="author"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var bits = doc.evaluate('//td[@class="author"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\s+\/\s+/); + newItem.creators.push(Zotero.Utilities.cleanAuthor(bits[0], "author")); + extras = Zotero.Utilities.trimInternal(bits[1]).match(/^(.*)(\s\w+\s+\d+,\s*\d+)$/); + newItem.place = extras[1]; + newItem.date = Zotero.Utilities.trimInternal(extras[2]); + newItem.complete(); + } else if (doc.evaluate('//td[@class="NewsSummary"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = Zotero.Utilities.trimInternal(doc.evaluate('//td[@class="NewsSummary"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + var printurl = 'http://www.business-standard.com/general/printpage.php?autono=' + newItem.url.match(/autono=(\d+)/)[1]; + Zotero.debug(printurl); + Zotero.Utilities.HTTP.doGet(printurl, function(text) { + var date = text.match(/<td class=author>([^<]+)</)[1]; + newItem.date = Zotero.Utilities.trimInternal(date.split("&nbsp;")[1]); + newItem.complete(); + }); + } + }, function() {Zotero.done;}); + Zotero.wait(); +} diff --git a/translators/BusinessWeek.js b/translators/BusinessWeek.js @@ -0,0 +1,58 @@ +{ + "translatorID":"fb342bae-7727-483b-a871-c64c663c2fae", + "translatorType":4, + "label":"BusinessWeek", + "creator":"Michael Berkowitz", + "target":"http://(www\\.)?businessweek.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-11 08:30:00" +} + +function detectWeb(doc, url) { + if (doc.title == "BusinessWeek Search Results") { + return "multiple"; + } else if (doc.evaluate('//meta[@name="headline"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "magazineArticle"; + } +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var results = doc.evaluate('//div[@class="result"]/h3[@class="story"]/a', doc, null, XPathResult.ANY_TYPE, null); + var result; + var items = new Object(); + while (result = results.iterateNext()) { + items[result.href] = Zotero.Utilities.trimInternal(result.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.debug(articles); + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var metaTags = new Object(); + var metas = newDoc.evaluate('//meta', newDoc, null, XPathResult.ANY_TYPE, null); + var meta; + while (meta = metas.iterateNext()) { + metaTags[meta.name] = meta.content; + } + Zotero.debug(metaTags); + var item = new Zotero.Item("magazineArticle"); + item.title = metaTags['headline']; + item.abstractNote = metaTags['abstract']; + item.tags = metaTags['keywords'].split(/\s*,\s*/); + item.creators.push(Zotero.Utilities.cleanAuthor(metaTags['author'], "author")); + item.publicationTitle = "BusinessWeek: " + metaTags['channel']; + item.url = newDoc.location.href; + item.date = metaTags['pub_date'].replace(/(\d{4})(\d{2})(\d{2})/, "$2/$3/$1"); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CABI - CAB Abstracts.js b/translators/CABI - CAB Abstracts.js @@ -0,0 +1,132 @@ +{ + "translatorID":"a29d22b3-c2e4-4cc0-ace4-6c2326144332", + "translatorType":4, + "label":"CABI - CAB Abstracts", + "creator":"Adam Crymble", + "target":"http://www.cabi.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-29 21:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div/table/tbody/tr[1]/td/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//span[@class="PageSubTitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +//CAB Abstracts translator. Code by Adam Crymble +//only designed for "book" entries. People, projects, sites, etc are ignored by Zotero. + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + +//authors + if (doc.evaluate('//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathAuthors = doc.evaluate('//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPath1Count = doc.evaluate('count (//td[@class="smallwebtext"]/table/tbody/tr/td[1]/span[@class="MenuBar"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + var nameTest = 0; + + for (var j = 0; j < xPath1Count.numberValue; j++) { + authors = xPathAuthors.iterateNext().textContent + if (authors.match("by ")) { + var shortenAuthor = authors.indexOf("by ")+3; + + authors = authors.substr(shortenAuthor).split("; "); + + for (var i = 0; i < authors.length; i++) { + + shortenAuthor = authors[i].indexOf(","); + authors[i] = (authors[i].substr(0, shortenAuthor)); + var givenName = (authors[i].split(/\s/)); + authors[i] = ''; + + for (var k = 0; k < givenName.length; k++) { + if (givenName[k].length == 1) { + authors[i] = (authors[i] + givenName[k] + "."); + } else { + + authors[i] = (authors[i] + " " + givenName[k]); + } + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + } + } + } + +//imprint info + var info = new Array(); + if (doc.evaluate('//td[3]/table/tbody/tr/td[@class="MenuBar"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathImprint = doc.evaluate('//td[3]/table/tbody/tr/td[@class="MenuBar"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var imprint = xPathImprint.iterateNext().textContent.split(/\n/); + + + for (var i = 0; i < imprint.length; i++) { + imprint[i] = imprint[i].replace(/^\s*|\s*$/g, ''); + if (imprint[i].match(/\w/)) { + info.push(imprint[i]); + } + } + + for (var i = 0; i < info.length; i++) { + if (info[i].match("pages")) { + var cutPages = info[i].indexOf("pages"); + newItem.pages = info[i].substr(0, cutPages); + } else if (info[i].match("Date:")) { + newItem.date = info[i].substr(10); + } else if (info[i].match("ISBN: ")) { + newItem.ISBN = info[i].substr(6); + } + } + } + + newItem.title = doc.title; + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//tr[1]/td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var mediaType = doc.evaluate('//strong', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var dump = mediaType.iterateNext(); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = mediaType.iterateNext().textContent; + if (items[next_title.href].match("Book")) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CARLABRC OAI Harvester.js b/translators/CARLABRC OAI Harvester.js @@ -0,0 +1,121 @@ +{ + "translatorID":"31649d9d-8f7e-4b87-8678-b3e68ee98f39", + "translatorType":4, + "label":"CARL/ABRC OAI Harvester", + "creator":"Adam Crymble", + "target":"http://carl-abrc-oai", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("Search")) { + return "multiple"; + } else if (doc.title.match("Browse")) { + return "multiple"; + } else if (doc.title.match("Record")) { + return "book"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var allAuthors = new Array(); + + var newItem = new Zotero.Item("book"); + + var metaTagHTML = doc.getElementsByTagName("meta"); + + for (var i = 0 ; i < metaTagHTML.length ; i++) { + dataTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + if (metaTagHTML[i].getAttribute("name") == "DC.Creator") { + allAuthors.push(dataTags["DC.Creator"]); + } + + } + Zotero.debug(allAuthors); + + for (var i = 0; i < allAuthors.length; i++) { + + + if (allAuthors[i].match(",")) { + var authorName = allAuthors[i].split(","); + allAuthors[i] = (authorName[1] + (" ") + authorName[0]); + + if (allAuthors[i].match("; ; ")) { + + allAuthors[i] = allAuthors[i].replace("; ;", ''); + } + + + newItem.creators.push(Zotero.Utilities.cleanAuthor(allAuthors[i], "author")); + } else { + if (allAuthors[i].match("; ; ")) { + + allAuthors[i] = allAuthors[i].replace("; ;", ''); + } + + newItem.creators.push({lastName: allAuthors[i], creatorType: "creator"}); + } + + + } + + + associateData (newItem, dataTags, "DC.Title", "title"); + associateData (newItem, dataTags, "DC.Description", "abstractNote"); + associateData (newItem, dataTags, "DC.Publisher", "publisher"); + associateData (newItem, dataTags, "DC.Contributor", "extra"); + associateData (newItem, dataTags, "DC.Date", "date"); + associateData (newItem, dataTags, "DC.Language", "language"); + + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//span[@class="title"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//div[@class="main"]/div/div/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[links.iterateNext().href] = next_title.textContent; + links.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/COinS.js b/translators/COinS.js @@ -0,0 +1,189 @@ +{ + "translatorID":"05d07af9-105a-4572-99f6-a8e231c0daef", + "translatorType":4, + "label":"COinS", + "creator":"Simon Kornblith", + "target":null, + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":300, + "inRepository":true, + "lastUpdated":"2007-09-15 20:08:46" +} + +function detectWeb(doc, url) { + var spanTags = doc.getElementsByTagName("span"); + + var encounteredType = false; + + for(var i=0; i<spanTags.length; i++) { + var spanClass = spanTags[i].getAttribute("class"); + if(spanClass) { + var spanClasses = spanClass.split(" "); + if(Zotero.Utilities.inArray("Z3988", spanClasses)) { + var spanTitle = spanTags[i].getAttribute("title"); + + // determine if it's a valid type + var item = new Zotero.Item; + var success = Zotero.Utilities.parseContextObject(spanTitle, item); + + if(item.itemType) { + if(encounteredType) { + return "multiple"; + } else { + encounteredType = item.itemType; + } + } + } + } + } + + return encounteredType; +} + +// used to retrieve next COinS object when asynchronously parsing COinS objects +// on a page +function retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc) { + if(needFullItems.length) { + var item = needFullItems.shift(); + + Zotero.debug("looking up contextObject"); + var search = Zotero.loadTranslator("search"); + search.setHandler("itemDone", function(obj, item) { + newItems.push(item); + }); + search.setHandler("done", function() { + retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc); + }); + search.setSearch(item); + + // look for translators + var translators = search.getTranslators(); + if(translators.length) { + search.setTranslator(translators); + search.translate(); + } else { + retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc); + } + } else { + completeCOinS(newItems, couldUseFullItems, doc); + Zotero.done(); + } +} + +// saves all COinS objects +function completeCOinS(newItems, couldUseFullItems, doc) { + if(newItems.length > 1) { + var selectArray = new Array(); + + for(var i in newItems) { + selectArray[i] = newItems[i].title; + } + selectArray = Zotero.selectItems(selectArray); + + var useIndices = new Array(); + for(var i in selectArray) { + useIndices.push(i); + } + completeItems(newItems, useIndices, couldUseFullItems); + } else if(newItems.length) { + completeItems(newItems, [0], couldUseFullItems); + } +} + +function completeItems(newItems, useIndices, couldUseFullItems, doc) { + if(!useIndices.length) { + return; + } + var i = useIndices.shift(); + + // grab full item if the COinS was missing an author + if(couldUseFullItems[i]) { + Zotero.debug("looking up contextObject"); + var search = Zotero.loadTranslator("search"); + + var firstItem = false; + search.setHandler("itemDone", function(obj, newItem) { + if(!firstItem) { + // add doc as attachment + newItem.attachments.push({document:doc}); + newItem.complete(); + firstItem = true; + } + }); + search.setHandler("done", function(obj) { + // if we didn't find anything, use what we had before (even if it + // lacks the creator) + if(!firstItem) { + newItems[i].complete(); + } + // call next + completeItems(newItems, useIndices, couldUseFullItems); + }); + + search.setSearch(newItems[i]); + var translators = search.getTranslators(); + if(translators.length) { + search.setTranslator(translators); + search.translate(); + } else { + // add doc as attachment + newItems[i].attachments.push({document:doc}); + newItems[i].complete(); + // call next + completeItems(newItems, useIndices, couldUseFullItems); + } + } else { + // add doc as attachment + newItems[i].attachments.push({document:doc}); + newItems[i].complete(); + // call next + completeItems(newItems, useIndices, couldUseFullItems); + } +} + +function doWeb(doc, url) { + var newItems = new Array(); + var needFullItems = new Array(); + var couldUseFullItems = new Array(); + + var spanTags = doc.getElementsByTagName("span"); + + for(var i=0; i<spanTags.length; i++) { + var spanClass = spanTags[i].getAttribute("class"); + if(spanClass) { + var spanClasses = spanClass.split(" "); + if(Zotero.Utilities.inArray("Z3988", spanClasses)) { + var spanTitle = spanTags[i].getAttribute("title"); + var newItem = new Zotero.Item(); + newItem.repository = false; // do not save repository + if(Zotero.Utilities.parseContextObject(spanTitle, newItem)) { + if(newItem.title) { + if(!newItem.creators.length) { + // if we have a title but little other identifying + // information, say we'll get full item later + newItem.contextObject = spanTitle; + couldUseFullItems[newItems.length] = true; + } + + // title and creators are minimum data to avoid looking up + newItems.push(newItem); + } else { + // retrieve full item + newItem.contextObject = spanTitle; + needFullItems.push(newItem); + } + } + } + } + } + + Zotero.debug(needFullItems); + if(needFullItems.length) { + // retrieve full items asynchronously + Zotero.wait(); + retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc); + } else { + completeCOinS(newItems, couldUseFullItems, doc); + } +} +\ No newline at end of file diff --git a/translators/CSIRO Publishing.js b/translators/CSIRO Publishing.js @@ -0,0 +1,71 @@ +{ + "translatorID":"303c2744-ea37-4806-853d-e1ca67be6818", + "translatorType":4, + "label":"CSIRO Publishing", + "creator":"Michael Berkowitz", + "target":"http://(www.)?publish.csiro.au/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-23 09:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//a[@class="searchBoldBlue"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//a[@class="linkjournal"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("/view/journals/") != -1 || url.indexOf("paper") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var links = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//a[@class="searchBoldBlue"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var arts = doc.evaluate('//a[@class="searchBoldBlue"]', doc, null, XPathResult.ANY_TYPE, null); + var art = arts.iterateNext(); + while (art) { + items[art.href] = art.textContent; + art = arts.iterateNext(); + } + } else if (doc.evaluate('//a[@class="linkjournal"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var arts = doc.evaluate('//a[@class="linkjournal"]', doc, null, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//td[3]//td[1]/table/tbody/tr/td/b', doc, null, XPathResult.ANY_TYPE, null); + var art; + var title; + while ((art = arts.iterateNext()) && (title = titles.iterateNext())) { + items[art.href] = title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + links.push(i.match(/([^/=.htm]*)(.htm)?$/)[1]); + } + } else { + links.push(url.match(/([^/=.htm]*)(.htm)?$/)[1]); + } + for (var i in links) { + var newURL = 'http://www.publish.csiro.au/view/journals/dsp_journal_retrieve_citation.cfm?ct=' + links[i] + '.ris'; + var pdfURL = 'http://www.publish.csiro.au/?act=view_file&file_id=' + links[i] + '.pdf'; + Zotero.Utilities.HTTP.doGet(newURL, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.itemType = "journalArticle"; + if (item.notes[0]) { + item.abstractNote = item.notes[0].note; + } + item.attachments = [ + {url:pdfURL, title:"CSIRO Publishing PDF", mimeType:"application/pdf"}, + {url:newURL, title:"CSIRO Publishing Snaphost", mimeType:"text/html"} + ]; + item.complete(); + }); + translator.translate(); + }); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Cambridge Journals Online.js b/translators/Cambridge Journals Online.js @@ -0,0 +1,90 @@ +{ + "translatorID":"850f4c5f-71fb-4669-b7da-7fb7a95500ef", + "translatorType":4, + "label":"Cambridge Journals Online", + "creator":"Sean Takats and Michael Berkowitz", + "target":"https?://[^/]*journals.cambridge.org[^/]*//?action/(quickSearch|search|displayAbstract|displayFulltext|displayIssue)", + "minVersion":"1.0.0b3r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-08 15:35:00" +} + +function detectWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var xpath = '//tr[td/input[@type="checkbox"][@name="toView"]]'; + if ((url.indexOf("/action/displayAbstract") != -1) || (url.indexOf("action/displayFulltext") != -1)){ + return "journalArticle"; + } else if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } +} + +function doWeb(doc, url){ + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var host = doc.location.host; + var urlstring="http://" + host + "/action/exportCitation"; + var datastring="format=RIS&emailId=&Download=Download&componentIds="; + var links = new Array(); + if(detectWeb(doc, url) == "multiple"){ + var xpath = '//tr[td/input[@type="checkbox"][@name="toView"]]'; + var tableRows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + var items=new Array(); + while (tableRow = tableRows.iterateNext()){ + var id = doc.evaluate('./td/input[@type="checkbox"][@name="toView"]/@value', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var title = doc.evaluate('./td/h3', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + items['http://' + host + '/action/displayAbstract?aid=' + id.nodeValue] = Zotero.Utilities.capitalizeTitle(title.textContent); + } + items=Zotero.selectItems(items); + for (var i in items) { + links.push(i); + } + } else { + links = [url]; + } + Zotero.Utilities.processDocuments(links, function(doc) { + if (doc.evaluate('//p[@class="AbsType"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var abs = doc.evaluate('//p[@class="AbsType"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + if (doc.evaluate('//p[@class="KeyWords"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var kws = doc.evaluate('//p[@class="KeyWords"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(11).split('; '); + } + var pdfpath='//div/ul/li/a[contains(text(), "PDF")]'; + if (doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var pdflink =doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + } + idRe = /aid=([0-9]+)/ + var m = idRe.exec(doc.location.href); + var id = m[1]; + Zotero.Utilities.HTTP.doGet(urlstring + "?" + datastring+id, function(text) { + text = text.replace(/(^|\n)?([A-Z\d]{2})\s+\-\s+(\n)?/g, "\n$2 - $3"); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [{url:url, title:"Cambridge Journals Snapshot", mimeType:"text/html"}] + if (pdflink) item.attachments.push({url:pdflink, title:"Cambridge Journals PDF", mimeType:"application/pdf"}); + item.url = url; + item.title = Zotero.Utilities.capitalizeTitle(item.title); + var authors = item.creators; + item.creators = new Array(); + for each (var aut in authors) { + item.creators.push({firstName:aut.firstName, lastName:aut.lastName, creatorType:"author"}); + } + if (kws) item.tags = kws; + if (abs) item.abstractNote = Zotero.Utilities.trimInternal(abs); + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Cambridge Scientific Abstracts.js b/translators/Cambridge Scientific Abstracts.js @@ -0,0 +1,187 @@ +{ + "translatorID":"82174f4f-8c13-403b-99b2-affc7bc7769b", + "translatorType":4, + "label":"Cambridge Scientific Abstracts", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://[^/]+/ids70/(?:results.php|view_record.php)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-28 18:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(url.indexOf("/results.php") != -1) { + var type = doc.evaluate('//td[@class="rt_tab_on"]', doc, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().textContent; + + if(type.substr(0, 15) == "Published Works") { + return "multiple"; + } + } else { + // default to journal + var itemType = "journalArticle"; + + var type = doc.evaluate('//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(type) { + type = Zotero.Utilities.cleanString(type.textContent); + if(type == "Book Chapter") { + return "bookSection"; + } else if(type.substr(0, 4) == "Book") { + return "book"; + } else if(type.substr(0, 12) == "Dissertation") { + return "thesis"; + } else if(type == "Catalog") { + return "magazineArticle"; + } + } + return "journalArticle"; + } + + return false; +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var itemType = "journalArticle"; + + var type = doc.evaluate('//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(type) { + type = Zotero.Utilities.trimInternal(type.textContent); + if(type == "Book Chapter") { + itemType = "bookSection"; + } else if(type.substr(0, 4) == "Book") { + itemType = "book"; + } else if(type.substr(0, 12) == "Dissertation") { + itemType = "thesis"; + } else if(type == "Catalog") { + itemType = "magazineArticle"; + } + } + + var newItem = new Zotero.Item(itemType); + + newItem.attachments = [{document:doc, title:"Cambridge Scientific Abstracts Snapshot"}]; + newItem.title = Zotero.Utilities.trimInternal(doc.evaluate('//tr/td[3][@class="data_emphasis"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().textContent); + + var dataRows = doc.evaluate('//tr[td[3][@class="data_content"]]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var dataRow; + while(dataRow = dataRows.iterateNext()) { + var tds = dataRow.getElementsByTagName("td"); + var heading = Zotero.Utilities.trimInternal(tds[0].textContent).toLowerCase(); + var content = Zotero.Utilities.trimInternal(tds[2].textContent); + if(heading == "database") { + newItem.repository = "Cambridge Scientific Abstracts ("+content+")"; + } else if(heading == "author") { + var authors = content.split("; "); + for each(var author in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author.replace(/\d+/g, ""), "author", true)); + } + } else if(heading == "source") { + if(itemType == "journalArticle") { + var parts = content.split(/(,|;)/); + newItem.publicationTitle = parts.shift(); + for each (var i in parts) { + if (i.match(/\d+/)) { + if (i.match(/v(ol)?/)) { + newItem.volume = i.match(/\d+/)[0]; + } else if (i.match(/pp/)) { + newItem.pages = i.match(/[\d\-]+/)[0]; + } else if (i.match(/no?/)) { + newItem.issue = i.match(/\d+/)[0]; + } else if (i.match(/\d{4}/)) { + newItem.date = Zotero.Utilities.trimInternal(i); + } + } + } + } else if(itemType == "book") { + var m = content.match(/^([^:]+): ([^,0-9]+)/); + if(m) { + newItem.place = m[1]; + newItem.publisher = m[2]; + } + } else if(itemType == "bookSection") { + if(content.length > newItem.publicationTitle.length + && content.substr(0, newItem.publicationTitle.length) == newItem.publicationTitle) { + var m = content.match(/\)\. ([^:]+): ([^,0-9]+)/); + if(m) { + newItem.place = m[1]; + newItem.publisher = m[2]; + } + var m = content.match(/\(pp. ([\-0-9]+)\)/); + if(m) newItem.pages = m[1]; + } + } + } else if(heading == "monograph title") { + newItem.publicationTitle = content; + } else if(heading == "series title") { + newItem.series = content; + } else if(heading == "issn") { + newItem.ISSN = content; + } else if(heading == "isbn") { + newItem.ISBN = content; + } else if(heading == "abstract") { + newItem.abstractNote = content; + } else if(heading == "notes") { + newItem.extra = content; + } else if(heading == "publication year") { + if(!newItem.date) newItem.date = content; + } else if(heading == "information provider") { + if(content.substr(0, 19) == "http://dx.doi.org/") { + newItem.DOI = content.substr(19); + } + } else if(heading == "journal volume") { + newItem.volume = content; + } else if(heading == "journal pages") { + newItem.pages = content; + } else if(heading == "journal issue") { + newItem.issue = content; + } else if(heading == "affiliation") { + if(newItem.itemType == "thesis") { + newItem.publisher = content; + } + } + } + + var terms = doc.evaluate('//input[substring(@name, 1, 4) = "term"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var term; + while(term = terms.iterateNext()) { + newItem.tags.push(term.value.replace(/ [0-9]{3,}$/, "")); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + if(url.indexOf("/results.php") != -1) { + var items = Zotero.Utilities.getItemArray(doc, doc, '/view_record\.php\?', '^(?:View Record|More\.{3})$'); + + items = Zotero.selectItems(items); + if(!items) return true; + + var urls = new Array(); + for(var url in items) { + urls.push(url); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done() }) + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/CanLII.js b/translators/CanLII.js @@ -0,0 +1,112 @@ +{ + "translatorID":"84799379-7bc5-4e55-9817-baf297d129fe", + "translatorType":4, + "label":"CanLII", + "creator":"Bill McKinney", + "target":"http:\\/\\/www\\.canlii\\.org\\/en\\/[^\\/]+\\/[^\\/]+\\/doc\\/.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-18 18:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var canLiiRegexp = /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/ + if(canLiiRegexp .test(url)) { + return "book"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + + +function associateMeta(newItem, metaTags, field, zoteroField) { + var field = metaTags.namedItem(field); + if(field) { + newItem[zoteroField] = field.getAttribute("content"); + } +} + +function scrape(doc) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("case"); + + var metaTags = doc.getElementsByTagName("meta"); + associateMeta(newItem, metaTags, "DC.Title", "title"); + associateMeta(newItem, metaTags, "DC.Date", "dateDecided"); + associateMeta(newItem, metaTags, "DC.Language", "language"); + newItem.url = doc.location.href; + + var field = metaTags.namedItem("DC.Title"); + var tmpText = ""; + if(field) { + tmpText = field.getAttribute("content"); + var capRe = /^(.+),\s+(\d{4})\s+(\w+)\s+(\d+)\s+\(([^\)]+)\)/; + var m = capRe.exec(tmpText); + if(m) { + + newItem.caseName = m[1]+", "+m[2]+" "+m[3]+" "+m[4]; + if (m[3] == 'CanLII') { + newItem.court = m[5]; + } else { + newItem.court = m[3]; + } + + } else { + newItem.caseName = tmpText; + newItem.court = "not found"; + } + } + + + + // attach link to pdf version + // NOTE: not working - don't know why + var pdfRe = /^(.+)\.html$/; + var pdfMatch = pdfRe.exec(doc.location.href); + if (pdfMatch) { + var pdfUrl = pdfMatch[1]+".pdf"; + newItem.attachments = [{url:pdfUrl, title:"PDF version", mimeType:"application/pdf"}]; + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var canLiiRegexp= /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/ + if(canLiiRegexp.test(url)) { + scrape(doc); + } else { + + var items = Zotero.Utilities.getItemArray(doc, doc, canLiiRegexp); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/Canada.com.js b/translators/Canada.com.js @@ -0,0 +1,153 @@ +{ + "translatorID":"4da40f07-904b-4472-93b6-9bea1fe7d4df", + "translatorType":4, + "label":"Canada.com", + "creator":"Adam Crymble", + "target":"http://www.canada.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:30:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("story")) { + return "newspaperArticle"; + } else if (doc.location.href.match("search")) { + return "multiple"; + } +} + + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("newspaperArticle"); + + newItem.title = doc.title; + + if (doc.evaluate('//div[@class="storyheader"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@class="storyheader"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else if (doc.evaluate('//div[@class="storyheader"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstracteNote = doc.evaluate('//div[@class="storyheader"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (doc.evaluate('//div[@class="feed_details"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//div[@class="feed_details"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if (author.match(/\n/)) { + author1 = author.split(/\n/); + if (author1[0].match(/ and /)) { + author2 = author1[0].split(/ and /); + for (var i in author2) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[i], "author")); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[0], "author")); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + if (doc.evaluate('//div[@class="feed_details"]/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var date1 = doc.evaluate('//div[@class="feed_details"]/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + if (date1.match("Published:")) { + date1 = date1.substr(11); + newItem.date = date1; + } + } + + if (doc.evaluate('//ul[@class="home"]/li/a/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var pubTitle = doc.evaluate('//ul[@class="home"]/li/a/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (pubTitle.match("Home")) { + newItem.publicationTitle = pubTitle.substr(0, pubTitle.length-5); + } else { + newItem.publicationTitle = pubTitle; + } + } else { + newItem.publicationTitle = "Canada.com"; + } + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var next_title; + + if (doc.evaluate('//div[@class="even"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("AAAAAA"); + var titles0 = doc.evaluate('//div[@class="even"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (next_title = titles0.iterateNext()) { + if (next_title.href.match("story") && next_title.href.match("canada.com")) { + items[next_title.href] = next_title.textContent; + } + } + } + + if (doc.evaluate('//div[@class="odd"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("BBBBB"); + var titles1 = doc.evaluate('//div[@class="odd"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (next_title = titles1.iterateNext()) { + if (next_title.href.match("story") && next_title.href.match("canada.com")) { + items[next_title.href] = next_title.textContent; + } + } + } + + if (doc.evaluate('//p/b/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("CCCCC"); + var titles2 = doc.evaluate('//p/b/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (next_title = titles2.iterateNext()) { + if (next_title.href.match("story") && next_title.href.match("canada.com")) { + items[next_title.href] = next_title.textContent; + } + } + } + + if (doc.evaluate('//div[@class="name"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + Zotero.debug("DDDD"); + var titles3 = doc.evaluate('//div[@class="name"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (next_title = titles3.iterateNext()) { + if (next_title.href.match("story") && next_title.href.match("canada.com")) { + items[next_title.href] = next_title.textContent; + } + } + } + + + + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Canadian Letters and Images.js b/translators/Canadian Letters and Images.js @@ -0,0 +1,124 @@ +{ + "translatorID":"a7c8b759-6f8a-4875-9d6e-cc0a99fe8f43", + "translatorType":4, + "label":"Canadian Letters and Images", + "creator":"Adam Crymble", + "target":"http://(www.)?canadianletters.ca/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("results")) { + return "multiple"; + } else if (doc.location.href.match("letters.php")) { + return "document"; + } else if (doc.location.href.match("template")) { + return "artwork"; + } + +} + +//Translator for Canadian Letters and Images. Code by Adam Crymble + + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + + var mediaType = (detectWeb(doc, url)); + if (mediaType == "document") { + var newItem = new Zotero.Item("letter"); + var title2; + + //title + if (doc.evaluate('//h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + newItem.title = doc.title; + } + + //letter, diary, memoir, personal item + if (doc.evaluate('//div[@id="collectionCategory_letters"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var xPathType = doc.evaluate('//div[@id="collectionCategory_letters"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.type = xPathType; + } + + //gets date, to and from + if (doc.evaluate('//div[@class="letterInfo_label"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathHeaders = doc.evaluate('//div[@class="letterInfo_label"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContent = doc.evaluate('//div[@class="letterInfo_title"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@class="letterInfo_label"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + fieldTitle=xPathHeaders.iterateNext().textContent.replace(/\s+/g, ''); + dataTags[fieldTitle] = xPathContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + + if (fieldTitle == "To:") { + + newItem.abstractNote = ("To: " + dataTags[fieldTitle]); + + } else if (fieldTitle == "From:") { + + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags[fieldTitle], "author")); + + } else if (fieldTitle == "Date:") { + + newItem.date = dataTags[fieldTitle]; + } + } + } + } else if (mediaType == "artwork") { + + newItem = new Zotero.Item("artwork"); + + if (doc.evaluate('//div[@class="pictureDisplay"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//div[@class="pictureDisplay"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + newItem.title = doc.title; + } + } + + + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//div[@class="searchResultsDisplay"]/div/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Canadiana.org.js b/translators/Canadiana.org.js @@ -0,0 +1,180 @@ +{ + "translatorID":"2d174277-7651-458f-86dd-20e168d2f1f3", + "translatorType":4, + "label":"Canadiana.org", + "creator":"Adam Crymble", + "target":"http://(www.)?canadiana.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + + //checks the title of the webpage. If it matches, then the little blue book symbol appears in the address bar. + //works for English and French versions of the page. + + if(doc.title == "Early Canadiana Online - Item Record"|doc.title == "Notre mémoire en ligne - Notice") { + return "book"; + } else if (doc.evaluate('//div[@id="Content"]/div[@class="NormalRecord"]/h3/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + + + +//Canadiana Translator Coding by Adam Crymble +//because the site uses so many random formats for the "Imprint" field, it's not always perfect. But it works for MOST entries + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + //declaring variables to be used later. + var newItem = new Zotero.Item("book"); + newItem.url = doc.location.href; + + var dataTags = new Object(); + var fieldTitle; + var tagsContent= new Array(); + + //these variables tell the program where to find the data we want in the HTML file we're looking at. + //in this case, the data is found in a table. + var xPath1 = '//tr/td[1][@class="Label"]'; + var xPath2 = '//tr/td[2]'; + + + //at this point, all the data we want has been saved into the following 2 Objects: one for the headings, one for the content. + // The 3rd object tells us how many items we've found. + if (doc.evaluate('//tr/td[1][@class="Label"]', doc, nsResolver, XPathResult.ANY_TYPE, null)) { + var xPath1Results = doc.evaluate(xPath1, doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPath2Results = doc.evaluate(xPath2, doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate( 'count (//tr/td[1][@class="Label"])', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + //At this point we have two lists (xPath1Results and xPath2Results). this loop matches the first item in the first list + //with the first item in the second list, and on until the end. + //If we then ask for the "Principal Author" the program returns "J.K. Rowling" instead of "Principal Author" + if (doc.evaluate('//tr/td[1][@class="Label"]', doc, nsResolver, XPathResult.ANY_TYPE, null)) { + for (i=0; i<xPathCount.numberValue; i++) { + + fieldTitle=xPath1Results.iterateNext().textContent.replace(/\s+/g, ''); + + //gets the author's name without cleaning it away using cleanTags. + if (fieldTitle =="PrincipalAuthor:" || fieldTitle == "Auteurprincipal:") { + + fieldTitle="PrincipalAuthor:"; + dataTags[fieldTitle]=(xPath2Results.iterateNext().textContent); + var authorName =dataTags["PrincipalAuthor:"].split(","); + authorName[0]=authorName[0].replace(/\s+/g, ''); + dataTags["PrincipalAuthor:"]= (authorName[1] + (" ") + authorName[0]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["PrincipalAuthor:"], "author")); + + //Splits Adressebibliographique or Imprint into 3 fields and cleans away any extra whitespace or unwanted characters. + } else if (fieldTitle =="Adressebibliographique:" || fieldTitle == "Imprint:") { + + fieldTitle = "Imprint:"; + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent); + + var separateImprint = dataTags["Imprint:"].split(":"); + separateImprint[0]= separateImprint[0].replace(/^\s*|\[|\]/g,''); + dataTags["Place:"]=separateImprint[0]; + + var justDate = separateImprint[1].replace(/\D/g, ''); + dataTags["Date:"]= justDate; + + separateImprint[1] = separateImprint[1].replace(/\d|\[|\]|\./g, ''); + separateImprint[1] = separateImprint[1].replace(/^\s*|\s*$/g, ''); + dataTags["Publisher:"]= separateImprint[1]; + + // determines how many tags there will be, pushes them into an array and clears away whitespace. + } else if (fieldTitle == "Subject:" || fieldTitle == "Sujet:") { + + tagsContent.push(Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, ''))); + while (fieldTitle != "Collection:") { + i=i+1; + tagsContent.push(Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, ''))); + fieldTitle=xPath1Results.iterateNext().textContent.replace(/\s+/g, ''); + } + + } else { + + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(xPath2Results.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + + } + } + } + //Adds a string to CIHM no: and ICMH no: so that the resulting number makes sense to the reader. + if (dataTags["CIHMno.:"]) { + + dataTags["CIHMno.:"]=("CIHM Number: " + dataTags["CIHMno.:"]); + } + + if (dataTags["ICMHno:"]) { + + dataTags["ICMHno:"]=("ICMH nombre: " + dataTags["ICMHno:"]); + } + + //makes tags of the items in the "tagsContent" array. + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + + //calls the associateData function to put the data in the correct Zotero field. + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Place:", "place"); + associateData (newItem, dataTags, "Publisher:", "publisher"); + associateData (newItem, dataTags, "Date:", "date"); + associateData (newItem, dataTags, "PageCount:", "pages"); + associateData (newItem, dataTags, "CIHMno.:", "extra"); + associateData (newItem, dataTags, "DocumentSource:", "rights"); + + associateData (newItem, dataTags, "Titre:", "title" ); + associateData (newItem, dataTags, "Nombredepages:", "pages"); + associateData (newItem, dataTags, "ICMHno:", "extra"); + associateData (newItem, dataTags, "Documentoriginal:", "rights"); + + //Saves everything to Zotero. + newItem.complete(); + +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//div[@id="Content"]/div[@class="NormalRecord"]/h3/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); + + + +} +\ No newline at end of file diff --git a/translators/Cell Press.js b/translators/Cell Press.js @@ -0,0 +1,139 @@ +{ + "translatorID":"f26cfb71-efd7-47ae-a28c-d4d8852096bd", + "translatorType":4, + "label":"Cell Press", + "creator":"Michael Berkowitz", + "target":"http://www.(cancercell|cell|cellhostandmicrobe|cellmetabolism|cellstemcell|chembiol|current-biology|developmentalcell|immunity|molecule|neuron|structure).(org|com)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":99, + "inRepository":true, + "lastUpdated":"2008-07-07 14:50:00" +} + +function detectWeb(doc, url) { + + if (url.indexOf("search/results") != -1) { + return "multiple"; + } else if (url.indexOf("content/article") != -1) { + return "journalArticle"; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var commaSplit = new Array(); + + var newItem = new Zotero.Item("journalArticle"); + + //title + newItem.title = doc.evaluate('//h1[@class="article_title"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + //publication, volume, pages, date. + var voliss = doc.evaluate('//div[contains(@class, "article_citation")]/p[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var volissSplit = voliss.split("."); + + for (var i = 0; i < volissSplit.length; i++) { + if (volissSplit[i].match(", ")) { + commaSplit = volissSplit[i].split(", "); + } + } + if (commaSplit[0] != '') { + newItem.publicationTitle = commaSplit[0]; + } + if (commaSplit[1] != '') { + newItem.volume = commaSplit[1]; + } + if (commaSplit[2] != '') { + newItem.pages= commaSplit[2]; + } + if (commaSplit[3] != '') { + newItem.date= commaSplit[3]; + } + + //abstract + + var abstractXPath2 = '//div[@class="min_fulltext"][@id="main_content"]/p'; + if (doc.evaluate(abstractXPath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate(abstractXPath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var abstractXPath = '//div[@class="panelcontent article_summary"]/p[contains(text(), " ")]'; + if (doc.evaluate(abstractXPath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate(abstractXPath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + //authors + var authors = doc.evaluate('//p[@class="authors"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(","); + for (var i in authors) { + var next_author = authors[i]; + if (next_author.match(/[a-z]/)) { + next_author = Zotero.Utilities.trimInternal(next_author.replace(/\d/g, "")); + if (next_author.substr(0, 3) == "and") { + next_author = next_author.substr(4); + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(next_author, "author")); + } + } + + //url + var newurl = doc.location.href; + if (newurl.indexOf("abstract") != -1) { + newurl = newurl.replace("abstract", "fulltext"); + } + + //attachments + var uid = newurl.match(/uid=([^&]+)/)[1]; + var pdfx = '//a[contains(text(), "PDF")][contains(@href, "' + uid + '")]'; + var pdfurl = doc.evaluate(pdfx, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + newItem.attachments = [ + {url:newurl, title:"Cell Press Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"Cell Press Full Text PDF", mimeType:"application/pdf"} + ]; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//dd/strong', doc, nsResolver, XPathResult.ANY_TYPE, null); + var link = doc.evaluate('//nobr/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + var next_lilnk; + + while (next_title = titles.iterateNext()) { + next_link = link.iterateNext(); + if (next_link.textContent.match("Summary")) { + items[next_link.href] = next_title.textContent; + } else { + next_link = link.iterateNext(); + items[next_link.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Champlain Society - Collection.js b/translators/Champlain Society - Collection.js @@ -0,0 +1,167 @@ +{ + "translatorID":"50d3ca81-3c4c-406b-afb2-0fe8105b9b38", + "translatorType":4, + "label":"Champlain Society - Collection", + "creator":"Adam Crymble", + "target":"http://link.library.utoronto.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search_results")) { + return "multiple"; + } else if (doc.location.href.match("item_record")) { + return "book"; + } +} + +//Champlain Collection translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//table[1]/tbody/tr/td[1]/b/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td/table[1]/tbody/tr/td[2]/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//table[1]/tbody/tr/td[1]/b/font)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + if (fieldTitle == "Auteur:" ) { + fieldTitle = "Author:"; + } else if (fieldTitle == "Titre:") { + fieldTitle = "Title:"; + } else if (fieldTitle == "Description:") { + fieldTitle = "Extent:"; + } else if (fieldTitle == "Éditeur:") { + fieldTitle = "Published:"; + } else if (fieldTitle == "Sujet:") { + fieldTitle = "Subjects:"; + } + + dataTags[fieldTitle] = (contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + +//author + var multiAuthors = 0; + if (dataTags["Author:"]) { + var author = dataTags["Author:"]; + if (author.match("; ")) { + var authors = author.split("; "); + multiAuthors = 1; + } + + if (multiAuthors == 1) { + for (var i = 0; i < authors.length; i++) { + if (authors[i].match(", ")) { + var author1 = authors[i].split(", "); + author = author1[1] + " " + author1[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + } else { + if (author.match(", ")) { + var author1 = author.split(", "); + author = author1[1] + " " + author1[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + } + + if (dataTags["Published:"]) { + if (dataTags["Published:"].match(": ")) { + var place1 = dataTags["Published:"].indexOf(": "); + newItem.place = dataTags["Published:"].substr(0, place1); + var publisher1 = dataTags["Published:"].substr(place1 + 2); + + if (publisher1.match(", ")) { + var date1 = publisher1.lastIndexOf(", "); + newItem.date = publisher1.substr(date1 +2); + newItem.publisher = publisher1.substr(0, date1); + } else { + newItem.publisher = publisher1; + } + } else { + newItem.publisher = publisher1; + } + } + +//for Tags + if (dataTags["Subjects:"]) { + tagsContent = dataTags["Subjects:"].split(/\n/); + } + + var j = 0; + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[j] = tagsContent[i].replace(/^\s*|\s+$/g, ''); + j++; + } + } + + associateData (newItem, dataTags, "Extent:", "pages"); + associateData (newItem, dataTags, "ID:", "callNumber"); + associateData (newItem, dataTags, "Notes:", "abstractNote"); + + newItem.title = doc.title; + if (dataTags["Title:"]) { + associateData (newItem, dataTags, "Title:", "title"); + } else { + newItem.title = "No Title Found: Champlain Collection"; + } + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//tr[1]/td[2]/font/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Christian Science Monitor.js b/translators/Christian Science Monitor.js @@ -0,0 +1,150 @@ +{ + "translatorID":"04c0db88-a7fc-4d1a-9cf7-471d0990acb1", + "translatorType":4, + "label":"Christian Science Monitor", + "creator":"Adam Crymble", + "target":"http://(features.csmonitor|www.csmonitor).com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search")) { + return "multiple"; + } else if (doc.location.href.match("features")) { + return "newspaperArticle"; + } else if (doc.evaluate('//div[@id="storyContent"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "newspaperArticle"; + } +} + +//Christian Science Monitor translator. Code by Adam Crymble. + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + + + if (doc.location.href.match("features.csmonitor")) { + + newItem.title = doc.title; + + + if (doc.evaluate('//div[@class="story"][@id="main"]/p/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@class="story"][@id="main"]/p/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (doc.evaluate('//h3/span[@class="time-date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.date = doc.evaluate('//h3/span[@class="time-date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(" edition", ''); + } + + if (doc.evaluate('//h3/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var author = doc.evaluate('//h3/span', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (author.match("By ")) { + author = author.substr(3); + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + var title1 = doc.title; + + //Some entries do not work for some reason unbeknownst to me; this flag catches the problem and prevents an error, but doesn't save the data properly. + if (title1.match("csmonitor")) { + newItem.title = title1.substr(0, title1.length-15); + } else { + newItem.title = "This Entry Cannot Be Saved"; + newItem.abstractNote = "Entry must be entered manually"; + } + + + + } else { + + //title + if (doc.evaluate('//div[@id="storyContent"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var title1 = doc.evaluate('//div[@id="storyContent"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var words = title1.split(" "); + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + title1 = words.join(" "); + newItem.title = title1; + } else { + newItem.title = "no title found"; + } + + //abstract note + if (doc.evaluate('//div[@id="storyContent"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@id="storyContent"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + //date + if (doc.evaluate('//div[@id="storyContent"]/p[@class="postdate"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var date1 = doc.evaluate('//div[@id="storyContent"]/p[@class="postdate"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + date1 = date1.replace(/from the /g, ''); + date1 = date1.replace(/ edition/g, ''); + newItem.date = date1; + } + + //author + if (doc.evaluate('//address[@class="byline"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//address[@class="byline"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if (author.match("By ")) { + author = author.substr(3); + } + var words = author.split(" "); + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + } + + newItem.publicationTitle = "Christian Science Monitor"; + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//p[@id="searchResultRow"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (!next_title.href.match("features")) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CiNii.js b/translators/CiNii.js @@ -0,0 +1,67 @@ +{ + "translatorID":"46291dc3-5cbd-47b7-8af4-d009078186f6", + "translatorType":4, + "label":"CiNii", + "creator":"Michael Berkowitz", + "target":"http://ci.nii.ac.jp/naid/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 00:30:00" +} + +function detectWeb(doc, url) { + if (url.match(/(naid|QuotDisp)/)) { + return "journalArticle"; + } else if (doc.evaluate('//a[contains(@href, "QuotDisp") or contains(@href, "/naid/")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//a[contains(@href, "QuotDisp") or contains(@href, "/naid/")]', doc, ns, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.trimInternal(link.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var biblink = doc.evaluate('//a[contains(text(), "BibTex")]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + var newurl = doc.location.href; + var tags = new Array(); + if (doc.evaluate('//a[@class="keyword"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var kws = doc.evaluate('//a[@class="keyword"]', doc, ns, XPathResult.ANY_TYPE, null); + var kw; + while (kw = kws.iterateNext()) { + tags.push(Zotero.Utilities.trimInternal(kw.textContent)); + } + } + Zotero.Utilities.HTTP.doGet(biblink, function(text) { + var trans = Zotero.loadTranslator("import"); + trans.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + trans.setString(text); + trans.setHandler("itemDone", function(obj, item) { + item.url = newurl; + item.attachments = [{url:item.url, title:item.title + " Snapshot", mimeType:"text/html"}]; + item.tags = tags; + item.complete(); + }); + trans.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CiteBase.js b/translators/CiteBase.js @@ -0,0 +1,94 @@ +{ + "translatorID":"daa26181-71d4-48ef-8cac-54c06ff4c20e", + "translatorType":12, + "label":"Citebase", + "creator":"Michael Berkowitz", + "target":"^http://www\\.citebase\\.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-11 04:32:00" +} + +function detectWeb(doc, url) { + if (url.match(/\/search/)) { + return "multiple"; + } else if (url.match(/\/abstract/)) { + return "journalArticle"; + } +} + +function detectSearch(item) { + if(item.itemType == "journalArticle") { + return true; + } + return false; +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var links = doc.evaluate('//div[@class="rs_match"]/div/a[@class="abs_title"]', doc, null, XPathResult.ANY_TYPE, null); + var items = new Object(); + var link; + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + + Zotero.Utilities.processDocuments(articles, function(doc) { + var biburl = doc.evaluate('//a[contains(text(), "BibTeX")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + if (doc.evaluate('/html/body/div[@class="body"]/div[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) var abs = Zotero.Utilities.trimInternal(doc.evaluate('/html/body/div[@class="body"]/div[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + Zotero.Utilities.HTTP.doGet(biburl, function(text) { + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (abs) { + if (abs.match(/^Abstract/)) { + item.abstractNote = abs.substr(9); + } else { + item.abstractNote = abs; + } + } + item.attachments = [{url:item.url, title:"Citebase Snapshot", mimeType:"text/html"}]; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} + +function doSearch(item) { + if(item.contextObject) { + var co = item.contextObject; + if(co.indexOf("url_ver=") == -1) { + co = "url_ver=Z39.88-2004&"+co; + } + co = co.replace(/(?:&|^)svc_id=[^&]*/, ""); + } else { + var co = Zotero.Utilities.createContextObject(item); + } + + Zotero.Utilities.HTTP.doGet("http://www.citebase.org/openurl?"+co+"&svc_id=bibtex", function(responseText, request) { + if(responseText.substr(0, 6) != "<?xml ") { + // read BibTeX + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + translator.setString(responseText); + translator.translate(); + } + + Zotero.done(); + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CiteSeer.js b/translators/CiteSeer.js @@ -0,0 +1,111 @@ +{ + "translatorID":"fa396dd4-7d04-4f99-95e1-93d6f355441d", + "translatorType":4, + "label":"CiteSeer", + "creator":"Simon Kornblith", + "target":"^http://(?:citeseer\\.ist\\.psu\\.edu/|citeseer\\.csail\\.mit\\.edu/|citeseer\\.ifi\\.unizh\\.ch/|citeseer\\.comp\\.nus\\.edu\\.sg/)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-06 21:00:00" +} + +function detectWeb(doc, url) { + var searchRe = /http:\/\/[^\/]+\/ci?s/; + if(searchRe.test(url)) { + return "multiple"; + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.evaluate('/html/body/span[@class="m"]/pre', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } + } +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // figure out what attachments to add + var attachments = new Array(); + var results = doc.evaluate('/html/body/span[@class="m"]/table[@class="h"]/tbody/tr/td[4]/center/font/a', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + + var acceptableTypes = ["PDF", "PS", "PS.gz"]; + var mimeTypes = ["application/pdf", "application/postscript", "application/gzip"]; + var resultsArray = []; + while (elmt = results.iterateNext()) { + resultsArray.push(elmt); + } + resultsArray = resultsArray.filter(function (element, index, array) { + return (acceptableTypes.indexOf(element.textContent.toString()) != -1); + }); + resultsArray = resultsArray.sort(function (a,b) { + return (acceptableTypes.indexOf(a.textContent.toString()) - + acceptableTypes.indexOf(b.textContent.toString())); + }); + if (resultsArray.length > 0) { + var elmt = resultsArray[0]; + var kind = elmt.textContent.toString(); + var index = acceptableTypes.indexOf(kind); + var attachment = {url:elmt.href, mimeType:mimeTypes[index], + title:"CiteSeer Full Text "+kind}; + attachments.push(attachment); + } + + var bibtex = doc.evaluate('/html/body/span[@class="m"]/pre/text()', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(bibtex) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + translator.setString(bibtex.nodeValue.toString()); + translator.setHandler("itemDone", function(obj, item) { + if(item.url) { // add http to url + item.url = "http://"+item.url; + } + item.attachments = attachments; + + item.complete(); + }); + translator.translate(); + } else { + throw "No BibTeX found!"; + } +} + +function doWeb(doc, url) { + var searchRe = /http:\/\/([^\/]+)\/ci?s/; + var m = searchRe.exec(doc.location.href); + if(m) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var items = Zotero.Utilities.getItemArray(doc, doc, "^http://"+m[1]+"/[^/]+.html"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/CiteULike.js b/translators/CiteULike.js @@ -0,0 +1,58 @@ +{ + "translatorID":"8917b41c-8527-4ee7-b2dd-bcbc3fa5eabd", + "translatorType":4, + "label":"CiteULike", + "creator":"Sean Takats", + "target":"https?://(?:www\\.)?citeulike.org(?:.*/tag/[^/]*$|/search/|/journal/|/group/[0-9]+/library$|/\\?page=[0-9]+$|/.*article/[0-9]+$|/$)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-01 19:30:00" +} + +function detectWeb(doc, url){ + var articleRe = /\/article\/[0-9]+$/; + var m = url.match(articleRe); + var newUris = new Array(); + + if (m){ + return "journalArticle"; + } else { + return "multiple"; + } +} + +function doWeb(doc, url){ + var articleRe = /\/article\/[0-9]+$/; + var m = url.match(articleRe); + var newUris = new Array(); + + if (m){ + newUris.push(url.replace(/citeulike\.org\//, "citeulike.org/endnote/")); + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var elmt; + var elmts = doc.evaluate('//a[@class="title"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var items = new Object(); + while(elmt = elmts.iterateNext()) { + items[elmt.href] = Zotero.Utilities.trimInternal(elmt.textContent); + } + items = Zotero.selectItems(items); + if(!items) return true; + for(var uri in items) { + newUris.push(uri.replace(/citeulike\.org\//, "citeulike.org/endnote/")); + } + } + Zotero.Utilities.HTTP.doGet(newUris, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Civilization.ca.js b/translators/Civilization.ca.js @@ -0,0 +1,132 @@ +{ + "translatorID":"8451431a-895f-4732-8339-79eb6756d2f9", + "translatorType":4, + "label":"Civilization.ca", + "creator":"Adam Crymble", + "target":"http://collections.civilization.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr/td[2]/a/font', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.location.href.match("Display.php")) { + return "artwork"; + } +} + +//Civilization.ca translator. Code by Adam Crymble. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("artwork"); + + var headers = doc.evaluate('//table[2]/tbody/tr/td[1]/span[@class="textb"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//tr[2]/td/table[2]/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//table[2]/tbody/tr/td[1]/span[@class="textb"]/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + newItem.title = contents.iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + var dump = contents.iterateNext(); + + for (i=0; i<xPathCount.numberValue; i++) { + + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + if (fieldTitle == "Artist/Maker/Manufacturer") { + fieldTitle = " Artiste/Artisan/Fabricant"; + } else if (fieldTitle == "Autreaffiliationculturelle") { + fieldTitle = "OtherCulturalAffiliation"; + } + + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + if (dataTags["Artist/Maker/Manufacturer"]) { + var author = dataTags["Artist/Maker/Manufacturer"]; + if (author.match(" and ")) { + var authors = author.split(" and "); + for (var i in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["OtherCulturalAffiliation"]) { + tagsContent = dataTags["OtherCulturalAffiliation"].split(/\n/); + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } + + if (dataTags["Collection"]) { + newItem.extra = "Collection: " + dataTags['Collection']; + } + + associateData (newItem, dataTags, "ArtifactNumber", "callNumber"); + associateData (newItem, dataTags, "Museum", "repository"); + associateData (newItem, dataTags, "Measurements", "artworkSize"); + associateData (newItem, dataTags, "BeginDate", "date"); + associateData (newItem, dataTags, "EndDate", "date"); + associateData (newItem, dataTags, "AdditionalInformation", "abstractNote"); + + associateData (newItem, dataTags, "Numérod'artefact", "callNumber"); + associateData (newItem, dataTags, "Musée", "repository"); + associateData (newItem, dataTags, "Mesures", "artworkSize"); + associateData (newItem, dataTags, "Datededébut", "date"); + associateData (newItem, dataTags, "Datedefin", "date"); + associateData (newItem, dataTags, "Informationsupplémentaire", "abstractNote"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//tr/td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.textContent.match(/\w/)) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Code4Lib Journal.js b/translators/Code4Lib Journal.js @@ -0,0 +1,68 @@ +{ + "translatorID":"a326fc49-60c2-405b-8f44-607e5d18b9ad", + "translatorType":4, + "label":"Code4Lib Journal", + "creator":"Michael Berkowitz", + "target":"http://journal.code4lib.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-25 20:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//h2[@class="articletitle"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//h1[@class="articletitle"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var items = new Object(); + var articles = new Array(); + var xpath = '//div[@class="article"]/h2[@class="articletitle"]/a'; + if (detectWeb(doc, url) == "multiple") { + var xpath = '//div[@class="article"]/h2[@class="articletitle"]/a'; + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_title = titles.iterateNext(); + while (next_title) { + items[next_title.href] = next_title.textContent; + next_title = titles.iterateNext(); + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles.push(url); + } + + Zotero.Utilities.processDocuments(articles, function(newDoc, url) { + var newItem = new Zotero.Item("journalArticle"); + newItem.repository = "Code4Lib Journal"; + newItem.publicationTitle = "The Code4Lib Journal"; + newItem.ISSN = "1940-5758"; + newItem.url = newDoc.location.href; + newItem.title = newDoc.evaluate('//div[@class="article"]/h1[@class="articletitle"]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.abstractNote = newDoc.evaluate('//div[@class="article"]/div[@class="abstract"]/p', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var issdate = newDoc.evaluate('//p[@id="issueDesignation"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.issue = issdate.match(/([^,]*)/)[0].match(/\d+/)[0]; + newItem.date = issdate.match(/,\s+(.*)$/)[1]; + + + var axpath = '//div[@class="article"]/div[@class="entry"]/p[1]/a'; + var authors = newDoc.evaluate(axpath, newDoc, null, XPathResult.ANY_TYPE, null); + var next_author = authors.iterateNext(); + while (next_author) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(next_author.textContent, "author")); + next_author = authors.iterateNext(); + } + + newItem.attachments.push({url:newDoc.location.href, title:"Code4Lib Journal Snapshot", mimeType:"text/html"}); + newItem.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Columbia University Press.js b/translators/Columbia University Press.js @@ -0,0 +1,69 @@ +{ + "translatorID":"a75e0594-a9e8-466e-9ce8-c10560ea59fd", + "translatorType":4, + "label":"Columbia University Press", + "creator":"Michael Berkowitz", + "target":"http://www.cup.columbia.edu/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 18:30:00" +} + +function detectWeb(doc, url) { + if (url.match(/book\//)) { + return "book"; + } else if (doc.evaluate('//p[@class="header"]/a/span[@class="_booktitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function addTag(item, tag, xpath) { + item[tag] = Zotero.Utilities.trimInternal(doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var books = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//p[@class="header"]/a', doc, ns, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i); + } + } else { + books = [url]; + } + Zotero.Utilities.processDocuments(books, function(doc) { + var item = new Zotero.Item("book"); + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//h1[@id="_booktitle"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.trimInternal(doc.evaluate('//p[@id="_authors"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (authors.match(/Edited/)) { + authors = Zotero.Utilities.trimInternal(authors.replace("Edited by", "")); + var autType = "editor"; + } else { + var autType = "author"; + } + var auts = authors.split(/,|\band\b/); + for each (var aut in auts) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, autType)); + } + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//p[@id="_desc"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.date = Zotero.Utilities.trimInternal(doc.evaluate('//span[@id="_publishDate"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.ISBN = Zotero.Utilities.trimInternal(doc.evaluate('//span[@id="_isbn"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.publisher = Zotero.Utilities.trimInternal(doc.evaluate('//span[@id="_publisher"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Common-Place.js b/translators/Common-Place.js @@ -0,0 +1,166 @@ +{ + "translatorID":"c3edb423-f267-47a1-a8c2-158c247f87c2", + "translatorType":4, + "label":"Common-Place", + "creator":"Frederick Gibbs", + "target":"http://www.common-place\\.|historycooperative\\.org/journals/cp", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + if(doc.title.indexOf("Previous Issues") != -1 || doc.title.indexOf("Search Site") != -1 ) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function scrape(doc) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("journalArticle"); + newItem.publicationTitle = "Common-Place"; + newItem.url = doc.location.href; + + + //get issue year and month + //these will determine what xpaths we use for title and author + var pubDate; + var dateRe = /<a href="\/vol-[0-9]{2}\/no-[0-9]{2}\/">(.*)<\/a><\/b>/; + var m = dateRe.exec(Zotero.Utilities.trimInternal(doc.getElementsByTagName("body")[0].innerHTML)); + + if(m) { + //newItem.title = Zotero.Utilities.trimInternal(Zotero.Utilities.unescapeHTML(m[1])); + pubDate = m[1]; + } else { + pubDate = doc.evaluate('//div[@id="container"]/div[@id="top"]/p/b/a[2]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + var d; + //Zotero.debug(pubDate); + pubDateVolRE = /vol. (.*) · no. /; + d = pubDateVolRE.exec(pubDate); + newItem.volume = d[1]; + + pubDateVolRE = /no. (.*) ·/; + d = pubDateVolRE.exec(pubDate); + newItem.issue = d[1]; + + pubDateVolRE = /no. [0-9] · (.*)/; + d = pubDateVolRE.exec(pubDate); + newItem.date = d[1]; + + //usually the page begins with the article title or book title (of reviewed book) + //some pages have an image just before them, so we need to skip it if it's there. + var pLevel; + var m=doc.evaluate('//div[@id="content"]/p[1]/img', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + //if there is an image here, offset the xpath + if (m == null) { + pLevel = '//div[@id="content"]/p[1]'; + } else { + pLevel = '//div[@id="content"]/p[2]'; + } + + //issues before 2004 have a table based layout, so a totally different xpath. + //check to see if we have anything, then try again if we don't. + var author; + var title; + + author = doc.evaluate(pLevel+'/span[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + author = author.iterateNext(); + + if (author != null) { + //Zotero.debug("au"+author+"au"); + var title = doc.evaluate(pLevel+'/span[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + //Zotero.debug("ti"+title+"ti"); + title = title.iterateNext().textContent; + + //determine if we have a book review + // if so, get the publication information + if (author.textContent.indexOf("Review by") != -1 ) { + newItem.title = String.concat("Review of ", title); + newItem.author = author.textContent.substring(10); + } else { + newItem.author = author.textContent; + newItem.title = title; + } + + } + else { //we have older issue + + //check if we are on a review + var review = doc.evaluate('/html/body/table/tbody/tr/td[2]/p[2]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var temp = review.textContent; + if (temp.indexOf("Review") != -1) { + title = doc.evaluate('/html/body/table/tbody/tr/td[2]/p/i', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + title = "Review of " + title; + author = review.textContent.substring(10); + } else { //for articles + title = doc.evaluate('/html/body/table/tbody/tr/td[2]/p/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + author = doc.evaluate('/html/body/table/tbody/tr/td[2]/p[1]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/)[1]; + //Zotero.debug(author); + } + newItem.author = author; + newItem.title = title; + } + + newItem.attachments.push({document:doc, title:doc.title}); + + newItem.complete(); +} + +function doWeb(doc, url) { +var type = detectWeb(doc, url); +if (type == "multiple") { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + //create list of items + //what about home page (current issue table of contents?) + //for search result links: /html/body/table[2]/tbody/tr/td[2]/li[3]/a + //for previous issues: //tr/td/p/a/b (but we need to strip out volume links (starts with 'Volume') + + var link; + var title; + var items = new Object(); + var searchLinks = doc.evaluate('/html/body/table[2]/tbody/tr/td[2]/li/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (elmt = searchLinks.iterateNext()) { + Zotero.debug(elmt.textContent); + title = elmt.textContent; + link = elmt.href; + if (title && link){ + items[link] = title; + } + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/Copernicus.js b/translators/Copernicus.js @@ -0,0 +1,92 @@ +{ + "translatorID":"a8df3cb0-f76c-4e2c-a11e-5fa283f8010c", + "translatorType":4, + "label":"Copernicus", + "creator":"Michael Berkowitz", + "target":"http://www.(adv-geosci|adv-radio-sci|ann-geophys).net/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-24 14:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//li[a[contains(text(), "Abstract")]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.title.match(/Abstract/)) { + return "journalArticle"; + } +} + +function scrape(doc) { + var item = new Zotero.Item("journalArticle"); + item.url = doc.location.href; + item.title = doc.evaluate('//span[@class="inhaltueber_16f"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.publicationTitle = doc.evaluate('//span[@class="ueberschrift"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/)[0]; + item.repository = item.publicationTitle; + var authors = doc.evaluate('//td/span[3]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + authors = authors.replace(/\d/g, "").replace(/,,/, ",").split(/(,|and)/); + for each (var aut in authors) { + if (!(aut == "and") && (aut.match(/\w/))) { + aut = Zotero.Utilities.trimInternal(aut); + names = aut.match(/(.*)\s([^\s]+)/); + item.creators.push({firstName:names[1], lastName:names[2], creatorType:"author"}); + } + } + var voliss = doc.evaluate('//tr[3]/td/span[@class="lib_small"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + voliss = voliss.match(/^([^,]+),([^,]+),([^,]+),([^w]+)/); + item.journalAbbreviation = voliss[1]; + item.volume = Zotero.Utilities.trimInternal(voliss[2]); + item.pages = Zotero.Utilities.trimInternal(voliss[3]); + item.year = Zotero.Utilities.trimInternal(voliss[4]); + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//tr[3]/td/span[4]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(10)); + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:item.url.replace(".html", ".pdf"), title:item.publicationTitle + " PDF", mimeType:"application/pdf"} + ]; + item.complete(); +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var link = doc.evaluate('//iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src; + Zotero.Utilities.HTTP.doGet(link, function(text) { + var links = text.match(/<a\s+target=\"_top\"\s+href=\"[^"]+\">[^<]+/g); + for each (var link in links) { + link = link.match(/href=\"([^"]+)\">(.*)/); + items[link[1].replace(/\.[^\.]+$/, ".html")] = Zotero.Utilities.trimInternal(link[2]) + "..."; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + + Zotero.Utilities.processDocuments(arts, function(doc) { + scrape(doc); + }, function() {Zotero.done;}); + }); + } else { + var titles = doc.evaluate('//li[a[contains(text(), "Abstract")]]/span[@class="articletitle"]', doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//li[a[contains(text(), "Abstract")]]/a[1]', doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + Zotero.Utilities.processDocuments(arts, function(doc) { scrape(doc);}, function() {Zotero.done;}); + } + } else { + Zotero.Utilities.processDocuments([url], function(doc) { + scrape(doc); + }, function() {Zotero.done;}); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Copernicus2.js b/translators/Copernicus2.js @@ -0,0 +1,72 @@ +{ + "translatorID":"8082115d-5bc6-4517-a4e8-abed1b2a784a", + "translatorType":4, + "label":"Copernicus2", + "creator":"Michael Berkowitz", + "target":"http://www.(adv-sci-res|astrophys-space-sci-trans|atmos-chem-phys|biogeosciences(-discuss)?|clim-past|electronic-earth|hydrol-earth-syst-sci|nat-hazards-earth-syst-sci|nonlin-processes-geophys|ocean-sci|soc-geogr|surv-perspect-integr-environ-soc|the-cryosphere).net/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-29 21:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@id="publisher"]/iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//td[*[a[contains(text(), "Abstract")]]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.title.match(/Abstract/)) { + return "journalArticle"; + } +} + +function getRIS(link) { + Zotero.Utilities.HTTP.doGet(link, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.repository = "Copernicus Online Journals"; + item.attachments[0].title = item.publicationTitle + " Snapshot"; + item.attachments[0].mimeType = "text/html"; + item.attachments[1].title = item.publicationTitle + " PDF"; + item.complete(); + }); + translator.translate(); + }); +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//div[@id="publisher"]/iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var link = doc.evaluate('//div[@id="publisher"]/iframe', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src; + Zotero.Utilities.HTTP.doGet(link, function(text) { + var links = text.match(/<a\s+target=\"_top\"\s+href=\"[^"]+\">[^<]+/g); + for each (var link in links) { + link = link.match(/href=\"([^"]+)\">(.*)/); + items[link[1].replace(/\.[^\.]+$/, ".ris")] = Zotero.Utilities.trimInternal(link[2]) + "..."; + } + items = Zotero.selectItems(items); + for (var i in items) { + getRIS(i); + } + }); + } else { + var titles = doc.evaluate('//td[*[a[contains(text(), "Abstract")]]]/span[@class="pb_toc_article_title"]', doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//td[*[a[contains(text(), "Abstract")]]]//a[1]', doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + getRIS(i.replace(".html", ".ris")); + } + } + } else { + getRIS(url.replace('.html', '.ris')); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Cornell LII.js b/translators/Cornell LII.js @@ -0,0 +1,208 @@ +{ + "translatorID":"930d49bc-44a1-4c22-9dde-aa6f72fb11e5", + "translatorType":4, + "label":"Cornell LII", + "creator":"Bill McKinney", + "target":"^http://www\\.law\\.cornell\\.edu/supct/html/.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-18 18:15:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/ + if(liiRegexp.test(url)) { + return "book"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + var field = metaTags.namedItem(field); + if(field) { + newItem[zoteroField] = field.getAttribute("content"); + } +} + +function scrape(doc) { + + var caselawCourt = "U.S. Supreme Court"; + var caselawJurisdiction = "Federal"; + var caselawSourceReporter = "U.S."; + var caselawSourceVolume = "___"; + var caselawSourceStartPage = "___"; + var caselawParallelSourceVolume = "___"; + var caselawParallelSourceStartPage = "___"; + var caselawParallelSourceReporter = "___"; + var caselawDecisionYear = ""; + + var newItem = new Zotero.Item("case"); + newItem.url = doc.location.href; + newItem.language = "en-us"; + newItem.court = "U.S. Supreme Court"; + newItem.reporter = "U.S."; + + // LII provides a bunch of meta tags to harvest + var metaTags = doc.getElementsByTagName("meta"); + associateMeta(newItem, metaTags, "CASENAME", "title"); + associateMeta(newItem, metaTags, "CASENAME", "caseName"); + //associateMeta(newItem, metaTags, "DOCKET", "caselawDocket"); + //associateMeta(newItem, metaTags, "PARTY1", "caselawParty1"); + //associateMeta(newItem, metaTags, "PARTY2", "caselawParty2"); + //associateMeta(newItem, metaTags, "ARGDATE", "caselawArguedDate"); + //associateMeta(newItem, metaTags, "DECDATE", "dateDecided"); + associateMeta(newItem, metaTags, "COURTBELOW", "history"); + //associateMeta(newItem, metaTags, "ACTION", "caselawCourtAction"); + + + var tmpCasename = newItem.caseName; + tmpCasename = Zotero.Utilities.capitalizeTitle(tmpCasename.toLowerCase()); + tmpCasename = tmpCasename.replace("V.", "v."); + newItem.caseName = tmpCasename; + newItem.shortTitle = tmpCasename; + + // judge + var j = metaTags.namedItem("AUTHOR"); + if(j) { + newItem.creators.push({lastName:j.getAttribute("content"), creatorType:"judge", fieldMode:true}); + } + + // group meta tags + for(var i=0; i<metaTags.length; i++) { + var key = metaTags[i].getAttribute("name"); + var value = metaTags[i].getAttribute("content"); + if (key == "GROUP") { + newItem.tags.push(value); + } + } + + // parse year out of decision date + var decdateField = metaTags.namedItem("DECDATE"); + if(decdateField ) { + var decisionYearRegex = /(\w+)\s+(\d+),\s+(\d+)/ + var decisionDateMatch = decisionYearRegex.exec(decdateField.getAttribute("content")); + var dy; + var dm; + var dd; + if (decisionDateMatch ) { + dm = decisionDateMatch[1]; + dd = decisionDateMatch[2]; + dy = decisionDateMatch [3]; + caselawDecisionYear = dy; + newItem.dateDecided = dy + " " + dm + " " + dd; + } + } + + // create attachment to pdf + var dyRegex = /^(.+)\/html\/(.+)(\.Z\w+)\.html$/; + var dyMatch = dyRegex.exec(newItem.url); + if (dyMatch) { + var pdfUrl = dyMatch[1]+"/pdf/"+dyMatch[2]+"P"+dyMatch[3]; + newItem.attachments.push({url:pdfUrl, title:"PDF version", mimeType:"application/pdf", downloadable:true}); + } + + // parse disposition + var dis = doc.getElementsByTagName("DISPOSITION"); + if (dis.length > 0) { + var tmpDis = dis[0].innerHTML; + tmpDis = tmpDis.replace(/\s+/g, " "); + newItem.title = newItem.title + " (" + tmpDis + ")"; + newItem.caseName= newItem.caseName + " (" + tmpDis + ")"; + + } + + + // parse citation into parts so that bluebook can be constructed + var cite = doc.getElementsByTagName("CASENUMBER"); + if (cite.length > 0) { + var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/; + var citeMatch = citeRegex.exec(cite[0].innerHTML); + if (citeMatch) { + caselawSourceVolume = citeMatch[1]; + newItem.reporterVolume = citeMatch[1]; + caselawSourceStartPage = citeMatch[2]; + newItem.firstPage = citeMatch[2]; + } + } + + // look for offcite span element + var spanTags = doc.getElementsByTagName("span"); + if (spanTags.length > 0) { + for(var i=0; i<spanTags.length; i++) { + if(spanTags[i].className == "offcite") { + var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/; + var citeMatch = citeRegex.exec(spanTags[i].innerHTML); + if (citeMatch) { + caselawSourceVolume = citeMatch[1]; + newItem.reporterVolume = citeMatch[1]; + caselawSourceStartPage = citeMatch[2]; + newItem.firstPage = citeMatch[2]; + } + break; + } + } + } + + // bluebook citation + var bbCite = newItem.shortTitle + ", " + + caselawSourceVolume + " " + + caselawSourceReporter + " " + + caselawSourceStartPage; + // paralell cite + if (caselawParallelSourceVolume != "___") { + bbCite = bbCite + ", " + caselawParallelSourceVolume + + " " + caselawParallelSourceReporter + " " + + caselawParallelSourceStartPage; + } + // jurisdiction and year + bbCite = bbCite + " (" + caselawDecisionYear + ")"; + // closing period + bbCite = "Bluebook citation: " + bbCite + "."; + newItem.notes.push({note:bbCite}); + + // parse out publication notice + var notice = doc.getElementsByTagName("NOTICE"); + if (notice .length > 0) { + var tmpNotice= notice [0].innerHTML; + tmpNotice= tmpNotice.replace(/\s+/g, " "); + newItem.notes.push({note:tmpNotice}); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/ + if(liiRegexp.test(url)) { + scrape(doc); + } else { + + var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/Cornell University Press.js b/translators/Cornell University Press.js @@ -0,0 +1,64 @@ +{ + "translatorID":"4363275e-5cc5-4627-9a7f-951fb58a02c3", + "translatorType":4, + "label":"Cornell University Press", + "creator":"Michael Berkowitz", + "target":"http://www.cornellpress.cornell.edu/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 19:30:00" +} + +function detectWeb(doc, url) { + if (url.match("detail.taf")) { + return "book"; + } else if (url.match("list.taf") || url.match("listsearch.taf")) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function (prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//tr/td[2]/a', doc, ns, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + if (title.textContent.match(/\w+/)) items[title.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i); + } + } else { + books = [url]; + } + Zotero.Utilities.processDocuments(books, function(doc) { + var item = new Zotero.Item("book"); + item.title = Zotero.Utilities.capitalizeTitle(doc.evaluate('//span[@class="bktitle"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = doc.evaluate('//div[@id="detail"]/table/tbody/tr/td/form/a', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/;/); + Zotero.debug(authors); + for each (var aut in authors) { + if (aut.match(/Translator/)) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut.match(/^(.*)\s+\(/)[1], "translator")); + } else if (aut.match(/Editor/)) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut.match(/^(.*)\s+\(/)[1], "editor")); + } else { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + var bits = doc.evaluate('//div[@id="detail"]/table/tbody/tr/td/form', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.ISBN = bits.match(/ISBN:\s+([\d\-]+)/)[1]; + item.date = bits.match(/\d{4}/)[0]; + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="description"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/CrossRef.js b/translators/CrossRef.js @@ -0,0 +1,89 @@ +{ + "translatorID":"11645bd1-0420-45c1-badb-53fb41eeb753", + "translatorType":8, + "label":"CrossRef", + "creator":"Simon Kornblith", + "target":"http://partneraccess.oclc.org/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-09-15 21:00:00" +} + +function detectSearch(item) { + if(item.itemType == "journalArticle") { + return true; + } + return false; +} + +function processCrossRef(xmlOutput) { + xmlOutput = xmlOutput.replace(/<\?xml[^>]*\?>/, ""); + + // parse XML with E4X + var qr = new Namespace("http://www.crossref.org/qrschema/2.0"); + try { + var xml = new XML(xmlOutput); + } catch(e) { + return false; + } + + // ensure status is valid + var status = xml.qr::query_result.qr::body.qr::query.@status.toString(); + if(status != "resolved" && status != "multiresolved") { + return false; + } + + var query = xml.qr::query_result.qr::body.qr::query; + var item = new Zotero.Item("journalArticle"); + + // try to get a DOI + item.DOI = query.qr::doi.(@type=="journal_article").text().toString(); + if(!item.DOI) { + item.DOI = query.qr::doi.(@type=="book_title").text().toString(); + } + if(!item.DOI) { + item.DOI = query.qr::doi.(@type=="book_content").text().toString(); + } + + // try to get an ISSN (no print/electronic preferences) + item.ISSN = query.qr::issn[0].text().toString(); + // get title + item.title = query.qr::article_title.text().toString(); + // get publicationTitle + item.publicationTitle = query.qr::journal_title.text().toString(); + // get author + item.creators.push(Zotero.Utilities.cleanAuthor(query.qr::author.text().toString(), "author", true)); + // get volume + item.volume = query.qr::volume.text().toString(); + // get issue + item.issue = query.qr::issue.text().toString(); + // get year + item.date = query.qr::year.text().toString(); + // get edition + item.edition = query.qr::edition_number.text().toString(); + // get first page + item.pages = query.qr::first_page.text().toString(); + + item.complete(); + return true; +} + +function doSearch(item) { + if(item.contextObject) { + var co = item.contextObject; + if(co.indexOf("url_ver=") == -1) { + co = "url_ver=Z39.88-2004&"+co; + } + } else { + var co = Zotero.Utilities.createContextObject(item); + } + + Zotero.Utilities.HTTP.doGet("http://www.crossref.org/openurl?req_dat=zter:zter321&"+co+"&noredirect=true", function(responseText) { + processCrossRef(responseText); + Zotero.done(); + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Cyberpresse.js b/translators/Cyberpresse.js @@ -0,0 +1,87 @@ +{ + "translatorID":"dbfcaa3e-082a-45a4-9619-9892f49399c1", + "translatorType":4, + "label":"Cyberpresse", + "creator":"Adam Crymble", + "target":"http://www.cyberpresse.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb (doc, url) { + if (doc.location.href.match("article")) { + return "newspaperArticle"; + } +} + +//Cyberpresse translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("newspaperArticle"); + + if (doc.title.match("|")) { + + var titleStuff = doc.title.split("|"); + if (titleStuff[0].match(":")) { + var authorTitle = titleStuff[0].split(":"); + newItem.title = authorTitle[1]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(authorTitle[0], "author")); + + } else { + newItem.title = titleStuff[0]; + } + + } else { + newItem.title = doc.title; + } + + var dataTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < dataTagHTML.length ; i++) { + dataTags[dataTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(dataTagHTML[i].getAttribute("content")); + } + + if (doc.evaluate('//div[@id="nouvelle"]/p[@class="auteur"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//div[@id="nouvelle"]/p[@class="auteur"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + if (doc.evaluate('//div[@id="nouvelle"]/p[@class="date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.date = doc.evaluate('//div[@id="nouvelle"]/p[@class="date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + associateData (newItem, dataTags, "summary", "abstractNote"); + associateData (newItem, dataTags, "mediaarticle", "publicationTitle"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + + var articles = new Array(); + + articles = [url]; + + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/DBLP Computer Science Bibliography.js b/translators/DBLP Computer Science Bibliography.js @@ -0,0 +1,170 @@ +{ + "translatorID":"625c6435-e235-4402-a48f-3095a9c1a09c", + "translatorType":4, + "label":"DBLP Computer Science Bibliography", + "creator":"Adam Crymble", + "target":"http://(search?|dblp?).mpi-inf", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("journals")) { + return "journalArticle"; + } else if (doc.title.match("conf")) { + return "conferencePaper"; + } else if (doc.title.match("DBLP entry")) { + return "bookSection"; + } +} + + +//DBLP Computer Science Database Translator. Code by Adam Crymble. +//Doesn't work for multiple entries. Site uses a different URL for the search and single entry. Multiple code attached as comment. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + } : null; + + var dataTags = new Object(); + + var mediaType = detectWeb(doc, url); + + if (mediaType == "bookSection") { + var newItem = new Zotero.Item("bookSection"); + } else if (mediaType == "conferencePaper") { + var newItem = new Zotero.Item("conferencePaper"); + } else if (mediaType == "journalArticle") { + var newItem = new Zotero.Item("journalArticle"); + } + + var xPathAllData = doc.evaluate('//pre', doc, nsResolver, XPathResult.ANY_TYPE, null); + var allData = xPathAllData.iterateNext().textContent.split("},"); + + var cleanFirstEntry = allData[0].indexOf(","); + allData[0] = allData[0].substr(cleanFirstEntry); + + var headers = new Array(); + var content = new Array(); + var splitAllData; + + for (var i = 0; i < allData.length-2; i++) { + splitAllData = allData[i].split("="); + headers.push(splitAllData[0].replace(/^\s*|\s*$|\W*/g, '')); + content.push(splitAllData[1].replace(/^\s*|\s*$|\{*/g, '')); + + fieldTitle = headers[i].replace(",", ''); + + if (fieldTitle == "author") { + var authors = content[i].split("and"); + + for (var j =0; j<authors.length; j++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author")); + } + } else if (fieldTitle == "editor") { + var editors = content[i].split("and"); + + for (var j =0; j<editors.length; j++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(editors[j], "editor")); + } + } else { + + dataTags[fieldTitle] = content[i]; + } + } + + if (mediaType == "conferencePaper") { + associateData (newItem, dataTags, "booktitle", "conferenceName"); + } else { + associateData (newItem, dataTags, "booktitle", "bookTitle"); + } + + newItem.url = doc.location.href; + + associateData (newItem, dataTags, "year", "date"); + associateData (newItem, dataTags, "pages", "pages"); + associateData (newItem, dataTags, "title", "title"); + associateData (newItem, dataTags, "publisher", "publisher"); + associateData (newItem, dataTags, "volume", "volume"); + associateData (newItem, dataTags, "isbn", "ISBN"); + associateData (newItem, dataTags, "series", "series"); + associateData (newItem, dataTags, "journal", "publicationTitle"); + associateData (newItem, dataTags, "number", "issue"); + + newItem.complete(); + +} + + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + /* Multiple code doesn't work due to Permission denied to get property HTMLDocument.documentElement error. + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + //newer interface xPaths + if (doc.title.match("DEMO")) { + + var titles = doc.evaluate('//a/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//dt/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[links.iterateNext().href] = next_title.textContent; + } + + //older interface xPaths + } else { + + var titles = doc.evaluate('//td[3]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//td[1]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + var split1; + var split2; + + while (next_title = titles.iterateNext()) { + + split1 = next_title.textContent.indexOf(":"); + var title = next_title.textContent.substr(split1+2); + split2 = title.indexOf("."); + title = title.substr(0, split2); + + items[links.iterateNext().href] = title; + } + + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + + } else { + + */ + + articles = [url]; + //} + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/DSpace.js b/translators/DSpace.js @@ -0,0 +1,101 @@ +{ + "translatorID":"0abd577b-ec45-4e9f-9081-448737e2fd34", + "translatorType":4, + "label":"DSpace", + "creator":"Michael Berkowitz", + "target":"(dspace|upcommons.upc.edu)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-06 08:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//table[@class="itemDisplayTable"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "document"; + } else if (doc.evaluate('//table[@class="miscTable"]//td[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//div[@id="main"]/ul[@class="browselist"]/li/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +var itemTypes = { + "Article":"journalArticle", + "Book":"book", + "Thesis":"thesis", + "Working Paper":"report", + "Technical Report":"report" +} + +function doWeb(doc, url) { + var records = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//div[@id="main"]/ul[@class="browselist"]/li/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="main"]/ul[@class="browselist"]/li/a'; + } else { + var xpath = '//table[@class="miscTable"]//td[2]//a'; + } + var rows = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var row; + while (row = rows.iterateNext()) { + items[row.href] = row.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + records.push(i + '?mode=full'); + } + } else { + records = [url.match(/^([^?]+)\??/)[1] + "?mode=full"]; + } + Zotero.Utilities.processDocuments(records, function(newDoc) { + var values = new Object(); + var fields = newDoc.evaluate('//table[@class="itemDisplayTable"]/tbody/tr/td[1]', newDoc, null, XPathResult.ANY_TYPE, null); + var data = newDoc.evaluate('//table[@class="itemDisplayTable"]/tbody/tr/td[2]', newDoc, null, XPathResult.ANY_TYPE, null); + var field2; + var datum2; + var newItem = new Zotero.Item(); + while ((field2 = fields.iterateNext()) && (datum2 = data.iterateNext())) { + var field = field2.textContent.replace(/^dc\./, ""); + var datum = datum2.textContent; + if (field == "contributor.author") { + var name = datum.split(","); + newItem.creators.push({firstName:name[1], lastName:name[0], creatorType:"author"}); + } else if (field == "dentifier.uri") { + newItem.url = datum; + } else if (field == "title") { + newItem.title = datum; + } else if (field == "type") { + if (itemTypes[datum]) { + newItem.itemType = itemTypes[datum]; + } else { + newItem.itemType = "document"; + } + } else if (field == "description.abstract") { + newItem.abstractNote = datum; + } else if (field == "date.available") { + newItem.date = datum.replace(/T.*$/, ""); + } else if (field == "subject") { + newItem.tags.push(datum); + } else if (field == "publisher") { + newItem.publisher = datum; + } else if (field == "identifier.issn") { + newItem.ISSN = datum; + } else if (field == "relation.ispartofseries") { + if (datum.match(/Vol/)) { + newItem.volume = datum.match(/\d+/)[0]; + } else if (datum.match(/No/)) { + newItem.issue = datum.match(/\d+/)[0]; + } + } else if (field == "rights") { + newItem.rights = datum; + } + } + if (newDoc.evaluate('//td[@class="standard"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) var pdf = newDoc.evaluate('//td[@class="standard"]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + newItem.attachments = [{url:newDoc.location.href, title:"DSpace Snapshot", mimeType:"text/html"}]; + if (pdf) { + newItem.attachments.push({url:pdf, title:"DSpace PDF", mimeType:"application/pdf"}); + } + newItem.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/Davidson College Library.js b/translators/Davidson College Library.js @@ -0,0 +1,81 @@ +{ + "translatorID":"8b35ab14-f18a-4f69-8472-b2df18c984da", + "translatorType":4, + "label":"Davidson College Library", + "creator":"Michael Berkowitz", + "target":"http://www.lib.davidson.edu/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-01 04:50:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("log_in") == -1) { + if (url.indexOf("screen=Record") != -1) { + return "book"; + } else { + return "multiple"; + } + } +} + +function doWeb(doc, url) { + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, 'screen=Record.html'); + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i.replace("Record.html", "MARCRecord.html")); + } + } else { + books = [url.replace("Record.html", "MARCRecord.html")]; + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(books, function(newDoc) { + var uri = newDoc.location.href; + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var nonstandard = false; + var xpath; + var xpath = '//td[@class="body"]/p/table/tbody/tr[td[3]]'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.trimInternal(newDoc.evaluate('./td[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if(field) { + var value = newDoc.evaluate('./td[3]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + value = value.replace(/\$([a-z]) /g, marc.subfieldDelimiter+"$1"); + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + + record.addField(code, ind, value); + } + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = "Davidson College Library Catalog"; + newItem.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Digital Humanities Quarterly.js b/translators/Digital Humanities Quarterly.js @@ -0,0 +1,61 @@ +{ + "translatorID":"bbad0221-134b-495a-aa56-d77cfaa67ab5", + "translatorType":4, + "label":"Digital Humanities Quarterly", + "creator":"Michael Berkowitz", + "target":"http://www.digitalhumanities.org/(dhq)?", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-16 04:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="DHQarticle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } else if (doc.evaluate('//div[@id="mainContent"]/div/p', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function scrape(doc, xpath, xdoc) { + return Zotero.Utilities.trimInternal(doc.evaluate(xpath, xdoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object; + var arts = doc.evaluate('//div[@id="mainContent"]/div/p/a', doc, null, XPathResult.ANY_TYPE, null); + var art; + while (art = arts.iterateNext()) { + items[art.href] = art.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i) + } + } else { + articles = [url]; + } + Zotero.debug(articles); + + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var item = new Zotero.Item("journalArticle"); + item.url = newDoc.location.href; + item.title = scrape(newDoc, '//h1[@class="articleTitle"]', newDoc); + var voliss = scrape(newDoc, '//div[@id="pubInfo"]', newDoc); + voliss = voliss.match(/(.*)Volume\s+(\d+)\s+Number\s+(\d+)/); + item.date = voliss[1]; + item.volume = voliss[2]; + item.issue = voliss[3]; + var authors = newDoc.evaluate('//div[@class="author"]', newDoc, null, XPathResult.ANY_TYPE, null); + var aut; + while (aut = authors.iterateNext()) { + item.creators.push(Zotero.Utilities.cleanAuthor(scrape(newDoc, './a[1]', aut), "author")); + } + item.attachments = [{url:item.url, title:"DHQ Snapshot", mimeType:"text/html"}]; + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/EBSCOhost.js b/translators/EBSCOhost.js @@ -0,0 +1,152 @@ +{ + "translatorID":"d0b1914a-11f1-4dd7-8557-b32fe8a3dd47", + "translatorType":4, + "label":"EBSCOhost", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://[^/]+/(?:bsi|ehost)/(?:results|detail|folder)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // See if this is a search results or folder results page + var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(searchResult) { + return "multiple"; + } +/* + var xpath = '//div[@class="citation-wrapping-div"]/dl[@class="citation-fields"]/dt[starts-with(text(), "Persistent link to this record")' + +' or starts-with(text(), "Vínculo persistente a este informe")' + +' or starts-with(text(), "Lien permanent à cette donnée")' + +' or starts-with(text(), "Permanenter Link zu diesem Datensatz")' + +' or starts-with(text(), "Link permanente al record")' + +' or starts-with(text(), "Link permanente para este registro")' + +' or starts-with(text(), "本記錄固定連結")' + +' or starts-with(text(), "此记录的永久链接")' + +' or starts-with(text(), "このレコードへのパーシスタント リンク")' + +' or starts-with(text(), "레코드 링크 URL")' + +' or starts-with(text(), "Постоянная ссылка на эту запись")' + +' or starts-with(text(), "Bu kayda sürekli bağlantı")' + +' or starts-with(text(), "Μόνιμος σύνδεσμος σε αυτό το αρχείο")]'; +*/ + var xpath = '//input[@id="ctl00_ctl00_MainContentArea_MainContentArea_topDeliveryControl_deliveryButtonControl_lnkExportImage"]'; + var persistentLink = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(persistentLink) { + return "journalArticle"; + } +} + +var customViewStateMatch = /<input type="hidden" name="__CUSTOMVIEWSTATE" id="__CUSTOMVIEWSTATE" value="([^"]+)" \/>/ +var host; + +function fullEscape(text) { + return escape(text).replace(/\//g, "%2F").replace(/\+/g, "%2B"); +} + +function generateDeliverString(nsResolver, doc){ + var hiddenInputs = doc.evaluate('//input[@type="hidden" and not(contains(@name, "folderHas"))]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var hiddenInput; + var deliverString =""; + while(hiddenInput = hiddenInputs.iterateNext()) { + deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+encodeURIComponent(hiddenInput.value) + "&"; + } + var otherHiddenInputs = doc.evaluate('//input[@type="hidden" and contains(@name, "folderHas")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while(hiddenInput = otherHiddenInputs.iterateNext()) { + deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+escape(hiddenInput.value).replace(/\//g, "%2F").replace(/%20/g, "+") + "&"; + } + + + deliverString = deliverString + +"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.x=5" + +"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.y=14"; + + return deliverString; +} + +/* + * given the text of the delivery page, downloads an item + */ +function downloadFunction(text) { + var postLocation = /<form name="aspnetForm" method="post" action="([^"]+)"/ + var m = postLocation.exec(text); + var deliveryURL = m[1].replace(/&amp;/g, "&"); + m = customViewStateMatch.exec(text); + var downloadString = "__EVENTTARGET=&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+fullEscape(m[1])+"&__VIEWSTATE=&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24btnSubmit=Save&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24BibFormat=1&ajax=enabled"; + + Zotero.Utilities.HTTP.doPost(host+"/ehost/"+deliveryURL, + downloadString, function(text) { // get marked records as RIS + // load translator for RIS + var test = text.match(/UR\s+\-(.*)/g); + if (test[0].match("@")) text = text.replace(/UR\s+\-(.*)/, ""); + if (text.match(/AB\s\s\-/)) text = text.replace(/AB\s\s\-/, "N2 -"); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (text.match("L3")) { + item.DOI = text.match(/L3\s+\-\s*(.*)/)[1]; + } + item.itemType = "journalArticle"; + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var hostRe = new RegExp("^(https?://[^/]+)/"); + var m = hostRe.exec(url); + host = m[1]; + + var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + + if(searchResult) { + var titlex = '//div[@class="result-list-record" or @class="folder-item-detail"]/span/a'; + var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items = new Object(); + var title; + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + + var items = Zotero.selectItems(items); + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(newDoc){ + var postURL = newDoc.evaluate('//form[@name="aspnetForm"]/@action', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + postURL = host+"/ehost/"+postURL.nodeValue; + var deliverString = generateDeliverString(nsResolver, newDoc); + Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction); + }); + } else { + var postURL = doc.evaluate('//form[@name="aspnetForm"]/@action', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + postURL = host+"/ehost/"+postURL.nodeValue; + var deliverString = generateDeliverString(nsResolver, doc); + Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ERIC.js b/translators/ERIC.js @@ -0,0 +1,109 @@ +{ + "translatorID":"e4660e05-a935-43ec-8eec-df0347362e4c", + "translatorType":4, + "label":"ERIC", + "creator":"Ramesh Srigiriraju", + "target":"^http://(?:www\\.)?eric\\.ed\\.gov/", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-03 19:40:00" +} + +function detectWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var searchpath='//form[@name="searchResultsForm"][@id="searchResultsForm"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; + var singpath='//tr/td[@class="primaryHeader"][contains(text(), "Result Details")]'; + if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var typepath='//tr[td/strong/text()="Pub Types:"]/td[2]/text()'; + var typestr=doc.evaluate(typepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var typereg=new RegExp("([^;/\-]+)"); + var typearr=typereg.exec(typestr); + if(typearr[1]=="Journal Articles") + return "journalArticle"; + if(typearr[1]=="Information Analyses") + return "journalArticle"; + if(typearr[1]="Machine") + return "computerProgram"; + if(typearr[1]="Computer Programs") + return "computerProgram"; + if(typearr[1]="Dissertations") + return "thesis"; + if(typearr[1]="Reports") + return "report"; + if(typearr[1]="Non") + return "audioRecording"; + if(typearr[1]="Legal") + return "statute"; + else + return "book"; + } +} + +function doWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var searchpath='//form[@name="searchResultsForm"][@id="searchResultsForm"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp"; + var idpath='//a[img]/@id'; + var ids=doc.evaluate(idpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items=new Array(); + var titlpath='//tr[1]/td[1]/p/a'; + var titlerows=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var id; + while(id=ids.iterateNext()) + items[id.nodeValue]=Zotero.Utilities.cleanTags(Zotero.Utilities.cleanString(titlerows.iterateNext().textContent)); + items=Zotero.selectItems(items); + var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?"; + for(var ids in items) + string+="accno="+ids+"&"; + string+="texttype=endnote&citationtype=brief&Download.x=86&Download.y=14"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.setHandler("itemDone", function(obj, newItem) { + var linkpath='//tbody[tr/td/a/@id="'+newItem.itemID+'"]/tr/td/p/a[@class="action"]'; + var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(link) + newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"}); + newItem.complete(); + }); + trans.translate(); + Zotero.done(); + }); + Zotero.wait(); + } + var singpath='//tr/td[@class="primaryHeader"][contains(text(), "Result Details")]'; + if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var idpath='//input[@type="hidden"][@name="accno"]/@value'; + var idpath2='//meta[@name="eric #"]/@content'; + var id = url.match(/accno=([^&]+)/)[1]; + var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?accno="; + string+= id+"&texttype=endnote&citationtype=brief&Download.x=86&Download.y=14"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.setHandler("itemDone", function(obj, newItem) { + var linkpath='//tr/td/p[img/@alt="PDF"]/a'; + var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(link) + newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"}); + newItem.complete(); + }); + trans.translate(); + Zotero.done(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/ESA Journals.js b/translators/ESA Journals.js @@ -0,0 +1,94 @@ +{ + "translatorID":"5af42734-7cd5-4c69-97fc-bc406999bdba", + "translatorType":4, + "label":"ESA Journals", + "creator":"Michael Berkowitz", + "target":"http://www.esajournals.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-10 06:15:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("get-toc") != -1 || url.indexOf("searchtype") != -1) { + return "multiple"; + } else if (url.indexOf("get-document") != -1 || url.indexOf("get-abstract") != -1) { + return "journalArticle"; + } +} + +function senCase(string) { + var smallwords = Array("AND", "A", "IN", "THE", "BY", "OF"); + var sen = string.split(/\b/); + for (var i = 0 ; i < sen.length; i++) { + if (sen[i].match(/\w+/)) { + if (smallwords.indexOf(sen[i]) != -1 && i != 0) { + sen[i] = sen[i].toLowerCase(); + } else { + sen[i] = sen[i][0] + sen[i].substring(1).toLowerCase(); + } + } + } + return sen.join(""); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var resultItems = doc.evaluate('//div[@class="nocolumn"][@id="content"]/div//*[@class="group"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_item; + while (next_item = resultItems.iterateNext()) { + var link = doc.evaluate('.//a[1]', next_item, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var title = senCase(doc.evaluate('.//*[@class="title"]', next_item, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles.push(url); + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var newlink = newDoc.evaluate('//a[text() = "Create Reference"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var itemurl = newDoc.location.href; + if (newDoc.evaluate('//a[text() = "Full Text"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + itemurl = newDoc.evaluate('//a[text() = "Full Text"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + } + if (newDoc.evaluate('//div[@class="doc-head"]/p[contains(text(), "DOI")][@class="info"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doi = newDoc.evaluate('//div[@class="doc-head"]/p[contains(text(), "DOI")][@class="info"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + doi = Zotero.Utilities.trimInternal(doi.substr(4)); + } + var issn = newDoc.evaluate('//div[@id="pageTitle"]/p/a', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.match(/issn=([^&]+)/)[1]; + newlink = newlink.replace('cite-builder', 'download-citation&t=refman&site=esaonline'); + Zotero.Utilities.HTTP.doGet(newlink, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = decodeURIComponent(itemurl); + if (doi) item.DOI = decodeURIComponent(doi); + var bits = new Array(issn, item.volume, item.issue); + var pdfurl = 'http://www.esajournals.org/archive/' + bits.join("/") + "/pdf/i" + bits.join("-") + "-" + item.pages.match(/\d+/)[0] + ".pdf"; + item.attachments = [ + {url:item.url, title:"ESA Journals Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"ESA Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ESpacenet.js b/translators/ESpacenet.js @@ -0,0 +1,174 @@ +{ + "translatorID":"176948f7-9df8-4afc-ace7-4c1c7318d426", + "translatorType":4, + "label":"ESpacenet", + "creator":"Gilles Poulain", + "target":"http://v3.espacenet.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + + if(doc.location.href.match("results?")) { + return "multiple"; + } else if (doc.location.href.match("textdoc")) { + return "patent"; + } + } + +function doWeb(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[3]/strong/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} + +function getItem(reftext,re) { + var item = reftext.match(re); + return item[1]; +} + +function scrape(doc,url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + + //Get title + var xpath = "/html/body/form/table[2]/tbody/tr[1]/td[3]/h2"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var title = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + + var title1 = title.split(" "); + for (var j in title1) { + title1[j] = title1[j][0].toUpperCase() + title1[j].substr(1).toLowerCase(); + } + title = title1.join(" "); + } + + //Get Abstract + var xpath = '//td[@id="abCell"]'; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var abstract = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get Applicant + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[4]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var applicant = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get application number + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[8]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var anumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get patent number + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[1]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var pnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get CIB + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[6]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var CIBnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get ECLA + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[7]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var tmpECLAnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + tmpECLAnumber = tmpECLAnumber.substr(24); + tmpECLAnumber = tmpECLAnumber.replace(/\)+/g, '; '); + var aus = tmpECLAnumber.split("; "); + var ECLAnumber = ""; + for (var i=0; i< aus.length/2 ; i++){ + ECLAnumber = ECLAnumber + aus[i] + "; " + } + } + + //Get priority number + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[9]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var prnumber = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + + //Get date + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[2]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var date = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Get Creators + var xpath = "//table[1]/tbody/tr/td[1]/table/tbody/tr[3]/td[2]"; + if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var author = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + //Create Zotero Ref + var newArticle = new Zotero.Item('patent'); + newArticle.url = doc.location.href; + newArticle.title = title; + newArticle.date = date; + newArticle.abstractNote = abstract; + newArticle.assignee = applicant; + newArticle.patentNumber = pnumber; + newArticle.priorityNumbers = prnumber; + newArticle.applicationNumber = anumber; + newArticle.extra = "CIB: " + CIBnumber + "\nECLA: " + ECLAnumber + + var author1 = author.split("; "); +; + for (var m = 0; m< author1.length; m++) { + + if (author1[m].match(/\(/)) { + author1[m] = author1[m].substr(0, author1[m].length-5); + } + words = author1[m].split(/\s/); + + for (var j in words) { + words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase(); + } + + var inventor = ''; + for (var k = 1; k < words.length; k++) { + inventor = inventor +words[k] + " "; + if (k == words.length-1) { + inventor = inventor +words[0]; + newArticle.creators.push(Zotero.Utilities.cleanAuthor(inventor, "inventor")); + } + } + } + + newArticle.complete(); +} +\ No newline at end of file diff --git a/translators/Early English Books Online.js b/translators/Early English Books Online.js @@ -0,0 +1,73 @@ +{ + "translatorID":"b86bb082-6310-4772-a93c-913eaa3dfa1b", + "translatorType":4, + "label":"Early English Books Online", + "creator":"Michael Berkowitz", + "target":"http://[^/]*eebo.chadwyck.com[^/]*/search", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-11 19:30:00" +} + +function detectWeb(doc, url) { + if (doc.title == "Search Results - EEBO") { + return "multiple"; + } else if (doc.title != "Basic Search - EEBO") { + return "book"; + } +} + +function doWeb(doc, url) { + var eeboIDs = new Array(); + + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + var hMatch = hostRegexp.exec(url); + var host = hMatch[1]; + + if (doc.title == "Search Results - EEBO") { + var items = new Object(); + Zotero.debug("search page"); + var IDxpath = '//td[3]/script'; + var Titlexpath = '//td[3]/i'; + var new_ids = doc.evaluate(IDxpath, doc, null, XPathResult.ANY_TYPE, null); + var new_titles = doc.evaluate(Titlexpath, doc, null, XPathResult.ANY_TYPE, null); + var next_id = new_ids.iterateNext(); + var next_title = new_titles.iterateNext(); + var IDRegex = /'(\d+)'/; + while (next_id) { + items[next_id.textContent.match(IDRegex)[1]] = next_title.textContent; + next_id = new_ids.iterateNext(); + next_title = new_titles.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + eeboIDs.push(i); + } + } else { + var IDRegex = /&ID=(\w+)&/ + var eeboid = url.match(IDRegex)[1]; + if (eeboid[0] == "D") { + eeboid = eeboid.slice(7, 14); + } + eeboIDs.push(eeboid); + } + Zotero.debug(eeboIDs); + for (var i = 0 ; i < eeboIDs.length ; i++) { + var postString = 'cit_format=RIS&Print=Print&cit_eeboid=' + eeboIDs[i] + '&EeboId=' + eeboIDs[i]; + var new_eeboid = eeboIDs[i] + Zotero.Utilities.HTTP.doPost(host+'/search/print', postString, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text.substring(17)); + translator.setHandler("itemDone", function(obj, item) { + item.url = host+'/search/full_rec?SOURCE=pgimages.cfg&ACTION=ByID&ID=' + new_eeboid + '&FILE=../session/1190302085_15129&SEARCHSCREEN=CITATIONS&SEARCHCONFIG=config.cfg&DISPLAY=ALPHA'; + item.complete(); + }); + translator.translate(); + Zotero.done(); + }); + } +} +\ No newline at end of file diff --git a/translators/Education Week.js b/translators/Education Week.js @@ -0,0 +1,95 @@ +{ + "translatorID":"7e51d3fb-082e-4063-8601-cda08f6004a3", + "translatorType":4, + "label":"Education Week", + "creator":"Ben Parr", + "target":"^https?://(?:www\\.|blogs\\.|www2\\.)?edweek", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath='//meta[@name="Story_type"]/@content'; + var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + { + if(temp.value=="Blog") + {return "blogPost";} + if(temp.value.indexOf("Story")>-1) + {return "magazineArticle";} + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags[field]) { + newItem[zoteroField] = metaTags[field]; + } +} + +function scrape(doc, url) { + + var newItem = new Zotero.Item("magazineArticle"); + if(url&&url.indexOf("blogs.edweek.org")>-1) + {newItem.itemType="blogPost";} + + newItem.url = doc.location.href; + + var metaTags = new Object(); + + var metaTagHTML = doc.getElementsByTagName("meta"); + var i; + for (i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")]=Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + } + associateMeta(newItem, metaTags, "Title", "title"); + associateMeta(newItem, metaTags, "Cover_date", "date"); + associateMeta(newItem, metaTags, "Description", "abstractNote"); + associateMeta(newItem, metaTags, "ArticleID", "accessionNumber"); + associateMeta(newItem,metaTags,"Source","publicationTitle"); + + + if (metaTags["Authors"]) { + var author = Zotero.Utilities.cleanString(metaTags["Authors"]); + if (author.substr(0,3).toLowerCase() == "by ") { + author = author.substr(3); + } + + var authors = author.split(" and "); + for each(var author in authors) { + var words = author.split(" "); + for (var i in words) { + words[i] = words[i][0].toUpperCase() +words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + newItem.complete(); +} + +function doWeb(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath='//meta[@name="Story_type"]/@content'; + var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + if(temp) + { + if(temp.value.indexOf("Story")>-1 || temp.value=="Blog") + {scrape(doc,url);} + } +} +\ No newline at end of file diff --git a/translators/Edutopia.js b/translators/Edutopia.js @@ -0,0 +1,139 @@ +{ + "translatorID":"3f44a651-8b6b-4591-8ca4-4bfb943a13f4", + "translatorType":4, + "label":"Edutopia", + "creator":"Adam Crymble", + "target":"http://www.edutopia.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb(doc, url) { + + var blog1 = 0; + + if (doc.title.match("blog")) { + blog1 = 1; + } + + if (doc.location.href.match("search")) { + return "multiple"; + } else if (blog1 == 0 && doc.evaluate('//h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "newspaperArticle"; + } +} + +//Edutopia.org translator. Code by Adam Crymble + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags[field]) { + newItem[zoteroField] = metaTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var author; + var authorCheck = 0; + var tagsContent = new Array(); + + var newItem = new Zotero.Item("newspaperArticle"); + +//title + var title1 = doc.title.split("|"); + newItem.title = title1[0]; + +//author + if (doc.evaluate('//div[@id="article"]/h4/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + author = doc.evaluate('//div[@id="article"]/h4/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + authorCheck = 1; + + } else if (doc.evaluate('//div[@id="pollpage"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + author = doc.evaluate('//div[@id="pollpage"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + authorCheck = 1; + + } else if (doc.evaluate('//div[@class="blog"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + author = doc.evaluate('//div[@class="blog"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + authorCheck = 1; + } + + if (authorCheck == 1) { + if (author.toLowerCase().match(/^by /)) { + author = author.substr(3); + } + Zotero.debug(author); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + +//abstract + if (doc.evaluate('//div[@class="dek"]/h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = (doc.evaluate('//div[@class="dek"]/h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + +//date + if (doc.evaluate('/span[@class="blog_date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.date = doc.evaluate('/span[@class="blog_date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var metaTags = new Object(); + + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + } + + if (metaTags["keywords"]) { + tagsContent = (metaTags["keywords"].split(', ')); + } + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + + associateMeta (newItem, metaTags, "description", "abstractNote"); + + newItem.publication = "Edutopia.org" + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//dt[@class="title"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Eighteenth Century Collections Online.js b/translators/Eighteenth Century Collections Online.js @@ -0,0 +1,160 @@ +{ + "translatorID":"00ce0d68-9205-40e6-91f4-c96f7ab296c2", + "translatorType":4, + "label":"Eighteenth Century Collections Online", + "creator":"Adam Crymble", + "target":"http://galenet.galegroup.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td[2][@class="stnd"]/a/i/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//td[3]/span[@class="stnd"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "bookSection"; + } else if (doc.evaluate('//span[@class="stnd"]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + + +//Eighteenth Century Collections Online translator. Code by Adam Crymble + + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//td[1][@class="stnd"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td[2][@class="stnd"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + while (fieldTitle = headers.iterateNext()) { + + fieldTitle = fieldTitle.textContent.replace(/\s+/g, ''); + fieldContent = contents.iterateNext().textContent; + + while (fieldContent.length<2) { + if (fieldContent.match(/\d/)) { + break; + } else { + fieldContent = contents.iterateNext().textContent; + } + } + dataTags[fieldTitle] = fieldContent.replace(/^\s*|\s*$/g, ''); + } + + if (dataTags["Author"]) { + if (dataTags["Author"].match(/\n/)) { + var author = dataTags["Author"].split(/\n/); + dataTags["Author"] = author[0]; + + } + if (dataTags["Author"].match(", ")) { + var author = dataTags["Author"].split(", "); + author = author[1] + " " + author[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author")); + } + } + + if (dataTags["GaleDocumentNumber"]) { + newItem.extra = "Gale Document Number: " + dataTags["GaleDocumentNumber"]; + } + + if (dataTags["18thCenturyMicrofilmReel#"]) { + newItem.locInArchive = "18th Century Microfilm Reel #: " + dataTags["18thCenturyMicrofilmReel#"]; + } + + if (dataTags["Imprint"]) { + if (dataTags["Imprint"].match(": ")) { + var place1 = dataTags["Imprint"].split(": "); + newItem.place = place1[0]; + if (place1[1].match(", ")) { + var pub1 = place1[1].split(", "); + newItem.publisher = pub1[0]; + newItem.date = pub1[1]; + } else { + newItem.publisher = place1[1]; + } + } else { + newItem.publisher = dataTags["Imprint"]; + } + } + + associateData (newItem, dataTags, "Title", "title"); + associateData (newItem, dataTags, "Language", "language"); + associateData (newItem, dataTags, "Pages", "page"); + associateData (newItem, dataTags, "SourceLibrary", "repository"); + associateData (newItem, dataTags, "Volume", "volume"); + associateData (newItem, dataTags, "Notes", "abstractNote"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var items = new Object(); + var articles1 = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var titles = doc.evaluate('//td[2][@class="stnd"]/a/i/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//td[2][@class="stnd"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + var link = links.iterateNext(); + + while (link.textContent!="Full Citation") { + link = links.iterateNext(); + } + + items[link.href] = next_title.textContent; + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles1.push(i); + } + + } else if (detectWeb(doc, url) == "bookSection") { + + var links = doc.evaluate('//td[3]/span[@class="stnd"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var articles = links.iterateNext(); + Zotero.debug(articles); + + articles1.push(articles.href); + + } else { + articles1 = [url]; + } + + Zotero.Utilities.processDocuments(articles1, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Embedded RDF.js b/translators/Embedded RDF.js @@ -0,0 +1,66 @@ +{ + "translatorID":"951c027d-74ac-47d4-a107-9c3069ab7b48", + "translatorType":4, + "label":"Embedded RDF", + "creator":"Simon Kornblith", + "target":null, + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":400, + "inRepository":true, + "lastUpdated":"2008-03-14 18:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("reprint") != -1) return false; + var metaTags = doc.getElementsByTagName("meta"); + for(var i=0; i<metaTags.length; i++) { + var tag = metaTags[i].getAttribute("name"); + if(tag && tag.substr(0, 3).toLowerCase() == "dc.") { + return "webpage"; + } + } + + return false; +} + +function doWeb(doc, url) { + var dc = "http://purl.org/dc/elements/1.1/"; + + // load RDF translator, so that we don't need to replicate import code + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("5e3ad958-ac79-463d-812b-a86a9235c28f"); + translator.setHandler("itemDone", function(obj, newItem) { + // use document title if none given in dublin core + if(!newItem.title) { + newItem.title = doc.title; + } + // add attachment + newItem.attachments.push({document:doc}); + // add url + newItem.url = doc.location.href; + newItem.repository = false; + newItem.complete(); + }); + var rdf = translator.getTranslatorObject(); + + var metaTags = doc.getElementsByTagName("meta"); + var foundTitle = false; // We can use the page title if necessary + for(var i=0; i<metaTags.length; i++) { + var tag = metaTags[i].getAttribute("name"); + var value = metaTags[i].getAttribute("content"); + if(tag && value && tag.substr(0, 3).toLowerCase() == "dc.") { + if(tag == "dc.title") { + foundTitle = true; + } + rdf.Zotero.RDF.addStatement(url, dc + tag.substr(3).toLowerCase(), value, true); + } else if(tag && value && (tag == "author" || tag == "author-personal")) { + rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true); + } else if(tag && value && tag == "author-corporate") { + rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true); + } + } + + rdf.defaultUnknownType = "webpage"; + rdf.doImport(); +} +\ No newline at end of file diff --git a/translators/Emerald Publishing.js b/translators/Emerald Publishing.js @@ -0,0 +1,84 @@ +{ + "translatorID":"79f6f9ed-537a-4d4f-8270-c4fbaafdf327", + "translatorType":4, + "label":"Emerald Publishing", + "creator":"Michael Berkowitz", + "target":"www.emeraldinsight.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (url.match('searchQuickOptions.do')) { + return "multiple" + } else if (url.match('viewContentItem')) { + return "journalArticle"; + } +} + +var tags = { + journal:"publicationTitle", + year:"date", + volume:"volume", + issue:"issue", + page:"pages", + doi:"DOI", +// publisher:"repository", + 'article url':"url", + abstract:"abstractNote" +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//td[3][@class="resultTd"]/a[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.trimInternal(doc.title.split('-')[1]); + + var data = new Object(); + var values = doc.evaluate('//div[@class="browseBoxGreen"]/div[@class="toc"]/p[@class="inline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var fields = doc.evaluate('//div[@class="browseBoxGreen"]/div[@class="toc"]/h3', doc, nsResolver, XPathResult.ANY_TYPE, null); + var value; + var field; + while ((field = fields.iterateNext()) && (value = values.iterateNext())) { + data[Zotero.Utilities.trimInternal(field.textContent.toLowerCase()).replace(':', '')] = value.textContent; + } + var values = doc.evaluate('//div[@id="centerLeft"]/p[@class="inline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var fields = doc.evaluate('//div[@id="centerLeft"]/h3[@class="inline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while ((field = fields.iterateNext()) && (value = values.iterateNext())) { + data[Zotero.Utilities.trimInternal(field.textContent.toLowerCase()).replace(':', '')] = value.textContent; + } + for (var tag in data) { + if (tags[tag]) item[tags[tag]] = Zotero.Utilities.trimInternal(data[tag]); + } + item.attachments = [{url:item.url, title:"Emerald Insight Snapshot", mimeType:"text/html"}]; + item.tags = Zotero.Utilities.trimInternal(data['keywords']).split(/,\s+/); + var authors = data['author(s)'].split(/,\s+/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Engineering Village.js b/translators/Engineering Village.js @@ -0,0 +1,125 @@ +{ + "translatorID":"1f40baef-eece-43e4-a1cc-27d20c0ce086", + "translatorType":4, + "label":"Engineering Village", + "creator":"Ben Parr", + "target":"^https?://(?:www\\.)?engineeringvillage(2)?\\.(?:com|org)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 19:40:00" +} + +function detectWeb(doc, url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath='//a[img/@style="vertical-align: middle;"][@href]'; + if(doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { return "journalArticle";} + + xpath='//input[@name="cbresult"]/@onclick'; + if(doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { return "multiple";} + + return null; +} + +function parseRIS(uris) +{ + Zotero.Utilities.HTTP.doGet(uris, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + +//creates the link to the RIS file +function createURL(EISESSION,docidlist,curURL) +{ + var milli = (new Date()).getTime(); + var temp = curURL.split('/'); + var url = temp.slice(0,temp.length-1).join('/') + "/Controller?EISESSION="+EISESSION; + url+="&CID=downloadSelectedRecordsris&format=ris&displayformat=fullDoc&timestamp=" + url+=milli; + url+="&docidlist="; + url+=docidlist; + url+="&handlelist=1"; + return url; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var url; + var xpath='//a[img/@style="vertical-align: middle;"][@href]'; + if(doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext()) + { + xpath='//a[@class="MedBlueLink"][img]/@onclick'; + var temp=doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + var docidlist=temp.value; + + docidlist=docidlist.split("MID=")[1]; + docidlist=docidlist.split("&")[0]; + + xpath='//a[img/@style="vertical-align: middle;"][@href]'; + temp=doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext(); + + var EISESSION =temp.href; + EISESSION=EISESSION.split("('")[1]; + EISESSION=EISESSION.split("'")[0]; + url=createURL(EISESSION,docidlist,doc.location.href); + parseRIS(url); + } + else + { + xpath='//input[@NAME="sessionid"]'; + var EISESSION=doc.evaluate(xpath, doc, + nsResolver,XPathResult.ANY_TYPE,null).iterateNext().value; + + xpath='//input[@name="cbresult"]/@onclick'; + + var items=new Array(); + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null); + var xpath2='//a[@class="MedBlackText"]/b'; + xpath2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE,null); + var title; + var docidlist; + while(row=rows.iterateNext()) + { + docidlist=row.value; + docidlist=docidlist.split("'")[1]; + + url=createURL(EISESSION,docidlist,doc.location.href); + + title=xpath2.iterateNext(); + title=title.textContent; + + items[url]=title; + } + items = Zotero.selectItems(items); + if(!items) return true; + var dois=""; + var theurls= new Array(); + for(var thelink in items) + { + theurls.push(thelink); + } + parseRIS(theurls); + } +} +\ No newline at end of file diff --git a/translators/Epicurious.js b/translators/Epicurious.js @@ -0,0 +1,150 @@ +{ + "translatorID":"aee2323e-ce00-4fcc-a949-06eb1becc98f", + "translatorType":4, + "label":"Epicurious", + "creator":"Sean Takats", + "target":"^https?://www\\.epicurious\\.com/(?:tools/searchresults|recipes/food/views)", + "minVersion":"1.0.0", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//div[@id="ingredients"]'; + var multxpath = '//table[@class="search-results"]/tbody/tr'; + + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "document"; + } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } + +} + +function cleanText(s){ + s = s.replace(/\n+/g, "\n"); + s = s.replace(/(\n|\r)\t+/g, "\n"); + s = s.replace(/\t+/g, " "); + s = s.replace(" ", "", "g"); + return s; +} + +function scrape(doc){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("document"); + + var xpath = '//title'; + var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + title = Zotero.Utilities.trimInternal(title); + title = title.substring(0, title.indexOf(" Recipe at Epicurious.com")); + newItem.title = title; + + var elmt; + + xpath = '//p[@class="source"]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if (elmt = elmts.iterateNext()){ + var authordate = elmt.textContent; + var authordates = authordate.split("|"); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authordates[0], "contributor", true)); + var datestring = authordates[1].toString(); + datestring = datestring.replace("Copyright", ""); + newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(datestring)); + while (elmt = elmts.iterateNext()){ + Zotero.debug("looping?"); + Zotero.debug(elmt.textContent); + newItem.creators.push(Zotero.Utilities.cleanAuthor(elmt.textContent, "contributor", false)); + } + } + + xpath = '//div[@id="recipe_intro"]/p'; + if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var abstract = elmt.textContent; + abstract = Zotero.Utilities.cleanString(abstract); + newItem.abstractNote = abstract; + } + + xpath = '//div[@id="ingredients"]'; + if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var ingredients = elmt.textContent; + ingredients = Zotero.Utilities.superCleanString(ingredients); + ingredients = cleanText(ingredients); + } + xpath = '//div[@id="preparation"]'; + if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var prep = elmt.textContent; + prep = Zotero.Utilities.superCleanString(prep); + prep = cleanText(prep); + prep = prep.replace(/\n/g, "\n\n"); + } + xpath = '//div[@id="recipe_summary"]/p'; + if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var serving = elmt.textContent; + serving = Zotero.Utilities.superCleanString(serving); + serving = cleanText(serving); + } +// notestring = ingredients + "\n\n" + prep + "\n\n" + serving; +// newItem.notes.push({note:notestring}); + newItem.notes.push({note:ingredients}); + newItem.notes.push({note:prep}); + newItem.notes.push({note:serving}); + + var url = doc.location.href; + + var snapshotURL = url.replace("/views/", "/printerfriendly/"); + newItem.attachments.push({title:"Epicurious.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true}); + newItem.url = url; + newItem.attachments.push({title:"Epicurious.com Link", snapshot:false, mimeType:"text/html", url:url}); + + newItem.complete(); +} + +function doWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var singxpath = '//div[@id="ingredients"]'; + var multxpath = '//table[@class="search-results"]/tbody/tr'; + if(doc.evaluate(singxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + // single recipe page + scrape(doc, url); + } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var items = new Object(); + var elmtxpath = '//div[@id="resultstable"]/table[@class="search-results"]/tbody/tr/td[3][@class="name"]/a[@class="hed"]'; + var elmts = doc.evaluate(elmtxpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + while (elmt = elmts.iterateNext()) { + var title = elmt.textContent; + var link = elmt.href; + if (title && link){ + items[link] = title; + } + } + + var items = Zotero.selectItems(items); + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/European Educational Research Journal.js b/translators/European Educational Research Journal.js @@ -0,0 +1,87 @@ +{ + "translatorID":"2e304579-dd7b-4770-85e9-0d724c9b49a5", + "translatorType":4, + "label":"European Educational Research Journal", + "creator":"Michael Berkowitz", + "target":"http://www.wwwords.co.uk/eerj/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@id="maincontent"]/table[*//p[@class="articletitle"]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function titleCase(str) { + var skipWords = ["but", "or", "yet", "so", "for", "and", "nor", "a", "an", "the", "at", "by", "from", "in", "into", "of", "on", "to", "with", "up", "down", "as"]; + var words = str.toLowerCase().split(/\s+/); + var newstr = ""; + for each (var word in words) { + if (skipWords.indexOf(word.replace(/[^a-zA-Z]+/, "")) != -1) { + newstr += " " + word; + } else if (word.indexOf("-") != -1) { + newword = word.split("-"); + newstr += " " + newword[0][0].toUpperCase() + newword[0].substr(1) + "-" + newword[1][0].toUpperCase() + newword[1].substr(1); + } else { + newstr += " " + word[0].toUpperCase() + word.substr(1); + } + } + return Zotero.Utilities.trimInternal(newstr); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return false; + } : null; + var items = new Object(); + var titles = doc.evaluate('//p[@class="articletitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + var text = Zotero.Utilities.trimInternal(title.textContent); + items[text] = text; + } + items = Zotero.selectItems(items); + Zotero.debug(items); + + var articles = doc.evaluate('//div[@id="maincontent"]/table[*//p[@class="articletitle"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var art; + while (art = articles.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate('.//p[@class="articletitle"]', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (items[title]) { + var pdfurl = doc.evaluate('.//a[contains(text(), "FULL TEXT")]', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var item = new Zotero.Item("journalArticle"); + item.publicationTitle = "European Educational Research Journal"; + item.ISSN = "1474-9041"; + item.url = url; + item.title = title; + var voliss = doc.title.match(/\-\s+(.*)$/)[1]; + voliss = voliss.match(/Volume\s+(\d+)\s+Issue\s+(\d+)\s+\((\d+)\)/); + item.volume = voliss[1]; + item.issue = voliss[2]; + item.date = voliss[3]; + + var authors = doc.evaluate('.//tr[2]/td', art, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var ibits = doc.evaluate('.//tr[2]/td//i', art, nsResolver, XPathResult.ANY_TYPE, null); + var ibit = ""; + var bit; + while (bit = ibits.iterateNext()) { + authors = authors.replace(bit.textContent, ","); + } + authors = authors.split(/\s*(,|&)\s*/); + for each (var aut in authors) { + if (aut.match(/\w/)) { + aut = titleCase(Zotero.Utilities.trimInternal(aut)); + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + item.attachments = [{url:pdfurl, title:"EERJ Full Text PDF", mimeType:"application/pdf"}]; + item.complete(); + } + } +} +\ No newline at end of file diff --git a/translators/Factiva.js b/translators/Factiva.js @@ -0,0 +1,136 @@ +{ + "translatorID":"7bdb79e-a47f-4e3d-b317-ccd5a0a74456", + "translatorType":4, + "label":"Factiva", + "creator":"Simon Kornblith", + "target":"https?://[^/]*global\\.factiva\\.com[^/]*/ha/default\\.aspx$", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-20 19:10:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.evaluate('//tr[@class="headline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + if(doc.body.className == 'articleView') { + return "newspaperArticle"; + } else { + return "multiple"; + } + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var items = new Array(); + var singlePage = doc.body.className == 'articleView'; + + var tableRows = doc.evaluate('//tr[@class="headline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + while(tableRow = tableRows.iterateNext()) { + var hdl = doc.evaluate('.//input[@name="hdl"]', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + if(!singlePage){ + items[hdl] = Zotero.Utilities.cleanString(tableRow.getElementsByTagName("a")[0].textContent); + } else { + var m = doc.evaluate('.//td[@class="count"]', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().textContent.match(/[0-9]+/); + items[m[0]] = hdl; + } + } + + if(!singlePage) { + items = Zotero.selectItems(items); + if(!items) return true; + + var hdls = new Array(); + for(var hdl in items) { + hdls.push(hdl); + } + } else { + var m = doc.evaluate('//div[@class="articleHeader"][@id="artHdr1"]/span[substring(text(), 1, 7) = "Article"]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/[0-9]+/); + var hdls = [items[m[0]]]; + } + + var post = ""; + + var hiddenInputs = doc.evaluate('//form[@name="PageBaseForm"]//input[@type="hidden"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var hiddenInput; + while(hiddenInput = hiddenInputs.iterateNext()) { + // this is some weird shit, but apparently they're very picky + post = post+"&"+hiddenInput.name+"="+escape(hiddenInput.value).replace(/\+/g, "%2B").replace(/\%20/g, "+"); + } + + var selects = doc.evaluate('//form[@name="PageBaseForm"]//select', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var select; + while(select = selects.iterateNext()) { + post = post+"&"+select.name+"="+escape(select.options[select.selectedIndex].value); + } + + for each(var hdl in hdls) { + post += "&hdl="+escape(hdl); + } + post = post.substr(1); + + Zotero.Utilities.HTTP.doPost("http://global.factiva.com/pps/default.aspx?pp=XML", post, function(text) { + // Remove xml parse instruction and doctype + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + // kill the XML namespace, too, because we have no way of knowing what it will be, which presents a problem + text = text.replace(/<ppsArticleResponse xmlns="[^"]+">/, "<ppsArticleResponse>"); + // kill hlt tags; they just make parsing harder + text = text.replace(/<\/?hlt>/g, ""); + var xml = new XML(text); + + // loop through articles + for each(var ppsarticle in xml[0]..ppsarticle) { + var article = ppsarticle.article; + var newItem = new Zotero.Item("newspaperArticle"); + + newItem.title = Zotero.Utilities.cleanString(article.headline.paragraph.text().toString()); + newItem.publicationTitle = Zotero.Utilities.cleanString(article.sourceName.text().toString()); + for each(var tag in article..name) { + newItem.tags.push(tag.text().toString()); + } + newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(article.publicationDate.date.text().toString())); + if(article.byline.length()) { + var byline = Zotero.Utilities.cleanString(article.byline.text().toString().replace(/By/i, "")); + var authors = byline.split(/ (?:\&|and) /i); + for each(var author in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + newItem.section = article.sectionName.text().toString(); + newItem.edition = article.edition.text().toString(); + + if(article.pages.length()) { + newItem.pages = ""; + for each(var page in article.pages.page) { + newItem.pages += ","+page.text().toString(); + } + newItem.pages = newItem.pages.substr(1); + } + + var m = article.volume.text().toString().match(/ISSN[:\s]*([\-0-9]{8,9})/i); + if(m) newItem.ISSN = m[1]; + + newItem.complete(); + } + + Zotero.done(); + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Flickr.js b/translators/Flickr.js @@ -0,0 +1,149 @@ +{ + "translatorID":"5dd22e9a-5124-4942-9b9e-6ee779f1023e", + "translatorType":4, + "label":"Flickr", + "creator":"Sean Takats", + "target":"^http://(?:www\\.)?flickr\\.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-01 17:20:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (elmt = doc.evaluate('//h1[@property="dc:title" and starts-with(@id, "title_div")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "artwork"; + } else if (doc.evaluate('//td[@class="DetailPic"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } else if (doc.evaluate('//div[@class="StreamView"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } else if (doc.evaluate('//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } else if (doc.evaluate('//p[@class="StreamList" or @class="UserTagList"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var items = new Object(); + var photo_ids = new Array(); + var uris = new Array(); + var key = "3cde2fca0879089abf827c1ec70268b5"; + + var elmts; + var elmt; + +// single result + if (elmt = doc.evaluate('//h1[@property="dc:title" and starts-with(@id, "title_div")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var photo_id = elmt.id; + photo_id = photo_id.substr(9); + photo_ids.push(photo_id); + } else { //multiple results + var photoRe = /\/photos\/[^\/]*\/([0-9]+)\//; +//search results + if (doc.evaluate('//td[@class="DetailPic"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//td[@class="DetailPic"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (elmt = elmts.iterateNext()){ + var title = elmt.title; + title = Zotero.Utilities.trimInternal(title); + var link = elmt.href; + var m = photoRe(link); + var photo_id = m[1]; + items[photo_id] = title; + } +// photo stream + } else if (doc.evaluate('//div[@class="StreamView"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//div[@class="StreamView" and starts-with(@id, "sv_title_")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (elmt = elmts.iterateNext()){ + var title = Zotero.Utilities.trimInternal(elmt.textContent); + var photo_id = elmt.id; + photo_id = photo_id.substr(9); + items[photo_id] = title; + } +// photo set + } else if (doc.evaluate('//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (elmt = elmts.iterateNext()){ + var title = Zotero.Utilities.trimInternal(elmt.title); + var photo_id = elmt.id.substr(15); + items[photo_id] = title; + } +// tagged with + } else if (doc.evaluate('//p[@class="StreamList" or @class="UserTagList"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var elmts = doc.evaluate('//p[@class="StreamList" or @class="UserTagList"]//a[img]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (elmt = elmts.iterateNext()){ + var title = Zotero.Utilities.trimInternal(elmt.title); + var link = elmt.href; + var m = photoRe(link); + var photo_id = m[1]; + items[photo_id] = title; + } + } + items = Zotero.selectItems(items); + if(!items) return true; + for(var i in items) { + photo_ids.push(i); + } + } + for each(var photo_id in photo_ids){ + uris.push("http://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key="+key+"&photo_id="+photo_id); + } + Zotero.Utilities.HTTP.doGet(uris, function(text) { + text = text.replace(/<\?xml[^>]*\?>/, ""); + var xml = new XML(text); + var newItem = new Zotero.Item("artwork"); + var title = ""; + if (xml..title.length()){ + var title = Zotero.Utilities.cleanString(xml..title[0].text().toString()); + if (title == ""){ + title = " "; + } + newItem.title = title; + } + for(var i=0; i<xml..tag.length(); i++) { + newItem.tags.push(Zotero.Utilities.cleanString(xml..tag[i].text().toString())); + } + if (xml..dates.length()){ + var date = xml..dates[0].@taken.toString(); + newItem.date = date.substr(0, 10); + } + if (xml..owner.length()){ + var author = xml..owner[0].@realname.toString(); + if (author == ""){ + author = xml..owner[0].@username.toString(); + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "artist")); + } + if (xml..url.length()){ + newItem.url = xml..url[0].text().toString(); + } + if (xml..description.length()){ + newItem.abstractNote = xml..description[0].text().toString(); + } + var format = xml..photo[0].@originalformat.toString(); + var photo_id = xml..photo[0].@id.toString(); + +// get attachment code + var uri = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key="+key+"&photo_id="+photo_id; + Zotero.Utilities.HTTP.doGet(uri, function(text) { + text = text.replace(/<\?xml[^>]*\?>/, ""); + var xml = new XML(text); + var last = xml..size.length() - 1; + var attachmentUri = xml..size[last].@source.toString(); + newItem.attachments = [{title:title, url:attachmentUri}]; + newItem.complete(); + }, function(){Zotero.done();}); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Florida University Libraries (Endeca 1).js b/translators/Florida University Libraries (Endeca 1).js @@ -0,0 +1,104 @@ +{ + "translatorID":"a2363670-7040-4cb9-8c48-6b96584e92ee", + "translatorType":4, + "label":"Florida University Libraries (Endeca 1)", + "creator":"Sean Takats", + "target":"^http://[^/]+/[^\\.]+.jsp\\?[^/]*(?:Ntt=|NttWRD=)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-03 23:35:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//div[starts-with(@id, "briefTitle")]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + if (url.indexOf("&V=D")){ + return "book"; + } else if (url.indexOf("&V=M")){ + return "book"; + } else if (url.indexOf("&V=U")){ + return "book"; + } +} + +function doWeb(doc, url){ + var newUris = new Array(); + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var xpath = '//div[starts-with(@id, "briefTitle")]/a[starts-with(@id, "Title")]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + if(elmt = elmts.iterateNext()) { + // search page + var items = new Array(); + do { + items[elmt.href] = Zotero.Utilities.cleanString(elmt.textContent); + } while (elmt = elmts.iterateNext()); + + items = Zotero.selectItems(items); + if(!items) { + return true; + } + for(var i in items) { + var newUri = i.replace(/&V=./, "&V=M"); + newUris.push(newUri); + } + } else { + // single page + var newURL = url.replace(/&V=./, "&V=M"); + newUris.push(newURL); + } + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var uri = newDoc.location.href; + var xpath = '//tr[@class="trGenContent"][td[3]]'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./TD[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var value = newDoc.evaluate('./TD[3]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + + value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1"); + + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + + record.addField(code, ind, value); + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function() { Zotero.done(); }, null); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/FreePatentsOnline.js b/translators/FreePatentsOnline.js @@ -0,0 +1,124 @@ +{ + "translatorID":"879d738c-bbdd-4fa0-afce-63295764d3b7", + "translatorType":4, + "label":"FreePatentsOnline", + "creator":"Adam Crymble", + "target":"http://www.freepatentsonline.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("result.html")) { + return "multiple"; + } else if (doc.evaluate('//div[@class="disp_doc2"]/div', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "patent"; + } +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var contents; + + var newItem = new Zotero.Item("patent"); + + var pageContent = doc.evaluate('//div[@class="disp_doc2"]/div', doc, null, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@class="disp_doc2"]/div)', doc, null, XPathResult.ANY_TYPE, null); + + + for (i=0; i<xPathCount.numberValue/2; i++) { + + fieldTitle = pageContent.iterateNext().textContent.replace(/\s+/g, ''); + content = pageContent.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + dataTags[fieldTitle] = (content); + } + + var inventors = new Array(); + var parenthesis; + + if (dataTags["Inventors:"]) { + inventors = dataTags["Inventors:"].split(/\n/); + if (inventors.length>1) { + for (var i = 0; i < inventors.length; i++) { + parenthesis = inventors[i].indexOf("("); + inventors[i] = inventors[i].substr(0, parenthesis).replace(/^\s*|\s*$/g, ''); + if (inventors[i].match(", ")) { + var inventors1 = inventors[i].split(", "); + inventors[i] = inventors1[1] + " " + inventors1[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(inventors[i], "inventor")); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(inventors[i], "inventor")); + } + } + + } else { + Zotero.debug(doc.title); + parenthesis = dataTags["Inventors:"].indexOf("("); + dataTags["Inventors:"] = dataTags["Inventors:"].substr(0, parenthesis).replace(/^\s*|\s*$/g, ''); + + if (dataTags["Inventors:"].match(", ")) { + var inventors1 = dataTags["Inventors:"].split(", "); + dataTags["Inventors:"] = inventors1[1] + " " + inventors1[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventors:"], "inventor")); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventors:"], "inventor")); + } + } + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Abstract:", "abstract"); + associateData (newItem, dataTags, "DocumentTypeandNumber:", "patentNumber"); + associateData (newItem, dataTags, "ApplicationNumber:", "applicationNumber"); + associateData (newItem, dataTags, "PublicationDate:", "issueDate"); + associateData (newItem, dataTags, "Assignee:", "assignee"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//table[@class="listing_table"]/tbody/tr/td[3]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/GPO Access e-CFR.js b/translators/GPO Access e-CFR.js @@ -0,0 +1,107 @@ +{ + "translatorID":"dede653d-d1f8-411e-911c-44a0219bbdad", + "translatorType":4, + "label":"GPO Access e-CFR", + "creator":"Bill McKinney", + "target":"^http://ecfr\\.gpoaccess\\.gov/cgi/t/text/text-idx.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-18 18:15:00" +} + +function detectWeb(doc, url) { + var re = new RegExp("^http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx"); + if(re.test(doc.location.href)) { + return "book"; + } else { + return "multiple"; + } +} + +function get_nextsibling(n) + { + var x=n.nextSibling; + while (x.nodeType!=1) + { + x=x.nextSibling; + } + return x; +} +function scrape(doc) { + + var newItem = new Zotero.Item("statute"); + newItem.url = doc.location.href; + var extraText = new String(); + var tmpSection = ""; + newItem.code = "Electronic Code of Federal Regulations"; + newItem.language = "en-us"; + + var spanTags = doc.getElementsByTagName("span"); + for(var i=0; i<spanTags.length; i++) { + if (spanTags[i].className == "mainheader") { + var tmpStr = spanTags[i].innerHTML; + tmpStr = tmpStr.replace(/\&nbsp;/g, " "); + tmpStr = tmpStr.replace(/\&\#167;/g, "Sec."); + newItem.codeNumber = tmpStr; + newItem.title = "e-CFR: " + tmpStr; + } + if (spanTags[i].className == "div5head") { + var tmpStr = spanTags[i].childNodes[0].innerHTML; + tmpStr = tmpStr.replace(/\&nbsp;/g, " "); + tmpStr = tmpStr.replace(/\&\#167;/g, "Sec."); + tmpSection = tmpStr; + } + } + + var heading5Tags = doc.getElementsByTagName("h5"); + for(var i=0; i<heading5Tags.length; i++) { + var tmpStr = heading5Tags[0].innerHTML; + tmpStr = tmpStr.replace(/\&nbsp;/g, " "); + tmpStr = tmpStr.replace(/\&\#167;/g, "Sec."); + if (tmpSection != "") { + tmpSection = tmpSection + " - "; + } + newItem.section = tmpSection + tmpStr; + break; + } + + // statutory source + var boldTags = doc.getElementsByTagName("b"); + for(var i=0; i<boldTags.length; i++) { + var s = new String(boldTags[i].innerHTML); + if (s.indexOf("Source:") > -1) { + newItem.history = "Source: " + boldTags[i].nextSibling.nodeValue; + } + if (s.indexOf("Authority:") > -1) { + newItem.extra = "Authority: " + boldTags[i].nextSibling.nodeValue; + } + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var re = new RegExp("http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+"); + if(re.test(doc.location.href)) { + scrape(doc); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc,"http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/GSA Journals Online.js b/translators/GSA Journals Online.js @@ -0,0 +1,60 @@ +{ + "translatorID":"70295509-4c29-460f-81a3-16d4ddbb93f6", + "translatorType":4, + "label":"GSA Journals Online", + "creator":"Michael Berkowitz", + "target":"http://www.gsajournals.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-23 09:45:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("request=search") != -1 || url.indexOf("request=get-toc") != -1) { + return "multiple"; + } else if (url.indexOf("request=get-abstract") != -1 || url.indexOf("request=get-document") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var results = doc.evaluate('//*[@class="group"]', doc, null, XPathResult.ANY_TYPE, null); + var next; + while (next = results.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate('.//*[@class="title"]', next, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate('.//a[1]', next, null, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i.replace(/get\-(abstract|document)/, "cite-builder")); + } + } else { + arts = [url.replace(/get\-(abstract|document)/, "cite-builder")]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var newurl = doc.evaluate('//a[contains(@href, "refman")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + var oldurl = doc.location.href; + Zotero.Utilities.HTTP.doGet(newurl, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = oldurl; + item.DOI = decodeURIComponent(item.url.match(/doi=([^&]+)/)[1]); + var pdfurl = 'http://www.gsajournals.org/perlserv/?request=res-loc&uri=urn:ap:pdf:doi:' + item.DOI; + item.attachments = [ + {url:item.url, title:"GSA Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"GSA Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/Gale - Cengage Learning.js b/translators/Gale - Cengage Learning.js @@ -0,0 +1,141 @@ +{ + "translatorID":"4ea89035-3dc4-4ae3-b22d-726bc0d83a64", + "translatorType":4, + "label":"Gale - Cengage Learning", + "creator":"Adam Crymble", + "target":"http://www.gale.cengage.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:30:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//td[3]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//div[@id="title_main"]/h2', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } + + + +} + +//Gale Cengage Learning - Catalog translator. Code by Adam Crymble. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var titles1; + + var newItem = new Zotero.Item("book"); + + var credits = doc.evaluate('//div[@id="credits"]/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@id="credits"]/ul/li)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var creditsArray = new Array(); + + for (var i = 0; i < xPathCount.numberValue; i++) { + creditsArray.push(credits.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + if (doc.evaluate('//div[@id="title_main"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + titles1 = doc.evaluate('//div[@id="title_main"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + } + + if (titles1.match(/\w/) && creditsArray[0].match(/\w/)) { + newItem.title = titles1 + ": " + creditsArray[0]; + } else if (titles1.match(/\w/) && !creditsArray[0].match(/\w/)) { + newItem.title = titles1; + } else { + newItem.title = "No Title Found." + } + + for (var i = 1; i < creditsArray.length; i++) { + + if (creditsArray[i].match("Author ")) { + var author = creditsArray[i].split("Author "); + author = author[1]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else if (creditsArray[i].match("Published by ")) { + var publisher1 = creditsArray[i].split("Published by "); + newItem.publisher = publisher1[1]; + } else if (creditsArray[i].match("Volume")) { + var volume1 = creditsArray[i].split("Volume"); + newItem.volume = volume1[1]; + } + + } + + if (doc.evaluate('//div[@id="description"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@id="description"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var pageContents = doc.evaluate('//div[@id="detail"]/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var allContents = new Array(); + var contents; + var fieldTitle; + + while (contents = pageContents.iterateNext()) { + allContents.push(contents.textContent); + } + + for (i=0; i<allContents.length; i++) { + if (allContents[i].match(":")) { + contents = allContents[i].split(":"); + fieldTitle = contents[0].replace(/\s*/g, ''); + dataTags[fieldTitle] = contents[1]; + } + } + + associateData (newItem, dataTags, "ISBN10", "ISBN"); + if (dataTags["ISBN13"]) { + newItem.extra = "ISBN 13: " + dataTags["ISBN13"]; + } + associateData (newItem, dataTags, "Published/Released", "date"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[3]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Gale Literature Resource Center.js b/translators/Gale Literature Resource Center.js @@ -0,0 +1,173 @@ +{ + "translatorID":"84564450-d633-4de2-bbcc-451ea580f0d6", + "translatorType":4, + "label":"Gale Literature Resource Center", + "creator":"Simon Kornblith", + "target":"^https?://[^/]+/servlet/LitRC?(?:|.*&)srchtp=(?:adv)?mla(?:&|$)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-28 20:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.title.length <= 33 || doc.title.substr(0, 33) != "Literature Resource Center -- MLA") return false; + + if(url.indexOf("docNum=") != -1) { // article; + return "journalArticle"; + } else if(doc.evaluate('//tr[td/span[@class="stndxtralead"]]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + + return false; +} + +function extractCitation(type, citation) { + type = Zotero.Utilities.cleanString(type).toLowerCase(); + citation = Zotero.Utilities.cleanString(citation); + + if(type == "book article") { + var item = new Zotero.Item("bookSection"); + } else if(type == "book" || type == "book collection") { + var item = new Zotero.Item("book"); + } else if(type == "dissertation abstract") { + var item = new Zotero.Item("thesis"); + } else { + var item = new Zotero.Item("journalArticle"); + } + + var m; + if(item.itemType == "journalArticle" || item.itemType == "thesis") { + m = citation.match(/^(.+)\. "([^"]+)" (.+), ([0-9\:]*) ?\(([^\)]+)\)(?:, (?:pp\. ([\-0-9]+)|([\-0-9A-Z]+)))?/); + if(!m) return false; + + item.publicationTitle = m[3]; + var parts = m[4].split(":"); + if(parts.length == 2) { + item.volume = parts[0]; + item.issue = parts[1]; + } else { + item.issue = m[4]; + } + item.date = m[5]; + item.pages = m[6] ? m[6] : m[7]; + } else if(item.itemType == "book") { + m = citation.match(/^(.+)\. "([^"]+)" ([^:]+): ([^,]+), ([0-9]{4})\..*?(?:([0-9]+) pp\.)/); + if(!m) return false; + + item.place = m[3]; + item.publisher = m[4]; + item.date = m[5]; + item.pages = m[6]; + } else if(item.itemType == "bookSection") { + m = citation.match(/^(.+)\. "([^"]+)" pp\. ([\-0-9]+)\. (?:((?:[^\.]*|\([^\)]+\)| [A-Z]\.)*)\.)? ([^\(\)]+). ([^:]+): ([^,]+), ([0-9]{4})/); + if(!m) return false; + + Zotero.debug(m); + + item.pages = m[3]; + var bookAuthors = m[4].split(" and "); + for each(var bookAuthor in bookAuthors) { + var n = bookAuthor.match(/^([^,]+), ([^\(]+)(?: \(([^\)]+)\)?)?$/); + if(n) { + var type = (n[3] && n[3].toLowerCase().indexOf("ed.") != -1) ? "editor" : "author"; + item.creators.push({lastName:n[1], firstName:n[2], creatorType:type}) + } + } + item.publicationTitle = m[5]; + item.place = m[6]; + item.publisher = m[7]; + item.date = m[8]; + } + + // add creators + var creators = m[1].split("; "); + for each(var creator in creators) { + item.creators.push(Zotero.Utilities.cleanAuthor(creator, "author", true)); + } + if(m[2][m[2].length-1] == ".") { + item.title = m[2].substr(0, m[2].length-1); + } else { + item.title = m[2]; + } + + return item; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var uri = doc.location.href; + if(url.indexOf("docNum=") != -1) { // article; + var citation = doc.evaluate('//td[b/text() = "Source Database:"] | //td[*/b/text() = "Source Database:"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().innerHTML; + + // ugh + var parts = citation.split(/<\/CENTER>/i); + var citation = parts[parts.length-1]; + citation = citation.replace(/<script[^>]*>(?:.|[\r\n])*<\/script>/gi, ""); + citation = citation.replace(/<a[^>]*>(?:.|[\r\n])*<\/a>/gi, ""); + + // big enormous hack, but it works + var span = doc.createElement("span"); + span.innerHTML = citation; + citation = span.textContent; + + var citeM = citation.match(/^\s*([^\n]+)/); + var subjectM = citation.match(/Subject Terms:\s+([^\n]+)/); + var typeM = citation.match(/Document Type:\s+([^\n]+)/); + var issnM = citation.match(/ISSN:\s+([^\n]+)/); + + var item = extractCitation(typeM[1], citeM[1]); + item.tags = subjectM[1].split("; "); + + if(issnM) item.ISSN = issnM[1]; + + item.complete(); + } else { // search results + var items = new Array(); + + var tableRows = doc.evaluate('//tr[td/span[@class="stndxtralead"]]', doc, nsResolver, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Go through table rows + for(var i=0; i<tableRows.snapshotLength; i++) { + items[i] = doc.evaluate('./td/span[@class="stndxtralead"]//a', tableRows.snapshotItem(i), + nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + items[i] = items[i].substring(1, items[i].length-1); + } + + items = Zotero.selectItems(items); + if(!items) return true + + for(var i in items) { + var tableRow = tableRows.snapshotItem(i); + + var type = doc.evaluate('./td[3]/span[@class="stndxtralead"]', tableRow, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().textContent; + var citation = doc.evaluate('./td/span[@class="stndxtralead"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var item = extractCitation(type, citation); + if(!item) continue; + + var terms = doc.evaluate('.//span[@class="mlasubjects"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(terms) { + // chop off "[Subject Terms: " and "]" + terms = terms.textContent; + terms = terms.substring(16, terms.length-2); + item.tags = terms.split("; "); + } + + item.complete(); + } + } +} +\ No newline at end of file diff --git a/translators/Getty Research Library Catalog.js b/translators/Getty Research Library Catalog.js @@ -0,0 +1,255 @@ +{ + "translatorID":"f87c10fe-2bdc-4e1e-aedd-7fd20ec4b4c2", + "translatorType":4, + "label":"Getty Research Library Catalog", + "creator":"Adam Crymble", + "target":"http://(opac.pub|library).getty.edu", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + + var multiCheck = ''; + + if (doc.evaluate('//table/tbody/tr/td[1]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + + multiCheck = doc.evaluate('//table/tbody/tr/td[1]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var callNumSearch = ''; + if (doc.evaluate('//table/tbody/tr/th[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + callNumSearch = doc.evaluate('//table/tbody/tr/th[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (callNumSearch.match("Call Number")) { + return "multiple"; + } + + if (multiCheck.match("Sort by:")) { + return "multiple"; + } + + if (doc.evaluate('//table[2]/tbody/tr/th', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Author:")) { + return "book"; + } else if (doc.evaluate('//tr/th/font/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } else if (doc.evaluate('//tr/th/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +//Getty Research Library Catalog translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + + var fieldContent = new Array(); + var fieldExtra = new Array(); + var tagsContent = new Array(); + var multis = new Array(); + + var content1; + var extra1; + var multi1; + + var newItem = new Zotero.Item("book"); + + var multiLineEntry = doc.evaluate('//table[2]/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (multi1 = multiLineEntry.iterateNext()) { + multis.push(multi1.textContent); + } + + //Puts field Content into an array + var contents = doc.evaluate('//table[2]/tbody/tr/td', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (content1 = contents.iterateNext()) { + if (content1.textContent.match(/\w/)) { + fieldContent.push(content1.textContent.replace(/^\s*|\s*&/g, '')); + } + } + + //Entries that do not line up perfectly with a field heading are put into an array and these are then removed from the field Content array. + var extraField = doc.evaluate('//table[2]/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + while (extra1 = extraField.iterateNext()) { + if (extra1.textContent.match(/\w/)) { + fieldExtra.push(extra1.textContent.replace(/^\s*|\s*&/g, '')); + } + } + + var duplicates = new Array(); + for (var i = 0; i < fieldContent.length; i++) { + for (var j = 0; j < fieldExtra.length; j++) { + if (fieldContent[i] == fieldExtra[j]) { + duplicates.push(i); + } + } + } + var cleanContent = new Array(); + + for (var i = duplicates.length-1; i > -1; i --) { + + fieldContent[duplicates[i]-1] = fieldContent[duplicates[i]-1] + "; " + fieldContent[duplicates[i]]; + fieldContent[duplicates[i]] = ''; + } + + for (var i = 0; i < fieldContent.length-1; i++) { + if (fieldContent[i].match(/\w/)) { + cleanContent.push(fieldContent[i]); + } + } + + var headers = doc.evaluate('//form/table/tbody/tr/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + + //field title and cleancontent have the same number of entries; These are then associated and put into dataTags object. + for (var i = 0; i < cleanContent.length; i++) { + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + if (fieldTitle.match(/\w/)) { + + } else { + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + } + dataTags[fieldTitle] = cleanContent[i]; + + } + + //The data is all now in the dataTags object. It needs only to be formatted and put in the proper Zotero fields. + + //fixing up any content that needs a different format for Zotero and then pushing it into Zotero. + if (dataTags["Notes:"]) { + if (dataTags["Notes:"].match("; ")) { + var notes1 = dataTags["Notes:"].split("; "); + var notes2 = ''; + + for (var i = 0; i < notes1.length; i++) { + + if (notes2.match(/\w/)) { + notes2 = notes2 + "; " + notes1[i]; + } else { + notes2 = notes1[i]; + } + } + dataTags["Notes:"] = notes2; + } + } + + if (dataTags["Subjects:"]) { + if (dataTags["Subjects:"].match("; ")) { + tagsContent = dataTags["Subjects:"].split("; "); + } else { + newItem.tags = dataTags["Subjects:"]; + var noMoreTags = 1; + } + if (noMoreTags != 1) { + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } + } + + if (dataTags["Author:"]) { + if (dataTags["Author:"].match(", ")) { + var author = dataTags["Author:"].split(', '); + author = author[1].substr(0, author[1].length) + " " + author[0]; + author = author.replace(/\./, ''); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + if (dataTags["CorporateAuthor:"]) { + newItem.creators.push({lastName: dataTags["CorporateAuthor:"], creatorType: "creator"}); + } + + if (dataTags["Location:"]) { + newItem.extra = "Location in Library: " + " " + dataTags["Location:"]; + } + + if (dataTags["PersistentLinkforthisRecord:"]) { + associateData (newItem, dataTags, "PersistentLinkforthisRecord:", "url"); + } else { + newItem.url = doc.location.href; + } + + //Publishing info is split in a best guess format. + //If not all of Place, Publisher and Date are present, or they are in an unstandard format, the information is stored in Publisher. + if (dataTags["PublicationInformation:"]) { + if (dataTags["PublicationInformation:"].match(": ")) { + var colon = dataTags["PublicationInformation:"].indexOf(":"); + var place1 = dataTags["PublicationInformation:"].substr(0, colon); + newItem.place = place1; + var publisher1 = dataTags["PublicationInformation:"].substr(colon); + if (publisher1.match(", ")) { + var date1 = publisher1.split(", "); + newItem.publisher = date1[0]; + if (date1[1].match(/\d/)) { + newItem.date = date1[1]; + } + } else { + newItem.date = publisher1; + } + } else { + newItem.publisher = dataTags["PublicationInformation:"]; + } + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Series:", "series"); + associateData (newItem, dataTags, "Description:", "description"); + associateData (newItem, dataTags, "ISBN:", "ISBN"); + associateData (newItem, dataTags, "Notes:", "abstractNote"); + associateData (newItem, dataTags, "CallNumber:", "callNumber"); + associateData (newItem, dataTags, "Edition:", "edition"); + + newItem.notes.push({title:"Title", note:"Site is designed to timeout user. This may prevent Zotero from saving a screen capture."}); + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var typeOfPage = doc.evaluate('//table/tbody/tr/th[3]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + Zotero.debug(typeOfPage); + + if (typeOfPage.match("Title")) { + var titles = doc.evaluate('//table/tbody/tr/td[3]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else { + var titles = doc.evaluate('//table[2]/tbody/tr/td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Glenbow Library.js b/translators/Glenbow Library.js @@ -0,0 +1,265 @@ +{ + "translatorID":"330f283f-12e9-4421-aa59-e17ec5f4aa37", + "translatorType":4, + "label":"Glenbow Library", + "creator":"Adam Crymble", + "target":"http://ww2.glenbow.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + + if (doc.title.match("Library Main Catalogue Search Results") && doc.location.href.match("GET_RECORD")) { + return "book"; + } else if + (doc.title.match("Library Map Collection Search Results") && doc.location.href.match("GET_RECORD")) { + return "map"; + + } else if + (doc.title.match("Library Main Catalogue Search Results") && !(doc.location.href.match("GET_RECORD"))) { + return "multiple"; + } else if + (doc.title.match("Map Collection Search Results") && !(doc.location.href.match("GET_RECORD"))) { + return "multiple"; + } +} + +//Translator for the Glenbow Museum Collection. Code by Adam Crymble +//Only works for Library Main Catalogue and Map Collection. The other categories do not have stable URLs for individual entries. + + +function associateContent (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape (doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + } : null; + + var fieldTitle = new Array(); + var tagsContent = new Array(); + + if (detectWeb(doc, url) == "book") { + + newItem = new Zotero.Item("book"); + authorType= "author"; + + } else if (detectWeb(doc, url) == "map") { + + newItem = new Zotero.Item("map"); + authorType= "cartographer"; + } + + var dataTags= new Object(); + var authorType; + var organizeName; + + if (doc.evaluate('//tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null)) { + var xPathContent = doc.evaluate('//tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//tr/td/p)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i = 0; i < xPathCount.numberValue; i++) { + + fieldTitle= xPathContent.iterateNext().textContent; + + var separate = fieldTitle.indexOf(":"); + var fieldTitle1 = fieldTitle.substr(0, separate); + fieldTitle1 = fieldTitle1.replace(/\s+/g, ''); + + var fieldContent = fieldTitle.substr(separate + 2); + + dataTags[fieldTitle1] = (fieldContent); + + } + + + //names start + if (dataTags["Names"]) { + + //if there are multiple authors: + if (dataTags["Names"].match("\n")) { + var multipleNames = dataTags["Names"].split("\n"); + + for (j = 0; j < multipleNames.length; j++) { + if (detectWeb(doc, url) == "book") { + multipleNames[j] = multipleNames[j].substr(3); + + } else if (detectWeb(doc, url) == "map") { + multipleNames[j] = multipleNames[j]; + } + + if (multipleNames[j].match(/\,/)) { + + organizeName = multipleNames[j].split(","); + organizeName = (organizeName[1] + (" ") + organizeName[0]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName, authorType)); + + } else { + newItem.creators.push({lastName: multipleNames[j], creatorType: authorType}); + } + + } + + //if there is 1 human author + } else if (dataTags["Names"].match(/\,/)) { + if (detectWeb(doc, url) == "book") { + var organizeName = dataTags["Names"].substr(3).split(","); + + } else if (detectWeb(doc, url) == "map") { + var organizeName = dataTags["Names"].split(","); + } + + organizeName = (organizeName[1] + (" ") + organizeName[0]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(organizeName,authorType)); + + //if there is 1 corporate author + } else { + if (detectWeb(doc, url) == "book") { + newItem.creators.push({lastName: dataTags["Names"].substr(3), creatorType: authorType}); + + } else if (detectWeb(doc, url) == "map") { + newItem.creators.push({lastName: dataTags["Names"], creatorType: authorType}); + + } + } + } + + //tags start + if (dataTags["Subjects"]) { + if (dataTags["Subjects"].match("\n")) { + var multipleSubjects= dataTags["Subjects"].split("\n"); + + for (j = 0; j < multipleSubjects.length; j++) { + multipleSubjects[j] = multipleSubjects[j].substr(3); + tagsContent.push(Zotero.Utilities.cleanTags(multipleSubjects[j])); + } + } else { + dataTags["Subjects"] = dataTags["Subjects"].substr(3); + tagsContent.push(Zotero.Utilities.cleanTags(dataTags["Subjects"])); + } + + for (var y = 0; y < tagsContent.length; y++) { + newItem.tags[y] = tagsContent[y]; + } + } + + //book publisher info start + if (dataTags["PublishingInformation"]) { + dataTags["PublishingInformation"] = dataTags["PublishingInformation"].replace(/\[|\]*/g, ''); + + var pubLoc= dataTags["PublishingInformation"].split(":"); + if (pubLoc[1]) { + dataTags["Place"] = pubLoc[0]; + + var pubAndDate = pubLoc[1].split(","); + dataTags["Publisher"] = pubAndDate[0]; + dataTags["Date"] = pubAndDate[1]; + } else { + associateContent (newItem, dataTags, "PublishingInformation", "date"); + } + } + + //accession number start + if (dataTags["Accessionnumber"]) { + + dataTags["Accessionnumber"] = ("Accession number: " + dataTags["Accessionnumber"]); + } + + if (dataTags["CallNumber"]) { + if (dataTags["CallNumber"] == ' ') { + dataTags["CallNumber"] = "None"; + Zotero.debug(dataTags["CallNumber"]); + } + } + } + associateContent (newItem, dataTags, "CallNumber", "callNumber"); + associateContent (newItem, dataTags, "Title", "title"); + associateContent (newItem, dataTags, "Place", "place"); + associateContent (newItem, dataTags, "Publisher", "publisher"); + associateContent (newItem, dataTags, "Date", "date"); + associateContent (newItem, dataTags, "Description", "pages"); + associateContent (newItem, dataTags, "Edition", "edition"); + associateContent (newItem, dataTags, "Notes", "abstractNote"); + associateContent (newItem, dataTags, "Accessionnumber", "extra"); + associateContent (newItem, dataTags, "Scale", "scale"); + + newItem.url = doc.location.href; + if (!newItem.title) newItem.title = "New Search Terms Suggested" + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + var dataTags = new Object(); + var titleList = new Array(); + var uris = new Array(); + var next_title= new Array(); + + if (detectWeb(doc, url) == "multiple") { + + //checks multiple entries for a link to a single entry page. + if (doc.evaluate('//td/div[@class="floatRight"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null)) { + + var items = new Object(); + var titles = doc.evaluate('//td/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var xPathMultiCount = doc.evaluate('count (//td/p)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + + for (var i = 0; i < xPathMultiCount.numberValue; i++) { + + articles= titles.iterateNext().textContent; + + var separateMulti = articles.indexOf(":"); + var articles1 = articles.substr(0, separateMulti); + articles1 = articles1.replace(/\s+/g, ''); + + var multiContent = articles.substr(separateMulti + 2); + + dataTags[articles1] = (multiContent); + + if (articles1 == "Title") { + titleList.push(dataTags["Title"]); + } + if (articles1 == "See") { + titleList.push("skip"); + } + } + var links = doc.evaluate('//td/div[@class="floatRight"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathLinksCount = doc.evaluate('count (//td/div[@class="floatRight"]/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathLinksCount.numberValue; i++) { + next_title.push(links.iterateNext().href); + if (titleList[i] != "skip") { + items[next_title] = titleList[i]; + } + } + + items = Zotero.selectItems(items); + + for (var i in items) { + uris.push(i); + } + + } + +//code if single entry only. + } else { + uris = [url]; + } + + Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Gmail.js b/translators/Gmail.js @@ -0,0 +1,48 @@ +{ + "translatorID":"58a778cc-25e2-4884-95b3-6b22d7571183", + "translatorType":4, + "label":"Gmail", + "creator":"Michael Berkowitz", + "target":"http://mail.google.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-17 19:30:00" +} + +function detectWeb(doc, url) { + if (url.match(/#inbox\/[\w\d]+/)) { + return "document"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var scripts = doc.evaluate('//script', doc, ns, XPathResult.ANY_TYPE, null); + var script; + var text = ""; + while (script = scripts.iterateNext()) { + text += script.textContent; + } + var ik = text.match(/ID_KEY:\"([^"]+)\"/)[1] + var th = url.match(/#inbox\/(.*)$/)[1]; + var newurl = 'http://mail.google.com/mail/?ui=2&ik=' + ik + '&view=om&th=' + th; + Zotero.Utilities.HTTP.doGet(newurl, function(text) { + var item = new Zotero.Item("email"); + var to = text.match(/\nTo:\s+([^\n]+)\n/)[1]; + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(to.replace(/<.*>/g, "")), "recipient")); + var from = text.match(/\nFrom:\s+([^\n]+)\n/)[1]; + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(from.replace(/<.*>/g, "")), "author")); + item.date = text.match(/\nDate:\s+(.*,\s+\d+\s+\w+\s+\d{4})/)[1]; + item.subject = text.match(/\nSubject:\s+([^\n]+)/)[1]; + if (item.subject == "") item.subject = "<No Subject>"; + item.title = item.subject; + item.complete(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Google Books.js b/translators/Google Books.js @@ -0,0 +1,111 @@ +{ + "translatorID":"3e684d82-73a3-9a34-095f-19b112d88bbf", + "translatorType":4, + "label":"Google Books", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"^http://books\\.google\\.[a-z]+(\\.[a-z]+)?/books\\?(.*id=.*|.*q=.*)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 11:15:00" +} + +function detectWeb(doc, url) { + var re = new RegExp('^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i'); + if(re.test(doc.location.href)) { + return "book"; + } else { + return "multiple"; + } +} + +function doWeb(doc, url) { + // get local domain suffix + var suffixRe = new RegExp("https?://books\.google\.([^/]+)/"); + var suffixMatch = suffixRe.exec(url); + var suffix = suffixMatch[1]; + var uri = doc.location.href; + var newUris = new Array(); + + var re = new RegExp('^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)', 'i'); + var m = re.exec(uri); + if(m) { + newUris.push('http://books.google.'+suffix+'/books?id='+m[2]); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, 'http://books\\.google\\.' + suffix + '/books\\?id=([^&]+)', '^(?:All matching pages|About this Book|Table of Contents|Index)'); + // Drop " - Page" thing + for(var i in items) { + items[i] = items[i].replace(/- Page [0-9]+\s*$/, ""); + } + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + var m = re.exec(i); + newUris.push('http://books.google.'+suffix+'/books?id='+m[2]); + } + } + Zotero.debug(newUris); + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var newItem = new Zotero.Item("book"); + newItem.extra = ""; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//h2[@class="title"]' + var elmt; + if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()){ + var title = Zotero.Utilities.superCleanString(elmt.textContent); + newItem.title = title; + Zotero.debug("title: " + title); + } + xpath = '//div[@class="titlewrap"]/span[@class="addmd"]' + if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()){ + var authors = Zotero.Utilities.superCleanString(elmt.textContent); + if (authors.substring(0, 3) == "By "){ + authors = authors.substring(3); + } + authors = authors.split(", "); + for(j in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author")); + } + } + + xpath = '//td[2][@id="bookinfo"]/div[@class="bookinfo_sectionwrap"]/div'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, + XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + var fieldelmt = newDoc.evaluate('.//text()', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(fieldelmt) { + field = Zotero.Utilities.superCleanString(fieldelmt.nodeValue); + Zotero.debug("output: " + field); + if(field.substring(0,10) == "Published ") { + newItem.date = field.substring(field.length-4); + var publisher = newDoc.evaluate('..//a', fieldelmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (publisher){ + publisher = Zotero.Utilities.superCleanString(publisher.textContent); + newItem.publisher = publisher; + } + } else if(field.substring(0,5) == "ISBN ") { + newItem.ISBN = field.substring(5); + } else if(field.substring(field.length-6) == " pages") { + newItem.pages = field.substring(0, field.length-6); + } else if(field.substring(0,12) == "Contributor ") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(field.substring(12), "contributor")); + } + } + } + newItem.complete(); + }, function() { Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Google Patents.js b/translators/Google Patents.js @@ -0,0 +1,170 @@ +{ + "translatorID":"d71e9b6d-2baa-44ed-acb4-13fe2fe592c0", + "translatorType":4, + "label":"Google Patents", + "creator":"Adam Crymble", + "target":"http://www\\.google.*/patents", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + + if (doc.location.href.match("Search")) { + return "multiple"; + } else if (doc.location.href.match("id")) { + return "patent"; + } + +} + +//Google Patents Translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var headings = new Array(); + var newItem = new Zotero.Item("patent"); + + //checks format type + if (doc.location.href.match("printsec")) { + + var contents = doc.evaluate('//table[@id="summarytable"]/tbody/tr[1]/td', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var xPathHeadings = doc.evaluate('//b', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var xPathCount = doc.evaluate('count (//b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + if (doc.evaluate('//span[@class="addmd"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var author = doc.evaluate('//span[@class="addmd"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "inventor")); + } + + } else { + + var xPathHeadings = doc.evaluate('//div[@class="patent_bibdata"]/p/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var xPathCount = doc.evaluate('count (//div[@class="patent_bibdata"]/p/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + + var xPathContents = doc.evaluate('//div[@class="patent_bibdata"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contentsCount = doc.evaluate('count (//div[@class="patent_bibdata"]/p)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var contents; + for (i = 0; i < contentsCount.numberValue; i++) { + contents = (contents + xPathContents.iterateNext().textContent + " "); + } + + if (doc.evaluate('//td[3]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = (doc.evaluate('//td[3]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("Abstract", '')); + } + + } + + for (var i =0; i < xPathCount.numberValue; i++) { + + headings.push(xPathHeadings.iterateNext().textContent); + contents = contents.replace(headings[i], "xxx"); + } + + + var splitContent = new Array(); + splitContent = contents.split(/xxx/); + + //associate headings with contents. + for (var i = 0; i < headings.length; i++) { + fieldTitle = headings[i].replace(/\s+|\W*/g, ''); + + if (fieldTitle == "USClassification" | fieldTitle == "InternationalClassification" | fieldTitle == "Abstract") { + dataTags[fieldTitle] = splitContent[i+1]; + } else { + dataTags[fieldTitle] = splitContent[i+1].replace(": ", ''); + } + + if (dataTags[fieldTitle].match("About this patent")) { + dataTags[fieldTitle] = dataTags[fieldTitle].replace("About this patent", ''); + } + + //author(s) + if (fieldTitle == "Inventors") { + var authors = dataTags[fieldTitle].split(", "); + for (var j = 0; j < authors.length; j++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "inventor")); + } + } else if (fieldTitle == "Inventor") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Inventor"], "inventor")); + } + } + + //extra field + if (dataTags["USClassification"] && dataTags["InternationalClassification"]) { + Zotero.debug(doc.title); + newItem.extra = ("U.S. Classification: " + dataTags["USClassification"] + "; International Classification: " + dataTags["InternationalClassification"]); + } else if (dataTags["USClassification"] ) { + newItem.extra = ("U.S. Classification: " + dataTags["USClassification"]); + } else if (dataTags["InternationalClassification"]) { + newItem.extra = ("International Classification: " + dataTags["InternationalClassification"]); + } + + associateData (newItem, dataTags, "Patentnumber", "patentNumber"); + associateData (newItem, dataTags, "Issuedate", "date"); + associateData (newItem, dataTags, "Assignees", "assignee"); + associateData (newItem, dataTags, "Assignee", "assignee"); + associateData (newItem, dataTags, "Abstract", "abstractNote"); + associateData (newItem, dataTags, "Applicationnumber", "applicationNumber"); + + newItem.title = doc.evaluate('//h2[@class="title"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var xPathFirstTitle = doc.evaluate('//div[@id="results_container"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var firstTitle = xPathFirstTitle.iterateNext(); + + var titles = doc.evaluate('//p/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + items[firstTitle.href] = firstTitle.textContent; + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.textContent.match("RSS feed")) { + + } else { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} diff --git a/translators/Google Scholar.js b/translators/Google Scholar.js @@ -0,0 +1,144 @@ +{ + "translatorID":"57a00950-f0d1-4b41-b6ba-44ff0fc30289", + "translatorType":4, + "label":"Google Scholar", + "creator":"Simon Kornblith", + "target":"http://scholar\\.google\\.(?:com|com?\\.[a-z]{2}|[a-z]{2})/scholar", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-28 16:30:00" +} + +function detectWeb(doc, url) { + return "multiple"; +} + +var haveEndNoteLinks; + +function scrape(doc) { + var nsResolver = doc.createNSResolver(doc.documentElement); + + var items = new Array(); + var itemGrabLinks = new Array(); + var itemGrabLink; + var links = new Array(); + var types = new Array(); + + var itemTypes = new Array(); + var attachments = new Array(); + + var elmts = doc.evaluate('//p[@class="g"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var elmt; + var i=0; + Zotero.debug("get elmts"); + Zotero.debug(haveEndNoteLinks); + while(elmt = elmts.iterateNext()) { + var isCitation = doc.evaluate("./font[1]/b[1]/text()[1]", elmt, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + + // use EndNote links if available + if(haveEndNoteLinks) { + itemGrabLink = doc.evaluate('.//a[contains(@href, ".enw")]', + elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } else { + itemGrabLink = doc.evaluate('.//a[text() = "Related Articles"]', + elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } + + var noLinkRe = /^\[[^\]]+\]$/; + + if(itemGrabLink) { + itemGrabLinks[i] = itemGrabLink.href; + if(isCitation && noLinkRe.test(isCitation.textContent)) { + // get titles for [BOOK] or [CITATION] entries + items[i] = Zotero.Utilities.getNodeString(doc, elmt, './text()|./b/text()', nsResolver); + } else { + // get titles for articles + var link = doc.evaluate('.//a', elmt, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(link) { + items[i] = link.textContent; + links[i] = link.href; + } + } + + if(items[i]) { + i++; + } + } + } + + items = Zotero.selectItems(items); + + if(!items) { + if(Zotero.done) Zotero.done(true); + return true; + } + + var relatedMatch = /[&?]q=related:([^&]+)/; + + var urls = new Array(); + for(var i in items) { + // get url + if(haveEndNoteLinks) { + urls.push(itemGrabLinks[i]); + } else { + var m = relatedMatch.exec(itemGrabLinks[i]); + urls.push("http://scholar.google.com/scholar.ris?hl=en&lr=&q=info:"+m[1]+"&oe=UTF-8&output=citation&oi=citation"); + } + + if(links[i]) { + attachments.push([{title:"Google Scholar Linked Page", type:"text/html", + url:links[i]}]); + } else { + attachments.push([]); + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = attachments.shift(); + item.complete(); + }); + Zotero.Utilities.HTTP.doGet(urls, function(text) { + translator.setString(text); + translator.translate(); + }, function() { Zotero.done() }); +} + +function doWeb(doc, url) { + var nsResolver = doc.createNSResolver(doc.documentElement); + + //SR:Will use preference setting url instead of cookie to get EndNote links (works with ezproxy, doesn't overwrite other prefs) + //doc.cookie = "GSP=ID=deadbeefdeadbeef:IN=ebe89f7e83a8fe75+7e6cc990821af63:CF=3; domain=.scholar.google.com"; + + // determine if we need to reload the page + + // first check for EndNote links + Zotero.debug("get links"); + haveEndNoteLinks = doc.evaluate('//a[contains(@href, ".enw")]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(!haveEndNoteLinks) { + // SR:Commenting out this bit as code for retrieving citations from "Related" links is unreliable and unnecessary + //// next check if there are docs with no related articles + //if(doc.evaluate(''//p[@class="g"][not(descendant-or-self::text() = "Related Articles")]'', + // doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + // SR:Set preferences to show import links in English and do page reload + // (bit of a hack as it overwrites user prefs for language and import link type) + url = url.replace (/hl\=[^&]*&?/, ""); + url = url.replace("scholar?", "scholar_setprefs?hl=en&scis=yes&scisf=3&submit=Save+Preferences&"); + haveEndNoteLinks = true; + Zotero.Utilities.loadDocument(url, scrape); + Zotero.wait(); + return; + //} + } + + scrape(doc, url); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Gulag Many Days, Many Lives.js b/translators/Gulag Many Days, Many Lives.js @@ -0,0 +1,142 @@ +{ + "translatorID":"c41c9c66-8540-4216-b138-7c00532748c9", + "translatorType":4, + "label":"Gulag: Many Days, Many Lives", + "creator":"Adam Crymble", + "target":"http://gulaghistory.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="field"][@id="citation"]/p', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } else if (doc.evaluate('//h3/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +//Gulag: Many Days, Many Lives translator; Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + + if (doc.evaluate('//div[@class="field"][@id="description"]/div', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var abstract1 = doc.evaluate('//div[@class="field"][@id="description"]/div', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.abstractNote = abstract1.replace(/^\s+|\s*$/g, ''); + } + + if (doc.evaluate('//div[@class="field"][@id="source"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var rights1 = doc.evaluate('//div[@class="field"][@id="source"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.rights = rights1.replace(/^\s+|\s*$/g, ''); + } + + var cite = doc.evaluate('//div[@class="field"][@id="citation"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var checkForAuthor = cite.indexOf('"'); + + if (cite.match("Gulag: Many Days, Many Lives")) { + + var split1 = new Array(); + var split2 = new Array(); + var split3 = new Array(); + var split4 = new Array(); + var split5 = new Array(); + + if (checkForAuthor == 0) { + split1[1] = cite; + } else { + //author + split1 = cite.split(', "'); + var authorWords = split1[0].split(/\b\s/); + if (authorWords.length > 3) { + newItem.creators.push({lastName: split1[0], creatorType: "creator"}); + } else { + + newItem.creators.push(Zotero.Utilities.cleanAuthor(split1[0], "author")); + } + } + + //title + split2 = split1[1].split('." '); + newItem.title = split2[0]; + + //repository + split3 = split2[1].split("Lives, "); + + //object number + split4 = split3[1].split(" ("); + newItem.callNumber = split4[0]; + + //date posted and URL + split5 = split4[1].split(")<"); + newItem.date = split5[0]; + + } else { + + var split1 = cite.split(". "); + Zotero.debug(split1); + + //author + var author = split1[0].split(/\, /); + author = author[1] + ' ' + author[0]; + Zotero.debug(author); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + + //title + newItem.title = split1[1]; + + //place + var place1 = split1[2].split(":"); + newItem.place = place1[0]; + + //date + var date1 = split1[2].split (", "); + newItem.date = date1[1]; + + //publisher + newItem.publisher = date1[0].replace(place1[0], '').substr(2); + } + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//h3/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + + while (next_title = titles.iterateNext()) { + + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/HeinOnline.js b/translators/HeinOnline.js @@ -0,0 +1,74 @@ +{ + "translatorID":"37445f52-64fa-4a2a-9532-35753520a0f0", + "translatorType":4, + "label":"HeinOnline", + "creator":"Michael Berkowitz", + "target":"http://heinonline\\.org/HOL/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-16 06:30:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("LuceneSearch") != -1) { + return "multiple"; + } else if (url.indexOf("handle=hein.journals")) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + + var handle = url.match(/handle=([^&]*)&/)[1]; + if (url.match(/&id=(\d+)/)) { + var id= url.match(/&id=(\d+)/)[1]; + } else if (url.match(/&div=(\d+)/)) { + var ids = new Array(); + var id = doc.evaluate('//option[@selected="selected"]/@value', doc, null, XPathResult.ANY_TYPE, null); + var next_id = id.iterateNext(); + while (next_id) { + ids.push(next_id.textContent); + next_id = id.iterateNext(); + } + id = ids[ids.length - 1]; + } + + var citationurl = 'http://heinonline.org/HOL/citation-info?handle=' + handle + '&id=' + id; + var xpath = '//div[@id="guide"]/ul/li[3]/a'; + var journal = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/([^\d]*)/)[1]; + + var newItem = new Zotero.Item("journalArticle"); + newItem.publicationTitle = Zotero.Utilities.trimInternal(journal); + newItem.repository = "HeinOnline"; + newItem.url = url; + + Zotero.Utilities.HTTP.doGet(citationurl, function(text) { + var stuff = text.match(/(\d+)\s+([^\d]+)\s+(\d+)\s+\(([-\d]+)\)\s+<br>\s+([^;]+)(;\s*(.*))?/); + newItem.volume = stuff[1]; + newItem.journalAbbreviation = stuff[2]; + newItem.pages = stuff[3]; + newItem.date = stuff[4]; + newItem.title = Zotero.Utilities.trimInternal(stuff[5]); + + if (stuff[7]) { + var authors = stuff[7].split(';'); + for (var i in authors) { + authors[i] = authors[i].split(','); + newItem.creators.push({lastName:authors[i][0], firstName:authors[i][1], creatorType:"author"}); + } + } + + var pdfurl = 'http://heinonline.org/HOL/Print?handle=' + handle + '&id=' + id; + Zotero.Utilities.HTTP.doGet(pdfurl, function(text) { + var newurl = text.match(/<a\s+href=\"(PDF[^"]+)\"/i)[1]; + newItem.attachments = [ + {url:url, title:"HeinOnline Snapshot", mimeType:"text/html"}, + {url:'http://heinonline.org/HOL/' + newurl, title:"HeinOnline PDF", mimeType:"application/pdf"} + ]; + newItem.complete(); + }); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Helsinki University of Technology.js b/translators/Helsinki University of Technology.js @@ -0,0 +1,81 @@ +{ + "translatorID":"2943d7fc-3ce8-401c-afd5-ee1f70b7aae0", + "translatorType":4, + "label":"Helsinki University of Technology", + "creator":"Michael Berkowitz", + "target":"https?://teemu.linneanet.fi/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:00:00" +} + +function detectWeb(doc, url) { + if (url.match(/v\d+=\d+/)) { + return "book"; + } else if (url.match(/Search_Arg/)) { + return "multiple"; + } +} + +function MARCify(str) { + return str.replace(/v\d+=([^&]+)/, "v3=$1"); +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var titles = doc.evaluate('/html/body/form/table/tbody/tr/td[3]/a', doc, ns, XPathResult.ANY_TYPE, null); + var title; + var items = new Object(); + while (title = titles.iterateNext()) { + items[title.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(MARCify(i)); + } + } else { + books = [MARCify(url)]; + } + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(books, function(doc) { + var elmts = doc.evaluate('/html/body/form/table/tbody/tr[th]', doc, ns, XPathResult.ANY_TYPE, null); + var record = new marc.record(); + var elmt; + while (elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.superCleanString(doc.evaluate('./th', elmt, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (field) { + var value = doc.evaluate('./td[1]', elmt, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]); + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1"); + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + + record.addField(code, ind, value); + } + } + } + var item = new Zotero.Item("book"); + record.translate(item); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/HighWire.js b/translators/HighWire.js @@ -0,0 +1,203 @@ +{ + "translatorID":"5eacdb93-20b9-4c46-a89b-523f62935ae4", + "translatorType":4, + "label":"HighWire", + "creator":"Simon Kornblith", + "target":"^http://[^/]+/(?:cgi/searchresults|cgi/search|cgi/content/(?:abstract|full|short|summary)|current.dtl$|content/vol[0-9]+/issue[0-9]+/(?:index.dtl)?$)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-04 20:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.title.indexOf(" -- Search Result") != -1 || + doc.title == "Science/AAAS | Search Results") { + if(doc.evaluate('//table/tbody/tr[td/input[@type="checkbox"][@name="gca"]]', doc, + nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return "multiple"; + } else if(doc.title.indexOf(" -- Table of Contents") != -1|| + doc.title == "Science/AAAS | Science Magazine Search Results") { + if(doc.evaluate('//form/dl', doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) return "multiple"; + } else { + if(doc.evaluate('//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()) return "journalArticle"; + } + + return false; +} + +function handleRequests(requests) { + if(requests.length == 0) { + Zotero.done(); + return; + } + + var request = requests.shift(); + var URL = request.baseURL+request.args; + + Zotero.Utilities.HTTP.doGet(URL, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes[0]) { + item.DOI = item.notes[0].note; + item.notes = new Array(); + } + + item.attachments = new Array(); + var snapshot = request.snapshots.shift(); + var pdf = request.pdfs.shift(); + if(snapshot) { + if(typeof(snapshot) == "string") { + // string snapshot (from search) + item.attachments.push({title:"HighWire Snapshot", mimeType:"text/html", url:snapshot}); + } else { + // document object + item.attachments.push({title:"HighWire Snapshot", document:snapshot}); + } + } + if(pdf) { + var m = pdf.match(/^[^?]+/); + item.attachments.push({title:"HighWire Full Text PDF", mimeType:"application/pdf", url:m[0]+".pdf"}); + } + + item.complete(); + }); + translator.translate(); + + handleRequests(requests); + }); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var requests = new Array(); + var hostRe = /https?:\/\/[^\/]+/; + + var isSearch = doc.title.indexOf("Search Result") != -1 + var isTOC = doc.title.indexOf(" -- Table of Contents") != -1; + var isScience = doc.title.indexOf("Science Magazine Search Results") != -1; + if(isSearch || isTOC) { + // search page + var items = new Object(); + var snapshots = new Object(); + var pdfs = new Object(); + + if(isTOC) { + var gcaRe = /^https?:\/\/[^\/]+\/cgi\/reprint\/([0-9]+\/[0-9]+\/[0-9]+)/; + var tableRows = doc.evaluate('//form/dl', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if(isScience) { + var tableRows = doc.evaluate('//form/dl/dd', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableDTs = doc.evaluate('//form/dl/dt', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else { + var tableRows = doc.evaluate('//table/tbody/tr[td/input[@type="checkbox"]][td/font/strong]', doc, + nsResolver, XPathResult.ANY_TYPE, null); + } + + var tableRow, link; + while(tableRow = tableRows.iterateNext()) { + var snapshot = undefined; + var pdf = undefined; + + if(isTOC) { + var title = doc.evaluate('.//strong', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var links = doc.evaluate('.//a', tableRow, nsResolver, XPathResult.ANY_TYPE, null); + while(link = links.iterateNext()) { + // prefer Full Text snapshots, but take abstracts + if(link.textContent == "[Abstract]") { + if(!snapshot) snapshot = link.href; + } else if (link.textContent == "[Full Text]") { + snapshot = link.href; + } else if(link.textContent == "[PDF]") { + pdf = link.href; + var m = gcaRe.exec(link.href); + var gca = m[1]; + } + } + } else { + if(isScience) { + var tableDT = tableDTs.iterateNext(); + var gca = doc.evaluate('./input[@type="checkbox"]', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var title = doc.evaluate('./label', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + var gca = doc.evaluate('./td/input[@type="checkbox"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var title = doc.evaluate('./td/font/strong', tableRow, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + if(title.snapshotItem(0).textContent.toUpperCase() == title.snapshotItem(0).textContent) { + title = title.snapshotItem(1).textContent; + } else { + title = title.snapshotItem(0).textContent; + } + } + + var links = doc.evaluate('.//a', tableRow, nsResolver, XPathResult.ANY_TYPE, null); + while(link = links.iterateNext()) { + // prefer Full Text snapshots, but take abstracts + var textContent = Zotero.Utilities.cleanString(link.textContent); + if((textContent.substr(0, 8) == "Abstract" && !snapshot) || textContent.substr(0, 9) == "Full Text") { + snapshot = link.href; + } else if(textContent.substr(0, 3) == "PDF") { + pdf = link.href; + } + } + } + + snapshots[gca] = snapshot; + pdfs[gca] = pdf; + + items[gca] = Zotero.Utilities.cleanString(title); + } + + items = Zotero.selectItems(items); + if(!items) return true; + + var requests = new Array(); + for(var gca in items) { + var m = hostRe.exec(pdfs[gca]); + var baseURL = 'http://' + doc.location.host + '/cgi/citmgr?type=refman'; + + var thisRequest = null; + for each(var request in requests) { + if(request.baseURL == baseURL) { + thisRequest = request; + break; + } + } + + if(!thisRequest) { + thisRequest = new Object(); + thisRequest.snapshots = new Array(); + thisRequest.pdfs = new Array(); + thisRequest.args = ""; + thisRequest.baseURL = baseURL; + requests.push(thisRequest); + } + + thisRequest.snapshots.push(snapshots[gca]); + thisRequest.pdfs.push(pdfs[gca]); + thisRequest.args += "&gca="+gca; + } + } else { + var baseURL = doc.evaluate('//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext().href; + var pdf = doc.location.href.replace(/\/content\/[^\/]+\//, "/reprint/"); + Zotero.debug(pdf); + var requests = [{baseURL:baseURL, args:"&type=refman", snapshots:[doc], pdfs:[pdf]}]; + } + + handleRequests(requests); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Hindawi Publishing Corporation.js b/translators/Hindawi Publishing Corporation.js @@ -0,0 +1,75 @@ +{ + "translatorID":"bc39e05b-141a-4322-85f0-a5b86edf896b", + "translatorType":4, + "label":"Hindawi Publishing Corporation", + "creator":"Michael Berkowitz", + "target":"http://www.hindawi.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (url.match('GetArticle.aspx')) { + return "journalArticle"; + } else if (Zotero.Utilities.getItemArray(doc, doc, 'GetArticle.aspx').length != 0) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, 'GetArticle.aspx'); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.title = doc.title; + item.url = doc.location.href; + + var authorsx = doc.evaluate('//span/h1/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var aut; + var authors = new Array(); + while (aut = authorsx.iterateNext()) { + var author = aut.textContent; + item.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + item.doi = item.url.match(/doi=(.*)/)[1]; + + var voliss = doc.evaluate('//span/pre', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase(); + if (voliss.match(/volume/)) item.volume = voliss.match(/volume\s+(\d+)/)[1]; + if (voliss.match(/\(\d+\)/)) item.date = voliss.match(/\((\d+)\)/)[1]; + if (voliss.match(/issue/)) item.issue = voliss.match(/issue\s+(\d+)/)[1]; + if (voliss.match(/pages\s+\d+/)) item.pages = voliss.match(/pages\s+([\d\-]+)/)[1]; + if (voliss.match(/article id/)) item.extra = 'Article ID ' + voliss.match(/article id\s+(\d+)/)[1]; + + var abss = doc.evaluate('//span/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + var absbit; + var abs = ""; + while (absbit = abss.iterateNext()) { + abs += absbit.textContent; + } + abs = Zotero.Utilities.trimInternal(abs); + item.abstractNote = abs; + item.publicationTitle = doc.evaluate('//img[@id="ctl00_ImgTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().alt; + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:item.url.replace('GetArticle', 'Getpdf'), title:item.publicationTitle + " PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/History Cooperative.js b/translators/History Cooperative.js @@ -0,0 +1,145 @@ +{ + "translatorID":"e85a3134-8c1a-8644-6926-584c8565f23e", + "translatorType":4, + "label":"History Cooperative", + "creator":"Simon Kornblith", + "target":"https?://[^/]*historycooperative\\.org[^/]*/(?:journals/.+/.+/.+\\.s?html$|cgi-bin/search.cgi|journals/(?!cp|whc).+/.+/)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-06 08:15:00" +} + +function detectWeb(doc, url) { + var contents = doc.title.replace("Contents", ""); + if(doc.title != contents || doc.title == "History Cooperative: Search Results") { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + var field = metaTags.namedItem(field); + if(field) { + newItem[zoteroField] = field.getAttribute("content"); + } +} + +function scrape(doc) { + var newItem = new Zotero.Item("journalArticle"); + newItem.url = doc.location.href; + + var month, year; + var metaTags = doc.getElementsByTagName("meta"); + + associateMeta(newItem, metaTags, "Journal", "publicationTitle"); + associateMeta(newItem, metaTags, "Volume", "volume"); + associateMeta(newItem, metaTags, "Issue", "issue"); + + // grab title without using meta tag, since when titles have quotes History + // Cooperative can't create a proper meta tag + + // 16apr08 - fwg + // as of now, title meta tags are properly escaped, but + // in the case of book reviews, the title field is set to one of many (~10) variations + // of "Book Review", so it's easiest to get the book title from the proprietary tags (below) as originally coded. + + var titleRe = /<!--_title_-->(.*)<!--_\/title_-->/; + + // 16apr08 - fwg + // added trimInteral, since some pages have extraneous line breaks in source code + // added unescapeHTML to make quotes nice + var m = titleRe.exec(Zotero.Utilities.trimInternal(doc.getElementsByTagName("body")[0].innerHTML)); + if(m) { + newItem.title = Zotero.Utilities.trimInternal(Zotero.Utilities.unescapeHTML(m[1])); + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var bookTitle; + + //different journals want their reviewed book titles formatted in different ways (or have bizarre markup) + jNames = new Array ("The Western Historical Quarterly", "Journal of American Ethnic History", "Labour History","Environmental History", + "New York History","Indiana Magazine of History"); + + jXpaths = new Array("//tr[4]/td[3]/table/tbody/tr[1]/td/b/i", + "//[4]/td[3]/table/tbody/tr[1]/td/b/i", + "//tr[4]/td[3]/table/tbody/tr[1]/td/b/b/i", + "//tr[4]/td[3]/table/tbody/tr[1]/td/b[1]", + "//tr[4]/td[3]/p[1]/font/b/i", + "//tr[4]/td[3]/table[1]/tbody/tr[1]/td/h4/font/i" + ); + + // 16apr08 - fwg + // figure out which Xpath to use + // the below Xpath seems to work much of the time, so we default to it + var jXpath ='//tr[4]/td[3]/table/tbody/tr[1]/td/i'; + + for (var i=0; i < jNames.length; i++) { + if (newItem.publicationTitle == jNames[i]) { + //Zotero.debug("using Xpath for: " + jNames[i]); + //Zotero.debug("Xpath is: " + jXpaths[i]); + jXpath = jXpaths[i]; + } + } + + bookTitle = doc.evaluate(jXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + //Zotero.debug("bookTitle: " + bookTitle); + + // 16apr08 - fwg + //instead of general failure, let's admit we can't get the title and save everything else + // this is useful when a book review page has a one-off introduction or strange formatting that we can't anticipate. + if (bookTitle) { + newItem.title = "Review of " + bookTitle.textContent; + } else { + newItem.title = "Review of <unable to get title from page>"; + } + } + + var author = metaTags.namedItem("Author"); + if(author) { + var authors = author.getAttribute("content").split(" and "); + for(j in authors) { + authors[j] = authors[j].replace("Reviewed by ", ""); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author")); + } + } + + var month = metaTags.namedItem("PublicationMonth"); + var year = metaTags.namedItem("PublicationYear"); + if(month && year) { + newItem.date = month.getAttribute("content")+" "+year.getAttribute("content"); + } + + newItem.attachments.push({document:doc, title:"History Cooperative Snapshot"}); + + newItem.complete(); +} + +function doWeb(doc, url) { + var contents = doc.title.replace(" Contents | ", ""); + if(doc.title != contents || doc.title == "History Cooperative: Search Results") { + var items = Zotero.Utilities.getItemArray(doc, doc, '^https?://[^/]+/journals/.+/.+/.+\.html$'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/Hurricane Digital Memory Bank.js b/translators/Hurricane Digital Memory Bank.js @@ -0,0 +1,114 @@ +{ + "translatorID":"9418dcc2-cc1e-432b-b7a6-7b00b7402d2f", + "translatorType":4, + "label":"Hurricane Digital Memory Bank", + "creator":"Adam Crymble", + "target":"http://hurricanearchive.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//p[@id="cite-as"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } else if (doc.evaluate('//p[@class="object_description"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } +} + +//Hurricane Digital Memory Bank translator; Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("book"); + + var dataTags = new Object(); + var tagsContent = new Array(); + var tags; + var cite = doc.evaluate('//p[@id="cite-as"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var split1 = new Array(); + var split2 = new Array(); + var split3 = new Array(); + var split4 = new Array(); + var split5 = new Array(); + + //author + split1 = cite.split(', "'); + var authorWords = split1[0].split(/\b\s/); + if (authorWords.length > 3) { + newItem.creators.push({lastName: split1[0], creatorType: "creator"}); + } else { + + newItem.creators.push(Zotero.Utilities.cleanAuthor(split1[0], "author")); + } + + //title + split2 = split1[1].split('." '); + newItem.title = split2[0]; + + //repository + split3 = split2[1].split("Bank, "); + + //object number + split4 = split3[1].split(" ("); + newItem.callNumber = split4[0]; + + //date posted and URL + split5 = split4[1].split(")<"); + newItem.date = split5[0]; + + //tags + if (doc.evaluate('//ul[@class="taglist"][@id="tags"]/li', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathTags = doc.evaluate('//ul[@class="taglist"][@id="tags"]/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tagsCount = doc.evaluate('count (//ul[@class="taglist"][@id="tags"]/li)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i =0; i < tagsCount.numberValue; i++) { + newItem.tags[i] = xPathTags.iterateNext().textContent; + } + } + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + + var links = doc.evaluate('//p[@class="object_description"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//p[@class="object_description"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + + while (next_title = titles.iterateNext()) { + + items[links.iterateNext().href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/IEEE Xplore.js b/translators/IEEE Xplore.js @@ -0,0 +1,127 @@ +{ + "translatorID":"92d4ed84-8d0-4d3c-941f-d4b9124cfbb", + "translatorType":4, + "label":"IEEE Xplore", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://[^/]*ieeexplore.ieee.org[^/]*/(?:[^\\?]+\\?(?:|.*&)arnumber=[0-9]+|search/(?:searchresult.jsp|selected.jsp))", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + var articleRe = /[?&]ar(N|n)umber=([0-9]+)/; + var m = articleRe.exec(url); + + if(m) { + return "journalArticle"; + } else { + return "multiple"; + } + + return false; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articleRe = /[?&]ar(N|n)umber=([0-9]+)/; + var m = articleRe.exec(url); + + if(detectWeb(doc, url) == "multiple") { + // search page + var items = new Array(); + + var tableRows = doc.evaluate('//table[tbody/tr/td/div/strong]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + while(tableRow = tableRows.iterateNext()) { + var link = doc.evaluate('.//a[@class="bodyCopy"]', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().href; + + var title = ""; + var strongs = tableRow.getElementsByTagName("strong"); + for each(var strong in strongs) { + if(strong.textContent) { + title += strong.textContent+" "; + } + } + + items[link] = Zotero.Utilities.cleanString(title); + } + + items = Zotero.selectItems(items); + if(!items) return true; + + var urls = new Array(); + for(var url in items) { + urls.push(url); + } + } else { + var urls = [url]; + } + var arnumber = ""; + for each(var url in urls) { + var m = articleRe.exec(url); + arnumber = "%3Carnumber%3E"+m[2]+"%3C%2Farnumber%3E"; + var post = "dlSelect=cite_abs&fileFormate=ris&arnumber="+arnumber+"&x=5&y=10"; + var isRe = /[?&]isnumber=([0-9]+)/; + var puRe = /[?&]punumber=([0-9]+)/; + Zotero.Utilities.HTTP.doPost("http://ieeexplore.ieee.org/xpls/citationAct", post, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var url = urls.shift(); + var is = isRe.exec(url); + var pu = puRe.exec(url); + var arnumber = articleRe.exec(url); + if(item.notes[0] && item.notes[0].note) { + item.abstractNote = item.notes[0].note; + item.notes = new Array(); + } + var dupes = new Array(); + for (var i = 0 ; i < item.creators.length - 1 ; i++) { + if (item.creators[i].lastName + item.creators[i].firstName == item.creators[i+1].lastName + item.creators[i].firstName) { + dupes.push(i + 1); + } + } + + for (var i in dupes) { + delete item.creators[dupes[i]]; + } + var dupes = []; + for (var i = 0 ; i < item.creators.length ; i++) { + if (item.creators[i]) { + dupes.push(item.creators[i]); + } + } + item.creators = dupes; + var newurls = [url]; + Zotero.Utilities.processDocuments(newurls, function(newDoc) { + var xpath = '//p[@class="bodyCopyBlackLargeSpaced"]'; + var textElmt = newDoc.evaluate(xpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext(); + if (textElmt) { + var m = textElmt.textContent.match(/Identifier:\s+([^\n]*)\n/); + if (m){ + item.DOI = m[1]; + } + } + var pdfpath = '//td[2][@class="bodyCopyBlackLarge"]/a[@class="bodyCopy"][substring(text(), 1, 3) = "PDF"]'; + var pdfurlElmt = newDoc.evaluate(pdfpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext(); + if (pdfurlElmt) { + item.attachments = [{url:pdfurlElmt.href, title:"IEEE Xplore Full Text PDF", mimeType:"application/pdf"}]; + } + item.complete(); + }, function() {Zotero.done;}); + }); + translator.translate(); + }); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/IRIS translator.js b/translators/IRIS translator.js @@ -0,0 +1,315 @@ +{ + "translatorID":"8381bf68-11fa-418c-8530-2e00284d3efd", + "translatorType":4, + "label":"IRIS translator", + "creator":"Chad Mills and Michael Berkowitz", + "target":"http://[^/]*www.iris.rutgers.edu[^/]*/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-09 00:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr/td[1][@class="searchsum"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//th[@class="viewmarctags"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//div[@id="panel1"]//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + + if(!elmt) { + return false; + } + + var newItem = new Zotero.Item("book"); + newItem.extra = ""; + + newItem.series = ""; + var seriesItemCount = 0; + + while(elmt) { + try { + var node = doc.evaluate('./TD[1]/A[1]/strong[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(!node) { + var node = doc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } + if(node) { + var casedField = Zotero.Utilities.superCleanString(doc.evaluate('./TH[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + field = casedField.toLowerCase(); + var value = Zotero.Utilities.superCleanString(node.nodeValue); + if(field == "publisher") { + newItem.publisher = value; + } else if(field == "pub date") { + var re = /[0-9]+/; + var m = re.exec(value); + newItem.date = m[0]; + } else if(field == "isbn") { + var re = /^[0-9](?:[0-9X]+)/; + var m = re.exec(value); + newItem.ISBN = m[0]; + } else if(field == "title") { + var titleParts = value.split(" / "); + re = /\[(.+)\]/i; + if (re.test(titleParts[0])) { + var ar = re.exec(titleParts[0]); + var itype = ar[1].toLowerCase(); + if(itype== "phonodisc" || itype == "sound recording"){ + newItem.itemType = "audioRecording"; + }else if(itype=="videorecording"){ + newItem.itemType = "videoRecording"; + }else if(itype=="electronic resource"){ + newItem.itemType = "webPage"; + } + } + newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]); + }else if(field == "series") {//push onto item, delimit with semicolon when needed + if (seriesItemCount != 0){ + newItem.series += "; " + value; + } + else if(seriesItemCount == 0) { + newItem.series = value; + } + seriesItemCount++;//bump counter + }else if(field == "dissertation note") { + newItem.itemType = "thesis"; + var thesisParts = value.split("--"); + var uniDate = thesisParts[1].split(", "); + newItem.university = uniDate[0]; + newItem.date = uniDate[1]; + }else if(field == "edition") { + newItem.edition = value; + }else if(field == "physical descrip") { + //support + var physParts = value.split(" : "); + var physParts = physParts[0].split(" ; "); + newItem.pages = physParts[0]; + } else if(field == "publication info") { + var pubParts = value.split(" : "); + newItem.place = pubParts[0]; + newItem.publisher = pubParts[1]; + } else if(field == "personal author") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true)); + } else if(field == "performer") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "performer", true)); + } else if(field == "author"){ + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true)); + } else if(field == "added author") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true)); + } else if(field == "conference author" || field == "corporate author") { + newItem.creators.push(value); + } else if(field == "subject" || field == "corporate subject" || field == "geographic term") { + var subjects = value.split("--"); + newItem.tags = newItem.tags.concat(subjects); + } else if(field == "personal subject") { + var subjects = value.split(", "); + newItem.tags = newItem.tags.push(value[0]+", "+value[1]); + } else if(value && field != "http") { + newItem.extra += casedField+": "+value+"\n"; + } + } + } catch (e) {} + elmt = elmts.iterateNext(); + } + + if(newItem.extra) { + newItem.extra = newItem.extra.substr(0, newItem.extra.length-1); + } + + var callNumber = doc.evaluate('//tr/td[1][@class="holdingslist"]/strong/text()', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(callNumber && callNumber.nodeValue) { + newItem.callNumber = callNumber.nodeValue; + } + + var domain = doc.location.href.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + newItem.accessed = Date(); + newItem.complete(); + return true; +} + +function doWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+ + var xpath = '//td[@class="searchsum"]/table'; + + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: searchsum"); + sirsiNew = true; + } else if (doc.evaluate('//form[@name="hitlist"]/table/tbody/tr', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: hitlist"); + sirsiNew = false; + } else if (doc.evaluate('//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: viewmarctags"); + sirsiNew = true; + } else if (doc.evaluate('//input[@name="VOPTIONS"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: VOPTIONS"); + sirsiNew = false; + } else { + var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver, XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") { + Zotero.debug("SIRSI doWeb: Viewing record"); + sirsiNew = false; + } + } + } + + if (sirsiNew) { //executes Simon's SIRSI 2003+ scraper code + Zotero.debug("Running SIRSI 2003+ code"); + if(!scrape(doc)) { + var checkboxes = new Array(); + var urls = new Array(); + var availableItems = new Array(); + //begin IUCAT fixes by Andrew Smith + var iuRe = /^https?:\/\/www\.iucat\.iu\.edu/; + var iu = iuRe.exec(url); + //IUCAT fix 1 of 2 + if (iu){ + var tableRows = doc.evaluate('//td[@class="searchsum"]/table[//input[@class="submitLink"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else{ + var tableRows = doc.evaluate('//td[@class="searchsum"]/table[//input[@value="Details"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + var tableRow = tableRows.iterateNext(); // skip first row + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + //IUCAT fix 2 of 2 + if (iu){ + var input = doc.evaluate('.//input[@class="submitLink"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var text = doc.evaluate('.//label/span', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + var input = doc.evaluate('.//input[@value="Details"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var text = doc.evaluate('.//label/strong', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + //end IUCAT fixes by Andrew Smith + if(text) { + availableItems[input.name] = text; + } + } + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + var hostRe = new RegExp("^http(?:s)?://[^/]+"); + var m = hostRe.exec(doc.location.href); + Zotero.debug("href: " + doc.location.href); + var hitlist = doc.forms.namedItem("hitlist"); + var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value; + var uris = new Array(); + for(var i in items) { + uris.push(baseUrl+"&"+i+"=Details"); + } + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done() }, null); + Zotero.wait(); + } + } else{ //executes Simon's SIRSI -2003 translator code + Zotero.debug("Running SIRSI -2003 code"); + var uri = doc.location.href; + var recNumbers = new Array(); + var xpath = '//form[@name="hitlist"]/table/tbody/tr'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + if(elmt) { // Search results page + var uriRegexp = /^http:\/\/[^\/]+/; + var m = uriRegexp.exec(uri); + var postAction = doc.forms.namedItem("hitlist").getAttribute("action"); + var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40"; + var titleRe = /<br>\s*(.*[^\s])\s*<br>/i; + var items = new Array(); + do { + var checkbox = doc.evaluate('.//input[@type="checkbox"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + // Collect title + var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if(checkbox && title) { + items[checkbox.name] = Zotero.Utilities.cleanString(title); + } + } while(elmt = elmts.iterateNext()); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + recNumbers.push(i); + } + } else {// Normal page + // this regex will fail about 1/100,000,000 tries + var uriRegexp = /^((.*?)\/([0-9]+?))\//; + var m = uriRegexp.exec(uri); + var newUri = m[1]+"/40" + var elmts = doc.evaluate('/html/body/form', doc, nsResolver, XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + var initialText = doc.evaluate('.//text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") { + recNumbers.push(doc.evaluate('./b[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + break; + } + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.loadDocument(newUri+'?marks='+recNumbers.join(",")+'&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=', function(doc) { + var pre = doc.getElementsByTagName("pre"); + var text = pre[0].textContent; + var documents = text.split("*** DOCUMENT BOUNDARY ***"); + for(var j=1; j<documents.length; j++) { + var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type="; + var lines = documents[j].split("\n"); + var record = new marc.record(); + var tag, content; + var ind = ""; + for(var i=0; i<lines.length; i++) { + var line = lines[i]; + if(line[0] == "." && line.substr(4,2) == ". ") { + if(tag) { + content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1"); + record.addField(tag, ind, content); + } + } else { + content += " "+line.substr(6); + continue; + } + tag = line.substr(1, 3); + if(tag[0] != "0" || tag[1] != "0") { + ind = line.substr(6, 2); + content = line.substr(8); + } else { + content = line.substr(7); + if(tag == "000") { + tag = undefined; + record.leader = "00000"+content; + Zotero.debug("the leader is: "+record.leader); + } + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + newItem.complete(); + } + Zotero.done(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/ISI Web of Knowledge.js b/translators/ISI Web of Knowledge.js @@ -0,0 +1,112 @@ +{ + "translatorID":"594ebe3c-90a0-4830-83bc-9502825a6810", + "translatorType":4, + "label":"ISI Web of Knowledge", + "creator":"Michael Berkowitz", + "target":"(WOS_GeneralSearch|product=WOS)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-07 14:50:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Web of Science Results") != -1) { + return "multiple"; + } else if (url.indexOf("full_record.do") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var ids = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object; + var xpath = '//a[@class="smallV110"]'; + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href.match(/\?(.*)/)[1]] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + ids.push(i); + } + } else { + ids.push(url.match(/\?(.*)/)[1]); + } + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + var m = hostRegexp.exec(url); + var host = m[1]; + for (var i in ids) { + ids[i] = host+"/full_record.do?" + ids[i]; + } + Zotero.Utilities.processDocuments(ids, function(newDoc) { + var url = newDoc.location.href; + var sid = newDoc.evaluate('//input[@name="selectedIds"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value; + var nid = newDoc.evaluate('//input[@name="SID"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().value; + var post2 = 'product=WOS&product_sid=' + nid + '&plugin=&product_st_thomas=http://esti.isiknowledge.com:8360/esti/xrpc&export_ref.x=0&export_ref.y=0'; + var post = 'action=go&mode=quickOutput&product=WOS&SID=' + nid + '&format=ref&fields=BibAbs&mark_id=WOS&count_new_items_marked=0&selectedIds=' + sid + '&qo_fields=bib&endnote.x=95&endnote.y=12&save_options=default'; + Zotero.Utilities.HTTP.doPost('http://apps.isiknowledge.com/OutboundService.do', post, function() { + Zotero.Utilities.HTTP.doPost('http://pcs.isiknowledge.com/uml/uml_view.cgi', post2, function(text) { + var lines = text.split("\n"); + var field = " "; + var content = " "; + var item = new Zotero.Item("journalArticle"); + item.url = url; + var authors; + var fieldRe = /^[A-Z0-9]{2}(?: |$)/; + + for each(var line in lines) { + if(line.match(fieldRe)) { + field = line.match(fieldRe)[0].substr(0,2); + content = line.substr(3); + if ((field == "AF" || field == "AU")) { + if (!item.creators[0]) { + var author = content.split(","); + item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"}); + } else { + field = ""; + } + } else if (field == "TI") { + item.title = content; + } else if (field == "SO") { + item.publicationTitle = content; + } else if (field == "SN") { + item.ISSN = content; + } else if (field == "PD" || field == "PY") { + if (item.date) { + item.date += " " + content; + } else { + item.date = content; + } + } else if (field == "VL") { + item.volume = content; + } else if (field == "IS") { + item.issue = content; + } else if (field == "BP") { + item.pages = content; + } else if (field == "EP") { + item.pages += "-" + content; + } else if (field == "AB") { + item.abstractNote = content; + } + } else { + content = Zotero.Utilities.trimInternal(line); + if (field == "AF" || field == "AU") { + var author = content.split(","); + item.creators.push({firstName:author[1], lastName:author[0], creatorType:"author"}); + } else if (field == "TI") { + item.title += " " + content; + } else if (field == "AB") { + item.abstractNote += " " + content; + } + } + } + item.attachments = [{url:item.url, title:"ISI Web of Knowledge Snapshot", mimeType:"text/html"}]; + item.complete(); + }); + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/InderScience.js b/translators/InderScience.js @@ -0,0 +1,83 @@ +{ + "translatorID":"409c520b-0720-4011-8fce-70fcd9806493", + "translatorType":4, + "label":"InderScience", + "creator":"Michael Berkowitz", + "target":"http://www.inderscience.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-09 00:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]][2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() + || doc.evaluate('//td[1][@class="textcontent"]/table/tbody/tr/td[2]/b/u/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("rec_id") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + if (detectWeb(doc, url) == "journalArticle") { + scrape(url); + } else if ((detectWeb(doc, url) == "multiple")) { + if (doc.evaluate('/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var items = new Object(); + var results = doc.evaluate('/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]', doc, null, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate('.//tr[1]/td[3]', result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var id = doc.evaluate('.//tr[8]/td[2]/a[2]', result, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/rec_id=([^&]+)/)[1]; + items[id] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + scrape('http://www.inderscience.com/search/index.php?action=record&rec_id=' + i); + } + } else { + var arts = new Array(); + var items = Zotero.Utilities.getItemArray(doc, doc, "&rec_id"); + items = Zotero.selectItems(items); + for (var i in items) { + scrape(i); + } + } + } + Zotero.wait(); +} + +function scrape(link) { + Zotero.Utilities.loadDocument(link, function(newDoc) { + var data = new Object(); + var rows = newDoc.evaluate('/html/body/table/tbody/tr/td[2]/table[tbody/tr/td[3]]//tr[td[3]]', newDoc, null, XPathResult.ANY_TYPE, null); + var row; + while (row = rows.iterateNext()) { + var tag = Zotero.Utilities.trimInternal(newDoc.evaluate('./td[2]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var value = Zotero.Utilities.trimInternal(newDoc.evaluate('./td[3]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + data[tag] = value; + } + Zotero.debug(data); + var item = new Zotero.Item("journalArticle"); + item.title = data['Title:']; + item.abstractNote = data['Abstract:']; + item.url = newDoc.location.href; + item.tags = data['Keywords:'].substr(0, data['Keywords:'].length - 1).split(/\s*;\s*/); + item.DOI = data['DOI:']; + item.attachments.push({url:item.url, title:item.title + ": InderScience Snapshot", mimeType:"text/html"}); + var authors = data['Author:'].split(/\s*,\s*/); + for each (var author in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + var voliss = data['Journal:'].match(/^([^\d]+)(\d+)\s*\-\s*Vol\.\s*(\d+)\s*,\s*No\.(.+)pp\.\s*(.*)$/); + Zotero.debug(voliss); + item.publicationTitle = voliss[1]; + item.date = voliss[2]; + item.volume = voliss[3]; + item.issue = voliss[4]; + item.pages = voliss[5]; + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/InfoTrac OneFile.js b/translators/InfoTrac OneFile.js @@ -0,0 +1,131 @@ +{ + "translatorID":"63c25c45-6257-4985-9169-35b785a2995e", + "translatorType":4, + "label":"InfoTrac OneFile", + "creator":"Simon Kornblith", + "target":"^https?://[^/]+/itx/(?:[a-z]+Search|retrieve|paginate|tab)\\.do", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-15 03:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.evaluate('//img[@alt="Thomson Gale"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext()) { + if(doc.evaluate('//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else { + return "journalArticle"; + } + } +} + +function infoTracRIS(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes && item.notes[0]) { + item.extra = item.notes[0].note; + + delete item.notes; + item.notes = undefined; + } + + // get underscored terms (term headings?) out of tags + for(var i in item.tags) { + var index = item.tags[i].indexOf("_"); + if(index != -1) { + item.tags[i] = item.tags[i].substr(0, index); + } + } + + // add names to attachments + for(var i in item.attachments) { + if(!item.attachments[i].title) { + item.attachments[i] = undefined; + } else { + item.attachments[i].title = "InfoTrac OneFile "+item.attachments[i].title; + } + } + + //item.attachments = newAttachments.shift(); + //Zotero.debug(item.attachments); + item.complete(); + }); + translator.translate(); + Zotero.done(); +} + +function readEncoded(url) { + var newArray = new Array(); + + var parts = url.split(/[?&]/); + for each(var part in parts) { + var index = part.indexOf("="); + if(index !== -1) { + newArray[part.substr(0, index)] = part.substr(index+1); + } + } + + return newArray; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var hostRe = new RegExp("^https?://[^/]+/"); + var host = hostRe.exec(doc.location.href)[0]; + + if(doc.evaluate('//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var items = Zotero.Utilities.getItemArray(doc, doc, '^https?://[^/]+/itx/retrieve\\.do\\?.*docId='); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + // parse things out of URLs + var time = new Date(); + time = time.getTime(); + var markedString = ""; + for(var i in items) { + var postVal = readEncoded(i); + markedString += postVal.tabID+"_"+postVal.docId+"_1_0_"+postVal.contentSet+"_srcprod="+postVal.prodId+"|^"; + } + + var postData = "inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=UPDATE_MARK_LIST&userGroupName="+postVal.userGroupName+"&markedString="+markedString+"&a="+time; + Zotero.Utilities.HTTP.doGet(host+"itx/marklist.do?inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=CLEAR_MARK_LIST&userGroupName="+postVal.userGroupName, + function(text) { // clear marked + Zotero.Utilities.HTTP.doPost(host+"itx/marklist.do", postData, + function(text) { // mark + Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID=T-ALL&prodId="+postVal.prodId+"&docId=&actionString=FormatCitation&userGroupName="+postVal.userGroupName+"&citationFormat=ENDNOTE", + function(text) { // get marked + infoTracRIS(text); + }); + }); + }); + } else { + // just extract from single page + var postVal = readEncoded(url); + Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID="+postVal.tabID+"&prodId="+postVal.prodId+"&docId="+postVal.docId+"&actionString=FormatCitation&citationFormat=ENDNOTE", + function(text) { + infoTracRIS(text); + }); + } + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/InfoTrac.js b/translators/InfoTrac.js @@ -0,0 +1,214 @@ +{ + "translatorID":"6773a9af-5375-3224-d148-d32793884dec", + "translatorType":4, + "label":"InfoTrac", + "creator":"Simon Kornblith", + "target":"^https?://[^/]+/itw/infomark/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-18 06:00:45" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // ensure that there is an InfoTrac logo + if(!doc.evaluate('//img[substring(@alt, 1, 8) = "InfoTrac"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return false; + + if(doc.title.substring(0, 8) == "Article ") { + var genre = doc.evaluate('//comment()[substring(., 1, 6) = " Genre"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + if(genre) { + var value = Zotero.Utilities.cleanString(genre.nodeValue.substr(7)); + if(value == "article") { + return "journalArticle"; + } else if(value == "book") { + return "book"; + } else if(value == "dissertation") { + return "thesis"; + } else if(value == "bookitem") { + return "bookSection"; + } + } + + return "magazineArticle"; + } else if(doc.title.substring(0, 10) == "Citations ") { + return "multiple"; + } +} + +function extractCitation(url, elmts, title, doc) { + var newItem = new Zotero.Item(); + newItem.url = url; + + if(title) { + newItem.title = Zotero.Utilities.superCleanString(title); + } + while(elmt = elmts.iterateNext()) { + var colon = elmt.nodeValue.indexOf(":"); + var field = elmt.nodeValue.substring(1, colon).toLowerCase(); + var value = elmt.nodeValue.substring(colon+1, elmt.nodeValue.length-1); + if(field == "title") { + newItem.title = Zotero.Utilities.superCleanString(value); + } else if(field == "journal") { + newItem.publicationTitle = value; + } else if(field == "pi") { + parts = value.split(" "); + var date = ""; + var field = null; + for(j in parts) { + firstChar = parts[j].substring(0, 1); + + if(firstChar == "v") { + newItem.itemType = "journalArticle"; + field = "volume"; + } else if(firstChar == "i") { + field = "issue"; + } else if(firstChar == "p") { + field = "pages"; + + var pagesRegexp = /p(\w+)\((\w+)\)/; // weird looking page range + var match = pagesRegexp.exec(parts[j]); + if(match) { // yup, it's weird + var finalPage = parseInt(match[1])+parseInt(match[2]) + parts[j] = "p"+match[1]+"-"+finalPage.toString(); + } else if(!newItem.itemType) { // no, it's normal + // check to see if it's numeric, bc newspaper pages aren't + var justPageNumber = parts[j].substr(1); + if(parseInt(justPageNumber).toString() != justPageNumber) { + newItem.itemType = "newspaperArticle"; + } + } + } else if(!field) { // date parts at the beginning, before + // anything else + date += " "+parts[j]; + } + + if(field) { + isDate = false; + + if(parts[j] != "pNA") { // make sure it's not an invalid + // page number + // chop of letter + newItem[field] = parts[j].substring(1); + } else if(!newItem.itemType) { // only newspapers are missing + // page numbers on infotrac + newItem.itemType = "newspaperArticle"; + } + } + } + + // Set type + if(!newItem.itemType) { + newItem.itemType = "magazineArticle"; + } + + if(date != "") { + newItem.date = date.substring(1); + } + } else if(field == "author") { + var author = Zotero.Utilities.cleanAuthor(value, "author", true); + + // ensure author is not already there + var add = true; + for each(var existingAuthor in newItem.creators) { + if(existingAuthor.firstName == author.firstName && existingAuthor.lastName == author.lastName) { + add = false; + break; + } + } + if(add) newItem.creators.push(author); + } else if(field == "issue") { + newItem.issue = value; + } else if(field == "volume") { + newItem.volume = value; + } else if(field == "issn") { + newItem.ISSN = value; + } else if(field == "gjd") { + var m = value.match(/\(([0-9]{4}[^\)]*)\)(?:, pp\. ([0-9\-]+))?/); + if(m) { + newItem.date = m[1]; + newItem.pages = m[2]; + } + } else if(field == "BookTitle") { + newItem.publicationTitle = value; + } else if(field == "genre") { + value = value.toLowerCase(); + if(value == "article") { + newItem.itemType = "journalArticle"; + } else if(value == "book") { + newItem.itemType = "book"; + } else if(value == "dissertation") { + newItem.itemType = "thesis"; + } else if(value == "bookitem") { + newItem.itemType = "bookSection"; + } + } + } + + if(doc) { + newItem.attachments.push({document:doc, title:"InfoTrac Snapshot"}); + } else { + newItem.attachments.push({url:url, title:"InfoTrac Snapshot", + mimeType:"text/html"}); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var uri = doc.location.href; + if(doc.title.substring(0, 8) == "Article ") { // article + var xpath = '/html/body//comment()'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + extractCitation(uri, elmts); + } else { // search results + var items = new Array(); + var uris = new Array(); + var elmts = new Array(); + + var host = doc.location.href.match(/^https?:\/\/[^\/]+/)[0]; + + var tableRows = doc.evaluate('/html/body//table/tbody/tr/td[a/b]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var tableRow; + var javaScriptRe = /'([^']*)' *, *'([^']*)'/ + var i = 0; + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + var link = doc.evaluate('./a', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var m = javaScriptRe.exec(link.href); + if(m) { + uris[i] = host+"/itw/infomark/192/215/90714844w6"+m[1]+"?sw_aep=olr_wad"+m[2]; + } + var article = doc.evaluate('./b/text()', link, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + items[i] = article.nodeValue; + // Chop off final period + if(items[i].substr(items[i].length-1) == ".") { + items[i] = items[i].substr(0, items[i].length-1); + } + elmts[i] = doc.evaluate(".//comment()", tableRow, nsResolver, XPathResult.ANY_TYPE, null); + i++; + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + extractCitation(uris[i], elmts[i], items[i]); + } + } +} +\ No newline at end of file diff --git a/translators/Informaworld.js b/translators/Informaworld.js @@ -0,0 +1,107 @@ +{ + "translatorID":"1885b93c-cf37-4b25-aef5-283f42eada9d", + "translatorType":4, + "label":"Informaworld", + "creator":"Michael Berkowitz", + "target":"http://www.informaworld.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-19 10:30:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("quicksearch") != -1) { + return "multiple"; + } else if (doc.evaluate('//a[substring(text(), 2, 8) = "Download"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + if (doc.evaluate('//div[@id="metahead"]/div/strong[text() = "Published in:"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var pubtype = doc.evaluate('//img[substring(@title, 1, 17) = "Publication type:"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().title; + if (pubtype.match("journal")) { + return "journalArticle"; + } else if (pubtype.match("book")) { + return "bookSection"; + } + } else { + return "book"; + } + } else if (url.indexOf("content=g") != -1 || + doc.evaluate('//div[@id="browse"]//tbody/tr/td[2]/a[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || + doc.evaluate('//div[@id="title"]//td[2]/div/strong/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else { + return true; + } +} + + +function doWeb(doc, url) { + var links = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//div[@id="quicksearch"]//tr/td/b/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="quicksearch"]//tr/td/b/a'; + } else if (doc.evaluate('//div[@id="title"]/table/tbody/tr[2]//strong/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="title"]/table/tbody/tr[2]//strong/a'; + } else if (doc.evaluate('//div[@id="browse"]//tbody/tr/td[2]/a[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="browse"]//tbody/tr/td[2]/a[2]'; + } else if (doc.evaluate('//div[@id="title"]//td[2]/div/strong/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="title"]//td[2]/div/strong/a'; + } + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var title = titles.iterateNext(); + while (title) { + items[title.href] = title.textContent; + title = titles.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + links.push(i); + } + } else { + links = [url]; + } + Zotero.debug(links); + + Zotero.Utilities.processDocuments(links, function(newDoc) { + var xpath = '//div[@id="metahead"]/div'; + var stuff = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null); + var thing = stuff.iterateNext() ; + while (thing) { + if (thing.textContent.match(/DOI/)) { + var doi = Zotero.Utilities.trimInternal(thing.textContent).match(/:\s+(.*)/)[1]; + } + thing = stuff.iterateNext(); + } + var pdfurl = newDoc.evaluate('//div[@id="content"]/div/a[1]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + var id = newDoc.location.href.match(/content=([\w\d]+)/); + var post = 'tab=citation&selecteditems=' + id[1].substr(1) + '&content=' + id[1] + '&citstyle=refworks&showabs=false&format=file'; + Zotero.Utilities.HTTP.doPost('http://www.informaworld.com/smpp/content', post, function(text) { + text = text.replace(/RT/, "TY"); + text = text.replace(/VO/, "VL"); + text = text.replace(/LK/, "UR"); + text = text.replace(/YR/, "PY"); + text = text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - ") + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var type = text.match(/TY\s+\-\s+([^\n]*)/)[1]; + if (type == "Journal") { + item.itemType = "journalArticle"; + } else if (type == "Book, Whole") { + item.itemType = "book"; + } else if (type == "Book, Section") { + item.itemType = "bookSection"; + } + if (doi) { + item.DOI = doi; + } + item.attachments.push({url:pdfurl, title:item.title, mimeType:'application/pdf'}); + item.complete(); + }); + translator.translate(); + + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/IngentaConnect.js b/translators/IngentaConnect.js @@ -0,0 +1,71 @@ +{ + "translatorID":"9e306d5d-193f-44ae-9dd6-ace63bf47689", + "translatorType":4, + "label":"IngentaConnect", + "creator":"Michael Berkowitz", + "target":"http://(www.)?ingentaconnect.com", + "minVersion":"1.0.0b3r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-02 11:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("article?") != -1 || url.indexOf("article;") != -1 || url.indexOf("/art") != -1) { + return "journalArticle"; + } else if (url.indexOf("search?") !=-1 || url.indexOf("search;") != -1) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var artlink = '//div//p/strong/a'; + var links = doc.evaluate(artlink, doc, null, XPathResult.ANY_TYPE, null); + var next_link; + while (next_link = links.iterateNext()) { + items[next_link.href] = next_link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.debug(articles); + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var risurl = newDoc.evaluate('//div[@id="export-formats"]/ul/li/a[@title="EndNote Export"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + if (newDoc.evaluate('//div[@id="abstract"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) var abs = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[@id="abstract"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10); + if (newDoc.evaluate('//div[@id="info"]/p[1]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var keywords = newDoc.evaluate('//div[@id="info"]/p[1]/a', newDoc, null, XPathResult.ANY_TYPE, null); + var key; + var keys = new Array(); + while (key = keywords.iterateNext()) { + keys.push(Zotero.Utilities.capitalizeTitle(key.textContent)); + } + } + Zotero.Utilities.HTTP.doGet(risurl, function(text) { + text = text.replace(/(PY\s+\-\s+)\/+/, "$1"); + text = text.replace(/ER\s\s\-/, "") + "\nER - "; + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (abs) item.abstractNote = abs; + item.attachments = [{url:item.url, title:"IngentaConnect Snapshot", mimeType:"text/html"}]; + if (keys) item.tags = keys; + if (item.DOI) { + if (item.DOI.match(/doi/)) { + item.DOI = item.DOI.substr(4); + } + } + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/Innovate Online.js b/translators/Innovate Online.js @@ -0,0 +1,102 @@ +{ + "translatorID":"ca6e95d1-46b9-4535-885c-df0c2d4b7f7a", + "translatorType":4, + "label":"Innovate Online", + "creator":"Michael Berkowitz", + "target":"^http://(www.)?innovateonline.info/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-07 19:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("view=article") != -1) { + return "journalArticle"; + } else if (url.indexOf("view=search") != -1) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var newURIs = new Array(); + + if (url.indexOf("view=search") != -1) { + var titles = new Array(); + var hrefs = new Array(); + var items = new Object(); + var xpath = '//ul[@class="articles"]/li[@class="result"]/div[@class="header"]'; + var names = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null); + var next_item = names.iterateNext(); + while (next_item) { + titles.push(next_item.textContent.split(/\n/)[3]); + next_item = names.iterateNext(); + } + + var nextpath = '//ul[@class="articles"]/li/@onclick'; + var links = doc.evaluate(nextpath, doc, namespace, XPathResult.ANY_TYPE, null); + var next_link = links.iterateNext(); + while (next_link) { + hrefs.push(next_link.textContent); + next_link = links.iterateNext(); + } + + for (var i = 0 ; i < titles.length ; i++) { + items[hrefs[i].match(/\d+/)] = titles[i]; + } + items = Zotero.selectItems(items); + + for (var i in items) { + newURIs.push('http://innovateonline.info/index.php?view=article&id=' + i); + } + } else { + var newURL = url; + if (newURL.indexOf("highlight") != -1) { + newURL = newURL.substring(0, newURL.indexOf("highlight") -1); + } + if (newURL.indexOf("action=synopsis") != -1) { + newURL = newURL.replace("action=synopsis", "action=article"); + } + newURIs.push(newURL); + } + Zotero.debug(newURIs); + + Zotero.Utilities.processDocuments(newURIs, function(newDoc) { + var newItem = new Zotero.Item("journalArticle"); + newItem.repository = "Innovate Online"; + newItem.publicationTitle = "Innovate"; + newItem.title = newDoc.title.substring(10); + + var authors = newDoc.evaluate('//div[@id="title"]/div[@class="author"]/a', newDoc, namespace, XPathResult.ANY_TYPE, null); + var author = authors.iterateNext(); + while (author) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author")); + author = authors.iterateNext(); + } + + newItem.date = newDoc.evaluate('//div[@id="page"]/a/div[@class="title"]', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var voliss = newDoc.evaluate('//div[@id="page"]/a/div[@class="subtitle"]', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Volume\s+(\d+).*Issue\s+(\d+)/); + newItem.volume = voliss[1]; + newItem.issue = voliss[2]; + + var id = newDoc.location.href.match(/\d+/)[0]; + var PDFurl = "http://innovateonline.info/print.php?view=pdf&id=" + id; + newItem.attachments = [ + {url:newDoc.location.href, title:"Innovate Online Snapshot", mimeType:"text/html"}, + {url:PDFurl, title:"Innovate Online PDF", mimeType:"application/pdf"} + ] + + Zotero.Utilities.HTTP.doGet(newDoc.location.href.replace("action=article", "action=synopsis"), function(text) { + var abs = text.match(/<div id=\"synopsis\">\n<p>(.*)<\/p>/)[1]; + newItem.abstractNote = Zotero.Utilities.unescapeHTML(Zotero.Utilities.cleanTags(abs)); + newItem.complete(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Institute of Physics.js b/translators/Institute of Physics.js @@ -0,0 +1,76 @@ +{ + "translatorID":"9346ddef-126b-47ec-afef-8809ed1972ab", + "translatorType":4, + "label":"Institute of Physics", + "creator":"Michael Berkowitz", + "target":"^http://www.iop.org/EJ/(toc|abstract|search|article)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":99, + "inRepository":true, + "lastUpdated":"2008-04-28 17:50:00" +} + +function detectWeb(doc, url) { + if ((doc.location.href.indexOf("toc") == -1) && (doc.location.href.indexOf("search") == -1)) { + return "journalArticle"; + } else { + return "multiple"; + } +} + +function parseRIS(getURL, pdfURL) { + var newGet = getURL.replace(/EJ\/[^/]+/, "EJ/sview") + "?format=refmgr&submit=1"; + Zotero.Utilities.HTTP.doGet(newGet, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator ("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = getURL; + item.attachments = [ + {url:item.url, title:"IOP Snapshot", mimeType:"text/html"} + ]; + if (pdfURL != null) { + item.attachments.push({url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"}); + } + item.complete(); + }); + translator.translate(); + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var results = doc.evaluate('//td[*//td[*//a[contains(text(), "Abstract")]]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = doc.evaluate('.//strong', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate('.//a[contains(text(), "Abstract")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var pdflink = doc.evaluate('.//a[contains(text(), "PDF")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ? doc.evaluate('.//a[contains(text(), "PDF")]', result, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href : null; + var links = new Array(link, pdflink); + items[links] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var links = url + ',' + pdfurl; + arts = [links]; + } + for each (var linkset in arts) { + var urls = linkset.split(','); + parseRIS(urls[0], urls[1]); + } +} +\ No newline at end of file diff --git a/translators/Institute of Pure and Applied Physics.js b/translators/Institute of Pure and Applied Physics.js @@ -0,0 +1,121 @@ +{ + "translatorID":"0863b8ec-e717-4b6d-9e35-0b2db2ac6b0f", + "translatorType":4, + "label":"Institute of Pure and Applied Physics", + "creator":"Michael Berkowitz", + "target":"http://(jjap|apex|jpsj)\\.ipap\\.jp/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-23 09:45:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Table of Contents") != -1 || doc.title.indexOf("search result") != -1) { + return "multiple"; + } else if (url.indexOf("link?") != -1) { + return "journalArticle"; + } +} + +var journalNames = { + jpsj:["Journal of the Physical Society of Japan", "0031-9015"], + jjap:["Japanese Journal of Applied Physics", "0021-4922"], + apex:["Applied Physics Express", "1882-0778"] +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title.toLowerCase().indexOf("table of contents") != -1) { + if (url.match(/apex/)) { + var titlesx = '//div[@id="contents"]/dl/dt'; + var linksx = '//div[@id="contents"]/dl/dd/a[1]'; + } else if (url.match(/jjap/)) { + var xpath = '/html/body/dt/a'; + } else if (url.match(/jpsj/)) { + var xpath = '/html/body/dl/dt/a[contains(@href, "link")]'; + } + } else if (doc.title.toLowerCase().indexOf("search result") != -1) { + var linksx = '/html/body//li/a'; + var titlesx = '/html/body//li//b'; + } + if (xpath) { + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = Zotero.Utilities.trimInternal(title.textContent); + } + } else { + var titles = doc.evaluate(titlesx, doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate(linksx, doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.url = doc.location.href; + var jour = item.url.match(/http:\/\/([^.]+)\./)[1]; + item.publicationTitle = journalNames[jour][0]; + item.ISSN = journalNames[jour][1]; + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//h2[@class="title"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.trimInternal(doc.evaluate('//p[@class="author"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + authors = authors.replace(/\d+/g, ""); + authors = authors.split(/,\s+(and)?\s*/); + for each (var aut in authors) { + if ((aut != "") && (aut != "and")) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + + //get info + var infos = doc.evaluate('//p[@class="info"]', doc, null, XPathResult.ANY_TYPE, null); + var voliss = infos.iterateNext().textContent; + var keys = infos.iterateNext().textContent; + if (voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+([\d\-]+)/)) { + voliss = voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+([\d\-]+)/); + var x = 4 + } else { + voliss = voliss.match(/([^\d]+)(\d+)\s+\((\d+)\)\s+(pp\.)?\s+([\d\-]+)/); + var x = 5 + } + item.journalAbbreviation = Zotero.Utilities.trimInternal(voliss[1]); + item.volume = voliss[2]; + item.date = voliss[3]; + item.pages = voliss[x]; + + keys = Zotero.Utilities.trimInternal(keys); + + if (keys.match(/KEYWORDS/)) { + keys = keys.match(/KEYWORDS:\s+(.*)URL:\s+(.*)DOI:\s+(.*)$/); + var a = 1; + var c = 3; + } else { + keys = keys.match(/URL:\s+(.*)DOI:\s+(.*)$/); + var c = 2; + } + if (a) { + item.tags = keys[a].split(/,\s+/); + } + item.DOI = keys[c]; + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//p[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.complete(); + var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + item.attachments = [ + {url:item.url, title:"IPAP Snapshot", mimeType:"text/html"} + ]; + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Inter-Research Science Center.js b/translators/Inter-Research Science Center.js @@ -0,0 +1,106 @@ +{ + "translatorID":"0eeb2ac0-fbaf-4994-b98f-203d273eb9fa", + "translatorType":4, + "label":"Inter-Research Science Center", + "creator":"Michael Berkowitz", + "target":"http://www.int-res.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="journal-index"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || + doc.evaluate('//div[@class="tx-indexedsearch-res"]//tr[1]/td[2]//a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//a[@class="citeexport"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +var journals = { + meps:["Marine Ecology Progress Series", "Mar Ecol Prog Ser"], + ab:["Aquatic Biology", "Aquat Biol"], + ame:["Aquatic Microbial Ecology", "Aquat Microb Ecol"], + dao:["Diseases of Aquatic Organisms", "Dis Aquat Org"], + cr:["Climate Research", "Clim Res"], + esr:["Endangered Species Research", "Endang Species Res"] +}; + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//div[@class="tx-indexedsearch-res"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var titlesx = doc.evaluate('//div[@class="tx-indexedsearch-res"]//tr[2]/td[2]', doc, null, XPathResult.ANY_TYPE, null); + var linksx = doc.evaluate('//div[@class="tx-indexedsearch-res"]//tr[1]/td[2]//a', doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titlesx.iterateNext()) && (link = linksx.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent).match(/doi:\s+[^\s]+\s+(.*)$/)[1]; + } + } else { + var stuff = doc.evaluate('//div[@class="journal-index"]/*[a[contains(text(), "pdf format")]]', doc, null, XPathResult.ANY_TYPE, null); + var thing; + var titles = ""; + while (thing = stuff.iterateNext()) { + titles += thing.textContent; + } + titles = titles.split(/\n/); + Zotero.debug(titles); + var names = new Array(); + for (var i = 0; i < titles.length; i++) { + if (((i-1)%2 == 0) && (titles[i].match(/\w+/))) { + names.push(titles[i]); + } + } + Zotero.debug(names); + var links = doc.evaluate('//div[@class="journal-index"]/*[a[contains(text(), "pdf format")]]/a[1]', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = names.shift(); + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//div[@class="bb"]/h2', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.url = doc.location.href; + var voliss = item.url.match(/v(\d+)\/(n(\d+)\/)?p([^/]+)\//); + item.volume = voliss[1]; + item.pages = voliss[4]; + if (voliss[2]) item.issue = voliss[3]; + var jour = item.url.match(/abstracts\/([^/]+)\//)[1]; + item.publicationTitle = journals[jour][0]; + item.journalAbbreviation = journals[jour][1]; + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//p[@class="abstract_block"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.trimInternal(doc.evaluate('//div[@class="bb"]/h3', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/,\s+/); + for each (var aut in authors) { + aut = aut.replace(/[^\w^\s^\.]/g, "").replace(/\d/g, ""); + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.date = doc.evaluate('//div[@class="abs-footer"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/date:\s+(.*)P/)[1]; + item.DOI = Zotero.Utilities.trimInternal(doc.evaluate('//h1[@class="csc-firstHeader"]/span', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).match(/doi:\s+(.*)/)[1]; + var tags = doc.evaluate('//div[@class="box"]/p/a', doc, null, XPathResult.ANY_TYPE, null); + var tag; + while (tag = tags.iterateNext()) { + item.tags.push(tag.textContent); + } + var pdfurl = doc.evaluate('//a[contains(@href, ".pdf")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.publicationTitle + " Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/International Herald Tribune.js b/translators/International Herald Tribune.js @@ -0,0 +1,129 @@ +{ + "translatorID":"84bd421d-c6d1-4223-ab80-a156f98a8e30", + "translatorType":4, + "label":"International Herald Tribune", + "creator":"Michael Berkowitz", + "target":"^http://(www.)?iht.com/", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc, url) { + if (doc.title == "Search - International Herald Tribune" && doc.location.href != "http://www.iht.com/info/nytarchive.php") { + return "multiple"; + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + + var xpath = '//meta[@name="Headline"]'; + if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "newspaperArticle"; + } + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags[field]) { + newItem[zoteroField] = metaTags[field]; + } +} + +function scrape(doc, url) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The International Herald Tribune"; + newItem.ISSN = "0294-8052"; + newItem.url = doc.location.href; + + var metaTags = new Object(); + + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + } + + associateMeta(newItem, metaTags, "Headline", "title"); + associateMeta(newItem, metaTags, "PrintPubDate", "date"); + associateMeta(newItem, metaTags, "Summary", "abstractNote"); + associateMeta(newItem, metaTags, "ArticleID", "accessionNumber"); + associateMeta(newItem, metaTags, "Owner", "extra"); + + if (metaTags["Author"]) { + var author = Zotero.Utilities.cleanString(metaTags["Author"]); + if (author.substr(0,3).toLowerCase() == "by ") { + author = author.substr(3); + } + + var authors = author.split(" and "); + for each(var author in authors) { + var words = author.split(" "); + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + if (metaTags["keywords"]) { + var keywords = metaTags["keywords"]; + newItem.tags = keywords.split(","); + if (newItem.tags[0].toLowerCase()) { + newItem.tags = newItem.tags.slice(1, newItem.tags.length); + } + Zotero.debug(newItem.tags); + for (var i in newItem.tags) { + if (newItem.tags[i] != "") { + newItem.tags[i] = Zotero.Utilities.cleanString(newItem.tags[i].replace(" ", ", ")); + var words = newItem.tags[i].split(" "); + for (var j = 0 ; j < words.length ; j++) { + if (words[j][0] == words[j][0].toLowerCase()) { + words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase(); + } + } + newItem.tags[i] = words.join(" "); + } + } + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var uris = new Array(); + if (doc.title == "Search - International Herald Tribune") { + var result = doc.evaluate('//td[@class="searchheadline"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var items = new Array(); + var elmt = result.iterateNext(); + while (elmt) { + items.push(elmt.href); + elmt = result.iterateNext(); + } + var items = Zotero.Utilities.getItemArray(doc, doc, '^http://(www.)*iht.com/articles/.*\.php$'); + items = Zotero.selectItems(items); + + if (!items) { + return true; + } + + for (var i in items) { + uris.push(i); + } + + } else if (doc.evaluate('//meta[@name="Headline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + uris.push(url); + } + + Zotero.Utilities.processDocuments(uris, scrape, function() { Zotero.done(); }); + + Zotero.wait(); +} diff --git a/translators/Internet Archive.js b/translators/Internet Archive.js @@ -0,0 +1,264 @@ +{ + "translatorID":"db0f4858-10fa-4f76-976c-2592c95f029c", + "translatorType":4, + "label":"Internet Archive", + "creator":"Adam Crymble", + "target":"http://www.archive.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:30:00" +} + +function detectWeb(doc, url) { + var mediaType = "1"; + + if (doc.evaluate('//h3', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + mediaType = doc.evaluate('//h3', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + } else if (doc.evaluate('//div[@class="box"][@id="spotlight"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + mediaType = doc.evaluate('//div[@class="box"][@id="spotlight"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + }else if (doc.evaluate('//div[@class="box"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + mediaType = doc.evaluate('//div[@class="box"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (mediaType == "The Item") { + return "artwork"; + } else if ( mediaType.match("Spotlight")) { + return "book"; + }else if (mediaType.match("book")) { + return "book"; + } else if (mediaType.match("movie")) { + return "videoRecording"; + } else if (mediaType.match("audio")) { + return "audioRecording"; + } else if (doc.location.href.match("search") && mediaType == "1") { + return "multiple"; + } +} + +//Internet Archive Translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + + var tagsContent = new Array(); + var fieldContents = new Array(); + var fieldTitleLength; + + var fieldTitle; + var scrapeType = 0; + + var mediaType1 = detectWeb(doc, url); + + if (mediaType1 == "artwork") { + + var newItem = new Zotero.Item("artwork"); + + //split contents by linebreak and push into an array if it is not empty + var contents = doc.evaluate('//div[@id="col2"]/div[@class="box"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/); + for (var i = 0; i < contents.length; i++) { + if (contents[i].match(/\w/)) { + fieldContents.push(contents[i]); + } + } + var headers = doc.evaluate('//div[@id="col2"]/div[@class="box"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var headersCount = doc.evaluate('count (//div[@id="col2"]/div[@class="box"]/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var k = 0; k < headersCount.numberValue; k++) { + fieldTitle = headers.iterateNext().textContent.toLowerCase(); + fieldTitleLength = fieldTitle.length; + var fieldTitleSpot; + + for (var j = 0; j < fieldContents.length; j++) { + if (fieldContents[j].match(fieldTitle)) { + fieldTitleSpot = fieldContents[j].indexOf(fieldTitle); + if (fieldTitleSpot != 0) { + fieldContents[j] = fieldContents[j].substr(fieldTitleSpot + fieldTitleLength); + } else { + fieldContents[j] = fieldContents[j].substr(fieldTitleLength); + } + + dataTags[fieldTitle] = fieldContents[j].replace(/^\s*|\s*$/g, ''); + fieldContents[j] = ''; + } + } + } + + } else if (mediaType1 == "book") { + var newItem = new Zotero.Item("book"); + + if (doc.evaluate('//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var headers = doc.evaluate('//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//div[@class="darkBorder roundbox"][@id="main"]/table/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = headers.iterateNext()) { + fieldTitle = next_title.textContent.toLowerCase().replace(/\s+/g, ''); + if (!fieldTitle.match(":")) { + fieldTitle = fieldTitle + ":"; + } + fieldContent = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + dataTags[fieldTitle] = fieldContent; + } + } + + } else if (mediaType1 == "videoRecording") { + var newItem = new Zotero.Item("videoRecording"); + scrapeType = 1; + + } else if (mediaType1 == "audioRecording") { + var newItem = new Zotero.Item("audioRecording"); + scrapeType = 1; + } + + if (scrapeType == 1) { + var xPathHeaders = '//div[@class="darkBorder roundbox"][@id="main"]/p[@class="content"]/span[@class="key"]'; + + if (doc.evaluate('xPathHeaders', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var headers = doc.evaluate('xPathHeaders', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//span[@class="value"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = headers.iterateNext()) { + fieldTitle = next_title.textContent.toLowerCase().replace(/\s+/g, ''); + fieldContent = contents.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + dataTags[fieldTitle] = fieldContent; + } + } + } + + if (dataTags["creator:"]) { + var author = dataTags["creator:"]; + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "creator")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["author:"]) { + var author = dataTags["author:"]; + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "author"}); + } + } + + if (doc.evaluate('//div[@class="box"][@id="description"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//div[@class="box"][@id="description"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else if (doc.evaluate('//div[@class="darkBorder roundbox"][@id="main"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//div[@class="darkBorder roundbox"][@id="main"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + newItem.title = doc.title; + } + + var tagsCount = "none"; + if (dataTags["keywords:"]) { + if (dataTags["keywords:"].match(";")) { + var tagsContent = (dataTags["keywords:"].split(";")); + tagsCount = "multiple"; + } else if (dataTags["keywords:"].match(", ")) { + var tagsContent = (dataTags["keywords:"].split(", ")); + tagsCount = "multiple"; + } else { + var tagsContent = (dataTags["keywords:"]); + tagsCount = "one"; + } + if (tagsCount == "multiple") { + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } else if (tagsCount == "one") { + newItem.tags = tagsContent; + } + } + + if (dataTags["publisher:"]) { + if (dataTags["publisher:"].match(":")) { + var place1 = dataTags["publisher:"].split(":"); + newItem.place = place1[0]; + newItem.publisher = place1[1]; + } else { + associateData (newItem, dataTags, "publisher:", "publisher"); + } + } + + if (dataTags["rights:"]) { + associateData (newItem, dataTags, "rights:", "rights"); + } else if (dataTags["creativecommonslicense:"]) { + newItem.rights = "Creative Commons License: " + dataTags["creativecommonslicense:"]; + } + + associateData (newItem, dataTags, "title:", "title");; + associateData (newItem, dataTags, "date:", "date"); + associateData (newItem, dataTags, "callnumber:", "callNumber"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[2][@class="hitCell"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titlesCount = doc.evaluate('count (//td[2][@class="hitCell"]/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + Zotero.debug(titlesCount.numberValue); + + var next_title; + for (var i = 0; i < titlesCount.numberValue; i++) { + next_title = titles.iterateNext(); + + while (!next_title.href.match(/details/)) { + i++; + if (i == titlesCount.numberValue) { + Zotero.debug(i); + break; + } + next_title = titles.iterateNext(); + } + + if (next_title.href.match(/details/)) { + items[next_title.href] = next_title.textContent; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Investigative Ophthalmology and Visual Science.js b/translators/Investigative Ophthalmology and Visual Science.js @@ -0,0 +1,84 @@ +{ + "translatorID":"4654c76f-451c-4ae6-9a36-575e982b3cdb", + "translatorType":4, + "label":"Investigative Ophthalmology and Visual Science", + "creator":"Michael Berkowitz", + "target":"http://www.iovs.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-14 19:10:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Table of Contents") != -1 || doc.title.indexOf("Search Result") != -1) { + return "multiple" + } else if (url.indexOf("abstract") != -1 || url.indexOf("full") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var host = doc.location.host; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title.indexOf("Search Result") != -1) { + var boxes = doc.evaluate('//table/tbody/tr/td/font/table/tbody/tr[1]', doc, null, XPathResult.ANY_TYPE, null); + var box; + while (box = boxes.iterateNext()) { + var id = doc.evaluate('.//input', box, null, XPathResult.ANY_TYPE, null).iterateNext().value; + var titles = doc.evaluate('./td/font/strong', box, null, XPathResult.ANY_TYPE, null); + var titletext = ''; + var title; + while (title = titles.iterateNext()) { + titletext += title.textContent; + } + items[id] = titletext; + } + } else if (doc.title.indexOf("Table of Content") != -1) { + var ids = doc.evaluate('/html/body/form/dl/dt/input', doc, null, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('/html/body/form/dl/dd/strong', doc, null, XPathResult.ANY_TYPE, null); + var id; + var title; + while ((title = titles.iterateNext()) && (id = ids.iterateNext())) { + items['iovs;' + id.value] = title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [doc.evaluate('//a[contains(@href, "citmgr")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/=(.*)$/)[1]] + } + Zotero.debug(arts); + for each (var id in arts) { + var post = 'type=refman&gca=' + id; + Zotero.debug(post); + post = 'http://www.iovs.org/cgi/citmgr?' + post; + Zotero.debug(post); + Zotero.Utilities.HTTP.doGet(post, function(text) { + Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pdfurl = item.url.replace(/content\/[^/]+/, "reprint") + ".pdf"; + item.attachments = [ + {url:item.url, title:"IOVS Snapshot", mimeType:"text/html"}, + {url:pdfurl, tite:"IOVS Full Text PDF", mimeType:"application/pdf"} + ]; + if (item.notes[0]['note'].match(/\d/)) { + item.DOI = item.notes[0]['note']; + item.notes = new Array(); + } + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); + } +} +\ No newline at end of file diff --git a/translators/J-Stage.js b/translators/J-Stage.js @@ -0,0 +1,85 @@ +{ + "translatorID":"e40a27bc-0eef-4c50-b78b-37274808d7d2", + "translatorType":4, + "label":"J-Stage", + "creator":"Michael Berkowitz", + "target":"http://www.jstage.jst.go.jp/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-06 08:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//a[contains(@href, "_ris")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } else if (doc.evaluate('//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || + doc.evaluate('//tr/td/table/tbody/tr/td/table/tbody/tr[td[1]//a]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + + +function RISify(str) { + return str.replace("_article", "_ris").replace("article", "download"); +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath; + var titlex; + var linkx; + if (doc.evaluate('//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '//tr/td[2]/table/tbody/tr/td/table/tbody/tr[td[2]//a]'; + titlex = './td[2]//strong'; + linkx = './td[2]//a[1]'; + } else if (doc.evaluate('//tr/td/table/tbody/tr/td/table/tbody/tr[td[1]//a]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '/html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[td//a[contains(@href, "_pdf")]]'; + titlex = './/td/b'; + linkx = './/td/a[contains(@href, "_article")]'; + } + Zotero.debug(xpath); + + var list = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null); + var nextitem; + while (nextitem = list.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, nextitem, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate(linkx, nextitem, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(RISify(i)); + } + } else { + arts = [RISify(url)]; + } + Zotero.debug(arts); + for each (var uri in arts) { + Zotero.Utilities.HTTP.doGet(uri, function(text) { + Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.url = uri.replace("download", "article").replace("_ris", "_article"); + var pdfurl = item.url.replace(/(\d+)_(\d+)\/_article/, "$2/_pdf").replace("download", "article"); + Zotero.debug(pdfurl); + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/JSTOR.js b/translators/JSTOR.js @@ -0,0 +1,128 @@ +{ + "translatorID":"d921155f-0186-1684-615c-ca57682ced9b", + "translatorType":4, + "label":"JSTOR", + "creator":"Simon Kornblith, Sean Takats and Michael Berkowitz", + "target":"https?://[^/]*jstor\\.org[^/]*/(action/(showArticle|doBasicSearch|doAdvancedSearch)|stable/|pss|sici)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-27 16:45:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // See if this is a seach results page + if (doc.title == "JSTOR: Search Results" || url.match(/\/i\d+/)) { + return "multiple"; + } else if(url.indexOf("/search/") != -1) { + return false; + } + + // If this is a view page, find the link to the citation + var xpath = '//a[@id="favorites"]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if(elmts.iterateNext() || url.match(/pss/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + var hMatch = hostRegexp.exec(url); + var host = hMatch[1]; + + // If this is a view page, find the link to the citation + var xpath = '//a[@id="favorites"]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if (url.match(/pss/)) { + var jid = url.match(/\d+/); + var downloadString = "&noDoi=yesDoi&downloadFileName=deadbeef&suffix=" + jid; + var pdfYes = false; + } else { + if(elmt = elmts.iterateNext()) { + var jid; + var jidRe1 = new RegExp("doi=[0-9\.]+/([0-9]+)"); + var jidRe2 = new RegExp("stable/view/([0-9]+)"); + var jidRe3 = new RegExp("stable/([0-9]+)"); + var jidmatch1 = jidRe1.exec(url); + var jidmatch2 = jidRe2.exec(url); + var jidmatch3 = jidRe3.exec(url); + if (jidmatch1) { + jid = jidmatch1[1]; + } else if (jidmatch2) { + jid = jidmatch2[1]; + } else if (jidmatch3) { + jid = jidmatch3[1]; + } else { + jid = elmt.href.match(/jid=([0-9]+)/)[1]; + } + var downloadString = "&noDoi=yesDoi&downloadFileName=deadbeef&suffix="+jid; + } + else{ + var availableItems = new Object(); + var tableRows = doc.evaluate('//li[ul/li/a[@class="title"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + var jid; + var title; + var jidRe = new RegExp("[0-9\.]+/([0-9]+)"); + while(tableRow = tableRows.iterateNext()) { + title = doc.evaluate('./ul/li/a[@class="title"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + jid = doc.evaluate('.//input[@name="doi"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var m = jidRe.exec(jid); + if (m) { + jid = m[1]; + } + availableItems[jid] = title; + } + + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + var downloadString="&noDoi=yesDoi&downloadFileName=deadbeef"; + for(var i in items) { + downloadString+="&suffix="+i; + } + } + var pdfYes = true; + } + + Zotero.Utilities.HTTP.doPost(host+"/action/downloadCitation?format=refman&direct=true", + downloadString, function(text) { + // load translator for RIS + Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes && item.notes[0]) { + item.extra = item.notes[0].note; + + delete item.notes; + item.notes = undefined; + } + item.attachments[0].title = item.title; + item.attachments[0].mimeType = "text/html"; + Zotero.debug(host); + var pdfurl = item.url.replace(/([^\d]+)(\d+)$/, host + "/stable/pdfplus/$2") + ".pdf"; + if (pdfYes == true) item.attachments.push({url:pdfurl, title:"JSTOR Full Text PDF", mimeType:"application/pdf"}); + item.complete(); + }); + + translator.translate(); + + Zotero.done(); + }); + +} +\ No newline at end of file diff --git a/translators/Journal of Electronic Publishing.js b/translators/Journal of Electronic Publishing.js @@ -0,0 +1,68 @@ +{ + "translatorID":"d93c14fb-d327-4540-b60a-327309ea512b", + "translatorType":4, + "label":"Journal of Electronic Publishing", + "creator":"Michael Berkowitz", + "target":"http://quod.lib.umich.edu/.*c=jep", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div/span[text() = "Search Results"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/\d+\.\d+\.\d+/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var links = doc.evaluate('//div[@id="resultslist"]/div[@class="itemcitation"]/div/a', doc, ns, XPathResult.ANY_TYPE, null); + var link; + var items = new Object(); + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.trimInternal(link.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var data = new Object(); + var rows = doc.evaluate('//table[@id="itemmdataTable"]//tr', doc, ns, XPathResult.ANY_TYPE, null); + var row; + while (row = rows.iterateNext()) { + var header = doc.evaluate('./td[1]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var value = doc.evaluate('./td[2]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + data[Zotero.Utilities.trimInternal(header.replace(":", "").replace("Authors", "Author"))] = value; + } + var item = new Zotero.Item("journalArticle"); + item.publicationTitle = "Journal of Electronic Publishing"; + item.title = data["Title"]; + var authors = data["Author"].split(","); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.url = data["URL"]; + var voliss = data["Source"].match(/vol\.\s+([^,]+),\s+no\.\s+([^,]+),\s+(.*)$/); + item.volume = voliss[1]; + item.issue = voliss[2]; + item.date = voliss[3]; + + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Journal of Vision.js b/translators/Journal of Vision.js @@ -0,0 +1,63 @@ +{ + "translatorID":"4345839f-b4fd-4e3f-a73d-268b6f280f6e", + "translatorType":4, + "label":"Journal of Vision", + "creator":"Michael Berkowitz", + "target":"http://(www.)?journalofvision.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-29 20:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("search.aspx?") != -1 || url.match(/\d+/g).length == 2) { + return "multiple"; + } else if (url.match(/\d+/g).length == 3) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var urls = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('//a[@class="AbsTitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//a[@class="AbsTitle"]'; + } else if (doc.evaluate('//a[@class="toc_ArticleTitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//a[@class="toc_ArticleTitle"]'; + } + var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_art; + while (next_art = articles.iterateNext()) { + items[next_art.href] = next_art.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + urls.push(i); + } + } else { + urls.push(url); + } + Zotero.debug(urls); + + Zotero.Utilities.processDocuments(urls, function(newDoc) { + var rislink = newDoc.evaluate('//div[@id="block0"]/table/tbody/tr/td[@class="body"]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace("info/GetCitation", "AutomaticCitationDownload") + '&type=ReferenceManager'; + var DOI = newDoc.evaluate('//td[2]/span[@class="toc_VolumeLine"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/doi:\s*(.*)$/)[1]; + var PDF = newDoc.evaluate('//div[@class="jovHistory"]//td[2]/a', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.debug(rislink); + Zotero.Utilities.HTTP.doGet(rislink, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.DOI = DOI; + item.publicationTitle = "Journal of Vision"; + item.attachments = [{url:PDF, title:"Journal of Vision Full Text PDF", mimeType:"application/pdf"}]; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/JurPC.js b/translators/JurPC.js @@ -0,0 +1,127 @@ +{ + "translatorID":"b662c6eb-e478-46bd- bad4-23cdfd0c9d67", + "translatorType":4, + "label":"JurPC", + "creator":"Oliver Vivell and Michael Berkowitz", + "target":"http://www.jurpc.de/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + var doctype = doc.evaluate('//meta/@doctype', doc, null,XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if (doctype == "Aufsatz"){ + return "Aufsatz"; + }else{ + return "Rechtsprechung"; + } +} + +function doWeb(doc, url) { + + var articles = new Array(); + + if (detectWeb(doc, url) == "Aufsatz") { + + // Aufsatz gefunden + + Zotero.debug("Ok, we have an JurPC Article"); + var authors = '//meta/@Author'; + var title = '//meta/@Title'; + var webdoktext = '//meta/@WebDok'; + + var authors = parseDoc(authors,doc); + var title = parseDoc(title,doc); + + var webabs = webdoktext.substr(webdoktext.lastIndexOf("Abs."), webdoktext.length); + + //Zotero.debug(doctype); + Zotero.debug(webdoktext); + var year = url.substr(28, 4); + + //Get Year & WebDok Number from Url + var webdok = url.substr(32, 4); + + var suche = webdok.indexOf("0"); + if (suche == 0){ + webdok = url.substr(33, 3); + suche = webdok.indexOf("0"); + + if(suche == 0){ + webdok = url.substr(34, 2); + suche = webdok.indexOf("0"); + } + //Zotero.debug(suche); + if(suche == 0){ + webdok = url.substr(35, 1); + suche = webdok.indexOf("0"); + } + } + + var re = /<[^>]*>/ + Zotero.debug(re); + title = title.replace(re,""); + title = title.replace(re,""); + title = title.replace(re,""); + Zotero.debug(title); + + var newArticle = new Zotero.Item('journalArticle'); + + newArticle.title = title; + newArticle.journal = "JurPC"; + newArticle.journalAbbreviation = "JurPC"; + newArticle.year = year; + newArticle.volume = "WebDok " + webdok + "/" + year; + newArticle.pages = webabs ; + newArticle.url = url; + var aus = authors.split("/"); + for (var i=0; i< aus.length ; i++) { + Zotero.debug(aus[0]); + newArticle.creators.push(Zotero.Utilities.cleanAuthor(aus[i], "author")); + } + newArticle.complete(); + } else { + + // Dokument ist ein Urteil + + var gericht = '//meta/@Gericht'; + var ereignis = '//meta/@Ereignis'; + var datum = '//meta/@Datum'; + var aktz = '//meta/@aktz'; + var titel = '//meta/@Title'; + var webdok = '//meta/@WebDok'; + + try{ + var gericht = parseDoc(gericht,doc); + var ereignis = parseDoc(ereignis,doc); + var datum = parseDoc(datum,doc); + var aktz = parseDoc(aktz,doc); + var webdok = parseDoc(webdok,doc); + var titel = parseDoc(titel,doc); + } catch (e) { var titel = doc.evaluate('//meta/@Titel', doc, null,XPathResult.ANY_TYPE, null).iterateNext().textContent;} + //Zotero.debug(titel); + + + // Informationen an Zotero übergeben + + var newCase = new Zotero.Item('case'); + newCase.court = gericht; + newCase.caseName = titel; + newCase.title = titel; + newCase.shortTitle = "WebDok " + webdok; + newCase.dateDecided = ereignis + " , " + aktz; + newCase.url = url; + newCase.journalAbbreviation = "JurPC"; + //Zotero.debug(newCase.codeNumber); + newCase.complete(); + } +} + +function parseDoc(xpath, doc) { + var content = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE,null).iterateNext().textContent; + return content; +} +\ No newline at end of file diff --git a/translators/KOBV.js b/translators/KOBV.js @@ -0,0 +1,93 @@ +{ + "translatorID":"fef07360-ee97-4f67-b022-6f64d5ec0c25", + "translatorType":4, + "label":"KOBV", + "creator":"Gunar Maiwald", + "target":"^http://vs13.kobv.de/V/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-04 08:15:46" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr /td[@class="no_wrap_center"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + else if (doc.evaluate('//tr/th[@class="no_wrap"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +function scrape(doc) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + var xpath; + if (doc.title.match("Freie Universität Berlin")) { xpath ='//li/a[@title="Ansicht des Originalformats"]'; } + else if (doc.title.match("KOBV")) { xpath ='//li/a[@title="Ansicht des bibliothekarischen Formats"]'; } + else if (doc.title.match("UB der HU Berlin")) { xpath ='//li/a[@title="Ansicht des Originalformats"]'; } + else if (doc.title.match("^MetaLib")) { xpath ='//li/a[@title="Ansicht des Originalformats"]'; } + var hrefs = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var href; + + while (href = hrefs.iterateNext()) { + var url = href.getAttribute("href"); + url += "&format=005"; + + Zotero.Utilities.processDocuments([url], function(newDoc) { + var record = new marc.record(); + var xpath = '//table//tr'; + var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null); + var elmt; + + while (elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.trimInternal(newDoc.evaluate('./td[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var value = Zotero.Utilities.trimInternal(newDoc.evaluate('./td[2]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + value = value.replace(/\|([a-z]) /g,marc.subfieldDelimiter+"$1"); + var code = field.substring(0,3); + var ind = field.substr(3); + + // QnD for Authors: + if (code == "100" && ind == "11" && value.match(marc.subfieldDelimiter+"b")) { + var values = value.split(marc.subfieldDelimiter); + var forename = values[1].substr(1); + var surname = values[2].substr(1); + value = marc.subfieldDelimiter+"a"+surname+", "+forename; + ind = 1; + } + record.addField(code, ind, value); + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + newItem.complete(); + + }, function() { Zotero.done; }); + Zotero.wait(); + } +} + + +function doWeb(doc, url) { + var xpath1 = '//table/tbody/tr/td[@class="no_wrap_center"]/a'; + var xpath2 = '//table/tbody/tr/th[@class="no_wrap"]'; + var newUrls = new Array(); + + if (doc.evaluate(xpath1, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var items = Zotero.Utilities.getItemArray(doc, doc, '^http://vs13.kobv.de/V/.*format=999$','^[0-9]+$'); + items = Zotero.selectItems(items); + for (var url in items) { + newUrls.push(url); + } + } + + else if (doc.evaluate(xpath2, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + newUrls.push(url); + } + + Zotero.Utilities.processDocuments(newUrls, scrape, function() { Zotero.done; }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/LA Times.js b/translators/LA Times.js @@ -0,0 +1,224 @@ +{ + "translatorID":"e4fe1596-a8c4-4d09-945f-120c4d83e580", + "translatorType":4, + "label":"LA Times", + "creator":"Ben Parr", + "target":"^https?://(?:www.|travel.)?latimes.com", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc, url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//link[@title="Main"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) + {return "newspaperArticle";} + + if(doc.title.indexOf("Search Results")>-1) + {return "multiple";} + + xpath = '//h1'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + while(row=rows.iterateNext()) + { + if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel") + {return "newspaperArticle";} + } + + return null; +} + +function getCount(s) +{ + if(!s||s=='') + return 0; + if(s.indexOf("Displaying")>-1) + { + s=s.substr(19); + s=s.replace('.',''); + s=s.split(' to '); + return s[1]-s[0]+1; + } + return 0; +} + +function processList(items) +{ + items = Zotero.selectItems(items); + var uris=new Array(); + + if (!items) + {return true;} + + for (var i in items) + {uris.push(i);} + + Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); }); + Zotero.wait(); + + return true; +} + +function findDate(s) +{ + var words=s.split(" "); + var months=new Array("january","febuary","march","april","may","june","july","august","september","october","november","december"); + for(var n=0;words[n];n++) + { + for(var m in months) + {if(words[n].toLowerCase()==months[m]) + {return words[n]+" "+words[n+1]+" "+words[n+2];} + } + } + return null; +} + + +function scrape(doc,url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The Los Angeles Times"; + newItem.ISSN = "0458-3035"; + + var xpath='//h2/a'; + var t=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext(); + if(t) + {newItem.section=t.textContent; } + else + { + xpath='//a/img[@alt="WEST"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) + {newItem.section="West";} + else + { + xpath = '//h1'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + if(t=rows.iterateNext()) + {newItem.section=t.textContent;} + } + } + + + xpath='//h1[last()]'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + if(t=rows.iterateNext()) + {newItem.title=t.textContent;} + + newItem.url = url; + xpath='//div[@class="storybyline"]'; + var test=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext(); + if(!test) + {xpath='//p[@class="by-author"]';} + var info=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext().textContent; + info=Zotero.Utilities.cleanString(info); + var date=findDate(info); + if(date) + { + newItem.date=date; + info=info.replace(date,''); + } + info=Zotero.Utilities.cleanString(info); + if(info.indexOf(", ")>-1) + { + var phrases=info.split(", "); + var a=phrases[0]; + if (a.substr(0,3).toLowerCase() == "by ") + {a= a.substr(3);} + if(a.substr(0,5).toLowerCase()!="from ") + { + var authors=a.split(" and "); + var n; + for(n in authors) + {newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[n],"author"));} + } + } + else + { + xpath='//div[@class="storydeckhead"]/a'; + temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext(); + if(temp!=null && temp!='') + {newItem.creators.push(Zotero.Utilities.cleanAuthor(temp.textContent,"author"));} + } + + newItem.attachments.push({document:doc, title:"The Los Angeles Times Snapshot"}); + newItem.complete(); +} + + + +function doWeb(doc, url) +{ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + + var xpath='//link[@title="Main"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) + {scrape(doc,url); return true;} + + xpath = '//h1'; + var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + var row; + while(row=rows.iterateNext()) + { + if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel") + {scrape(doc,url); return true;} + } + + if(doc.title.indexOf("Search Results")>-1) + { + xpath='//div[@class="abstract1"]'; + var count=0; + rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + while(row=rows.iterateNext()) + { + count=getCount(row.textContent); + if(count!=0) + {break;} + } + if(count==0) + { + xpath='//td[@class="abstract1"]'; + rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + while(row=rows.iterateNext()) + { + count=getCount(row.textContent); + if(count!=0) + {break;} + } + } + + if(count>0) + { + var items=new Array(); + xpath='//div[@class="headline14"]/a'; + rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null); + while(row=rows.iterateNext()) + { + if(count==0) + {break;} + if(row.href.indexOf("/travel/")<0) + {items[row.href]=Zotero.Utilities.cleanString(row.textContent);} + count--; + } + + return processList(items); + } + } +} +\ No newline at end of file diff --git a/translators/Le Devoir.js b/translators/Le Devoir.js @@ -0,0 +1,142 @@ +{ + "translatorID":"d1605270-d7dc-459f-9875-74ad8dde1f7d", + "translatorType":4, + "label":"Le Devoir", + "creator":"Adam Crymble", + "target":"http://www.ledevoir.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("Recherche")) { + return "multiple"; + } else if (doc.evaluate('//div[@id="autresArticles"]/p', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "newspaperArticle"; + } +} + +//Le Devoir Translator. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var tagsContent = new Array(); + + var newItem = new Zotero.Item("newspaperArticle"); + + var contents = doc.evaluate('//div[@id="autresArticles"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var j = 0; + var n = 0; + var contentsArray = new Array(); + var contents1; + + while (contents1 = contents.iterateNext()) { + contentsArray.push(contents1.textContent); + j++; + } + + var author; + var author1; + var author2; + + if (j > 1) { + for (var i in contentsArray) { + if (contentsArray[i].match("Édition du ")) { + var date1 = contentsArray[i].split("Édition du "); + + newItem.date = date1[1]; + + if (date1[0].match(/\w/)) { + + author = date1[0]; + if (author.match(/\n/)) { + author1 = author.split(/\n/); + + for (var k = 0; k < author1.length; k++) { + if (author1[k].match(/\w/) && author1[k].match(", ")) { + author2 = author1[k].split(", "); + if (author2[0].match(/\w/)) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[0], "author")); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author2[1], "author")); + } + } else if (author1[k].match(/\w/) && !author1[k].match(", ")) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author")); + } + } + } else if (author.match(" et ")) { + author1 = author.split(" et "); + for (var k in author1) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author")); + } + } else if (author.match(", ")) { + author1 = author.split(", "); + for (var k in author1) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author")); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(date1[0], "author")); + } + } + } else if (contentsArray[i].match("Mots clés")) { + contentsArray[i] = contentsArray[i].substr(11); + if (contentsArray[i].match(", ")) { + tagsContent = contentsArray[i].split(", "); + } else { + newItem.tags = ontentsArray[i]; + n = 1; + } + } + } + } + + if (n == 0 && tagsContent.length>1) { + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } + + newItem.title = doc.title; + newItem.url = doc.location.href; + newItem.publicationTitle = "Le Devoir"; + newItem.ISSN = "0319-0722"; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/LexisNexis.js b/translators/LexisNexis.js @@ -0,0 +1,145 @@ +{ + "translatorID":"b047a13c-fe5c-6604-c997-bef15e502b09", + "translatorType":4, + "label":"LexisNexis", + "creator":"Sean Takats", + "target":"https?://[^/]*lexis-?nexis\\.com[^/]*/us/lnacademic", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-18 02:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (doc.title.substr(doc.title.length-8, 8)=="Document"){ + var xpath = '//input[@name="cisb"]'; + var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if (elmt.iterateNext()){ + return "newspaperArticle"; + } + } + var xpath = '//input[@name="frm_tagged_documents" and @type="checkbox"]'; + var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if (elmt.iterateNext()){ + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // define results navigation frame doc for export buttons and hidden fields + var rfDoc = doc.defaultView.window.top.frames[1].document; + var xpath = '//img[@title="Export Bibliographic References"]'; + + var elmt = doc.evaluate(xpath, rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + var hostRe = new RegExp("^http(?:s)?://[^/]+"); + var m = hostRe.exec(doc.location.href); + var host = m[0]; + + var risb = doc.evaluate('//input[@name="risb"]', rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var cisb = doc.evaluate('//input[@name="cisb"]', rfDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var uri = host+"/us/lnacademic/results/listview/delPrep.do?cisb="+cisb+"&risb="+risb+"&mode=delivery_refworks"; + var hiddenInputs = doc.evaluate('//form[@name="results_docview_DocumentForm"]//input[@type="hidden" and not(@name="tagData")]', rfDoc, nsResolver, + XPathResult.ANY_TYPE, null); + var hiddenInput; + var poststring=""; + while(hiddenInput = hiddenInputs.iterateNext()) { + poststring = poststring+"&"+hiddenInput.name+"="+encodeURIComponent(hiddenInput.value); + } + + var xpath = '//input[@name="frm_tagged_documents" and @type="checkbox"]'; + var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + if (doc.title.substr(doc.title.length-8, 8)=="Document"){ + // single page + var delRange = "cur"; + poststring = poststring + "&hiddensearchfield=Narrow+Search&reloadClassif=&format=GNBFI&focusTerms=&nextSteps=0"; + } else { + // get multiple item titles and tags + var xpath = '//tr[td/input[@name="frm_tagged_documents"]]'; + var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var tagNumber; + var items = new Object(); + while (row = rows.iterateNext()){ + title = doc.evaluate('.//a', row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + tagNumber = doc.evaluate('./td/input[@name="frm_tagged_documents"]', row, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + items[tagNumber] = title; + } + var tagData = ""; + items = Zotero.selectItems(items); + if (!items) { + return true; + } + for (var i in items) { + tagData += "-"+i; + } + tagData = tagData.substr(1); + var delRange = "tag"; + poststring = poststring + "&tagData=" + tagData + "&hiddensearchfield=Narrow+Search&reloadClassif=&selDomainID=4&format=GNBLIST&focusTerms=&sort=RELEVANCE&nextSteps=0"; + } + Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) { + uri = host+"/us/lnacademic/delivery/refExport.do"; + var disb = text.match(/<input type="hidden" name="disb" value="([^"]+)">/); + poststring = "delRange="+delRange+"&selDocs=&disb="+disb[1]+"&initializationPage=0"; + Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) { + uri = text.match(/&amp;url=([^']+)'/) + uri = decodeURIComponent(uri[1]); + uri = uri.replace(/http:\/\/[^/]*\//, host+"/"); + var uris = new Array(); + uris.push(uri); + Zotero.Utilities.processDocuments(uris, function(newDoc){ + var elmts =newDoc.evaluate('//html', newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + while (elmt = elmts.iterateNext()){ + var newItem = new Zotero.Item("newspaperArticle"); + var title = newDoc.evaluate('.//div[@class="HEADLINE"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (title.textContent){ + newItem.title = title.textContent; + }else{ + newItem.title = " "; + } + var date = newDoc.evaluate('.//meta[@name="_lndateissue"]/@content', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (date){ + date = date.nodeValue; + var m = date.match(/([^T]+)T/); + date = m[1]; + if (date.length == 8){ + date = date.substr(0,4) + "-" + date.substr(4,2) + "-" + date.substr(6,2); + } else if (date.length == 6){ + date = date.substr(0,4) + "-" + date.substr(4,2); + } + newItem.date = date; + } + var publicationTitle = newDoc.evaluate('.//div[@class="PUB"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (publicationTitle){ + newItem.publicationTitle = publicationTitle.textContent; + } + var section = newDoc.evaluate('.//div[@class="SECTION-INFO"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (section){ + newItem.section = section.textContent; + } + var author = newDoc.evaluate('.//div[@class="BYLINE"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (author){ + newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author")); + } + newItem.repository = "lexisnexis.com"; + newItem.url = url; + newItem.complete() + } + Zotero.done(); + }); + }); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (Aleph).js b/translators/Library Catalog (Aleph).js @@ -0,0 +1,159 @@ +{ + "translatorID":"cf87eca8-041d-b954-795a-2d86348999d5", + "translatorType":4, + "label":"Library Catalog (Aleph)", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://[^/]+/F(?:/[A-Z0-9\\-]+(?:\\?.*)?$|\\?func=find|\\?func=scan|\\?func=short)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-10 22:30:00" +} + +function detectWeb(doc, url) { + var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct|func=myshelf-full.*)"); + + if(singleRe.test(doc.location.href)) { + return "book"; + } else { + var tags = doc.getElementsByTagName("a"); + for(var i=0; i<tags.length; i++) { + if(singleRe.test(tags[i].href)) { + return "multiple"; + } + } + } +} + +function doWeb(doc, url) { + var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct|func=myshelf-full.*)"); + var mab2Opac = new RegExp("^https?://[^/]+berlin|193\.30\.112\.134|duisburg-essen/F/[A-Z0-9\-]+\?.*"); + var uri = doc.location.href; + var newUris = new Array(); + + if(detailRe.test(uri)) { + var newuri = uri.replace(/\&format=[0-9]{3}/, "&format=001"); + if (newuri == uri) newuri += "&format=001"; + newUris.push(newuri); + } else { + var itemRegexp = '^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct|func=myshelf-full.*)' + var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp, '^[0-9]+$'); + + // ugly hack to see if we have any items + var haveItems = false; + for(var i in items) { + haveItems = true; + break; + } + + // If we don't have any items otherwise, let us use the numbers + if(!haveItems) { + var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp); + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + var newUri = i.replace("&format=999", "&format=001"); + if(newUri == i) { + newUri += "&format=001"; + } + newUris.push(newUri); + } + } + var translator = Zotero.loadTranslator("import"); + if(mab2Opac.test(uri)) { + translator.setTranslator("91acf493-0de7-4473-8b62-89fd141e6c74"); + } else { + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + } + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var uri = newDoc.location.href; + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var nonstandard = false; + var xpath; + if (newDoc.evaluate('//*[tr[td/text()="LDR"]]/tr[td[2]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '//*[tr[td/text()="LDR"]]/tr[td[2]]'; + } else if (newDoc.evaluate('//tr[2]//table[2]//tr', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '//tr[2]//table[2]//tr[td[2]]'; + nonstandard = true; + } else if (newDoc.evaluate('//table//tr[td[2][@class="td1"]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '//table//tr[td[2][@class="td1"]]'; + nonstandard = true; + } else if (newDoc.evaluate('//tr/td[2]/table/tbody[tr/td[contains(text(), "LDR")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + xpath = '//tr/td[2]/table/tbody[tr/td[contains(text(), "LDR")]]/tr'; + nonstandard = true; + } + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + if (nonstandard) { + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./td[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } else { + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + } + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./td[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if(field) { + var value = newDoc.evaluate('./TD[2]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; //.split(/\n/)[1]; + if (value.split(/\n/)[1]) value = Zotero.Utilities.trimInternal(value.split(/\n/)[1]); + Zotero.debug(field + " : " + value); + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1"); + + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + + record.addField(code, ind, value); + } + } + } + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + for (var i in newItem.creators) { + if (!newItem.creators[i]['firstName']) { + var name = newItem.creators[i]['lastName'].split(/([^\s]+)\s+(.*)$/); + newItem.creators[i] = {lastName:name[1], firstName:name[2], creatorType:'author'}; + } + } + + var oldCreators = newItem.creators; + newItem.creators = new Array(); + var transient = new Array(); + for each (var a in oldCreators) { + if (a.lastName) { + if (!a.lastName.match(/\d+/)) transient.push(a); + } + } + for each (var a in transient) { + if (a.firstName) { + if (a.firstName.match(/\|/)) a.firstName = a.firstName.match(/([^|]+)\s+|/)[1]; + } + } + newItem.creators = transient; + newItem.title = newItem.title.replace(/(<<|>>)/g, ''); + newItem.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (DRA).js b/translators/Library Catalog (DRA).js @@ -0,0 +1,83 @@ +{ + "translatorID":"fb12ae9e-f473-cab4-0546-27ab88c64101", + "translatorType":4, + "label":"Library Catalog (DRA)", + "creator":"Simon Kornblith", + "target":"/web2/tramp2\\.exe/(?:see\\_record/|authority\\_hits/|goto/.*\\?.*screen=Record\\.html)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-15 15:11:00" +} + +function detectWeb(doc, url) { + if(doc.location.href.indexOf("/authority_hits") > 0) { + return "multiple"; + } else { + return "book"; + } +} + +function doWeb(doc, url) { + var checkItems = false; + + if(doc.location.href.indexOf("/authority_hits") > 0) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + checkItems = Zotero.Utilities.gatherElementsOnXPath(doc, doc, "/html/body//ol/li", nsResolver); + } + + if(checkItems && checkItems.length) { + var items = Zotero.Utilities.getItemArray(doc, checkItems, 'https?://.*/web2/tramp2\.exe/see_record'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + } else { + var ug = new Array(doc.location.href); + } + + for(var i in uris) { + var uri = uris[i]; + var uriRegexp = /^(https?:\/\/.*\/web2\/tramp2\.exe\/)(?:goto|see\_record|authority\_hits)(\/.*)\?(?:screen=Record\.html\&)?(.*)$/i; + var m = uriRegexp.exec(uri); + if(uri.indexOf("/authority_hits") < 0) { + var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc&"+m[3]; + } else { + var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc"; + } + + // Keep track of how many requests have been completed + var j = 0; + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + + var domain = url.match(/https?:\/\/([^/]+)/); + marc.setHandler("itemDone", function(obj, item) { + item.repository = domain[1]+" Library Catalog"; + item.complete(); + }); + + Zotero.Utilities.HTTP.doGet(newUri, function(text) { + translator.setString(text); + translator.translate(); + + j++; + if(j == uris.length) { + Zotero.done(); + } + }); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (Dynix).js b/translators/Library Catalog (Dynix).js @@ -0,0 +1,109 @@ +{ + "translatorID":"774d7dc2-3474-2684-392c-f787789ec63d", + "translatorType":4, + "label":"Library Catalog (Dynix)", + "creator":"Simon Kornblith", + "target":"ipac\\.jsp\\?.*(?:uri=(?:link|full)=[0-9]|menu=search)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-09-19 20:30:00" +} + +function detectWeb(doc, url) { + var detailsRe = new RegExp('ipac\.jsp\?.*uri=(?:full|link)=[0-9]'); + if(detailsRe.test(doc.location.href)) { + return "book"; + } else { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var uri = doc.location.href; + var detailsRe = new RegExp('ipac\.jsp\?.*uri=(?:full|link)=[0-9]'); + + var uris = new Array(); + if(detailsRe.test(uri)) { + uris.push(uri+'&fullmarc=true'); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, "ipac\.jsp\?.*uri=(?:full|link)=[0-9]|^javascript:buildNewList\\('.*uri%3Dfull%3D[0-9]"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var buildNewList = new RegExp("^javascript:buildNewList\\('([^']+)"); + + var uris = new Array(); + for(var i in items) { + var m = buildNewList.exec(i); + if(m) { + uris.push(unescape(m[1]+'&fullmarc=true')); + } else { + uris.push(i+'&fullmarc=true'); + } + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + Zotero.Utilities.processDocuments(uris, function(newDoc) { + var uri = newDoc.location.href; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="normalBlackFont1"]]'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + if (!elmts.iterateNext()) { + var xpath2 = '//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="boldBlackFont1"]]'; + var elmts = newDoc.evaluate(xpath2, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + } + var elmt; + + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.superCleanString(newDoc.evaluate('./TD[1]/A[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + var value = newDoc.evaluate('./TD[2]/TABLE[1]/TBODY[1]/TR[1]/TD[1]/A[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + value = value.replace(/\$([a-z]) /g, marc.subfieldDelimiter+"$1"); + + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + + record.addField(code, ind, value); + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function() { Zotero.done() }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (GEAC).js b/translators/Library Catalog (GEAC).js @@ -0,0 +1,105 @@ +{ + "translatorID":"c0e6fda6-0ecd-e4f4-39ca-37a4de436e15", + "translatorType":4, + "label":"Library Catalog (GEAC)", + "creator":"Simon Kornblith", + "target":"/(?:GeacQUERY|GeacFETCH[\\:\\?].*[&:]next=html/(?:record\\.html|geacnffull\\.html))", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-15 15:11:00" +} + +function detectWeb(doc, url) { + if(doc.location.href.indexOf("/GeacQUERY") > 0) { + return "multiple"; + } else { + return "book"; + } +} + +function doWeb(doc, url) { + var uri = doc.location.href; + + var uris = new Array(); + + if(uri.indexOf("/GeacQUERY") > 0) { + var items = Zotero.Utilities.getItemArray(doc, doc, "(?:Geac)?FETCH[\:\?].*[&:]next=html/(?:record\.html|geacnffull\.html)"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + var newUri = i.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html"); + newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html"); + uris.push(newUri); + } + } else { + var newUri = uri.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html"); + newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html"); + uris.push(newUri); + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + Zotero.Utilities.processDocuments(uris, function(newDoc) { + var uri = newDoc.location.href; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var record = new marc.record(); + + var elmts = newDoc.evaluate('//pre/text()', newDoc, nsResolver, + XPathResult.ANY_TYPE, null); + var elmt, tag, content; + var ind = ""; + + while(elmt = elmts.iterateNext()) { + var line = elmt.nodeValue; + + if(line.substring(0, 6) == " ") { + content += " "+line.substring(6); + continue; + } else { + if(tag) { + record.addField(tag, ind, content); + } + } + + line = line.replace(/[_\t\xA0]/g," "); // nbsp + + tag = line.substr(0, 3); + if(tag[0] != "0" || tag[1] != "0") { + ind = line.substr(4, 2); + content = line.substr(7).replace(/\$([a-z])(?: |$)/g, marc.subfieldDelimiter+"$1"); + } else { + if(tag == "000") { + tag = undefined; + record.leader = "00000"+line.substr(4); + } else { + content = line.substr(4); + } + } + + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function() { Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (InnoPAC).js b/translators/Library Catalog (InnoPAC).js @@ -0,0 +1,199 @@ +{ + "translatorID":"4fd6b89b-2316-2dc4-fd87-61a97dd941e8", + "translatorType":4, + "label":"Library Catalog (InnoPAC)", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"(search~|\\/search\\?|(a|X|t|Y|w)\\?|\\?(searchtype|searchscope)|frameset&FF)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":200, + "inRepository":true, + "lastUpdated":"2008-05-28 18:30:00" +} + +function detectWeb(doc, url) { + if (!url.match(/SEARCH=/) && !url.match(/searchargs?=/) && !url.match(/&FF/)) return false; + // First, check to see if the URL alone reveals InnoPAC, since some sites don't reveal the MARC button + var matchRegexp = new RegExp('^https?://[^/]+/search[^/]*\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/frameset(.+)$'); + if(matchRegexp.test(doc.location.href)) { + if (!url.match("SEARCH") && !url.match("searchtype")) { + return "book"; + } + } + // Next, look for the MARC button + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//a[img[@src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]'; + var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(elmt) { + return "book"; + } + // Also, check for links to an item display page + var tags = doc.getElementsByTagName("a"); + for(var i=0; i<tags.length; i++) { + if(matchRegexp.test(tags[i].href) || tags[i].href.match(/^https?:\/\/([^/]+\/(?:search\??\/|record=?|search%7e\/)|frameset&FF=)/)) { + return "multiple"; + } + } + + return false; +} + +function scrape(marc, newDoc) { + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//pre/text()'; + if (newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null); + var useNodeValue = true; + } else { + var elmts = newDoc.evaluate('//pre', newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var useNodeValue = false; + } + var elmt; + while(elmt = elmts.iterateNext()) { + if (useNodeValue) { + var text = elmt.nodeValue; + } else { + var text = elmt.textContent; + } + var newItem = new Zotero.Item(); + var record = new marc.record(); + + var linee = text.split("\n"); + for (var i=0; i<linee.length; i++) { + if(!linee[i]) { + continue; + } + + linee[i] = linee[i].replace(/[\xA0_\t]/g, " "); + var value = linee[i].substr(7); + + if(linee[i].substr(0, 6) == " ") { + // add this onto previous value + tagValue += value; + } else { + if(linee[i].substr(0, 6) == "LEADER") { + // trap leader + record.leader = value; + } else { + if(tagValue) { // finish last tag + tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1"); + if(tagValue[0] != marc.subfieldDelimiter) { + tagValue = marc.subfieldDelimiter+"a"+tagValue; + } + + // add previous tag + record.addField(tag, ind, tagValue); + } + + var tag = linee[i].substr(0, 3); + var ind = linee[i].substr(4, 2); + var tagValue = value; + } + } + } + if(tagValue) { + tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1"); + if(tagValue[0] != marc.subfieldDelimiter) { + tagValue = marc.subfieldDelimiter+"a"+tagValue; + } + + // add previous tag + record.addField(tag, ind, tagValue); + } + + record.translate(newItem); + + var domain = newDoc.location.href.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + } +} + +function pageByPage(marc, urls) { + Zotero.Utilities.processDocuments(urls, function(newDoc) { + scrape(marc, newDoc); + }, function() { Zotero.done() }); +} + +function doWeb(doc, url) { + var uri = doc.location.href; + var newUri; + // load translator for MARC + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (detectWeb(doc, url) == "book") { + var matchRegexp = new RegExp('^(.*)frameset(.+)$'); + var m = matchRegexp.exec(uri); + if (m) { + newUri = uri.replace(/frameset/, "marc"); + } else { + newUri = doc.evaluate('//a[contains(@href, "frameset")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace(/frameset/, 'marc'); + } + pageByPage(marc, [newUri]); + } else { // Search results page + // Require link to match this + var tagRegexp = new RegExp(); + tagRegexp.compile('^https?://[^/]+/search\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/frameset'); + + var urls = new Array(); + var availableItems = new Array(); + var firstURL = false; + + var tableRows = doc.evaluate('//table[@class="browseScreen"]//tr[@class="browseEntry" or @class="briefCitRow" or td/input[@type="checkbox"] or td[contains(@class,"briefCitRow")]]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + // Go through table rows + var i = 0; + while(tableRow = tableRows.iterateNext()) { + // get link + var links = doc.evaluate('.//span[@class="briefcitTitle"]/a', tableRow, nsResolver, XPathResult.ANY_TYPE, null); + var link = links.iterateNext(); + if(!link) { + var links = doc.evaluate(".//a", tableRow, nsResolver, XPathResult.ANY_TYPE, null); + link = links.iterateNext(); + } + + if(link) { + if(availableItems[link.href]) { + continue; + } + + + // Go through links + while(link) { + if (link.textContent.match(/\w+/)) availableItems[link.href] = link.textContent; + link = links.iterateNext(); + } + i++; + } + }; + + var items = Zotero.selectItems(availableItems); + + if(!items) { + return true; + } + + var newUrls = new Array(); + for(var url in items) { + newUrls.push(url.replace("frameset", "marc")); + } + pageByPage(marc, newUrls); + } + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (SIRSI).js b/translators/Library Catalog (SIRSI).js @@ -0,0 +1,346 @@ +{ + "translatorID":"add7c71c-21f3-ee14-d188-caf9da12728b", + "translatorType":4, + "label":"Library Catalog (SIRSI)", + "creator":"Sean Takats", + "target":"/uhtbin/cgisirsi", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + + var xpath = '//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI detectWeb: viewmarctags"); + return "book"; + } + var xpath = '//input[@name="VOPTIONS"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI detectWeb: VOPTIONS"); + return "book"; + } + var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver, + XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") { + Zotero.debug("SIRSI detectWeb: Viewing record"); + return "book"; + } + } + + var xpath = '//td[@class="searchsum"]/table'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI detectWeb: searchsum"); + return "multiple"; + } + var xpath = '//form[@name="hitlist"]/table/tbody/tr'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI detectWeb: hitlist"); + return "multiple"; + } + // var xpath = '//input[@type="checkbox"]' +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + if(!elmt) { + return false; + } + + var newItem = new Zotero.Item("book"); + newItem.extra = ""; + + authors = []; + while(elmt) { + try { + var node = doc.evaluate('./TD[1]/A[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(!node) { + var node = doc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } + + if(node) { + var casedField = Zotero.Utilities.superCleanString(doc.evaluate('./TH[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + field = casedField.toLowerCase(); + var value = Zotero.Utilities.superCleanString(node.nodeValue); + if(field == "publisher") { + newItem.publisher = value; + } else if(field == "pub date") { + var re = /[0-9]+/; + var m = re.exec(value); + newItem.date = m[0]; + } else if(field == "isbn") { + var re = /^[0-9](?:[0-9X]+)/; + var m = re.exec(value); + newItem.ISBN = m[0]; + } else if(field == "title" || field == "título") { + var titleParts = value.split(" / "); + newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]); + } else if(field == "publication info" || field == "publicación") { + var pubParts = value.split(" : "); + newItem.place = pubParts[0]; + if (pubParts[1].match(/\d+/)) newItem.date = pubParts[1].match(/\d+/)[0]; + } else if(field == "personal author" || field == "autor personal") { + if(authors.indexOf(value) == -1) { + value = value.replace(/(\(|\)|\d+|\-)/g, ""); + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true)); + authors.push(value); + } + } else if(field == "author"){ + if(authors.indexOf(value) == -1) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true)); + authors.push(value); + } + } else if(field == "added author") { + if(authors.indexOf(value) == -1) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true)); + authors.push(value); + } + } else if(field == "corporate author") { + if(authors.indexOf(value) == -1) { + newItem.creators.push({lastName:value, fieldMode:true}); + authors.push(value); + } + } else if(field == "edition") { + newItem.edition = value; + } else if(field == "subject term" || field == "corporate subject" || field == "geographic term" || field == "subject") { + var subjects = value.split("--"); + for(var i=0; i<subjects.length; i++) { + if(newItem.tags.indexOf(subjects[i]) == -1) { + newItem.tags.push(subjects[i]); + } + } + } else if(field == "personal subject") { + var subjects = value.split(", "); + var tag = value[0]+", "+value[1]; + if(newItems.tag.indexOf(tag) == -1) { + newItem.tags.push(tag); + } + } else if(value && field != "http") { + newItem.extra += casedField+": "+value+"\n"; + } + } + } catch (e) {} + + elmt = elmts.iterateNext(); + } + + if(newItem.extra) { + newItem.extra = newItem.extra.substr(0, newItem.extra.length-1); + } + + var callNumber = doc.evaluate('//tr/td[1][@class="holdingslist"]/text()', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(callNumber && callNumber.nodeValue) { + newItem.callNumber = callNumber.nodeValue; + } + + var domain = doc.location.href.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + return true; +} + +function doWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+ + var xpath = '//td[@class="searchsum"]/table'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: searchsum"); + sirsiNew = true; + } else if (doc.evaluate('//form[@name="hitlist"]/table/tbody/tr', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: hitlist"); + sirsiNew = false; + } else if (doc.evaluate('//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: viewmarctags"); + sirsiNew = true; + } else if (doc.evaluate('//input[@name="VOPTIONS"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + Zotero.debug("SIRSI doWeb: VOPTIONS"); + sirsiNew = false; + } else { + var elmts = doc.evaluate('/html/body/form//text()', doc, nsResolver, + XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") { + Zotero.debug("SIRSI doWeb: Viewing record"); + sirsiNew = false; + } + } + } + + if (sirsiNew) { //executes Simon's SIRSI 2003+ scraper code + Zotero.debug("Running SIRSI 2003+ code"); + if(!scrape(doc)) { + + var checkboxes = new Array(); + var urls = new Array(); + var availableItems = new Array(); + //begin IUCAT fixes by Andrew Smith + var iuRe = /^https?:\/\/www\.iucat\.iu\.edu/; + var iu = iuRe.exec(url); + //IUCAT fix 1 of 2 + if (iu){ + var tableRows = doc.evaluate('//td[@class="searchsum"]/table[//input[@class="submitLink"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else{ + var tableRows = doc.evaluate('//td[@class="searchsum"]/table[//input[@value="Details"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + var tableRow = tableRows.iterateNext(); // skip first row + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + //IUCAT fix 2 of 2 + if (iu){ + var input = doc.evaluate('.//input[@class="submitLink"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var text = doc.evaluate('.//label/span', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else { + var input = doc.evaluate('.//input[@value="Details"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var text = doc.evaluate('.//label/strong', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + //end IUCAT fixes by Andrew Smith + if(text) { + availableItems[input.name] = text; + } + } + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + var hostRe = new RegExp("^http(?:s)?://[^/]+"); + var m = hostRe.exec(doc.location.href); + Zotero.debug("href: " + doc.location.href); + var hitlist = doc.forms.namedItem("hitlist"); + var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value; + var uris = new Array(); + for(var i in items) { + uris.push(baseUrl+"&"+i+"=Details"); + } + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done() }, null); + Zotero.wait(); + } + } else{ //executes Simon's SIRSI -2003 translator code + Zotero.debug("Running SIRSI -2003 code"); + var uri = doc.location.href; + var recNumbers = new Array(); + var xpath = '//form[@name="hitlist"]/table/tbody/tr'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + if(elmt) { // Search results page + var uriRegexp = /^http:\/\/[^\/]+/; + var m = uriRegexp.exec(uri); + var postAction = doc.forms.namedItem("hitlist").getAttribute("action"); + var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40"; + var titleRe = /<br>\s*(.*[^\s])\s*<br>/i; + var items = new Array(); + do { + var checkbox = doc.evaluate('.//input[@type="checkbox"]', elmt, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + // Collect title + var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if(checkbox && title) { + items[checkbox.name] = Zotero.Utilities.cleanString(title); + } + } while(elmt = elmts.iterateNext()); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + recNumbers.push(i); + } + } else { // Normal page + // this regex will fail about 1/100,000,000 tries + var uriRegexp = /^((.*?)\/([0-9]+?))\//; + var m = uriRegexp.exec(uri); + var newUri = m[1]+"/40" + + var elmts = doc.evaluate('/html/body/form', doc, nsResolver, + XPathResult.ANY_TYPE, null); + while(elmt = elmts.iterateNext()) { + var initialText = doc.evaluate('.//text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") { + recNumbers.push(doc.evaluate('./b[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + break; + } + } + // begin Emory compatibility + var elmts = doc.evaluate('//input[@name="first_hit"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + while (elmt = elmts.iterateNext()) { + recNumbers.length = 0; + var recNumber = elmt.value; + recNumbers.push(recNumber); + break; + } + // end Emory compatibility + } + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.loadDocument(newUri+'?marks='+recNumbers.join(",")+'&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=', function(doc) { + var pre = doc.getElementsByTagName("pre"); + var text = pre[0].textContent; + var documents = text.split("*** DOCUMENT BOUNDARY ***"); + for(var j=1; j<documents.length; j++) { + var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type="; + var lines = documents[j].split("\n"); + var record = new marc.record(); + var tag, content; + var ind = ""; + for(var i=0; i<lines.length; i++) { + var line = lines[i]; + if(line[0] == "." && line.substr(4,2) == ". ") { + if(tag) { + content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1"); + record.addField(tag, ind, content); + } + } else { + content += " "+line.substr(6); + continue; + } + tag = line.substr(1, 3); + if(tag[0] != "0" || tag[1] != "0") { + ind = line.substr(6, 2); + content = line.substr(8); + } else { + content = line.substr(7); + if(tag == "000") { + tag = undefined; + record.leader = "00000"+content; + Zotero.debug("the leader is: "+record.leader); + } + } + } + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + } + Zotero.done(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/Library Catalog (TLCYouSeeMore).js b/translators/Library Catalog (TLCYouSeeMore).js @@ -0,0 +1,106 @@ +{ + "translatorID":"0f9fc2fc-306e-5204-1117-25bca009dffc", + "translatorType":4, + "label":"Library Catalog (TLC/YouSeeMore)", + "creator":"Simon Kornblith", + "target":"TLCScripts/interpac\\.dll\\?(?:.*LabelDisplay.*RecordNumber=[0-9]|Search|ItemTitles)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-15 15:11:00" +} + +function detectWeb(doc, url) { + var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]"); + if(detailRe.test(doc.location.href)) { + return "book"; + } else { + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]"); + var uri = doc.location.href; + var newUris = new Array(); + + if(detailRe.test(uri)) { + newUris.push(uri.replace("LabelDisplay", "MARCDisplay")); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, 'TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + newUris.push(i.replace("LabelDisplay", "MARCDisplay")); + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var uri = newDoc.location.href; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var record = new marc.record(); + + var elmts = newDoc.evaluate('/html/body/table/tbody/tr[td[4]]', newDoc, nsResolver, + XPathResult.ANY_TYPE, null); + var tag, ind, content, elmt; + + while(elmt = elmts.iterateNext()) { + tag = newDoc.evaluate('./td[2]/tt[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var inds = newDoc.evaluate('./td[3]/tt[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + + tag = tag.replace(/[\r\n]/g, ""); + inds = inds.replace(/[\r\n\xA0]/g, ""); + + var children = newDoc.evaluate('./td[4]/tt[1]//text()', elmt, nsResolver, + XPathResult.ANY_TYPE, null); + var subfield = children.iterateNext(); + var fieldContent = children.iterateNext(); + + if(tag == "LDR") { + record.leader = "00000"+subfield.nodeValue; + } else { + content = ""; + if(!fieldContent) { + content = subfield.nodeValue; + } else { + while(subfield && fieldContent) { + content += marc.subfieldDelimiter+subfield.nodeValue.substr(1, 1)+fieldContent.nodeValue; + var subfield = children.iterateNext(); + var fieldContent = children.iterateNext(); + } + } + + record.addField(tag, inds, content); + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function() {Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (VTLS).js b/translators/Library Catalog (VTLS).js @@ -0,0 +1,136 @@ +{ + "translatorID":"63a0a351-3131-18f4-21aa-f46b9ac51d87", + "translatorType":4, + "label":"Library Catalog (VTLS)", + "creator":"Simon Kornblith", + "target":"/chameleon(?:\\?|$)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + var node = doc.evaluate('//tr[@class="intrRow"]/td/table/tbody/tr[th]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + if(node) { + return "multiple"; + } + var node = doc.evaluate('//a[text()="marc"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); + if(node) { + return "book"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var uri = doc.location.href; + var newUris = new Array(); + + var marcs = doc.evaluate('//a[text()="marc"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var record = marcs.iterateNext(); + + if(record && !marcs.iterateNext()) { + newUris.push(record.href); + } else { + // Require link to match this + var tagRegexp = new RegExp(); + tagRegexp.compile("/chameleon\?.*function=CARDSCR"); + + var items = new Array(); + + var tableRows = doc.evaluate('//tr[@class="intrRow"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var tableRow; + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + var links = tableRow.getElementsByTagName("a"); + // Go through links + var url; + for(var j=0; j<links.length; j++) { + if(tagRegexp.test(links[j].href)) { + url = links[j].href; + break; + } + } + if(url) { + // Collect title information + var fields = doc.evaluate('./td/table/tbody/tr[th]', tableRow, + nsResolver, XPathResult.ANY_TYPE, null); + var field; + while(field = fields.iterateNext()) { + var header = doc.evaluate('./th/text()', field, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(header.nodeValue == "Title") { + var value = doc.evaluate('./td', field, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(value) { + items[url] = Zotero.Utilities.cleanString(value.textContent); + } + } + } + } + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + Zotero.debug(i.replace(/function=[A-Z]{7}/, "function=MARCSCR")); + newUris.push(i.replace(/function=[A-Z]{7}/, "function=MARCSCR")); + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var uri = newDoc.location.href + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var record = new marc.record(); + +// var xpath = '//table[@class="outertable"]/tbody/tr[td[4]]'; //old xpath +// xpaths from virginia college of osteopathic medicine +// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[1][@class="marcTag"] +// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[2] +// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[3] +// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[4][@class="marcSubfields"] + var xpath = '//table[@class="marctable"]/tbody/tr[td[4]]'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, + XPathResult.ANY_TYPE, null); + + while(elmt = elmts.iterateNext()) { + var field = newDoc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var ind1 = newDoc.evaluate('./TD[2]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var ind2 = newDoc.evaluate('./TD[3]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var value = newDoc.evaluate('./TD[4]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + value = value.replace(/\\([a-z]) /g, marc.subfieldDelimiter+"$1"); + + record.addField(field, ind1+ind2, value); + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function(){ Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (Voyager).js b/translators/Library Catalog (Voyager).js @@ -0,0 +1,173 @@ +{ + "translatorID":"88915634-1af6-c134-0171-56fd198235ed", + "translatorType":4, + "label":"Library Catalog (Voyager)", + "creator":"Simon Kornblith", + "target":"Pwebrecon\\.cgi", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-16 20:10:00" +} + +function detectWeb(doc, url) { + var export_options = doc.forms.namedItem('frm').elements.namedItem('RD').options; + for(var i in export_options) { + if(export_options[i].text == 'Latin1 MARC' + || export_options[i].text == 'Raw MARC' + || export_options[i].text == 'MARC 8' + || export_options[i].text == 'MARC-8' + || export_options[i].text == 'UTF-8' + || export_options[i].text == 'MARC (Unicode/UTF-8)' + || export_options[i].text == 'MARC UTF-8' + || export_options[i].text == 'UTF-8 MARC (Unicode)' + || export_options[i].text == 'UTF8-Unicode' + || export_options[i].text == 'MARC (non-Unicode/MARC-8)' + || export_options[i].text == 'MARC communication format') { + // We have an exportable single record + if(doc.forms.namedItem('frm').elements.namedItem('RC')) { + return "multiple"; + } else { + return "book"; + } + } + } +} + +function doWeb(doc, url) { + var postString = ''; + var form = doc.forms.namedItem('frm'); + var newUri = form.action; + var multiple = false; + + if(doc.forms.namedItem('frm').elements.namedItem('RC')) { + multiple = true; + + var availableItems = new Object(); // Technically, associative arrays are objects + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // Require link to match this + var tagRegexp = new RegExp(); + tagRegexp.compile('Pwebrecon\\.cgi\\?.*v1=[0-9]+\\&.*ti='); + // Do not allow text to match this + var rejectRegexp = new RegExp(); + rejectRegexp.compile('\[ [0-9]+ \]'); + + var checkboxes = new Array(); + var urls = new Array(); + + var tableRows = doc.evaluate('//form[@name="frm"]//table/tbody/tr[td/input[@type="checkbox"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + // Go through table rows + var tableRow; + var i = 0; + while(tableRow = tableRows.iterateNext()) { + i++; + // CHK is what we need to get it all as one file + var input = doc.evaluate('./td/input[@name="CHK"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + checkboxes[i] = input.value; + var links = tableRow.getElementsByTagName("a"); + // Go through links + for(var j=0; j<links.length; j++) { + if(tagRegexp.test(links[j].href)) { + var text = links[j].textContent; + if(text) { + text = Zotero.Utilities.cleanString(text); + if(!rejectRegexp.test(text)) { + if(availableItems[i]) { + availableItems[i] += " "+text; + } else { + availableItems[i] = text; + } + } + } + } + } + // if no title, pull from second td + if(!availableItems[i]) { + availableItems[i] = Zotero.Utilities.cleanString(doc.evaluate('./td[2]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + } + + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + + // add arguments for items we need to grab + for(var i in items) { + postString += "CHK="+checkboxes[i]+"&"; + } + } + + var raw, unicode, latin1; + + for(var i=0; i<form.elements.length; i++) { + if(form.elements[i].type && form.elements[i].type.toLowerCase() == 'hidden') { + postString += escape(form.elements[i].name)+'='+escape(form.elements[i].value)+'&'; + } + } + + var export_options = form.elements.namedItem('RD').options; + for(var i=0; i<export_options.length; i++) { + if(export_options[i].text == 'Raw MARC' + || export_options[i].text == 'MARC 8' + || export_options[i].text == 'MARC-8' + || export_options[i].text == 'MARC (non-Unicode/MARC-8)') { + raw = i; + } if(export_options[i].text == 'Latin1 MARC') { + latin1 = i; + } else if(export_options[i].text == 'UTF-8' + || export_options[i].text == 'UTF-8 MARC (Unicode)' + || export_options[i].text == 'UTF8-Unicode' + || export_options[i].text == 'MARC UTF-8' + || export_options[i].text == 'MARC (Unicode/UTF-8)' + || export_options[i].text == 'MARC communication format') { + unicode = i; + } + } + + if(unicode) { + var rd = unicode; + } else if(latin1) { + var rd = latin1; + } else if(raw) { + var rd = raw; + } else { + return false; + } + + postString += 'RD='+rd+'&MAILADDY=&SAVE=Press+to+SAVE+or+PRINT'; + + // No idea why this doesn't work as post + Zotero.Utilities.HTTP.doGet(newUri+'?'+postString, function(text) { + // load translator for MARC + var marc = Zotero.loadTranslator("import"); + marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + marc.setString(text); + + // if this is the LOC catalog, specify that in repository field + if(url.length > 23 && url.substr(0, 23) == "http://catalog.loc.gov/") { + marc.setHandler("itemDone", function(obj, item) { + item.repository = "Library of Congress Catalog"; + item.complete(); + }); + } else { + var domain = url.match(/https?:\/\/([^/]+)/); + marc.setHandler("itemDone", function(obj, item) { + item.repository = domain[1]+" Library Catalog"; + item.complete(); + }); + } + + marc.translate(); + + Zotero.done(); + }) + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Library Catalog (X-OPAC).js b/translators/Library Catalog (X-OPAC).js @@ -0,0 +1,53 @@ +{ + "translatorID":"f880bf79-d42f-4337-b0d2-7a7de4a48b7d", + "translatorType":4, + "label":"Library Catalog (X-OPAC)", + "creator":"Michael Berkowitz", + "target":"(xopac|hylib)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-06 21:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("&nd=") != -1) { + return "book"; + } else if (url.indexOf("Aktion") != -1) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var ids = new Array(); + if (detectWeb(doc, url) == "multiple") { + var xpath = '//table/tbody/tr/td//a'; + var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var link = links.iterateNext(); + var items = new Object(); + while (link) { + if (link.href.match(/&nd=\d+/)) { + items[link.href.match(/&nd=(\d+)/)[1]] = Zotero.Utilities.trimInternal(link.textContent); + } + link = links.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + ids.push(i); + } + } else { + ids = [url.match(/&nd=(\d+)/)[1]]; + } + Zotero.debug(ids); + for (var i = 0 ; i < ids.length ; i++) { + var post = 'db=ubfr&nd=' + ids[i] + '&counter=0&Aktion=S&VomOLAF=0&links=1&gk=&format=ris'; + Zotero.Utilities.HTTP.doPost('http://www.ub.uni-freiburg.de/cgi-bin/refman', post, function(text) { + //Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/MAB2.js b/translators/MAB2.js @@ -0,0 +1,359 @@ +{ + "translatorID":"91acf493-0de7-4473-8b62-89fd141e6c74", + "translatorType":1, + "label":"MAB2", + "creator":"Simon Kornblith. Adaptions for MAB2: Leon Krauthausen (FUB)", + "target":"mab2", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-12 19:00:00" +} + +function detectImport() { + var mab2RecordRegexp = /^[0-9]{3}[a-z ]{2}[a-z ]{3}$/ + var read = Zotero.read(8); + if(mab2RecordRegexp.test(read)) { + return true; + } +} + +var fieldTerminator = "\x1E"; +var recordTerminator = "\x1D"; +var subfieldDelimiter = "\x1F"; + +/* +* CLEANING FUNCTIONS +*/ + +// general purpose cleaning +function clean(value) { + value = value.replace(/^[\s\.\,\/\:;]+/, ''); + value = value.replace(/[\s\.\,\/\:;]+$/, ''); + value = value.replace(/<<+/g, ''); + value = value.replace(/>>+/g, ''); + value = value.replace(/ +/g, ' '); + + var char1 = value[0]; + var char2 = value[value.length-1]; + if((char1 == "[" && char2 == "]") || (char1 == "(" && char2 == ")")) { + // chop of extraneous characters + return value.substr(1, value.length-2); + } + + return value; +} + +function cleanTag(value) { + // Chop off Authority-IDs + value = value.slice(0, value.indexOf('|')); + return value; +} + +// number extraction +function pullNumber(text) { + var pullRe = /[0-9]+/; + var m = pullRe.exec(text); + if(m) { + return m[0]; + } +} + +// ISBN extraction +function pullISBN(text) { + var pullRe = /[0-9X\-]+/; + var m = pullRe.exec(text); + if(m) { + return m[0]; + } +} + +// corporate author extraction +function corpAuthor(author) { + return {lastName:author, fieldMode:true}; +} + +// regular author extraction +function author(author, type, useComma) { + return Zotero.Utilities.cleanAuthor(author, type, useComma); +} + +// MAB2 author extraction +// evaluates subfield $b and sets authType +function authorMab(author, authType, useComma) { + if(!authType) var authType='author'; + authType = authType.replace('[Hrsg.]', 'editor'); + authType = authType.replace('[Mitarb.]', 'contributor'); + authType = authType.replace('[Übers.]', 'translator'); + return Zotero.Utilities.cleanAuthor(author, authType, useComma); +} +/* +* END CLEANING FUNCTIONS +*/ + +var record = function() { + this.directory = new Object(); + this.leader = ""; + this.content = ""; + + // defaults + this.indicatorLength = 2; + this.subfieldCodeLength = 2; +} + +// import a binary MAB2 record into this record +record.prototype.importBinary = function(record) { + // get directory and leader + var directory = record.substr(0, record.indexOf(fieldTerminator)); + this.leader = directory.substr(0, 24); + var directory = directory.substr(24); + + // get various data + this.indicatorLength = parseInt(this.leader[10], 10); + this.subfieldCodeLength = parseInt(this.leader[11], 10); + var baseAddress = parseInt(this.leader.substr(12, 5), 10); + + // get record data + var contentTmp = record.substr(baseAddress); + + // MARC wants one-byte characters, so when we have multi-byte UTF-8 + // sequences, add null characters so that the directory shows up right. we + // can strip the nulls later. + this.content = ""; + for(i=0; i<contentTmp.length; i++) { + this.content += contentTmp[i]; + if(contentTmp.charCodeAt(i) > 0x00FFFF) { + this.content += "\x00\x00\x00"; + } else if(contentTmp.charCodeAt(i) > 0x0007FF) { + this.content += "\x00\x00"; + } else if(contentTmp.charCodeAt(i) > 0x00007F) { + this.content += "\x00"; + } + } + + // read directory + for(var i=0; i<directory.length; i+=12) { + var tag = parseInt(directory.substr(i, 3), 10); + var fieldLength = parseInt(directory.substr(i+3, 4), 10); + var fieldPosition = parseInt(directory.substr(i+7, 5), 10); + + if(!this.directory[tag]) { + this.directory[tag] = new Array(); + } + this.directory[tag].push([fieldPosition, fieldLength]); + } +} + +// add a field to this record +record.prototype.addField = function(field, indicator, value) { + field = parseInt(field, 10); + // make sure indicator is the right length + if(indicator.length > this.indicatorLength) { + indicator = indicator.substr(0, this.indicatorLength); + } else if(indicator.length != this.indicatorLength) { + indicator = Zotero.Utilities.lpad(indicator, " ", this.indicatorLength); + } + + // add terminator + value = indicator+value+fieldTerminator; + + // add field to directory + if(!this.directory[field]) { + this.directory[field] = new Array(); + } + this.directory[field].push([this.content.length, value.length]); + + // add field to record + this.content += value; +} + +// get all fields with a certain field number +record.prototype.getField = function(field) { + field = parseInt(field, 10); + var fields = new Array(); + + // make sure fields exist + if(!this.directory[field]) { + return fields; + } + + // get fields + for(var i in this.directory[field]) { + var location = this.directory[field][i]; + + // add to array, replacing null characters + fields.push([this.content.substr(location[0], this.indicatorLength), + this.content.substr(location[0]+this.indicatorLength, + location[1]-this.indicatorLength-1).replace(/\x00/g, "")]); + } + + return fields; +} + +// get subfields from a field +record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensional array of values + var fields = this.getField(tag); + var returnFields = new Array(); + + for(var i in fields) { + returnFields[i] = new Object(); + + var subfields = fields[i][1].split(subfieldDelimiter); + if (subfields.length == 1) { + returnFields[i]["?"] = fields[i][1]; + } else { + for(var j in subfields) { + if(subfields[j]) { + var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1); + if(!returnFields[i][subfieldIndex]) { + returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1); + } + } + } + } + } + + return returnFields; +} + +// add field to DB +record.prototype._associateDBField = function(item, fieldNo, part, fieldName, execMe, arg1, arg2) { + var field = this.getFieldSubfields(fieldNo); + Zotero.debug('MARC: found '+field.length+' matches for '+fieldNo+part); + if(field) { + for(var i in field) { + var value = false; + for(var j=0; j<part.length; j++) { + var myPart = part[j]; + if(field[i][myPart]) { + if(value) { + value += " "+field[i][myPart]; + } else { + value = field[i][myPart]; + } + } + } + if(value) { + value = clean(value); + + if(execMe) { + value = execMe(value, arg1, arg2); + } + + if(fieldName == "creator") { + item.creators.push(value); + } else { + item[fieldName] = value; + return; + } + } + } + } +} + +// add field to DB as tags +record.prototype._associateTags = function(item, fieldNo, part) { + var field = this.getFieldSubfields(fieldNo); + for(var i in field) { + for(var j=0; j<part.length; j++) { + var myPart = part[j]; + if(field[i][myPart]) { + item.tags.push(cleanTag(field[i][myPart])); + } + } + } +} + +// this function loads a MAB2 record into our database +record.prototype.translate = function(item) { + // get item type + if(this.leader) { + var marcType = this.leader[6]; + if(marcType == "g") { + item.itemType = "film"; + } else if(marcType == "k" || marcType == "e" || marcType == "f") { + item.itemType = "artwork"; + } else if(marcType == "t") { + item.itemType = "manuscript"; + } else { + item.itemType = "book"; + } + } else { + item.itemType = "book"; + } + + // Extract MAB2 fields + // FUB Added language, edition, pages, url, edition, series, ISBN, url + for (var i = 100; i <= 196; i++) { + if (this.getFieldSubfields(i)[0]) { + var field = this.getFieldSubfields(i)[0]['a']; + var authType = this.getFieldSubfields(i)[0]['b']; + this._associateDBField(item, i, "a", "creator", authorMab, authType, true); + } + } + + // if (this.getFieldSubfields("800")[0]) this._associateDBField(item, "800", "a", "creator", author, "author", true); + if (!item.language) this._associateDBField(item, "037b", "a", "language"); + this._associateDBField(item, "200", "a", "creator", corpAuthor); + if (!item.title) this._associateDBField(item, "331", "a", "title"); + this._associateDBField(item, "304", "a", "extra"); + if (this.getFieldSubfields("335")[0]) { + item.title = item.title + ": " + this.getFieldSubfields("335")[0]['a']; + } + if (!item.edition) this._associateDBField(item, "403", "a", "edition"); + if (!item.place) this._associateDBField(item, "410", "a", "place"); + if (!item.publisher) this._associateDBField(item, "412", "a", "publisher"); + if (!item.title) this._associateDBField(item, "1300", "a", "title"); + if (!item.date) this._associateDBField(item, "425", "a", "date", pullNumber); + if (!item.pages) this._associateDBField(item, "433", "a", "pages", pullNumber); + if (!item.series) this._associateDBField(item, "451", "a", "series"); + this._associateDBField(item, "501", "a", "extra"); + this._associateDBField(item, "519", "a", "extra"); + if (!item.edition) this._associateDBField(item, "523", "a", "edition"); + if (!item.ISBN) this._associateDBField(item, "540", "a", "ISBN", pullISBN); + if (!item.date) this._associateDBField(item, "595", "a", "date", pullNumber); + if (!item.url) this._associateDBField(item, "655e", "u", "url"); + + // Extract German subject headings (RSWK) as tags + this._associateTags(item, "902", "acfgpkstz"); + this._associateTags(item, "907", "acfgpkstz"); + this._associateTags(item, "912", "acfgpkstz"); + this._associateTags(item, "917", "acfgpkstz"); + this._associateTags(item, "922", "acfgpkstz"); + this._associateTags(item, "927", "acfgpkstz"); + this._associateTags(item, "932", "acfgpkstz"); + this._associateTags(item, "937", "acfgpkstz"); + this._associateTags(item, "942", "acfgpkstz"); + + +} + +function doImport() { + var text; + var holdOver = ""; // part of the text held over from the last loop + + Zotero.setCharacterSet("utf-8"); + + while(text = Zotero.read(4096)) { // read in 4096 byte increments + var records = text.split("\x1D"); + + if(records.length > 1) { + records[0] = holdOver + records[0]; + holdOver = records.pop(); // skip last record, since it's not done + + for(var i in records) { + var newItem = new Zotero.Item(); + + // create new record + var rec = new record(); + rec.importBinary(records[i]); + rec.translate(newItem); + + newItem.complete(); + } + } else { + holdOver += text; + } + } +} +\ No newline at end of file diff --git a/translators/MARC.js b/translators/MARC.js @@ -0,0 +1,419 @@ +{ + "translatorID":"a6ee60df-1ddc-4aae-bb25-45e0537be973", + "translatorType":1, + "label":"MARC", + "creator":"Simon Kornblith", + "target":"marc", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-29 21:10:00" +} + +function detectImport() { + var marcRecordRegexp = /^[0-9]{5}[a-z ]{3}$/ + var read = Zotero.read(8); + if(marcRecordRegexp.test(read)) { + return true; + } +} + +var fieldTerminator = "\x1E"; +var recordTerminator = "\x1D"; +var subfieldDelimiter = "\x1F"; + +/* + * CLEANING FUNCTIONS + */ + + + + +// general purpose cleaning +function clean(value) { + value = value.replace(/^[\s\.\,\/\:;]+/, ''); + value = value.replace(/[\s\.\,\/\:;]+$/, ''); + value = value.replace(/ +/g, ' '); + + var char1 = value[0]; + var char2 = value[value.length-1]; + if((char1 == "[" && char2 == "]") || (char1 == "(" && char2 == ")")) { + // chop of extraneous characters + return value.substr(1, value.length-2); + } + + return value; +} + +// number extraction +function pullNumber(text) { + var pullRe = /[0-9]+/; + var m = pullRe.exec(text); + if(m) { + return m[0]; + } +} + +// ISBN extraction +function pullISBN(text) { + var pullRe = /[0-9X\-]+/; + var m = pullRe.exec(text); + if(m) { + return m[0]; + } +} + +// corporate author extraction +function corpAuthor(author) { + return {lastName:author, fieldMode:true}; +} + +// regular author extraction +function author(author, type, useComma) { + return Zotero.Utilities.cleanAuthor(author, type, useComma); +} + +/* + * END CLEANING FUNCTIONS + */ + +var record = function() { + this.directory = new Object(); + this.leader = ""; + this.content = ""; + + // defaults + this.indicatorLength = 2; + this.subfieldCodeLength = 2; +} + +// import a binary MARC record into this record +record.prototype.importBinary = function(record) { + // get directory and leader + var directory = record.substr(0, record.indexOf(fieldTerminator)); + this.leader = directory.substr(0, 24); + var directory = directory.substr(24); + + // get various data + this.indicatorLength = parseInt(this.leader[10], 10); + this.subfieldCodeLength = parseInt(this.leader[11], 10); + var baseAddress = parseInt(this.leader.substr(12, 5), 10); + + // get record data + var contentTmp = record.substr(baseAddress); + + // MARC wants one-byte characters, so when we have multi-byte UTF-8 + // sequences, add null characters so that the directory shows up right. we + // can strip the nulls later. + this.content = ""; + for(i=0; i<contentTmp.length; i++) { + this.content += contentTmp[i]; + if(contentTmp.charCodeAt(i) > 0x00FFFF) { + this.content += "\x00\x00\x00"; + } else if(contentTmp.charCodeAt(i) > 0x0007FF) { + this.content += "\x00\x00"; + } else if(contentTmp.charCodeAt(i) > 0x00007F) { + this.content += "\x00"; + } + } + + // read directory + for(var i=0; i<directory.length; i+=12) { + var tag = parseInt(directory.substr(i, 3), 10); + var fieldLength = parseInt(directory.substr(i+3, 4), 10); + var fieldPosition = parseInt(directory.substr(i+7, 5), 10); + + if(!this.directory[tag]) { + this.directory[tag] = new Array(); + } + this.directory[tag].push([fieldPosition, fieldLength]); + } +} + +// add a field to this record +record.prototype.addField = function(field, indicator, value) { + field = parseInt(field, 10); + // make sure indicator is the right length + if(indicator.length > this.indicatorLength) { + indicator = indicator.substr(0, this.indicatorLength); + } else if(indicator.length != this.indicatorLength) { + indicator = Zotero.Utilities.lpad(indicator, " ", this.indicatorLength); + } + + // add terminator + value = indicator+value+fieldTerminator; + + // add field to directory + if(!this.directory[field]) { + this.directory[field] = new Array(); + } + this.directory[field].push([this.content.length, value.length]); + + // add field to record + this.content += value; +} + +// get all fields with a certain field number +record.prototype.getField = function(field) { + field = parseInt(field, 10); + var fields = new Array(); + + // make sure fields exist + if(!this.directory[field]) { + return fields; + } + + // get fields + for(var i in this.directory[field]) { + var location = this.directory[field][i]; + + // add to array, replacing null characters + fields.push([this.content.substr(location[0], this.indicatorLength), + this.content.substr(location[0]+this.indicatorLength, + location[1]-this.indicatorLength-1).replace(/\x00/g, "")]); + } + + return fields; +} + +// get subfields from a field +record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensional array of values + var fields = this.getField(tag); + var returnFields = new Array(); + + for(var i in fields) { + returnFields[i] = new Object(); + + var subfields = fields[i][1].split(subfieldDelimiter); + if (subfields.length == 1) { + returnFields[i]["?"] = fields[i][1]; + } else { + for(var j in subfields) { + if(subfields[j]) { + var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1); + if(!returnFields[i][subfieldIndex]) { + returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1); + } + } + } + } + } + + return returnFields; +} + +// add field to DB +record.prototype._associateDBField = function(item, fieldNo, part, fieldName, execMe, arg1, arg2) { + var field = this.getFieldSubfields(fieldNo); + + Zotero.debug('MARC: found '+field.length+' matches for '+fieldNo+part); + if(field) { + for(var i in field) { + var value = false; + for(var j=0; j<part.length; j++) { + var myPart = part[j]; + if(field[i][myPart]) { + if(value) { + value += " "+field[i][myPart]; + } else { + value = field[i][myPart]; + } + } + } + if(value) { + value = clean(value); + + if(execMe) { + value = execMe(value, arg1, arg2); + } + + if(fieldName == "creator") { + item.creators.push(value); + } else { + item[fieldName] = value; + return; + } + } + } + } +} + +// add field to DB as tags +record.prototype._associateTags = function(item, fieldNo, part) { + var field = this.getFieldSubfields(fieldNo); + + for(var i in field) { + for(var j=0; j<part.length; j++) { + var myPart = part[j]; + if(field[i][myPart]) { + item.tags.push(clean(field[i][myPart])); + } + } + } +} + +// this function loads a MARC record into our database +record.prototype.translate = function(item) { + // get item type + if(this.leader) { + var marcType = this.leader[6]; + if(marcType == "g") { + item.itemType = "film"; + } else if(marcType == "k" || marcType == "e" || marcType == "f") { + item.itemType = "artwork"; + } else if(marcType == "t") { + item.itemType = "manuscript"; + } else { + item.itemType = "book"; + } + } else { + item.itemType = "book"; + } + + // Extract ISBNs + this._associateDBField(item, "020", "a", "ISBN", pullISBN); + // Extract ISSNs + this._associateDBField(item, "022", "a", "ISSN", pullISBN); + // Extract creators + this._associateDBField(item, "100", "a", "creator", author, "author", true); + this._associateDBField(item, "110", "a", "creator", corpAuthor, "author"); + this._associateDBField(item, "111", "a", "creator", corpAuthor, "author"); + this._associateDBField(item, "700", "a", "creator", author, "contributor", true); + this._associateDBField(item, "710", "a", "creator", corpAuthor, "contributor"); + this._associateDBField(item, "711", "a", "creator", corpAuthor, "contributor"); + if(item.itemType == "book" && !item.creators.length) { + // some LOC entries have no listed author, but have the author in the person subject field as the first entry + var field = this.getFieldSubfields("600"); + if(field[0]) { + item.creators.push(Zotero.Utilities.cleanAuthor(field[0]["a"], "author", true)); + } + } + + // Extract tags + // personal + this._associateTags(item, "600", "aqtxyz"); + // corporate + this._associateTags(item, "611", "abtxyz"); + // meeting + this._associateTags(item, "630", "acetxyz"); + // uniform title + this._associateTags(item, "648", "atxyz"); + // chronological + this._associateTags(item, "650", "axyz"); + // topical + this._associateTags(item, "651", "abcxyz"); + // geographic + this._associateTags(item, "653", "axyz"); + // uncontrolled + this._associateTags(item, "653", "a"); + // faceted topical term (whatever that means) + this._associateTags(item, "654", "abcyz"); + // genre/form + this._associateTags(item, "655", "abcxyz"); + // occupation + this._associateTags(item, "656", "axyz"); + // function + this._associateTags(item, "657", "axyz"); + // curriculum objective + this._associateTags(item, "658", "ab"); + // hierarchical geographic place name + this._associateTags(item, "662", "abcdfgh"); + + // Extract title + this._associateDBField(item, "245", "ab", "title"); + // Extract edition + this._associateDBField(item, "250", "a", "edition"); + // Extract place info + this._associateDBField(item, "260", "a", "place"); + + // Extract publisher/distributor + if(item.itemType == "film") { + this._associateDBField(item, "260", "b", "distributor"); + } else { + this._associateDBField(item, "260", "b", "publisher"); + } + + // Extract year + this._associateDBField(item, "260", "c", "date", pullNumber); + // Extract pages + this._associateDBField(item, "300", "a", "pages", pullNumber); + // Extract series + this._associateDBField(item, "440", "a", "series"); + // Extract series number + this._associateDBField(item, "440", "v", "seriesNumber"); + // Extract call number + this._associateDBField(item, "084", "ab", "callNumber"); + this._associateDBField(item, "082", "a", "callNumber"); + this._associateDBField(item, "080", "ab", "callNumber"); + this._associateDBField(item, "070", "ab", "callNumber"); + this._associateDBField(item, "060", "ab", "callNumber"); + this._associateDBField(item, "050", "ab", "callNumber"); + this._associateDBField(item, "090", "a", "callNumber"); + this._associateDBField(item, "099", "a", "callNumber"); + this._associateDBField(item, "955", "a", "callNumber"); + + //German + if (!item.place) this._associateDBField(item, "410", "a", "place"); + if (!item.publisher) this._associateDBField(item, "412", "a", "publisher"); + if (!item.title) this._associateDBField(item, "331", "a", "title"); + if (!item.title) this._associateDBField(item, "1300", "a", "title"); + if (!item.date) this._associateDBField(item, "425", "a", "date", pullNumber); + if (!item.date) this._associateDBField(item, "595", "a", "date", pullNumber); + if (this.getFieldSubfields("104")[0]) this._associateDBField(item, "104", "a", "creator", author, "author", true); + if (this.getFieldSubfields("800")[0]) this._associateDBField(item, "800", "a", "creator", author, "author", true); + + //Spanish + if (!item.title) this._associateDBField(item, "200", "a", "title"); + if (!item.place) this._associateDBField(item, "210", "a", "place"); + if (!item.publisher) this._associateDBField(item, "210", "c", "publisher"); + if (!item.date) this._associateDBField(item, "210", "d", "date"); + if (!item.creators) { + for (var i = 700; i < 703; i++) { + if (this.getFieldSubfields(i)[0]) { + Zotero.debug(i + " is AOK"); + Zotero.debug(this.getFieldSubfields(i.toString())); + var aut = this.getFieldSubfields(i)[0]; + if (aut.b) { + aut = aut['b'].replace(/,\W+/g, "") + " " + aut['a'].replace(/,\s/g, ""); + } else { + aut = aut['a'].split(", ").join(" "); + } + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + } + if(item.title) { + item.title = Zotero.Utilities.capitalizeTitle(item.title); + } + if (this.getFieldSubfields("335")[0]) { + item.title = item.title + ": " + this.getFieldSubfields("335")[0]['a']; + } +} + +function doImport() { + var text; + var holdOver = ""; // part of the text held over from the last loop + + while(text = Zotero.read(4096)) { // read in 4096 byte increments + var records = text.split("\x1D"); + + if(records.length > 1) { + records[0] = holdOver + records[0]; + holdOver = records.pop(); // skip last record, since it's not done + + for(var i in records) { + var newItem = new Zotero.Item(); + + // create new record + var rec = new record(); + rec.importBinary(records[i]); + rec.translate(newItem); + + newItem.complete(); + } + } else { + holdOver += text; + } + } +} +\ No newline at end of file diff --git a/translators/MIT Press Journals.js b/translators/MIT Press Journals.js @@ -0,0 +1,69 @@ +{ + "translatorID":"2e43f4a9-d2e2-4112-a6ef-b3528b39b4d2", + "translatorType":4, + "label":"MIT Press Journals", + "creator":"Michael Berkowitz", + "target":"http://www.mitpressjournals.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-28 17:50:00" +} + +function detectWeb(doc, url) { + if (url.match(/action\/doSearch/) || url.match(/toc\//)) { + return "multiple"; + } else if (url.match(/doi\/abs\//)) { + return "journalArticle"; + } +} + +function getDOI(str) { + return str.match(/doi\/abs\/([^?]+)/)[1]; +} + +function doWeb(doc, url) { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//table[@class="articleEntry"]/tbody/tr//a[text() = "First Page" or text() = "Citation" or text() = "Abstract"]', doc, null, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//table[@class="articleEntry"]/tbody/tr//div[@class="arttitle"]', doc, null, XPathResult.ANY_TYPE, null); + var link, title; + while ((link = links.iterateNext()) && (title = titles.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push('http://www.mitpressjournals.org/doi/abs/' + getDOI(i)); + } + } else { + articles = ['http://www.mitpressjournals.org/doi/abs/' + getDOI(url)]; + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + if (newDoc.evaluate('//div[@class="abstractSection"]/p[contains(@class, "last") or contains(@class, "first")]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var abs = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[@class="abstractSection"]/p[contains(@class, "last") or contains(@class, "first")]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + var doi = getDOI(newDoc.location.href); + var risurl = 'http://www.mitpressjournals.org/action/downloadCitation?doi=' + doi + '&include=cit&format=refman&direct=on&submit=Download+article+metadata'; + var pdfurl = newDoc.location.href.replace("/doi/abs/", "/doi/pdf/"); + Zotero.Utilities.HTTP.doGet(risurl, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (item.notes[0]['note'].match(/doi:/)) { + item.DOI = item.notes[0]['note'].substr(5); + item.notes = new Array(); + } + item.attachments[0].title= item.publicationTitle + " Snapshot"; + item.attachments[0].mimeType = "text/html"; + item.attachments.push({url:pdfurl, title:item.publicationTitle + " Full Text PDF", mimeType:"application/pdf"}); + if (abs) item.abstractNote = abs; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/MODS.js b/translators/MODS.js @@ -0,0 +1,615 @@ +{ + "translatorID":"0e2235e7-babf-413c-9acf-f27cce5f059c", + "translatorType":3, + "label":"MODS", + "creator":"Simon Kornblith", + "target":"xml", + "minVersion":"1.0.8", + "maxVersion":"", + "priority":50, + "inRepository":true, + "lastUpdated":"2008-08-20 01:05:28" +} + +Zotero.addOption("exportNotes", true); + +function detectImport() { + var read = Zotero.read(512); + var modsTagRegexp = /<mods[^>]+>/ + if(modsTagRegexp.test(read)) { + return true; + } +} + +var partialItemTypes = ["bookSection", "journalArticle", "magazineArticle", "newspaperArticle"]; + +function doExport() { + Zotero.setCharacterSet("utf-8"); + var modsCollection = <modsCollection xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd" />; + + var item; + while(item = Zotero.nextItem()) { + var isPartialItem = Zotero.Utilities.inArray(item.itemType, partialItemTypes); + + var mods = <mods />; + + /** CORE FIELDS **/ + + // XML tag titleInfo; object field title + if(item.title) { + mods.titleInfo.title = item.title; + } + + // XML tag typeOfResource/genre; object field type + var modsType, marcGenre; + if(item.itemType == "book" || item.itemType == "bookSection") { + modsType = "text"; + marcGenre = "book"; + } else if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") { + modsType = "text"; + marcGenre = "periodical"; + } else if(item.itemType == "newspaperArticle") { + modsType = "text"; + marcGenre = "newspaper"; + } else if(item.itemType == "thesis") { + modsType = "text"; + marcGenre = "theses"; + } else if(item.itemType == "letter") { + modsType = "text"; + marcGenre = "letter"; + } else if(item.itemType == "manuscript") { + modsType = "text"; + modsType.@manuscript = "yes"; + } else if(item.itemType == "interview") { + modsType = "text"; + marcGenre = "interview"; + } else if(item.itemType == "film") { + modsType = "moving image"; + marcGenre = "motion picture"; + } else if(item.itemType == "artwork") { + modsType = "still image"; + marcGenre = "art original"; + } else if(item.itemType == "webpage") { + modsType = "multimedia"; + marcGenre = "web site"; + } else if(item.itemType == "note" || item.itemType == "attachment") { + continue; + } + mods.typeOfResource = modsType; + mods.genre += <genre authority="local">{item.itemType}</genre>; + if(marcGenre) { + mods.genre += <genre authority="marcgt">{marcGenre}</genre>; + } + + // XML tag genre; object field thesisType, type + if(item.thesisType) { + mods.genre += <genre>{item.thesisType}</genre>; + } + if(item.type) { + mods.genre += <genre>{item.type}</genre>; + } + + // XML tag name; object field creators + for(var j in item.creators) { + var roleTerm = ""; + if(item.creators[j].creatorType == "author") { + roleTerm = "aut"; + } else if(item.creators[j].creatorType == "editor") { + roleTerm = "edt"; + } else if(item.creators[j].creatorType == "creator") { + roleTerm = "ctb"; + } + + // FIXME - currently all names are personal + mods.name += <name type="personal"> + <namePart type="family">{item.creators[j].lastName}</namePart> + <namePart type="given">{item.creators[j].firstName}</namePart> + <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> + </name>; + } + + // XML tag recordInfo.recordOrigin; used to store our generator note + //mods.recordInfo.recordOrigin = "Zotero for Firefox "+Zotero.Utilities.getVersion(); + + /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/ + + // XML tag recordInfo.recordContentSource; object field source + if(item.source) { + mods.recordInfo.recordContentSource = item.source; + } + // XML tag recordInfo.recordIdentifier; object field accessionNumber + if(item.accessionNumber) { + mods.recordInfo.recordIdentifier = item.accessionNumber; + } + + // XML tag accessCondition; object field rights + if(item.rights) { + mods.accessCondition = item.rights; + } + + /** SUPPLEMENTAL FIELDS **/ + + // Make part its own tag so we can figure out where it goes later + var part = new XML(); + + // XML tag detail; object field volume + if(item.volume) { + if(Zotero.Utilities.isInt(item.volume)) { + part += <detail type="volume"><number>{item.volume}</number></detail>; + } else { + part += <detail type="volume"><text>{item.volume}</text></detail>; + } + } + + // XML tag detail; object field number + if(item.issue) { + if(Zotero.Utilities.isInt(item.issue)) { + part += <detail type="issue"><number>{item.issue}</number></detail>; + } else { + part += <detail type="issue"><text>{item.issue}</text></detail>; + } + } + + // XML tag detail; object field section + if(item.section) { + if(Zotero.Utilities.isInt(item.section)) { + part += <detail type="section"><number>{item.section}</number></detail>; + } else { + part += <detail type="section"><text>{item.section}</text></detail>; + } + } + + // XML tag detail; object field pages + if(item.pages) { + var range = Zotero.Utilities.getPageRange(item.pages); + part += <extent unit="pages"><start>{range[0]}</start><end>{range[1]}</end></extent>; + } + + // Assign part if something was assigned + if(part.length() != 1) { + if(isPartialItem) { + // For a journal article, bookSection, etc., the part is the host + mods.relatedItem.part += <part>{part}</part>; + } else { + mods.part += <part>{part}</part>; + } + } + + // XML tag originInfo; object fields edition, place, publisher, year, date + var originInfo = new XML(); + if(item.edition) { + originInfo += <edition>{item.edition}</edition>; + } + if(item.place) { + originInfo += <place><placeTerm type="text">{item.place}</placeTerm></place>; + } + if(item.publisher) { + originInfo += <publisher>{item.publisher}</publisher>; + } else if(item.distributor) { + originInfo += <publisher>{item.distributor}</publisher>; + } + if(item.date) { + if(Zotero.Utilities.inArray(item.itemType, ["book", "bookSection"])) { + // Assume year is copyright date + var dateType = "copyrightDate"; + } else if(Zotero.Utilities.inArray(item.itemType, ["journalArticle", "magazineArticle", "newspaperArticle"])) { + // Assume date is date issued + var dateType = "dateIssued"; + } else { + // Assume date is date created + var dateType = "dateCreated"; + } + var tag = <{dateType}>{item.date}</{dateType}>; + originInfo += tag; + } + if(item.accessDate) { + originInfo += <dateCaptured>{item.accessDate}</dateCaptured>; + } + if(originInfo.length() != 1) { + if(isPartialItem) { + // For a journal article, bookSection, etc., this goes under the host + mods.relatedItem.originInfo += <originInfo>{originInfo}</originInfo>; + } else { + mods.originInfo += <originInfo>{originInfo}</originInfo>; + } + } + + // XML tag identifier; object fields ISBN, ISSN + if(isPartialItem) { + var identifier = mods.relatedItem; + } else { + var identifier = mods; + } + if(item.ISBN) { + identifier.identifier += <identifier type="isbn">{item.ISBN}</identifier>; + } + if(item.ISSN) { + identifier.identifier += <identifier type="issn">{item.ISSN}</identifier>; + } + if(item.DOI) { + mods.identifier += <identifier type="doi">{item.DOI}</identifier>; + } + + // XML tag relatedItem.titleInfo; object field publication + if(item.publicationTitle) { + mods.relatedItem.titleInfo += <titleInfo><title>{item.publicationTitle}</title></titleInfo>; + } + + // XML tag classification; object field callNumber + if(item.callNumber) { + mods.classification = item.callNumber; + } + + // XML tag location.physicalLocation; object field archiveLocation + if(item.archiveLocation) { + mods.location.physicalLocation = item.archiveLocation; + } + + // XML tag location.url; object field archiveLocation + if(item.url) { + mods.location.url = item.url; + } + + // XML tag title.titleInfo; object field journalAbbreviation + if(item.journalAbbreviation) { + mods.relatedItem.titleInfo += <titleInfo type="abbreviated"><title>{item.journalAbbreviation}</title></titleInfo>; + } + + // XML tag abstract; object field abstractNote + if(item.abstractNote) { + mods.abstract = item.abstractNote; + } + + if(mods.relatedItem.length() == 1 && isPartialItem) { + mods.relatedItem.@type = "host"; + } + + /** NOTES **/ + + if(Zotero.getOption("exportNotes")) { + for(var j in item.notes) { + // Add note tag + var note = <note type="content">{item.notes[j].note}</note>; + mods.note += note; + } + } + + /** TAGS **/ + + for(var j in item.tags) { + mods.subject += <subject><topic>{item.tags[j].tag}</topic></subject>; + } + + + // XML tag relatedItem.titleInfo; object field series + if(item.seriesTitle || item.series || item.seriesNumber || item.seriesText) { + var series = <relatedItem type="series"/>; + + if(item.series) { + series.titleInfo.title = item.series; + } + + if(item.seriesTitle) { + series.titleInfo.partTitle = item.seriesTitle; + } + + if(item.seriesText) { + series.titleInfo.subTitle = item.seriesText; + } + + if(item.seriesNumber) { + series.titleInfo.partNumber = item.seriesNumber; + } + + // TODO: make this work in import + /*if(item.itemType == "bookSection") { + // For a book section, series info must go inside host tag + mods.relatedItem.relatedItem = series; + } else {*/ + mods.relatedItem += series; + //} + } + + modsCollection.mods += mods; + } + + Zotero.write('<?xml version="1.0"?>'+"\n"); + Zotero.write(modsCollection.toXMLString()); +} + +function processIdentifiers(newItem, identifier) { + for each(var myIdentifier in identifier) { + if(myIdentifier.@type == "isbn") { + newItem.ISBN = myIdentifier.text().toString() + } else if(myIdentifier.@type == "issn") { + newItem.ISSN = myIdentifier.text().toString() + } else if(myIdentifier.@type == "doi") { + newItem.DOI = myIdentifier.text().toString() + } + } +} + +function doImport() { + var marcGenres = { + "book":"book", + "periodical":"journalArticle", + "newspaper":"newspaperArticle", + "theses":"thesis", + "letter":"letter", + "motion picture":"film", + "art original":"artwork", + "web site":"webpage" + }; + + + var read; + + // read until we see if the file begins with a parse instruction + read = " "; + while(read == " " || read == "\n" || read == "\r") { + read = Zotero.read(1); + } + + var firstPart = read + Zotero.read(4); + if(firstPart == "<?xml") { + // got a parse instruction, read until it ends + read = true; + while((read !== false) && (read !== ">")) { + read = Zotero.read(1); + firstPart += read; + } + var encodingRe = /encoding=['"]([^'"]+)['"]/; + var m = encodingRe.exec(firstPart); + // set character set + try { + Zotero.setCharacterSet(m[1]); + } catch(e) { + Zotero.setCharacterSet("utf-8"); + } + } else { + Zotero.setCharacterSet("utf-8"); + } + + // read in 16384 byte increments + var text = ""; + while(read = Zotero.read(16384)) { + text += read; + } + text = text.replace(/<\?xml[^>]+\?>/, ""); + + // parse with E4X + var m = new Namespace("http://www.loc.gov/mods/v3"); + // why does this default namespace declaration not work!? + default xml namespace = m; + var xml = new XML(text); + + if(xml.m::mods.length()) { + var modsElements = xml.m::mods; + } else { + var modsElements = [xml]; + } + + for each(var mods in modsElements) { + var newItem = new Zotero.Item(); + + // title + for each(var titleInfo in mods.m::titleInfo) { + if(titleInfo.@type != "abbreviated") { + newItem.title = titleInfo.m::title; + } + } + // try to get genre from local genre + for each(var genre in mods.m::genre) { + if(genre.@authority == "local" && Zotero.Utilities.itemTypeExists(genre)) { + newItem.itemType = genre.text().toString(); + } else if(!newItem.itemType && (genre.@authority == "marcgt" || genre.@authority == "marc")) { + // otherwise, look at the marc genre + newItem.itemType = marcGenres[genre.text().toString()]; + } + } + + if(!newItem.itemType) { + // try to get genre data from host + for each(var relatedItem in mods.m::relatedItem) { + if(relatedItem.@type == "host") { + for each(var genre in relatedItem.m::genre) { + if(genre.@authority == "marcgt" || genre.@authority == "marc") { + newItem.itemType = marcGenres[genre.text().toString()]; + break; + } + } + } + } + + // check if this is an electronic resource + if(!newItem.itemType) { + for each(var form in mods.m::physicalDescription.m::form) { + if(form.@authority == "marcform" || form.@authority == "marc") { + if(form.text().toString() == "electronic") { + newItem.itemType = "webpage"; + break; + } + } + } + + if(!newItem.itemType) newItem.itemType = "book"; + } + } + + var isPartialItem = Zotero.Utilities.inArray(newItem.itemType, partialItemTypes); + + // TODO: thesisType, type + + for each(var name in mods.m::name) { + // TODO: institutional authors + var creator = new Array(); + for each(var namePart in name.m::namePart) { + if(namePart.@type == "given") { + creator.firstName = namePart.text().toString(); + } else if(namePart.@type == "family") { + creator.lastName = namePart.text().toString(); + } else { + var backupName = namePart.text().toString(); + } + } + + if(backupName && !creator.firstName && !creator.lastName) { + creator = Zotero.Utilities.cleanAuthor(backupName, "author", true); + } + + // look for roles + for(var role in name.m::role.m::roleTerm) { + if(role.@type == "code" && role.@authority == "marcrelator") { + if(role == "edt") { + creator.creatorType = "editor"; + } else if(role == "ctb") { + creator.creatorType = "contributor"; + } else if(role == "trl") { + creator.creatorType = "translator"; + } + } + } + if(!creator.creatorType) creator.creatorType = "author"; + + newItem.creators.push(creator); + } + + // source + newItem.source = mods.m::recordInfo.m::recordContentSource.text().toString(); + // accessionNumber + newItem.accessionNumber = mods.m::recordInfo.m::recordIdentifier.text().toString(); + // rights + newItem.rights = mods.m::accessCondition.text().toString(); + + /** SUPPLEMENTAL FIELDS **/ + + var part = false, originInfo = false; + + // series + for each(var relatedItem in mods.m::relatedItem) { + if(relatedItem.@type == "host") { + for each(var titleInfo in relatedItem.m::titleInfo) { + if(titleInfo.@type == "abbreviated") { + newItem.journalAbbreviation = titleInfo.m::title.text().toString(); + if(!newItem.publicationTitle) newItem.publicationTitle = newItem.journalAbbreviation; + } else { + newItem.publicationTitle = titleInfo.m::title.text().toString(); + } + } + part = relatedItem.m::part; + originInfo = relatedItem.m::originInfo; + processIdentifiers(newItem, relatedItem.m::identifier); + } else if(relatedItem.@type == "series") { + newItem.series = relatedItem.m::titleInfo.m::title.text().toString(); + newItem.seriesTitle = relatedItem.m::titleInfo.m::partTitle.text().toString(); + newItem.seriesText = relatedItem.m::titleInfo.m::subTitle.text().toString(); + newItem.seriesNumber = relatedItem.m::titleInfo.m::partNumber.text().toString(); + } + } + + // get part + if(!part) { + part = mods.m::part; + originInfo = mods.m::originInfo; + } + + if(part) { + for each(var detail in part.m::detail) { + // volume + if(detail.@type == "volume") { + newItem.volume = detail.m::number.text().toString(); + if(!newItem.volume) { + newItem.volume = detail.m::text.text().toString(); + } + } + + // number + if(detail.@type == "issue") { + newItem.issue = detail.m::number.text().toString(); + if(!newItem.issue) { + newItem.issue = detail.m::text.text().toString(); + } + } + + // section + if(detail.@type == "section") { + newItem.section = detail.m::number.text().toString(); + if(!newItem.section) { + newItem.section = detail.m::text.text().toString(); + } + } + } + + // pages + for each(var extent in part.m::extent) { + if(extent.@unit == "pages" || extent.@unit == "page") { + var pagesStart = extent.m::start.text().toString(); + var pagesEnd = extent.m::end.text().toString(); + if(pagesStart || pagesEnd) { + if(pagesStart == pagesEnd) { + newItem.pages = pagesStart; + } else if(pagesStart && pagesEnd) { + newItem.pages = pagesStart+"-"+pagesEnd; + } else { + newItem.pages = pagesStart+pagesEnd; + } + } + } + } + } + + // identifier + processIdentifiers(newItem, mods.m::identifier); + // edition + newItem.edition = originInfo.m::edition.text().toString(); + // place + for each(var placeTerm in originInfo.m::place.m::placeTerm) { + if(placeTerm.@type == "text") { + newItem.place = placeTerm.text().toString(); + } + } + // publisher/distributor + if(originInfo.m::publisher.length()) { + if(newItem.itemType == "webpage" || newItem.itemType == "website") { + newItem.publicationTitle = originInfo.m::publisher[0].text().toString(); + } else { + newItem.publisher = originInfo.m::publisher[0].text().toString(); + } + } + // date + if(originInfo.m::copyrightDate.length()) { + newItem.date = originInfo.m::copyrightDate[0].text().toString(); + } else if(originInfo.m::dateIssued.length()) { + newItem.date = originInfo.m::dateIssued[0].text().toString(); + } else if(originInfo.m::dateCreated.length()) { + newItem.date = originInfo.m::dateCreated[0].text().toString(); + } + // lastModified + newItem.lastModified = originInfo.m::dateModified.text().toString(); + // accessDate + newItem.accessDate = originInfo.m::dateCaptured.text().toString(); + + // call number + newItem.callNumber = mods.m::classification.text().toString(); + // archiveLocation + newItem.archiveLocation = mods.m::location.m::physicalLocation.text().toString(); + // url + newItem.url = mods.m::location.m::url.text().toString(); + // abstract + newItem.abstractNote = mods.m::abstract.text().toString(); + + /** NOTES **/ + for each(var note in mods.m::note) { + newItem.notes.push({note:note.text().toString()}); + } + + /** TAGS **/ + for each(var subject in mods.m::subject.m::topic) { + newItem.tags.push(subject.text().toString()); + } + + Zotero.debug(newItem); + + newItem.complete(); + } +} +\ No newline at end of file diff --git a/translators/Max Planck Institute for the History of Science Virtual Laboratory Library.js b/translators/Max Planck Institute for the History of Science Virtual Laboratory Library.js @@ -0,0 +1,75 @@ +{ + "translatorID":"66928fe3-1e93-45a7-8e11-9df6de0a11b3", + "translatorType":4, + "label":"Max Planck Institute for the History of Science: Virtual Laboratory Library", + "creator":"Sean Takats", + "target":"http://vlp.mpiwg-berlin.mpg.de/library/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-22 16:35:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var elmt = doc.evaluate('//base[contains(@href, "/library/data/lit")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (elmt){ + return "book"; + } + elmt = doc.evaluate('//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (elmt){ + return "multiple"; + } +} + +function doWeb(doc, url){ + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var uris = new Array(); + var baseElmt = doc.evaluate('//base[contains(@href, "/library/data/lit")]/@href', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (baseElmt){ + var docID = baseElmt.nodeValue; + var idRe = /lit[0-9]+/; + var m = idRe.exec(docID); + uris.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + m[0]); + } else { + var searchElmts = doc.evaluate('//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var searchElmt; + var links = new Array(); + var availableItems = new Array(); + var i = 0; + while (searchElmt = searchElmts.iterateNext()){ + availableItems[i] = Zotero.Utilities.cleanString(searchElmt.textContent); + var docID = doc.evaluate('./@title', searchElmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + links.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + docID); + i++; + } + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + var uris = new Array(); + for(var i in items) { + uris.push(links[i]); + } + } + Zotero.Utilities.HTTP.doGet(uris, function(text) { + // load Refer translator + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.type = undefined; + item.complete(); + }); + translator.translate(); + }, function() {Zotero.done();}, null); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Melvyl.js b/translators/Melvyl.js @@ -0,0 +1,137 @@ +{ + "translatorID":"5e3e6245-83da-4f55-a39b-b712df54a935", + "translatorType":4, + "label":"Melvyl", + "creator":"Sean Takats and Michael Berkowitz", + "target":"^https?://(?:melvyl.cdlib.org|melvyl-dev.cdlib.org:8162)/F(?:/[A-Z0-9\\-]+(?:\\?.*)?$|\\?func=find|\\?func=scan)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":90, + "inRepository":true, + "lastUpdated":"2008-05-19 17:20:00" +} + +function detectWeb(doc, url) { + var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)"); + + if(singleRe.test(doc.location.href)) { + return "book"; + } else { + var tags = doc.getElementsByTagName("a"); + for(var i=0; i<tags.length; i++) { + if(singleRe.test(tags[i].href)) { + return "multiple"; + } + } + } +} + +function doWeb(doc, url) { + var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)"); + var uri = doc.location.href; + var newUris = new Array(); + + if(detailRe.test(uri)) { + newUris.push(uri.replace(/\&format=[0-9]{3}/, "&format=001")) + } else { + var itemRegexp = '^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)'; + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var reviewXpath = '//table/tbody/tr[td[@class="resultsDisplayWhite"]]' + + var reviewRows = doc.evaluate(reviewXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var reviewRow; + + var items = new Array(); + + if (reviewRow = reviewRows.iterateNext()){ + var xpath = './td[@class="resultsDisplayWhite"][2]/a[1]'; + var titleXpath = './td[@class="resultsDisplayWhite"][5]'; + var elmt; + var titleElmt; + do { + elmt = doc.evaluate(xpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + titleElmt = doc.evaluate(titleXpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent); + } while (reviewRow = reviewRows.iterateNext()); + + } else { + var xpath = '//td[2][@class="resultsBrief"]/a[1]'; // gets MELVYL links + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + var titleXpath = '//tr[td[@class="resultsBrief"][@id="bold"]/b[text()="Title"]]/td[4]'; // gets MELVYL results titles + var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmt; + while ((elmt = elmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())){ + items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent); + } + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + var newUri = i.replace(/\&format=[0-9]{3}/, "&format=001") + if(newUri == i) { + newUri += "&format=001"; + } + newUris.push(newUri); + } + } + + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + var marc = translator.getTranslatorObject(); + Zotero.Utilities.processDocuments(newUris, function(newDoc) { + var uri = newDoc.location.href; + + var namespace = newDoc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//tr[td[1][@class="contentSmall"][@id="bold"]/strong]'; + var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + + var record = new marc.record(); + while(elmt = elmts.iterateNext()) { + var field = Zotero.Utilities.trimInternal(newDoc.evaluate('./TD[1]/strong/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue); + var value = newDoc.evaluate('./TD[2]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if(field == "LDR") { + record.leader = value; + } else if(field != "FMT") { + + value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1"); + + var code = field.substring(0, 3); + var ind = ""; + if(field.length > 3) { + ind = field[3]; + if(field.length > 4) { + ind += field[4]; + } + } + record.addField(code, ind, value); + } + } + + var newItem = new Zotero.Item(); + record.translate(newItem); + + var domain = url.match(/https?:\/\/([^/]+)/); + newItem.repository = domain[1]+" Library Catalog"; + + newItem.complete(); + }, function() { Zotero.done(); }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/MetaPress.js b/translators/MetaPress.js @@ -0,0 +1,57 @@ +{ + "translatorID":"62c0e36a-ee2f-4aa0-b111-5e2cbd7bb5ba", + "translatorType":4, + "label":"MetaPress", + "creator":"Michael Berkowitz", + "target":"https?://(.*).metapress.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-13 22:30:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Search Results") != -1) { + return "multiple"; + } else if (url.match(/content\/[^?/]/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var host = doc.location.host; + var artids = new Array(); + if (detectWeb(doc, url) == "multiple") { + + } else { + artids.push(url.match(/content\/([^/]+)/)[1]); + } + for (var i in artids) { + var newurl = 'http://' + host + '/content/' + artids[i]; + Zotero.Utilities.processDocuments([newurl], function(newDoc) { + var tagsx = '//td[@class="mainPageContent"]/div[3]'; + if (doc.evaluate(tagsx, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var tags = Zotero.Utilities.trimInternal(doc.evaluate(tagsx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(","); + } + Zotero.Utilities.HTTP.doPost('http://' + host + '/export.mpx', 'code=' + artids[i] + '&mode=ris', function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pdfurl = 'http://' + host + '/content/' + artids[i] + '/fulltext.pdf'; + item.attachments = [ + {url:item.url, title:"MetaPress Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"MetaPress Full Text PDF", mimeType:"application/pdf"} + ]; + if (tags) item.tags = tags; + if (item.abstractNote.substr(0, 8) == "Abstract") item.abstractNote = Zotero.Utilities.trimInternal(item.abstractNote.substr(8)); + item.complete(); + }); + translator.translate(); + Zotero.done(); + }); + }, function() {}); + } +} +\ No newline at end of file diff --git a/translators/Musee du Louvre.js b/translators/Musee du Louvre.js @@ -0,0 +1,162 @@ +{ + "translatorID":"22d17fb9-ae32-412e-bcc4-7650ed3359bc", + "translatorType":4, + "label":"Musee du Louvre", + "creator":"Adam Crymble", + "target":"http://www.louvre.fr", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("recherche")) { + return "multiple"; + } else if (doc.evaluate('//div[@class="alignRight"]/a/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "artwork"; + } + +} + +//Translator Musee du Louvre. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + + var newItem = new Zotero.Item("artwork"); + + //tags + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + dataTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + } + + newItem.abstractNote = dataTags["description"]; + + if (dataTags["keywords"]) { + if (dataTags["keywords"].match(", ")) { + tagsContent = tagsContent = dataTags["keywords"].split(", "); + } else if (dataTags["keywords"].split("、")) { + tagsContent = dataTags["keywords"].split("、"); + } + } + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + + //date + var xPathDate = '//td[@class="txtContent"]/span[@class="txtContentSmall"]'; + + if (doc.evaluate(xPathDate, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + newItem.date = doc.evaluate(xPathDate, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + //creator + var xPathCreator = '//td[@class="txtContent"]/strong'; + if (doc.evaluate(xPathCreator, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var creator = doc.evaluate(xPathCreator, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase(); + + var comma = 0; + var parenthesis = 0; + var commaSpot; + var parenthesisSpot; + + if (creator.match(", ")) { + comma = 1; + commaSpot = creator.indexOf(","); + } + + if (creator.match(/\(/)) { + parenthesis = 1; + parenthesisSpot = creator.indexOf(" ("); + } + + if (comma == 1 && parenthesis == 1) { + if (commaSpot < parenthesisSpot) { + creator = creator.substr(0, commaSpot); + } else { + creator = creator.substr(0, parenthesisSpot); + } + } else if (comma == 1 && parenthesis == 0) { + creator = creator.substr(0, commaSpot); + } else if (comma == 0 && parenthesis == 1) { + creator = creator.substr(0, parenthesisSpot); + } + + var words = creator.split(" "); + + for (var j in words) { + if (words[j] != "" && words[j] != ' ') { + if (words[j].match("-")) { + Zotero.debug(words[j]); + var hyphen = words[j].split("-"); + hyphen[0] = hyphen[0][0].toUpperCase() + hyphen[0].substr(1).toLowerCase() + "-"; + hyphen[1] = hyphen[1][0].toUpperCase() + hyphen[1].substr(1).toLowerCase(); + words[j] = hyphen[0] + hyphen[1]; + } else { + words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase(); + } + } + } + creator = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(creator, "artist")); + } + + + //title + var title1 = doc.title.split(" |"); + Zotero.debug(title1[0]); + newItem.title = title1[0]; + + //extra + if (doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var collection1 = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.extra = collection1.replace(/^\s*|\s*$/g, ''); + } + + newItem.repository = "Musée du Louvre"; + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var links = doc.evaluate('//td[4][@class="alignTop"]/a[@class="lkContent"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//h4', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[links.iterateNext().href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/NAA RecordSearch.js b/translators/NAA RecordSearch.js @@ -0,0 +1,72 @@ +{ + "translatorID":"83538f48-906f-40ef-bdb3-e94f63676307", + "translatorType":4, + "label":"NAA RecordSearch", + "creator":"Tim Sherratt", + "target":"http://naa12.naa.gov.au/scripts/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-30 08:00:00" +} + +function detectWeb(doc, url) { + if (url.match(/Items_listing.asp/i)) { + return "multiple"; + } else if (url.match(/ItemDetail.asp/i)) { + return "manuscript"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + if (detectWeb(doc, url) == "multiple") { + var records = new Array(); + var items = new Object(); + var titles = doc.evaluate('//form[2]/table/tbody/tr/td[b="Title"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('//form[2]/table/tbody/tr/td[b="Control symbol"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.lastChild.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + records.push(i); + } + } else { + records = [url]; + } + Zotero.Utilities.processDocuments(records, function(doc) { + var title = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Title"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var series = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Series number"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var control = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Control symbol"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var date = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Contents date range"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var access = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Access status"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var location = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Location"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + var barcode = Zotero.Utilities.cleanString(doc.evaluate('//table/tbody/tr/td[b="Barcode"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().lastChild.textContent); + if (doc.body.innerHTML.match("View digital copy")) { + var digitised = "yes"; + } else { + var digitised = "no"; + } + var repository ="National Archives of Australia, " + location; + var url = "http://www.aa.gov.au/cgi-bin/Search?O=I&Number=" + barcode; + var ref_number = series + ", " + control; + var type = "file"; + var item = new Zotero.Item("manuscript"); + item.title = title; + item.archiveLocation = ref_number; + item.url = url; + item.date = date; + item.manuscriptType = type; + item.extra = "Access: " + access + "\nDigitised: " + digitised; + item.repository = repository; + item.complete(); + + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/NASA ADS.js b/translators/NASA ADS.js @@ -0,0 +1,81 @@ +{ + "translatorID":"7987b420-e8cb-4bea-8ef7-61c2377cd686", + "translatorType":4, + "label":"NASA ADS", + "creator":"Asa Kusuma and Ramesh Srigiriraju", + "target":"http://(ukads|cdsads|ads|adsabs|esoads|adswww|www.ads)\\.(inasan|iucaa.ernet|nottingham.ac|harvard|eso|u-strasbg|nao.ac|astro.puc|bao.ac|on|kasi.re|grangenet|lipi.go|mao.kiev)\\.(edu|org|net|fr|jp|cl|id|uk|cn|ua|in|ru|br|kr)/(?:cgi-bin|abs)/", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-06 20:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var singXpath = '//input[@name="bibcode"][@type="hidden"]'; + var multXpath = '//input[@name="bibcode"][@type="checkbox"]'; + + if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "journalArticle"; + } +} + +function parseRIS(bibcodes, hostname){ + var getURL = "http://" + hostname + "/cgi-bin/nph-bib_query?" + + bibcodes + "data_type=REFMAN&nocookieset=1"; + Zotero.Utilities.HTTP.doGet(getURL, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var singXpath = '//input[@name="bibcode"][@type="hidden"]'; + var multXpath = '//input[@name="bibcode"][@type="checkbox"]'; + var titleXpath = '//table/tbody/tr/td[4]'; //will find scores and titles + var hostname = doc.location.host + var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmt; + var bibElmt; + + if ((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())) { + + var items = new Array(); + + do { + titleElmt = titleElmts.iterateNext(); //iterate a second time to avoid score + items[bibElmt.value] = Zotero.Utilities.cleanString(titleElmt.textContent); + } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())); + items = Zotero.selectItems(items); + if(!items) return true; + + var bibcodes=""; + for(var bibcode in items) { + bibcodes = bibcodes + "bibcode="+encodeURIComponent(bibcode) + "&"; + } + parseRIS(bibcodes, hostname); + + } else if (bibElmt = doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + var bibcode = bibElmt.value; + var bibcodes = "bibcode="+encodeURIComponent(bibcode) + "&"; + parseRIS(bibcodes, hostname); + } +} +\ No newline at end of file diff --git a/translators/NCBI PubMed.js b/translators/NCBI PubMed.js @@ -0,0 +1,204 @@ +{ + "translatorID":"fcf41bed-0cbc-3704-85c7-8062a0068a7a", + "translatorType":4, + "label":"NCBI PubMed", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"http://[^/]*www\\.ncbi\\.nlm\\.nih\\.gov[^/]*/(pubmed|sites/entrez|entrez/query\\.fcgi\\?.*db=PubMed)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-29 04:10:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var uids = doc.evaluate('//input[@id="UidCheckBox" or @name="uid"]', doc, + nsResolver, XPathResult.ANY_TYPE, null); + if(uids.iterateNext() && doc.title.indexOf("PMC Results") == -1) { + if (uids.iterateNext() && doc.title.indexOf("PMC Results") == -1){ + return "multiple"; + } + return "journalArticle"; + } +} +function getPMID(co) { + var coParts = co.split("&"); + for each(part in coParts) { + if(part.substr(0, 7) == "rft_id=") { + var value = unescape(part.substr(7)); + if(value.substr(0, 10) == "info:pmid/") { + return value.substr(10); + } + } + } +} + +function detectSearch(item) { + if(item.contextObject) { + if(getPMID(item.contextObject)) { + return "journalArticle"; + } + } + return false; +} + + +function lookupPMIDs(ids, doc) { + Zotero.wait(); + var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+ids.join(","); + Zotero.Utilities.HTTP.doGet(newUri, function(text) { + // Remove xml parse instruction and doctype + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + + var xml = new XML(text); + + for(var i=0; i<xml.PubmedArticle.length(); i++) { + var newItem = new Zotero.Item("journalArticle"); + + var citation = xml.PubmedArticle[i].MedlineCitation; + + var PMID = citation.PMID.text().toString(); + newItem.url = "http://www.ncbi.nlm.nih.gov/pubmed/" + PMID; + newItem.extra = "PMID: "+PMID; + // add attachments + if(doc) { + newItem.attachments.push({document:doc, title:"PubMed Snapshot"}); + } else { + var url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids="+PMID; + newItem.attachments.push({url:url, title:"PubMed Snapshot", + mimeType:"text/html"}); + } + + var article = citation.Article; + if(article.ArticleTitle.length()) { + var title = article.ArticleTitle.text().toString(); + if(title.substr(-1) == ".") { + title = title.substring(0, title.length-1); + } + newItem.title = title; + } + + if (article.Pagination.MedlinePgn.length()){ + newItem.pages = article.Pagination.MedlinePgn.text().toString(); + } + + if(article.Journal.length()) { + var issn = article.Journal.ISSN.text().toString(); + if(issn) { + newItem.ISSN = issn; + } + + if(citation.MedlineJournalInfo.MedlineTA.length()) { + newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString()); + } +// newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.Article.Journal.ISOAbbreviation.text().toString()); + if(article.Journal.Title.length()) { + newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString()); + } else if(citation.MedlineJournalInfo.MedlineTA.length()) { + newItem.publicationTitle = newItem.journalAbbreviation; + } + + if(article.Journal.JournalIssue.length()) { + newItem.volume = article.Journal.JournalIssue.Volume.text().toString(); + newItem.issue = article.Journal.JournalIssue.Issue.text().toString(); + if(article.Journal.JournalIssue.PubDate.length()) { // try to get the date + if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString(); + } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString(); + } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") { + newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString(); + } + } + } + } + + if(article.AuthorList.length() && article.AuthorList.Author.length()) { + var authors = article.AuthorList.Author; + for(var j=0; j<authors.length(); j++) { + var lastName = authors[j].LastName.text().toString(); + var firstName = authors[j].FirstName.text().toString(); + if(firstName == "") { + var firstName = authors[j].ForeName.text().toString(); + } + if(firstName || lastName) { + newItem.creators.push({lastName:lastName, firstName:firstName}); + } + } + } + + + if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) { + var keywords = citation.MeshHeadingList.MeshHeading; + for (var k = 0 ; k < keywords.length() ; k++) { + newItem.tags.push(keywords[k].DescriptorName.text().toString()); + } + } + newItem.abstractNote = article.Abstract.AbstractText.toString() + + newItem.DOI = xml.PubmedArticle[i].PubmedData.ArticleIdList.ArticleId[0].text().toString(); + newItem.publicationTitle = Zotero.Utilities.capitalizeTitle(newItem.publicationTitle); + newItem.complete(); + } + + Zotero.done(); + }); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var ids = new Array(); + var uids = doc.evaluate('//input[@id="UidCheckBox" or @name="uid"]', doc, //edited for new PubMed + nsResolver, XPathResult.ANY_TYPE, null); + var uid = uids.iterateNext(); + if(uid) { + if (uids.iterateNext()){ + var items = new Array(); + var tablex = '//div[@class="rprt"]'; + if (!doc.evaluate(tablex, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var tablex = '//div[@class="ResultSet"]/dl'; + var other = true; + } + var tableRows = doc.evaluate(tablex, doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + uid = doc.evaluate('.//input[@id="UidCheckBox"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (other) { + var article = doc.evaluate('.//h2', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } else { + var article = doc.evaluate('.//div[@class="title"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + } + items[uid.value] = article.textContent; + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + ids.push(i); + } + + lookupPMIDs(ids); + } else { + ids.push(uid.value); + lookupPMIDs(ids, doc); + } + } +} + +function doSearch(item) { + // pmid was defined earlier in detectSearch + lookupPMIDs([getPMID(item.contextObject)]); +} +\ No newline at end of file diff --git a/translators/NCSU Library (Endeca 2).js b/translators/NCSU Library (Endeca 2).js @@ -0,0 +1,76 @@ +{ + "translatorID":"da440efe-646c-4a18-9958-abe1f7d55cde", + "translatorType":4, + "label":"NCSU Library (Endeca 2)", + "creator":"Sean Takats", + "target":"^https?://[^\\.]+.lib.ncsu.edu/(?:web2/tramp2\\.exe|catalog/\\?)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-26 03:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var xpath = '//a[contains(text(), "MARC record")]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } + xpath = '//span[@class="resultTitle"]/a'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function scrape(text){ + var tempidRe = new RegExp("/web2/tramp2\.exe/goto/([^?]+)\?"); + var tempidMatch = tempidRe.exec(text); + var tempid = tempidMatch[1]; + + marcUri = "http://catalog.lib.ncsu.edu/web2/tramp2.exe/download_hitlist/" + tempid; + marcUri = marcUri + "/NCSUCatResults.mrc?server=1home&format=MARC&server=1home&item=1&item_source=1home"; + Zotero.Utilities.HTTP.doGet(marcUri, function(text) { + // load translator for MARC + var marc = Zotero.loadTranslator("import"); + marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); + marc.setString(text); + marc.translate(); + }, function() {Zotero.done()}, null); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//span[@class="resultTitle"]/a'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt; + if(elmt = elmts.iterateNext()) { + // search results page + var newUris = new Array(); + var items = new Array(); + do { + items[elmt.href] = Zotero.Utilities.cleanString(elmt.textContent); + } while (elmt = elmts.iterateNext()); + items = Zotero.selectItems(items); + if(!items) { + return true; + } + for(var i in items) { + newUris.push(i); + } + Zotero.Utilities.HTTP.doGet(newUris, function(text) { scrape(text) }, + function() {}, null); + Zotero.wait(); + } else if (elmt = doc.evaluate('//a[contains(text(), "MARC record")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + // single book + scrape(elmt.href); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/NYTimes.com.js b/translators/NYTimes.com.js @@ -0,0 +1,151 @@ +{ + "translatorID":"ce7a3727-d184-407f-ac12-52837f3361ff", + "translatorType":4, + "label":"NYTimes.com", + "creator":"Simon Kornblith", + "target":"^http://(?:query\\.nytimes\\.com/search/query|(?:select\\.|www\\.)?nytimes\\.com/.)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-18 08:55:00" +} + +function detectWeb(doc, url) { + if(doc.title.substr(0, 30) == "The New York Times: Search for") { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var result = doc.evaluate('//div[@id="srchContent"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + if(result) { + return "multiple"; + } + } else { + var metaTags = doc.getElementsByTagName("meta"); + if(metaTags.namedItem("hdl") && metaTags.namedItem("byl")) { + return "newspaperArticle"; + } + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags[field]) { + newItem[zoteroField] = metaTags[field]; + } +} + +function scrape(doc, url) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The New York Times"; + newItem.ISSN = "0362-4331"; + + var metaTags = new Object(); + if(url != undefined) { + newItem.url = url; + var metaTagRe = /<meta[^>]*>/gi; + var nameRe = /name="([^"]+)"/i; + var contentRe = /content="([^"]+)"/i; + var m = doc.match(metaTagRe); + + if(!m) { + return; + } + + for(var i=0; i<m.length; i++) { + var name = nameRe.exec(m[i]); + var content = contentRe.exec(m[i]); + if(name && content) { + metaTags[name[1]] = content[1]; + } + } + + if(!metaTags["hdl"]) { + return; + } + + newItem.attachments.push({url:url, title:"New York Times Snapshot", + mimeType:"text/html"}); + } else { + newItem.url = doc.location.href; + var metaTagHTML = doc.getElementsByTagName("meta"); + for(var i=0; i<metaTagHTML.length; i++) { + var key = metaTagHTML[i].getAttribute("name"); + var value = metaTagHTML[i].getAttribute("content"); + if(key && value) { + metaTags[key] = value; + } + } + + newItem.attachments.push({document:doc, title:"New York Times Snapshot"}); + } + + associateMeta(newItem, metaTags, "dat", "date"); + associateMeta(newItem, metaTags, "hdl", "title"); + associateMeta(newItem, metaTags, "dsk", "section"); + associateMeta(newItem, metaTags, "articleid", "accessionNumber"); + + if(metaTags["byl"]) { + var author = Zotero.Utilities.cleanString(metaTags["byl"]); + if(author.substr(0, 3).toLowerCase() == "by ") { + author = author.substr(3); + } + + var authors = author.split(" and "); + for each(var author in authors) { + // fix capitalization + var words = author.split(" "); + for(var i in words) { + words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + + if(words[0] == "The") { + newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true}); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + } + + if(metaTags["keywords"]) { + var keywords = metaTags["keywords"]; + newItem.tags = keywords.split(","); + for(var i in newItem.tags) { + newItem.tags[i] = newItem.tags[i].replace(" ", ", "); + } + } + + newItem.complete(); +} + +function doWeb(doc, url) { + if(doc.title.substr(0, 30) == "The New York Times: Search for") { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var result = doc.evaluate('//div[@id="srchContent"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + var items = Zotero.Utilities.getItemArray(doc, result, '^http://(?:select\.|www\.)nytimes.com/.*\.html(\\?|$)'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.HTTP.doGet(urls, function(text, response, url) { scrape(text, url) }, function() { Zotero.done(); }, null); + + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/National Archives of South Africa.js b/translators/National Archives of South Africa.js @@ -0,0 +1,130 @@ +{ + "translatorID":"5b02e8d4-d8fb-4143-af3d-3576d4c1b49c", + "translatorType":4, + "label":"National Archives of South Africa", + "creator":"Adam Crymble", + "target":"http://www.national.archsrch.gov.za", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("Results Summary")) { + return "multiple"; + } else if (doc.title.match("Results Detail")) { + return "book"; + } +} + +//National Archives of South Africa Translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + + var headers = doc.evaluate('//td[2]/pre/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//td[2]/pre/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td[2]/pre', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var headersArray = new Array(); + var oneHeader = ''; + + if (xPathCount.numberValue > 1) { + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + headersArray.push(fieldTitle); + } + } else { + oneHeader = (headers.iterateNext().textContent); + } + + var contentsArray = new Array(); + var j = 0; + + if (oneHeader.length<1) { + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.indexOf(headersArray[i]); + var shorten = headersArray[i].length; + + contentsArray.push(contents.substr(fieldIndex)); + contents = contents.substr(0, fieldIndex); + fieldTitle = headersArray[i].replace(/\s+/g, ''); + + dataTags[fieldTitle] = contentsArray[j].substr(shorten).replace(/^\s*|\s+$/g, ''); + j++; + } + } + + associateData (newItem, dataTags, "DEPOT", "repository"); + associateData (newItem, dataTags, "REFERENCE", "callNumber"); + associateData (newItem, dataTags, "STARTING", "date"); + associateData (newItem, dataTags, "ENDING", "date"); + associateData (newItem, dataTags, "VOLUME_NO", "volume"); + associateData (newItem, dataTags, "REMARKS", "extra"); + associateData (newItem, dataTags, "SUMMARY", "abstractNote"); + + if (dataTags["DESCRIPTION"]) { + associateData (newItem, dataTags, "DESCRIPTION", "title"); + } else { + newItem.title = "No Title Found"; + } + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var lastLink; + var next_title; + while (next_title = titles.iterateNext()) { + + if (!next_title.textContent.match(/^\d\d\d\d/) && !next_title.textContent.match(/\\/) && next_title.textContent.length>3 && next_title.textContent.match(/\w/)) { + Zotero.debug(next_title.textContent); + items[next_title.href] = next_title.textContent; + } + + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/National Bureau of Economic Research.js b/translators/National Bureau of Economic Research.js @@ -0,0 +1,73 @@ +{ + "translatorID":"99f958ab-0732-483d-833f-6bd8e42f6277", + "translatorType":4, + "label":"National Bureau of Economic Research", + "creator":"Michael Berkowitz", + "target":"^https?://(?:papers\\.|www\\.)?nber\\.org/(papers|s|new)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-05 07:45:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (doc.evaluate('//a[contains(text(), "RIS")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } else if (doc.evaluate('//div[@class="maintd"][@id="maine"]/table/tbody/tr/td[1]//a[contains(@href, "papers/w")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } +} + +function parseRIS(uris){ + + Zotero.Utilities.HTTP.doGet(uris, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//div[@class="maintd"][@id="maine"]/table/tbody/tr/td[1]//a[contains(@href, "papers/w")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + if (!link.href.match(/\.pdf$/)) items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i + '.ris'); + } + } else { + arts = [url + '.ris']; + } + Zotero.Utilities.HTTP.doGet(arts, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (text.match(/AB\s+\-\s+/)) item.abstractNote = text.match(/AB\s+\-\s+((.|\s)+)\n([A-Z]{2})/)[1]; + item.notes = new Array(); + item.complete(); + }); + translator.translate(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/National Gallery of Art - U.S.A..js b/translators/National Gallery of Art - U.S.A..js @@ -0,0 +1,169 @@ +{ + "translatorID":"ed28758b-9c39-4e1c-af89-ce1c9202b70f", + "translatorType":4, + "label":"National Gallery of Art - U.S.A.", + "creator":"Adam Crymble", + "target":"http://www.nga.gov/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + var single = 0; + + if (doc.evaluate('//div[@class="content"]/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext()){ + var pageType = doc.evaluate('//div[@class="content"]/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext().src; + } + + if (doc.location.href.match("tinfo") || doc.title.match("timage")) { + single = "1"; + } + + + + if (doc.title.match("Image") && doc.location.href.match("fcgi")) { + return "artwork"; + } + + if (pageType.match("search_test")) { + return "multiple"; + } else if (doc.location.href.match("artistid")) { + return "multiple"; + } else if (single == "1" && pageType.match("collections_test")) { + return "artwork"; + } +} + +//National Gallery USA translator. Code by Adam Crymble + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var style = 0; + var title1; + var newItem = new Zotero.Item("artwork"); + + //determines page layout type + + //single entry with thumbnail + if (doc.evaluate('//div[@class="BodyText"]/table/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var content = doc.evaluate('//div[@class="BodyText"]/table/tbody/tr/td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/); + style = 1; + + //single entry without thumbnail (2 variations) + } else if (doc.evaluate('//div[@class="BodyText"]/table/tbody/tr/td', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var content = doc.evaluate('//div[@class="BodyText"]/table/tbody/tr/td', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/); + + if (content[1].match("Rendered")) { + style = 3; + } else { + style = 1; + } + + //single entry with large image. + } else if (doc.evaluate('//tr[2]/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var content = doc.evaluate('//tr[2]/td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n/); + style = 2; + } + + if (style == 1) { + + newItem.creators.push(Zotero.Utilities.cleanAuthor(content[1], "artist")); + + + var titleDate = content[3].split(", "); + title1 = titleDate[0]; + + if (titleDate.length>2) { + for (var j = 1; j < titleDate.length-1; j++) { + title1 = (title1 + ", " + titleDate[j]); + } + } + newItem.title = title1; + + if (titleDate.length > 1) { + newItem.date = titleDate[titleDate.length-1]; + } + + newItem.extra = ("Aquisition: " + content[content.length-3]); + newItem.callNumber = content[content.length-2]; + + } else if (style == 2) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(content[0], "artist")); + + var date = content[1].split(", "); + + title1 = date[0]; + + if (date.length>2) { + for (var j = 1; j < date.length-1; j++) { + title1 = (title1 + ", " + date[j]); + } + } + + newItem.title = title1; + + newItem.date = date[date.length-1]; + + var acquisition = content[2].split(/\d/); + newItem.extra = ("Aquisition: " + acquisition[0]); + + } else if (style == 3) { + + var titleAuthor = content[1].split("Rendered by "); + + newItem.title = titleAuthor[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(titleAuthor[1], "artist")); + + newItem.callNumber = content[content.length-2]; + + } + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + if (doc.location.href.match("artistid")) { + var titles = doc.evaluate('//ul/li/b/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + } else { + var titles = doc.evaluate('//ul/li/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.textContent.match("image available")) { + next_title = titles.iterateNext(); + } + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/National Library of Australia (new catalog).js b/translators/National Library of Australia (new catalog).js @@ -0,0 +1,130 @@ +{ + "translatorID":"54ac4ec1-9d07-45d3-9d96-48bed3411fb6", + "translatorType":4, + "label":"National Library of Australia (new catalog)", + "creator":"Mark Triggs and Steve McPhillips", + "target":"catalogue.nla.gov.au", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + if (url.match("/Record/[0-9]+")) { + var format = Zotero.Utilities.cleanString(doc.getElementById("myformat").textContent); + + if (format == "Audio") { + return "audioRecording"; + } + else if (format == "Book") { + return "book"; + } + else if (format == "Journal/Newspaper") { + return "journalArticle"; + } + else if (format == "Manuscript") { + return "manuscript"; + } + else if (format == "Map") { + return "map"; + } + else if (format == "Music") { + return "audioRecording"; + } + else if (format == "Online") { + return "webpage"; + } + else if (format == "Picture") { + return "artwork"; + } + else if (format == "Video") { + return "videoRecording"; + } + else { + return "book"; + } + } else if (url.match ("/Search/Home") && + doc.getElementById ("resultItemLine1")) { + return "multiple"; + } +} + +function as_array(obj) { + if (obj instanceof Array) { + return obj; + } else { + return [obj]; + } +} + + +function load_item(responseText, requestObject, format) { + metadata = eval("(" + Zotero.Utilities.cleanString(responseText) + ")"); + + var newItem = new Zotero.Item(format); + + /* load in our authors */ + if (metadata.authors) { + for (var i=0; i< metadata.authors.length ; i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor + (metadata.authors[i], "author", true)); + } + } + + /* and our tags */ + if (metadata.tags) { + for (var i=0; i< metadata.tags.length ; i++) { + newItem.tags.push(metadata.tags[i]); + } + } + + /* and our summary */ + if (metadata.notes) { + newItem.notes.push ({"note": metadata.notes}); + } + + /* and everything else */ + for (var attr in metadata) { + if (!newItem[attr]) { + newItem[attr] = metadata[attr]; + } + } + newItem.repository = "National Library of Australia"; + newItem.complete(); +} + +function doWeb(doc, url) { + format = detectWeb(doc, url); + + items = []; + if (format == "multiple") { + for (var url in Zotero.selectItems((Zotero.Utilities.getItemArray + (doc, doc, "/Record/[0-9]+")))) { + items.push(url); + } + } else { + items.push(url); + } + + if (items.length > 0) { + Zotero.Utilities.processDocuments(items, function(onedoc) { + handleDocument(onedoc); + }, function() { Zotero.done; }); + + Zotero.wait(); + } +} + + +function handleDocument(doc) { + bibid = doc.location.href.match("^.*\/Record/([0-9]+)")[1]; + format = detectWeb(doc, doc.location.href); + Zotero.Utilities.HTTP.doGet("http://catalogue.nla.gov.au/Record/" + + bibid + + "/Export?style=zotero", + function(text, obj) { + load_item(text, obj, format); + }); +} +\ No newline at end of file diff --git a/translators/National Library of Australia.js b/translators/National Library of Australia.js @@ -0,0 +1,65 @@ +{ + "translatorID":"fc410e64-0252-4cd3-acb1-25e584775fa2", + "translatorType":4, + "label":"National Library of Australia", + "creator":"Michael Berkowitz", + "target":"http://librariesaustralia.nla.gov.au/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + if (url.match("action=Search")) { + return "multiple"; + } else if (url.match("action=Display")) { + return "book"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, 'action=Display&'); + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i); + } + } else { + books = [url]; + } + Zotero.Utilities.processDocuments(books, function(doc) { + var table = doc.evaluate('//tbody/tr[td[1][@class="CellAlignRight"]/strong]', doc, ns, XPathResult.ANY_TYPE, null); + var row; + var data = new Object(); + while (row = table.iterateNext()) { + var heading = doc.evaluate('./td[1]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var value = doc.evaluate('./td[2]', row, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + data[Zotero.Utilities.trimInternal(heading)] = value; + } + item = new Zotero.Item("book"); + item.title = Zotero.Utilities.trimInternal(data['Title:'].match(/^[^/]+/)[0]); + if (data['Author:']) item.creators.push(Zotero.Utilities.cleanAuthor(data['Author:'], "author", true)); + if (data['Published:'].match(/\w+/)) { + var pub = data['Published:'].match(/^([^:]+):(.*)\s+([^\s]+)$/); + item.location = Zotero.Utilities.trimInternal(pub[1]); + item.publisher = Zotero.Utilities.trimInternal(pub[2]); + item.date = Zotero.Utilities.trimInternal(pub[3].replace(/\D/g, "")); + } + if (data['Subjects:']) { + var kws = data['Subjects:'].split("."); + for each (var key in kws) { + if (key.match(/\w+/)) item.tags.push(key); + } + } + if (data['ISBN:']) item.ISBN = Zotero.Utilities.trimInternal(data['ISBN:'].match(/^[^(]+/)[0]); + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/National Library of New Zealand.js b/translators/National Library of New Zealand.js @@ -0,0 +1,166 @@ +{ + "translatorID":"45763818-8530-49c6-a069-34acdee1a096", + "translatorType":4, + "label":"National Library of New Zealand", + "creator":"Adam Crymble", + "target":"http://nlnzcat.natlib", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + + if (doc.title.match("Quick Record View")) { + return "book"; + } else if (doc.title.match("Details Record View")) { + return "book"; + } else if (doc.title.match("Catalogue Titles")) { + return "multiple"; + } +} + +//National Library of New Zealand translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var headersArray = new Array(); + var contentsArray = new Array(); + var fieldTitle; + var j = 0; + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//form/table/tbody/tr/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//form/table/tbody/tr/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//table[2]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + if (fieldTitle.match(/\w/)) { + headersArray.push(fieldTitle); + } + } + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.lastIndexOf(headersArray[i]); + contentsArray.push(contents.substr(fieldIndex)); + contents = contents.substr(0, fieldIndex); + + fieldTitle = headersArray[i].replace(/\s+/g, ''); + + dataTags[fieldTitle] = contentsArray[j].substr(headersArray[i].length).replace(/^\s*|\s+$/g, ''); + j++; + } + + if (dataTags["Author:"]) { + var author = dataTags["Author:"]; + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["Publisher:"]) { + if (dataTags["Publisher:"].match(": ")) { + var place1 = dataTags["Publisher:"].indexOf(": "); + newItem.place = dataTags["Publisher:"].substr(0, place1); + var publisher1 = dataTags["Publisher:"].substr(place1 + 2); + + if (publisher1.match(", ")) { + var date1 = publisher1.lastIndexOf(", "); + newItem.date = publisher1.substr(date1 +2); + newItem.publisher = publisher1.substr(0, date1); + } else { + newItem.publisher = publisher1; + } + } else { + newItem.publisher = publisher1; + } + } + + if (dataTags["Subject:"]) { + if (dataTags["Subject:"].match(/\n/)) { + tagsContent = dataTags["Subject:"].split(/\n/) + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[i] = tagsContent[i]; + } + } + } else { + newItem.tags = dataTags["Subject:"] + } + } + + if (dataTags["LCSubject:"]) { + if (dataTags["LCSubject:"].match(/\n/)) { + tagsContent = dataTags["LCSubject:"].split(/\n/) + var k = 0; + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[k] = tagsContent[i]; + k++; + } + } + } else { + newItem.tags = dataTags["LCSubject:"] + } + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "Description:", "pages"); + associateData (newItem, dataTags, "CallNumber:", "callNumber"); + associateData (newItem, dataTags, "Location:", "repository"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//form/table/tbody/tr/td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.textContent.match(/\w/)) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/National Post.js b/translators/National Post.js @@ -0,0 +1,123 @@ +{ + "translatorID":"1c5b122c-7e58-4cd5-932b-93f5ca0b7e1a", + "translatorType":4, + "label":"National Post", + "creator":"Adam Crymble", + "target":"http://www.(national|financial)post.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + + if (doc.title.match("Search Results")) { + return "multiple"; + } else if (doc.location.href.match("story")) { + return "newspaperArticle"; + } else if (doc.location.href.match("blog")) { + return "blogPost"; + } + +} + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var dataTags = new Object(); + var author = new Array(); + + var mediaType = detectWeb(doc,doc.location.href); + if (mediaType == "newspaperArticle") { + var newItem = new Zotero.Item("newspaperArticle"); + + //metadata + var dataTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < dataTagHTML.length ; i++) { + dataTags[dataTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(dataTagHTML[i].getAttribute("content")); + } + + associateData (newItem, dataTags, "Description", "abstractNote"); + associateData (newItem, dataTags, "PubDate", "date"); + + //author + if (dataTags["Author"]) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(dataTags["Author"], "author")); + } else { + + author = doc.evaluate('//strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(","); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author[0], "author")); + } + + } else if (mediaType == "blogPost") { + + var newItem = new Zotero.Item("blogPost"); + + var blog = doc.evaluate('//div[@class="entryviewfooter"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + blog = blog.replace("Posted:", '').split("by"); + newItem.date = blog[0].replace(/^\s*|\s*$/g, ''); + + var author = doc.evaluate('//span[@class="MoreRecentPostsAuthor"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace("by ", ''); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + Zotero.debug(doc.location.href); + newItem.url = doc.location.href; + + // This is ACTUALLY returning This URL: http://www.nationalpost.com/components/npemail.aspx?id=591742&ref=http://www.nationalpost.com/story.html + + + var title1 = doc.title; + Zotero.debug(title1); + + newItem.title = title1; + newItem.publication = "The National Post"; + newItem.ISSN = "1486-8008"; + + newItem.complete(); +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//h3[@class="alt"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.href.match("nationalpost")) { + items[next_title.href] = next_title.textContent; + Zotero.debug(next_title.href); + Zotero.debug(next_title.textContent); + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); + + + +} +\ No newline at end of file diff --git a/translators/Nature.js b/translators/Nature.js @@ -0,0 +1,107 @@ +{ + "translatorID":"6614a99-479a-4524-8e30-686e4d66663e", + "translatorType":4, + "label":"Nature", + "creator":"Simon Kornblith", + "target":"https?://www\\.nature\\.com[^/]*/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\\.html|index.html)|search/executeSearch)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-26 03:00:00" +} + +function detectWeb(doc, url) { + var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/; + + if (articleRe.test(url)) { + if (doc.evaluate('//a[contains(@href, ".ris")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } else { return false; } + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var tableRows = doc.evaluate('//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var fulltextLinks = doc.evaluate('//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + + if(tableRows.iterateNext() && fulltextLinks.iterateNext()) { + return "multiple"; + } + } + + return false; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+)\.html/; + var m = articleRe.exec(url); + + if(!m) { + // search page + var items = new Array(); + + var tableRows = doc.evaluate('//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var fulltextLinks = doc.evaluate('//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow, fulltextLink; + while((tableRow = tableRows.iterateNext()) && (fulltextLink = fulltextLinks.iterateNext())) { + items[fulltextLink.href] = Zotero.Utilities.cleanString(tableRow.textContent); + } + + items = Zotero.selectItems(items); + if(!items) return true; + + var urls = new Array(); + for(var url in items) { + urls.push(url); + } + } else { + var urls = [url]; + } + + var RIS = new Array(); + var regexps = new Array(); + + for each(var item in urls) { + var m = articleRe.exec(item); + if(m[3][m[3].length-2] == "_") { + m[3] = m[3].substr(0, m[3].length-2); + } + RIS.push(m[1]+"ris"+m[3]+".ris"); + regexps.push(m); + } + + Zotero.Utilities.HTTP.doGet(RIS, function(text) { + var url = urls.shift(); + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var m = regexps.shift(); + item.attachments = [ + {url:m[0], title:"Nature Snapshot", mimeType:"text/html"}, + {url:m[1]+"pdf"+m[3]+".pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"} + ] + + item.notes = new Array(); + if (item.date) item.date = item.date.replace("print ", ""); + + item.complete(); + }); + translator.translate(); + }, function() { Zotero.done(); }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/New Zealand Herald.js b/translators/New Zealand Herald.js @@ -0,0 +1,110 @@ +{ + "translatorID":"c7830593-807e-48cb-99f2-c3bed2b148c2", + "translatorType":4, + "label":"New Zealand Herald", + "creator":"Michael Berkowitz", + "target":"^http://(www|search).nzherald.co.nz/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-08-14 22:15:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Search Results") != -1) { + return "multiple"; + } else if (doc.location.href.indexOf("story.cfm") != -1) { + return "newspaperArticle"; + } +} + +function scrape(url) { + Zotero.Utilities.HTTP.doGet(url, function(text) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.url = url; + newItem.publicationTitle = "New Zealand Herald"; + + //author? + var aut = /<a href=\"\/author\/[^>]*>(.*)<\/a>/; + if (text.match(aut)) { + var author = text.match(aut)[1]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + + //abstract + var a = /meta name=\"description\" content=\"([^&]*)/; + newItem.abstractNote = text.match(a)[1]; + + //title and date + var t = /<title>(.*)<\/title>/; + var result = text.match(t)[1].split(" - "); + newItem.title = result[0]; + newItem.date = result[1]; + + //keywords + var k = /<meta name=\"keywords\" content=\"(.*)\"/; + var kwords = Zotero.Utilities.cleanString(text.match(k)[1]).split(", "); + for (var i = 0 ; i < kwords.length ; i++) { + newItem.tags.push(kwords[i]); + } + + //section + var s = /class=\"current\"><.*><span>(.*)<\/span>/; + newItem.section = text.match(s)[1]; + + newItem.complete(); + Zotero.debug(newItem); + + Zotero.done(); + }, function() {}); +} + +function doWeb(doc, url) { + var articles = new Array(); + var names = new Array(); + if (doc.title.indexOf("Search Results:") != -1) { + var URLS = new Array(); + var titles = new Array(); + var xpath = '//p[@class="g"]/a'; + var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var link = links.iterateNext(); + + while (link) { + URLS.push(link.href); + titles.push(link.textContent); + link = links.iterateNext(); + } + + Zotero.debug(titles); + Zotero.debug(URLS); + + var newItems = new Object(); + + for (var i = 0 ; i < titles.length ; i++) { + newItems[URLS[i]] = titles[i]; + } + + newItems = Zotero.selectItems(newItems); + + Zotero.debug(newItems); + + for (var i in newItems) { + articles.push(i); + names.push(newItems[i]); + } + } else { + articles.push(doc.location.href); + names.push(Zotero.Utilities.cleanString(doc.title.split("-")[0])); + } + + Zotero.debug(articles); + + Zotero.Utilities.HTTP.doPost(articles, "", function(text) { + for (var i = 0 ; i < articles.length ; i++) { + scrape(articles[i]); + } + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/OAIster.js b/translators/OAIster.js @@ -0,0 +1,90 @@ +{ + "translatorID":"4afb932d-9211-4c0b-a31c-cfa984d62b66", + "translatorType":4, + "label":"OAIster", + "creator":"Michael Berkowitz", + "target":"http://quod.lib.umich.edu/cgi/b/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-20 19:10:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("OAIster") != -1) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var items = new Array(); + var titlex = '/html/body/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[1]/td[4]/font'; + var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items.push(Zotero.Utilities.trimInternal(title.textContent)); + } + items = Zotero.selectItems(items); + titles = new Array(); + for each (var title in items) { + titles.push(title); + } + Zotero.debug(titles); + var xpath = '//table/tbody/tr/td/table/tbody//table/tbody[tr/td[4]]'; + var arts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var art; + while (art = arts.iterateNext()) { + var data = new Object(); + var rows = doc.evaluate('./tr[td[4]]', art, null, XPathResult.ANY_TYPE, null); + var row; + while (row = rows.iterateNext()) { + var tag = Zotero.Utilities.trimInternal(doc.evaluate('./td[2]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var value = Zotero.Utilities.trimInternal(doc.evaluate('./td[4]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (tag == "Note") { + if (!data['Note']) { + data[tag] = Zotero.Utilities.unescapeHTML(value); + } + } else { + data[tag] = Zotero.Utilities.unescapeHTML(value); + } + + } + var item = new Zotero.Item(); + if (data['Resource Type']) { + var itemType = data['Resource Type']; + } else { + var itemType = "journalArticle"; + } + if (itemType == "journalArticle" || itemType.match(/(A|a)rticle/) || itemType.match(/text/)) { + item.itemType = "journalArticle"; + } else if (itemType.match(/(T|t)hesis/)) { + item.itemType = "thesis"; + } else if (itemType == "image") { + item.itemType = "artwork"; + } + item.title = data['Title']; + if (data['Author/Creator']) { + var authors = data['Author/Creator'].split(/;/); + for each (var aut in authors) { + if (aut.match(/,/)) { + aut = aut.split(/,\s+/); + aut = aut[1] + " " + aut[0]; + } + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + item.date = data['Year']; //.match(/\d{4}\-\d{2}\-\d{2}/)[0]; + item.url = data['URL']; + if (data['Note']) item.abstractNote = Zotero.Utilities.trimInternal(data['Note']); + if (data['Subject']) { + var keys = data['Subject'].split(/;/); + for each (var kw in keys) { + if (kw.match(/\w+/)) item.tags.push(kw); + } + } + for (var i in titles) { + if (item.title == titles[i]) item.complete(); + } + } +} +\ No newline at end of file diff --git a/translators/OCLC WorldCat FirstSearch.js b/translators/OCLC WorldCat FirstSearch.js @@ -0,0 +1,207 @@ +{ + "translatorID":"838d8849-4ffb-9f44-3d0d-aa8a0a079afe", + "translatorType":4, + "label":"OCLC WorldCat FirstSearch", + "creator":"Simon Kornblith", + "target":"https?://[^/]*firstsearch\\.oclc\\.org[^/]*/WebZ/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-07 21:15:00" +} + +function detectWeb(doc, url) { + var detailRe = /FirstSearch: [\w ]+ Detailed Record/; + var searchRe = /FirstSearch: [\w ]+ List of Records/; + + if(detailRe.test(doc.title)) { + return "book"; + } else if(searchRe.test(doc.title)) { + return "multiple"; + } +} + +function processURLs(urls) { + if(!urls.length) { // last url + Zotero.done(); + return; + } + + var newUrl = urls.shift(); + + Zotero.Utilities.HTTP.doPost(newUrl, + 'exportselect=record&exporttype=plaintext', function(text) { + var lineRegexp = new RegExp(); + lineRegexp.compile("^([\\w() ]+): *(.*)$"); + + var newItem = new Zotero.Item("book"); + newItem.extra = ""; + + var lines = text.split('\n'); + for(var i=0;i<lines.length;i++) { + var testMatch = lineRegexp.exec(lines[i]); + if(testMatch) { + var match = newMatch; + var newMatch = testMatch + } else { + var match = false; + } + + if(match) { + // is a useful match + if(match[1] == 'Title') { + var title = match[2]; + if(!lineRegexp.test(lines[i+1])) { + i++; + title += ' '+lines[i]; + } + if(title.substring(title.length-2) == " /") { + title = title.substring(0, title.length-2); + } + newItem.title = Zotero.Utilities.capitalizeTitle(title); + } else if(match[1] == "Series") { + newItem.series = match[2]; + } else if(match[1] == "Description") { + var pageMatch = /([0-9]+) p\.?/ + var m = pageMatch.exec(match[2]); + if(m) { + newItem.pages = m[1]; + } + } else if(match[1] == 'Author(s)' || match[1] == "Corp Author(s)") { + var yearRegexp = /[0-9]{4}-([0-9]{4})?/; + + var authors = match[2].split(';'); + if(authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[0], "author", true)); + for(var j=1; j<authors.length; j+=2) { + if(authors[j-1].substring(0, 1) != '(' && !yearRegexp.test(authors[j])) { + // ignore places where there are parentheses + newItem.creators.push({lastName:authors[j], creatorType:"author", fieldMode:true}); + } + } + } else { + newItem.creators.push(Zotero.Utilities.cleanString(match[2])); + } + } else if(match[1] == 'Publication') { + match[2] = Zotero.Utilities.cleanString(match[2]); + if(match[2].substring(match[2].length-1) == ',') { + match[2] = match[2].substring(0, match[2].length-1); + } + + // most, but not all, WorldCat publisher/places are + // colon delimited + var parts = match[2].split(/ ?: ?/); + if(parts.length == 2) { + newItem.place = parts[0]; + newItem.publisher = parts[1]; + } else { + newItem.publisher = match[2]; + } + } else if(match[1] == 'Institution') { + newItem.publisher = match[2]; + } else if(match[1] == 'Standard No') { + var ISBNRe = /ISBN:\s*([0-9X]+)/ + var m = ISBNRe.exec(match[2]); + if(m) newItem.ISBN = m[1]; + } else if(match[1] == 'Year') { + newItem.date = match[2]; + } else if(match[1] == "Descriptor") { + if(match[2][match[2].length-1] == ".") { + match[2] = match[2].substr(0, match[2].length-1); + } + + var tags = match[2].split("--"); + for(var j in tags) { + newItem.tags.push(Zotero.Utilities.cleanString(tags[j])); + } + } else if(match[1] == "Accession No") { + newItem.accessionNumber = Zotero.Utilities.superCleanString(match[2]); + } else if(match[1] == "Degree") { + newItem.itemType = "thesis"; + newItem.thesisType = match[2]; + } else if(match[1] == "DOI") { + newItem.DOI = match[2]; + } else if(match[1] == "Database") { + if(match[2].substr(0, 8) != "WorldCat") { + newItem.itemType = "journalArticle"; + } + } else if(match[1] != "Availability" && + match[1] != "Find Items About" && + match[1] != "Document Type") { + newItem.extra += match[1]+": "+match[2]+"\n"; + } + } else { + if(lines[i] != "" && lines[i] != "SUBJECT(S)") { + newMatch[2] += " "+lines[i]; + } + } + } + + if(newItem.extra) { + newItem.extra = newItem.extra.substr(0, newItem.extra.length-1); + } + + newItem.complete(); + processURLs(urls); + }, false, 'iso-8859-1'); +} + +function doWeb(doc, url) { + var sessionRegexp = /(?:\?|\:)sessionid=([^?:]+)(?:\?|\:|$)/; + var numberRegexp = /(?:\?|\:)recno=([^?:]+)(?:\?|\:|$)/; + var resultsetRegexp = /(?:\?|\:)resultset=([^?:]+)(?:\?|\:|$)/; + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + + var sMatch = sessionRegexp.exec(url); + var sessionid = sMatch[1]; + + var hMatch = hostRegexp.exec(url); + var host = hMatch[1]; + + var newUri, exportselect; + + var detailRe = /FirstSearch: [\w ]+ Detailed Record/; + if(detailRe.test(doc.title)) { + var publisherRegexp = /^(.*), (.*?),?$/; + + var nMatch = numberRegexp.exec(url); + if(nMatch) { + var number = nMatch[1]; + } else { + number = 1; + } + + var rMatch = resultsetRegexp.exec(url); + if(rMatch) { + var resultset = rMatch[1]; + } else { + // It's in an XPCNativeWrapper, so we have to do this black magic + resultset = doc.forms.namedItem('main').elements.namedItem('resultset').value; + } + + urls = [host+'/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset=' + resultset + ':entityexportrecno=' + number + ':sessionid=' + sessionid + ':entitypagenum=35:0']; + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, '/WebZ/FSFETCH\\?fetchtype=fullrecord', '^(See more details for locating this item|Detailed Record)$'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + + for(var i in items) { + var nMatch = numberRegexp.exec(i); + var rMatch = resultsetRegexp.exec(i); + if(rMatch && nMatch) { + var number = nMatch[1]; + var resultset = rMatch[1]; + urls.push(host+'/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset=' + resultset + ':entityexportrecno=' + number + ':sessionid=' + sessionid + ':entitypagenum=35:0'); + } + } + } + + processURLs(urls); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/OSTI Energy Citations.js b/translators/OSTI Energy Citations.js @@ -0,0 +1,50 @@ +{ + "translatorID":"0cdc6a07-38cf-4ec1-b9d5-7a3c0cc89b15", + "translatorType":4, + "label":"OSTI Energy Citations", + "creator":"Michael Berkowitz", + "target":"http://www.osti.gov/energycitations", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-20 15:20:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//table[@class="searchresults"]//a[@class="citation"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("product.biblio.jsp") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var urls = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//table[@class="searchresults"]//a[@class="citation"]'; + var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_link; + while (next_link = links.iterateNext()) { + items[next_link.href] = next_link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + urls.push(i.match(/osti_id=\d+/)[0]); + } + } else { + urls = [url.match(/osti_id=\d+/)[0]]; + } + for (var i = 0 ; i < urls.length ; i++) { + var getstr = 'http://www.osti.gov/energycitations/endnote?' + urls[i]; + Zotero.Utilities.HTTP.doGet(getstr, function(text) { + Zotero.debug(text); + text = text.replace(/(%.)/g, "$1 "); + var trans = Zotero.loadTranslator("import"); + trans.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); + trans.setString(text); + trans.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/Old Bailey Online.js b/translators/Old Bailey Online.js @@ -0,0 +1,130 @@ +{ + "translatorID":"b10bf941-12e9-4188-be04-f6357fa594a0", + "translatorType":4, + "label":"Old Bailey Online", + "creator":"Adam Crymble", + "target":"http://www.oldbaileyonline.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search")) { + return "multiple"; + } else if (doc.location.href.match("browse")) { + return "case"; + } +} + +//Old Bailey Online translator. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("case"); + + var headers = doc.evaluate('//div[@class="apparatus"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//div[@class="apparatus"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var xPathCount = doc.evaluate('count (//div[@class="apparatus"]/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var headersArray = new Array(); + var oneHeader = ''; + + if (xPathCount.numberValue > 1) { + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + headersArray.push(fieldTitle); + } + } else { + oneHeader = (headers.iterateNext().textContent); + } + + var contentsArray = new Array(); + var j = 0; + + if (oneHeader.length<1) { + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.indexOf(headersArray[i]); + + contentsArray.push(contents.substr(fieldIndex)); + contents = contents.substr(0, fieldIndex); + fieldTitle = headersArray[i].replace(/\s+/g, ''); + + if (fieldTitle != "ReferenceNumber:") { + tagsContent.push(contentsArray[j]); + } else { + newItem.extra = contentsArray[j]; + } + j++; + } + } else { + + if (oneHeader.match("Reference")) { + + newItem.extra = contents; + } else { + newItem.tags = contents; + var noMoreTags = 1; + } + } + + if (noMoreTags != 1) { + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + } + + newItem.title = doc.evaluate('//div[@class="sessionsPaperTitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//li/p[@class="srchtitle"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else if (doc.evaluate('//div[@id="main2"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var xmlOrText = doc.evaluate('//div[@id="main2"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + if (xmlOrText.textContent.match("Text")) { + articles = [xmlOrText.href]; + + } else { + articles = [url]; + } + } + + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Open WorldCat (Search).js b/translators/Open WorldCat (Search).js @@ -0,0 +1,92 @@ +{ + "translatorID":"e07e9b8c-0e98-4915-bb5a-32a08cb2f365", + "translatorType":12, + "label":"Open WorldCat (Search)", + "creator":"Simon Kornblith", + "target":"http://partneraccess.oclc.org/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-22 18:15:00" +} + +function detectSearch(item) { + if(item.itemType == "book" || item.itemType == "bookSection") { + return true; + } + return false; +} + +// creates an item from an Open WorldCat document +function processOWC(doc) { + var spanTags = doc.getElementsByTagName("span"); + for(var i=0; i<spanTags.length; i++) { + var spanClass = spanTags[i].getAttribute("class"); + if(spanClass) { + var spanClasses = spanClass.split(" "); + if(Zotero.Utilities.inArray("Z3988", spanClasses)) { + var spanTitle = spanTags[i].getAttribute("title"); + var item = new Zotero.Item(); + if(Zotero.Utilities.parseContextObject(spanTitle, item)) { + if(item.title) { + item.title = Zotero.Utilities.capitalizeTitle(item.title); + } else { + item.title = "[Untitled]"; + } + + item.complete(); + return true; + } else { + return false; + } + } + } + } + + return false; +} + +function doSearch(item) { + if(item.contextObject) { + var co = item.contextObject; + } else { + var co = Zotero.Utilities.createContextObject(item); + } + + Zotero.Utilities.loadDocument("http://partneraccess.oclc.org/wcpa/servlet/OpenUrl?"+co, function(doc) { + // find new COinS in the Open WorldCat page + if(processOWC(doc)) { // we got a single item page + Zotero.done(); + } else { // assume we have a search results page + var items = new Array(); + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // first try to get only books + var elmts = doc.evaluate('//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null); + var elmt = elmts.iterateNext(); + if(!elmt) { // if that fails, look for other options + var elmts = doc.evaluate('//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null); + elmt = elmts.iterateNext() + } + + var urlsToProcess = new Array(); + do { + urlsToProcess.push(elmt.href); + } while(elmt = elmts.iterateNext()); + + Zotero.Utilities.processDocuments(urlsToProcess, function(doc) { + // per URL + processOWC(doc); + }, function() { // done + Zotero.done(); + }); + } + }, null); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Open WorldCat (Web).js b/translators/Open WorldCat (Web).js @@ -0,0 +1,79 @@ +{ + "translatorID":"c73a4a8c-3ef1-4ec8-8229-7531ee384cc4", + "translatorType":4, + "label":"Open WorldCat (Web)", + "creator":"Sean Takats", + "target":"^http://(?:www\\.)?worldcat\\.org/(?:search\\?|profiles/[^/]+/lists/)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-11-05 18:00:00" +} + +function detectWeb(doc, url){ + var nsResolver = doc.createNSResolver(doc.documentElement); + + var xpath = '//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a/strong'; + var results = doc.evaluate(xpath, doc, + nsResolver, XPathResult.ANY_TYPE, null); + if(results.iterateNext()) { + return "multiple"; + } +} + +function processOWC(doc) { + var spanTags = doc.getElementsByTagName("span"); + for(var i=0; i<spanTags.length; i++) { + var spanClass = spanTags[i].getAttribute("class"); + if(spanClass) { + var spanClasses = spanClass.split(" "); + if(Zotero.Utilities.inArray("Z3988", spanClasses)) { + var spanTitle = spanTags[i].getAttribute("title"); + var item = new Zotero.Item(); + if(Zotero.Utilities.parseContextObject(spanTitle, item)) { + if(item.title) { + item.title = Zotero.Utilities.capitalizeTitle(item.title); + } else { + item.title = "[Untitled]"; + } + + item.complete(); + return true; + } else { + return false; + } + } + } + } + + return false; +} + +function doWeb(doc, url){ + var nsResolver = doc.createNSResolver(doc.documentElement); + + var urls = new Array(); + var items = new Array(); + var xpath = '//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a'; + var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + // Go through titles + while(title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, function(doc) { + processOWC(doc);}, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/OpenJudis - Indian Supreme Court cases.js b/translators/OpenJudis - Indian Supreme Court cases.js @@ -0,0 +1,100 @@ +{ + "translatorID":"fe39e97d-7397-4f3f-a5f3-396a1a79213c", + "translatorType":4, + "label":"OpenJudis - Indian Supreme Court cases", + "creator":"Prashant Iyengar and Michael Berkowitz", + "target":"http://(www.)?openarchive.in/(judis|newcases)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@id="footer"]/dl/dt/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/\d+\.htm/)) { + return "case"; + } +} + +function regexMeta(stuff, item) { + if (stuff) { + if (stuff[0] == "Origlink") { + item.source = stuff[1].split(/\s+/)[0]; + } + if (stuff[0] == "Acts") { + if (stuff[1].indexOf("|")!=-0) { + echts=stuff[1].split(" | "); + for (i=0;i<echts.length;i++) { + item.tags.push(echts[i]); + } + } else { + item.tags.push(stuff[1]); + } + } + if (stuff[0] == "Citations" && stuff[1].length > 1) { + item.reporter=stuff[1]; + } + if (stuff[0] == "Judges") { + if (stuff[1].indexOf(";")!=-0) { + jedges=stuff[1].split(" ; "); + for (i=0;i<jedges.length;i++) { + item.creators.push(Zotero.Utilities.cleanAuthor(jedges[i], "author")); + } + } else { + item.creators.push(Zotero.Utilities.cleanAuthor(stuff[1], "author")); + } + } + if (stuff[0] == "Jday") { + item.dateDecided= stuff[1]; + } + } +} + + + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, "^http:\/\/openarchive\.in\/[^/]+\/[0-9]+.htm$"); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { arts = [url]; } + Zotero.debug(arts); + for each (var art in arts) { + var newurl = art; + Zotero.Utilities.HTTP.doGet(art, function(text) { + var newItem = new Zotero.Item("case"); + newItem.publicationTitle = "OpenJudis - http://judis.openarchive.in"; + newItem.url = url; + + //title + var t = /\<title\>([\w\W]*?)<\/title/; + newItem.title = Zotero.Utilities.trimInternal(t.exec(text)[1]); + newItem.caseName = newItem.title; + newItem.url = newurl; + newItem.court="The Supreme Court of India"; + + newItem.websiteTitle="OpenJudis - http://judis.openarchive.in"; + newItem.edition="Online"; + + var metareg = /<META NAME[^>]+\>/g; + var tags = text.match(metareg); + for each (var tag in tags) { + var stuff = tag.match(/NAME=\"([^"]+)\"\s+CONTENT=\"([^"]+)\"/); + regexMeta([stuff[1], stuff[2]], newItem); + } + pdfurl = 'http://judis.openarchive.in/makepdf.php?filename=' + newItem.url; + newItem.attachments = [ + {url:newItem.url, title:"OpenJudis Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"OpenJudis PDF", mimeType:"application/pdf"} + ]; + newItem.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); + } +} diff --git a/translators/Optical Society of America.js b/translators/Optical Society of America.js @@ -0,0 +1,80 @@ +{ + "translatorID":"a1a97ad4-493a-45f2-bd46-016069de4162", + "translatorType":4, + "label":"Optical Society of America", + "creator":"Michael Berkowitz", + "target":"https?://[^.]+\\.(opticsinfobase|osa)\\.org", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-15 19:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var searchpath = '//div[@id="col2"]/p/strong/a'; + if (doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("abstract.cfm") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var host = doc.location.host; + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//div[@id="col2"]/p/strong/a'; + var arts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_art; + while (next_art = arts.iterateNext()) { + items[next_art.href] = Zotero.Utilities.trimInternal(next_art.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var osalink = newDoc.evaluate('//div[@id="abstract"]/p/a[contains(text(), "opticsinfobase")]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.Utilities.HTTP.doGet(osalink, function(text) { + var action = text.match(/select\s+name=\"([^"]+)\"/)[1]; + var id = text.match(/input\s+type=\"hidden\"\s+name=\"articles\"\s+value=\"([^"]+)\"/)[1]; + if (newDoc.evaluate('//p[*[contains(text(), "DOI")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doi = Zotero.Utilities.trimInternal(newDoc.evaluate('//p[*[contains(text(), "DOI")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + doi = doi.match(/doi:(.*)$/)[1]; + } + var get = 'http://' + host + '/custom_tags/IB_Download_Citations.cfm'; + var post = 'articles=' + id + '&ArticleAction=save_endnote2&' + action + '=save_endnote2'; + Zotero.Utilities.HTTP.doPost(get, post, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pubName; + if (item.journalAbbreviation) { + pubName = item.journalAbbreviation; + } else { + pubName = item.publicationTitle; + } + if (doi) item.DOI = doi; + item.attachments = [{url:osalink, title:pubName + " Snapshot", mimeType:"text/html"}]; + item.complete(); + }); + translator.translate(); + }); + }); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/Optics Express.js b/translators/Optics Express.js @@ -0,0 +1,78 @@ +{ + "translatorID":"8a07dd43-2bce-47bf-b4bf-c0fc441b79a9", + "translatorType":4, + "label":"Optics Express", + "creator":"Michael Berkowitz", + "target":"http://(www.)?opticsexpress\\.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-15 19:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var searchpath = '//div[@id="col2"]/p/strong/a'; + if (doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("abstract.cfm") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//div[@id="col2"]/p/strong/a'; + var art = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_art; + while (next_art = art.iterateNext()) { + items[next_art.href] = Zotero.Utilities.trimInternal(next_art.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + for (var a in articles) { + var link = articles[a]; + Zotero.Utilities.HTTP.doGet(link, function(text) { + if (text.match(/doi:.*\"/)) var doi = text.match(/doi:(.*)\"/)[1]; + var id = text.match(/name=\"articles\"\s+value=\"([^"]+)\"/)[1]; + var action = text.match(/select\s+name=\"([^"]+)\"/)[1]; + var get = 'http://www.opticsinfobase.org/custom_tags/IB_Download_Citations.cfm'; + var post = 'articles=' + id + '&ArticleAction=save_endnote2&' + action + '=save_endnote2'; + Zotero.Utilities.HTTP.doPost(get, post, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pubName; + if (item.journalAbbreviation) { + pubName = item.journalAbbreviation; + } else { + pubName = item.publicationTitle; + } + if (doi) item.DOI = doi; + item.attachments = [{url:articles[a], title:pubName + " Snapshot", mimeType:"text/html"}]; + item.complete(); + }); + translator.translate(); + }); + }); + } +} +\ No newline at end of file diff --git a/translators/Osterreichischer Bibliothekenverbund.js b/translators/Osterreichischer Bibliothekenverbund.js @@ -0,0 +1,52 @@ +{ + "translatorID":"e1140aa1-3bcf-4226-9099-78ef0b63bb3e", + "translatorType":4, + "label":"Osterreichischer Bibliothekenverbund", + "creator":"Michael Berkowitz", + "target":"http://meteor.bibvb.ac.at/F", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-19 16:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td[@class="bar"]/a[@class="blue"]/img', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } else if (doc.title.indexOf("Ergebnisliste") != -1) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var itemRegexp = '^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)' + var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp, '^[0-9]+$'); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(newDoc) { + var link = newDoc.evaluate('//td[@class="bar"]/a[@class="blue"][2]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + link = link.replace(/full\-mail[^&]+&/, "full-mail&") + "&option_type=&format=777&encoding=UTF_TO_WEB_MAIL+++++&SUBJECT=&NAME=&EMAIL=&x=17&y=7"; + Zotero.Utilities.loadDocument([link], function(newDoc2) { + var newest = newDoc2.evaluate('/html/body/p[@class="text3"]/a', newDoc2, null, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.Utilities.HTTP.doGet(newest, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.itemType = "book"; + item.complete(); + }); + translator.translate(); + }); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Ovid.js b/translators/Ovid.js @@ -0,0 +1,170 @@ +{ + "translatorID":"cde4428-5434-437f-9cd9-2281d14dbf9", + "translatorType":4, + "label":"Ovid", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"/(gw2|spa|spb)/ovidweb\\.cgi", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var results = doc.evaluate('//div[@class="bibheader-resultsrange"]/b', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + + if(results) { + results = Zotero.Utilities.cleanString(results.textContent); + + if(results.indexOf("-") != -1) { + return "multiple"; + } else { + return "journalArticle"; + } + } + + return false; +} + +function senCase(string) { + var words = string.split(/\b/); + for (var i = 0 ; i < words.length ; i++) { + if (words[i].match(/[A-Z]/)) { + words[i] = words[i][0] + words[i].substring(1).toLowerCase(); + } + } + return words.join(""); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var results = Zotero.Utilities.cleanString(doc.evaluate('//div[@class="bibheader-resultsrange"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var post = "S="+doc.evaluate('.//input[@name="S"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + + if(results.indexOf("-") != -1) { + var items = new Object(); + + // Go through table rows + if (doc.evaluate('/html/body/form/div[substring(@class, 1, 10)="titles-row"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var tableRows = doc.evaluate('/html/body/form/div[substring(@class, 1, 10)="titles-row"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (doc.evaluate('//div[@id="titles-records"]/table[@class="titles-row"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var tableRows = doc.evaluate('//div[@id="titles-records"]/table[@class="titles-row"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + var tableRow; + while(tableRow = tableRows.iterateNext()) { + var id = doc.evaluate('.//input[@name="R"]', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + items[id] = Zotero.Utilities.cleanString(doc.evaluate('.//span[@class="titles-title"]', tableRow, + nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + var items = Zotero.selectItems(items); + if(!items) return true; + + for(var i in items) { + post += "&R="+i; + } + } else { + var id = doc.evaluate('.//input[@name="R"]', doc, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + post += "&R="+id; + } + + if (detectWeb(doc, url) == "multiple") { + var selectvar = doc.evaluate('.//input[@name="SELECT"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var nextselect = selectvar.iterateNext().value; + if (next = selectvar.iterateNext()) { + post += "&SELECT=" + next.value; + } else { + post += "&SELECT="+ nextselect; + } + } else { + post += "&SELECT=" + doc.evaluate('.//input[@name="SELECT"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + } + post += "&CitMan="+doc.evaluate('.//input[@name="CitMan"]', doc, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + post += "&CitManPrev="+doc.evaluate('.//input[@name="CitManPrev"]', doc, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + post += "&cmRecordSelect=SELECTED&cmFields=ALL&cmFormat=export&cmsave.x=12&cmsave.y=7"; + + Zotero.Utilities.HTTP.doPost(url, post, function(text) { + var lines = text.split("\n"); + var haveStarted = false; + var newItemRe = /^<[0-9]+>/; + + var newItem = new Zotero.Item("journalArticle"); + + for(var i in lines) { + if(lines[i].substring(0,3) == "<1>") { + haveStarted = true; + } else if(newItemRe.test(lines[i])) { + newItem.complete(); + + newItem = new Zotero.Item("journalArticle"); + } else if(lines[i].substr(2, 4) == " - " && haveStarted) { + var fieldCode = lines[i].substr(0, 2); + var fieldContent = Zotero.Utilities.cleanString(lines[i].substr(6)); + if(fieldCode == "TI") { + newItem.title = fieldContent.replace(/\. \[\w+\]$/, ""); + } else if(fieldCode == "AU") { + var names = fieldContent.split(", "); + + if(names.length >= 2) { + // get rid of the weird field codes + if(names.length == 2) { + names[1] = names[1].replace(/ [\+\*\S\[\]]+$/, ""); + } + names[1] = names[1].replace(/ (?:MD|PhD|[BM]Sc|[BM]A|MPH|MB)$/i, ""); + + newItem.creators.push({firstName:names[1], lastName:names[0], creatorType:"author"}); + } else { + newItem.creators.push({lastName:names[0], isInstitution:true, creatorType:"author"}); + } + } else if(fieldCode == "SO") { + if (fieldContent.match(/\d{4}/)) { + newItem.date = fieldContent.match(/\d{4}/)[0]; + } + if (fieldContent.match(/(\d+)\((\d+)\)/)) { + var voliss = fieldContent.match(/(\d+)\((\d+)\)/); + newItem.volume = voliss[1]; + newItem.issue = voliss[2]; + } + if (fieldContent.match(/\d+\-\d+/)) + newItem.pages = fieldContent.match(/\d+\-\d+/)[0]; + if (fieldContent.match(/[J|j]ournal/)) { + newItem.publicationTitle = fieldContent.match(/[J|j]ournal[-\s\w]+/)[0]; + } else { + newItem.publicationTitle = Zotero.Utilities.trimInternal(fieldContent.split(/(\.|;)/)[0]); + } + } else if(fieldCode == "SB") { + newItem.tags.push(Zotero.Utilities.superCleanString(fieldContent)); + } else if(fieldCode == "KW") { + newItem.tags.push(fieldContent.split(/; +/)); + } else if(fieldCode == "DB") { + newItem.repository = "Ovid ("+fieldContent+")"; + } else if(fieldCode == "DI") { + newItem.DOI = fieldContent; + } else if(fieldCode == "AB") { + newItem.abstractNote = fieldContent; + } + } + } + + // last item is complete + if(haveStarted) { + newItem.complete(); + } + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Oxford Music and Art Online.js b/translators/Oxford Music and Art Online.js @@ -0,0 +1,59 @@ +{ + "translatorID":"f203db7f-7b7b-4dc4-b018-115b7885fe3b", + "translatorType":4, + "label":"Oxford Music and Art Online", + "creator":"Michael Berkowitz", + "target":"http://[^/]*www.oxford(music|art)online.com[^/]*/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-10 06:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/search_results/)) { + return "multiple"; + } else if (url.match(/\/article\//)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var host = doc.location.host; + var site = host.match(/oxford(.*)online/)[1]; + var ids = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//ul[@class="search_result_list"]/li/p/a', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + ids.push(i.match(/(music|art)\/([^?]+)/)[2]); + } + } else { + ids = [url.match(/(music|art)\/([^?]+)/)[2]]; + } + Zotero.debug(ids); + for each (var id in ids) { + var get = 'http://' + host + '/subscriber/article_export_citation/grove/' + site + '/' + id; + Zotero.Utilities.HTTP.doGet(get, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var authors = new Array(); + for (var i in item.creators) { + names = item.creators[i].lastName.match(/(.*)\s([^\s]+)$/); + authors.push({firstName:names[1], lastName:names[2], creatorType:"author"}); + } + item.creators = authors; + item.complete(); + }); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/PEI Archival Information Network.js b/translators/PEI Archival Information Network.js @@ -0,0 +1,173 @@ +{ + "translatorID":"6871e8c5-f935-4ba1-8305-0ba563ce3941", + "translatorType":4, + "label":"PEI Archival Information Network", + "creator":"Adam Crymble", + "target":"http://www.archives.pe.ca", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (doc.evaluate('//td[2]/table/tbody/tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Search")) { + return "multiple"; + + } else if (doc.evaluate('//td[2]/table/tbody/tr/td/p', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match("Display")){ + return "book"; + } +} + +//PEI Archival Information Network translator: Code by Adam Crymble + +var authors; + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function authors1() { + for (var k = 0; k< authors.length; k++) { + if (authors[k].match(", ")) { + var author = authors[k].split(", "); + authors[k] = (author[1] + (" ") + author[0].replace(/^\s*|\s*$/g, '')); + + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[k], "author")); + + } else { + + newItem.creators.push({lastName: authors[k], creatorType: "creator"}); + } + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + var contents; + var tagsContent = new Array(); + + newItem = new Zotero.Item("book"); + + var xPathHeadings = doc.evaluate('//small/b', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathContents = doc.evaluate('//dd', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//small/b)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + + fieldTitle = xPathHeadings.iterateNext().textContent.replace(/\s+/g, ''); + contents = xPathContents.iterateNext().textContent; + + if (fieldTitle == "AccessPoints") { + + //creates Author + dataTags["Author"] = (contents.substr(11).replace(/^\s*|\s*$/g, '')); + contents = xPathContents.iterateNext().textContent; + + authors = dataTags["Author"].split(/\n/); + authors1(); + + //creates Other Authors (if any) + dataTags["OtherAuthor"] = (contents.substr(13).replace(/^\s*|\s*$/g, '')); + contents = xPathContents.iterateNext().textContent; + + if (dataTags["OtherAuthor"].match("no Other Author access points found")) { + + } else { + + authors = dataTags["OtherAuthor"].split(/\n/); + authors1(); + } + + //creates tags + dataTags["subject"] = (contents); + var tags; + + var tagLinks = doc.evaluate('//dd/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var tagsLinksCount = doc.evaluate('count (//dd/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (j = 0; j < tagsLinksCount.numberValue; j++) { + + tags = tagLinks.iterateNext(); + if (tags.href.match("subject")) { + tagsContent.push(tags.textContent); + } + } + } else { + + dataTags[fieldTitle] = (contents.replace(/^\s*|\s*$/g, '')); + } + } + + for (var i = 0; i < tagsContent.length; i++) { + newItem.tags[i] = tagsContent[i]; + } + + associateData (newItem, dataTags, "NameofRepository", "repository"); + associateData (newItem, dataTags, "DatesofCreation", "date"); + associateData (newItem, dataTags, "Identifier", "callNumber"); + associateData (newItem, dataTags, "PhysicalDescription", "extra"); + associateData (newItem, dataTags, "ScopeAndContent", "abstractNote"); + associateData (newItem, dataTags, "Title/StmntofResponsibility", "title"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var xPathTitles = doc.evaluate('//td/ul', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var linkContent = xPathTitles.iterateNext().textContent.split(/\n/); + + + var linkContent1; + var linkHref = new Array(); + + var xPathLinks= doc.evaluate('//ul/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathLinksCount = doc.evaluate('count (//ul/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i< xPathLinksCount.numberValue; i++) { + linkHref.push(xPathLinks.iterateNext().href); + + var y = (i + 1); + linkContent1 = linkContent[y].split("- "); + + + items[linkHref[i]] = linkContent1[1]; + } + + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/PLoS Biology and Medicine.js b/translators/PLoS Biology and Medicine.js @@ -0,0 +1,87 @@ +{ + "translatorID":"bdae838b-3a58-461f-9e8a-142ed9de61dc", + "translatorType":4, + "label":"PLoS Biology and Medicine", + "creator":"Michael Berkowitz", + "target":"http://[^.]+\\.plosjournals\\.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-02 08:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="search"][@id="browseResults"]/ul/li/span/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || + doc.evaluate('//div[@id="toclist"]/dl/dt/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("get-document") != -1) { + return "journalArticle"; + } +} + +function unescape(text) { + var specialreg=new RegExp("&#[^;]+;"); + var specials=specialreg.exec(text); + while(specials) { + text=text.replace(specials[0], String.fromCharCode(parseInt(specials[0].substring(2, specials[0].length-1), 10))); + specials=specialreg.exec(text); + } + return text; +} + +function doWeb(doc, url) { + var URLs = new Array(); + var items = new Object(); + if (detectWeb(doc, url) == "multiple") { + if (doc.evaluate('//div[@class="search"][@id="browseResults"]/ul/li/span/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@class="search"][@id="browseResults"]/ul/li/span/a'; + } else if (doc.evaluate('//div[@id="toclist"]/dl/dt/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="toclist"]/dl/dt/a'; + } + var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_article = articles.iterateNext(); + while (next_article) { + items[next_article.href] = Zotero.Utilities.cleanString(next_article.textContent); + next_article = articles.iterateNext(); + } + items = Zotero.selectItems(items); + + if (!items) { + return true; + } + + for (var i in items) { + URLs.push(i); + } + } else { + URLs.push(url); + } + + + Zotero.Utilities.processDocuments(URLs, function(doc, url) { + var bits = doc.location.href.match(/(^.*\?request=).*(doi=.*$)/); + var RISurl = bits[1] + 'download-citation&t=refman&' + bits[2]; + Zotero.Utilities.HTTP.doGet(RISurl, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(text); + trans.setHandler("itemDone", function(obj, newItem) { + var urlstring= bits[1]+ 'get-pdf&' +bits[2].replace("doi=", "file=").replace("/", "_").replace("%2F", "_") + '-S.pdf'; + newItem.attachments.push({url:urlstring, title:newItem.title, mimeType:"application/pdf"}); + + var urlRE = /http:\/\/dx.doi.org\/(.*)$/; + if (newItem.url) { + newItem.DOI = newItem.url.match(urlRE)[1].replace("%2F", "/"); + } + + newItem.complete(); + }); + trans.translate(); + Zotero.done(); + }); + Zotero.wait(); + }, function() {Zotero.done;}); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/PLoS Journals.js b/translators/PLoS Journals.js @@ -0,0 +1,58 @@ +{ + "translatorID":"9575e804-219e-4cd6-813d-9b690cbfc0fc", + "translatorType":4, + "label":"PLoS Journals", + "creator":"Michael Berkowitz", + "target":"http://www\\.plos(one|ntds|compbiol|pathogens|genetics)\\.org/(search|article)/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-02 08:30:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) { + return "multiple"; + } else if (url.indexOf("article") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var items = new Object(); + var texts = new Array(); + if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) { + var articlex = '//span[@class="article"]/a'; + var articles = doc.evaluate(articlex, doc, null, XPathResult.ANY_TYPE, null); + var next_art = articles.iterateNext(); + while (next_art) { + items[next_art.href] = next_art.textContent; + next_art = articles.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + texts.push(i); + } + } else { + texts.push(url); + } + Zotero.Utilities.processDocuments(texts, function(newDoc, url) { + var doi = newDoc.location.href.match(/doi(\/|%2F)(.*)$/)[2]; + var newURL = newDoc.location.href.replace("info", "getRisCitation.action?articleURI=info"); + var pdfURL = newDoc.location.href.replace("info", "fetchObjectAttachment.action?uri=info") + '&representation=PDF'; + Zotero.Utilities.HTTP.doGet(newURL, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments.push({url:pdfURL, title:"PLoS One Full Text PDF", mimeType:"application/pdf"}); + item.DOI = doi; + item.repository = item.publicationTitle; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/PROLA.js b/translators/PROLA.js @@ -0,0 +1,64 @@ +{ + "translatorID":"2c310a37-a4dd-48d2-82c9-bd29c53c1c76", + "translatorType":4, + "label":"PROLA", + "creator":"Eugeniy Mikhailov and Michael Berkowitz", + "target":"https?://(?:www\\.)?prola.aps.org/(toc|searchabstract|abstract)/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-12 18:40:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("toc") != -1) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, "(abstract|abstractsearch)"); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + + Zotero.Utilities.processDocuments(arts, function(newDoc) { + Zotero.debug(newDoc.title); + var abs = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[contains(@class, "aps-abstractbox")]/p', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var urlRIS = newDoc.location.href; + // so far several more or less identical url possible + // one is with "abstract" other with "searchabstract" + urlRIS = urlRIS.replace(/(searchabstract|abstract)/,"export"); + var post = "type=ris"; + var snapurl = newDoc.location.href; + var pdfurl = snapurl.replace(/(searchabstract|abstract)/, "pdf"); + Zotero.Utilities.HTTP.doPost(urlRIS, post, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (item.itemID) { + item.DOI = item.itemID; + } + item.attachments = [ + {url:snapurl, title:"PROLA Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"PROLA Full Text PDF", mimeType:"application/pdf"} + ]; + item.abstractNote = abs; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Patents - USPTO.js b/translators/Patents - USPTO.js @@ -0,0 +1,144 @@ +{ + "translatorID":"232e24fe-2f68-44fc-9366-ecd45720ee9e", + "translatorType":4, + "label":"Patents - USPTO", + "creator":"Bill McKinney", + "target":"^http://patft\\.uspto\\.gov/netacgi/nph-Parser.+", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-21 06:30:00" +} + +function detectWeb(doc, url) { + var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser"); + if(re.test(doc.location.href)) { + return "book"; + } else { + return "multiple"; + } +} + +function get_nextsibling(n) + { + var x=n.nextSibling; + while (x.nodeType!=1) + { + x=x.nextSibling; + } + return x; +} + +function scrape(doc) { + + var newItem = new Zotero.Item("patent"); + newItem.url = doc.location.href; + var extraText = new String(); + var tmpStr = new String(); + var tmpRefs = ""; + var tmpTitle = doc.title; + + var fontTags = doc.getElementsByTagName("font"); + for(var i=0; i<fontTags.length; i++) { + if (fontTags[i].getAttribute("size") == "+1") { + tmpTitle = tmpTitle + " - " + fontTags[i].innerHTML; + } + } + tmpTitle = Zotero.Utilities.cleanString(tmpTitle); + tmpTitle = tmpTitle.replace(/<[^>]+>/g, ""); + newItem.title = tmpTitle; + + var cellTags = doc.getElementsByTagName("td"); + for(var i=0; i<cellTags.length; i++) { + + var s = new String(cellTags[i].innerHTML); + if (s.indexOf("United States Patent") > -1) { + + tmpStr = cellTags[i+1].childNodes[0].innerHTML; + tmpStr = tmpStr.replace(/<[^>]+>/gi, ""); + tmpStr = tmpStr.replace(/,/gi, ""); + newItem.patentNumber = tmpStr; + + tmpStr = cellTags[i+3].innerHTML; + tmpStr = tmpStr.replace(/<[^>]+>/gi, ""); + newItem.issueDate = tmpStr; + continue; + } + if (s.indexOf("Assignee") > -1) { + tmpStr = cellTags[i+1].innerHTML; + tmpStr = tmpStr.replace(/<\/?\w+>/gi, ""); + newItem.assignee = tmpStr; + continue; + } + if (s.indexOf("Inventors") > -1) { + tmpStr = cellTags[i+1].innerHTML; + + var inventors = tmpStr.split(/<b>,/ig); + for (var j=0; j<inventors.length; j++) { + var tmpInventor = inventors[j]; + tmpInventor = tmpInventor.replace(/<\/?\w+>/gi, ""); + tmpInventor = tmpInventor.replace(/\([^\)]+\)/gi, ""); + tmpInventor = tmpInventor.replace(/^\s+/gi, ""); + + var names = tmpInventor.split(";"); + if (names) { + var lname = names[0]; + var fname = names[1]; + lname = lname.replace(/^\s+/gi, ""); + lname = lname.replace(/\s+$/gi, ""); + fname= fname.replace(/^\s+/gi, ""); + fname= fname.replace(/\s+$/gi, ""); + newItem.creators.push({lastName:lname, firstName:fname, creatorType:"inventor"}); + } + } + continue; + } + + // references + if (s.indexOf("<a href=\"/netacgi/nph-Parser?Sect2") > -1) { + tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " "; + } + if (s.indexOf("<a href=\"http://appft1.uspto.gov/netacgi/nph-Parser?TERM1") > -1) { + tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " "; + } + } + + var centerTags = doc.getElementsByTagName("center"); + for(var i=0; i<centerTags.length; i++) { + var s = new String(centerTags[i].innerHTML); + if (s.indexOf("Abstract") > -1) { + //newItem.extra = "ok"; + var el = get_nextsibling(centerTags[i]); + newItem.abstractNote = el.innerHTML; + } + + } + + newItem.references = tmpRefs; + newItem.complete(); +} + +function doWeb(doc, url) { + var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser.+"); + if(re.test(doc.location.href)) { + scrape(doc); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, "^http://patft\.uspto\.gov/netacgi/nph-Parser.+"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/Persée.js b/translators/Persée.js @@ -0,0 +1,110 @@ +{ + "translatorID":"dd149efc-7f0e-43e4-b3df-b6d15e171717", + "translatorType":4, + "label":"Persée", + "creator":"Adam Crymble", + "target":"http://www.persee.fr", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-15 19:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search") && doc.evaluate('//div[@id="searchResults"]/div[@class="oneResult"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.location.href.match("article")) { + return "journalArticle"; + } +} + +//Persee Translator. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("journalArticle"); + + newItem.url = doc.location.href; + newItem.title = doc.evaluate('//div[@class="oneResult"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + + //various journal info + if (doc.title.match(", ")) { + var contents = doc.title.split(", "); + newItem.publicationTitle = contents[0].substr(9); + for (var i = 1; i < contents.length; i++) { + if (contents[i].match("Year ")) { + newItem.date = contents[i].substr(5); + } else if (contents[i].match("Volume ")) { + newItem.volume = contents[i].substr(7); + } else if (contents[i].match("Issue ")) { + newItem.issue = contents[i].substr(6); + } else if (contents[i].match("pp. ")) { + newItem.pages = contents[i].substr(4); + } + } + } + + //authors + var getAuthors = doc.evaluate('//div[@class="oneResult"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + var chopAuthors1 = getAuthors.indexOf(newItem.title) + newItem.title.length; + var chopAuthors2 = getAuthors.indexOf(newItem.publicationTitle); + + var authors = getAuthors.substr(chopAuthors1, chopAuthors2-chopAuthors1); + if (authors.match(", ")) { + authors = authors.split(", "); + for (var i in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author")); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc,url) == "journalArticle") { + articles = [url]; + + } else if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//div[@id="searchResults"]/div[@class="oneResult"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + var titlesArray = new Array(); + var linksArray = new Array(); + + while (next_title = titles.iterateNext()) { + titlesArray.push(next_title.textContent.replace(/^\s*|\s+$/g, '')); + linksArray.push(next_title.href); + } + + for (var i = 0; i < titlesArray.length; i++) { + + if (linksArray[i].match("article")) { + items[linksArray[i]] = titlesArray[i]; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Philosopher's Imprint.js b/translators/Philosopher's Imprint.js @@ -0,0 +1,88 @@ +{ + "translatorID":"b0abb562-218c-4bf6-af66-c320fdb8ddd3", + "translatorType":4, + "label":"Philosopher's Imprint", + "creator":"Michael Berkowitz", + "target":"http://quod.lib.umich.edu/cgi/t/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-01 04:50:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div/span[text() = "Search Results"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/\d+\.\d+\.\d+/)) { + return "journalArticle"; + } +} + +function getID(str) { + return str.match(/\d+\.\d+\.\d+/)[0]; +} +function doWeb(doc, url) { + var ids = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//div[@class="itemcitation"]//a', doc, null, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + ids.push('http://quod.lib.umich.edu/cgi/t/text/text-idx?c=phimp;view=text;rgn=main;idno=' + getID(i)); + } + } else { + ids = ['http://quod.lib.umich.edu/cgi/t/text/text-idx?c=phimp;view=text;rgn=main;idno=' + getID(url)]; + } + Zotero.Utilities.processDocuments(ids, function(newDoc) { + var rows = newDoc.evaluate('//tr[td[@id="labelcell"]]', newDoc, null, XPathResult.ANY_TYPE, null); + var row; + var data = new Object(); + while (row = rows.iterateNext()) { + var heading = newDoc.evaluate('./td[1]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var value = newDoc.evaluate('./td[2]', row, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + data[heading.replace(/[\s:]/g, "")] = value; + } + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.trimInternal(data['Title']); + if (data['Author']) { + item.creators.push(Zotero.Utilities.cleanAuthor(data['Author'], "author")); + } else if (data['Authors']) { + var authors = data['Authors'].split(","); + for each (var a in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(a, "author")); + } + } + if (data['Keywords']) { + var kws = data['Keywords'].split(/\n/); + for each (var kw in kws) { + if (kw != "") item.tags.push(kw); + } + } + var voliss = data['Source'].replace(item.title, ""); + if (item.creators.length > 1) { + voliss = voliss.replace(data['Authors'], ""); + } else if (item.creators.length == 1) { + voliss = voliss.replace(data['Author'], ""); + } + Zotero.debug(voliss); + item.volume = voliss.match(/vol\.\s+(\d+)/)[1]; + item.issue = voliss.match(/no\.\s+(\d+)/)[1]; + item.pages = voliss.match(/pp\.\s+([\d\-]+)/)[1]; + item.date = Zotero.Utilities.trimInternal(voliss.match(/[^,]+$/)[0]); + item.place = "Ann Arbor, MI"; + item.publisher = "University of Michigan"; + item.abstractNote = data['Abstract']; + item.url = data['URL']; + item.attachments = [ + {url:item.url, title:item.title + " Snapshot", mimeType:"text/html"}, + {url:'http://quod.lib.umich.edu/p/phimp/images/' + getID(item.url) + '.pdf', title:"Philosopher's Imprint Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Pion Journals.js b/translators/Pion Journals.js @@ -0,0 +1,67 @@ +{ + "translatorID":"291934d5-36ec-4b81-ac9c-c5ad5313dba4", + "translatorType":4, + "label":"Pion Journals", + "creator":"Michael Berkowitz", + "target":"http://(www.)?(hthpweb|envplan|perceptionweb).com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-06 08:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/search\.cgi/) || url.match(/ranking/) || url.match(/volume=/)) { + return "multiple"; + } else if (url.match(/abstract\.cgi/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, "abstract.cgi\\?id="); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.debug(arts); + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.publicationTitle = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="footer"]/div[@class="left"]/i', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="total"]/p[2]/font/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="total"]/p[3]/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/,\s*/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + if (doc.evaluate('//div[@id="title"]/div[@class="left"]/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\d+/)) { + var voliss = doc.evaluate('//div[@id="title"]/div[@class="left"]/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/(\d+)\s+volume\s+(\d+)\s*\((\d+)\)\s+(pages\s+(.*))?$/); + Zotero.debug(voliss); + item.date = voliss[1]; + item.volume = voliss[2]; + item.issue = voliss[3]; + if (voliss[5]) item.pages = voliss[5]; + } else { + item.date = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="total"]/p[4]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).match(/(\d+)$/)[1]; + } + item.DOI = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="title"]/div[@class="right"]/font', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(4); + + if (doc.evaluate('//a[contains(@href, ".pdf")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) var pdfurl = doc.evaluate('//a[contains(@href, ".pdf")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + item.url = doc.location.href; + var pub = item.publicationTitle; + item.attachments = [{url:item.url, title:pub + " Snapshot", mimeType:"text/html"}]; + if (pdfurl) item.attachments.push({url:pdfurl, title:pub + " Full Text PDF", mimeType:"application/pdf"}); + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="total"]/p[5]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10); + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/ProQuest.js b/translators/ProQuest.js @@ -0,0 +1,212 @@ +{ + "translatorID":"a77690cf-c5d1-8fc4-110f-d1fc765dcf88", + "translatorType":4, + "label":"ProQuest", + "creator":"Simon Kornblith", + "target":"^https?://[^/]+/pqdweb\\?((?:.*\\&)?did=.*&Fmt=[0-9]|(?:.*\\&)Fmt=[0-9].*&did=|(?:.*\\&)searchInterface=|(?:.*\\&)TS=[0-9])", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 18:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.evaluate('//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]', + doc, nsResolver, XPathResult.ANY_TYPE, null)) { + + + var xpath = '//table[@id="tableIndexTerms"]/tbody/tr/td[@class="textSmall"]'; + var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var aitem; + var source; + while(aitem = data.iterateNext()) { + source=aitem.textContent; + if(source=="Source type:") { + source=data.iterateNext().textContent; + Zotero.debug("Item Source Type: "+source); + break; + } + } + + if(doc.title == "Results") { + return "multiple"; + } else if(doc.title == "Document View") { + switch (source) { + case 'Dissertation': + return "thesis"; + break; + case 'Historical Newspaper': + case 'Newspaper': + return "newspaperArticle"; + default: + return "journalArticle"; + break; + } + + } + } +} + +//^https?://[^/]+/pqdweb\?((?:.*\&)?did=.*&Fmt=[0-9]|(?:.*\&)Fmt=[0-9].*&did=|(?:.*\&)searchInterface=) + +function parseRIS(uris) { + Zotero.Utilities.HTTP.doGet(uris, function(text, xmlhttp, url){ + // load translator for RIS + if(url.match("exportFormat=1")=="exportFormat=1") { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + // Strip lines with just whitespace, which mess up RIS parsing + text = text.replace(/^\s*$\n/gm, ''); + translator.setString(text); + + //Set Handler fixes anomaly in Proquest RIS format. Properly formats author name as [last name], [first name] + translator.setHandler("itemDone", function(obj, item) { + var cre = new Array(); + cre = item.creators; + for each(var e in cre) { + + if(!e['firstName']) { + //check if there is a first name, if not, take the first word in the last name + var names = e['lastName'].split(" "); + e['firstName']=names[0]; + e['lastName']=""; + for(var i = 1; i<names.length; i++) { + e['lastName']+=names[i]; + } + } + } + if (item.publicationTitle) item.publicationTitle = Zotero.Utilities.trimInternal(item.publicationTitle.replace(/\([\d\-]+\)/g, "")); + item.complete(); + }); + + translator.translate(); + Zotero.done(); + } + + }, function() {}); + Zotero.wait(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var hostRegexp = new RegExp("^(https?://[^/]+)/"); + var hMatch = hostRegexp.exec(url); + var host = hMatch[1]; + + + + if(doc.evaluate('//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]', + doc, nsResolver, XPathResult.ANY_TYPE, null)) { + if(doc.title == "Results") { + + //Get Client ID + var xpath = '//a'; + var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var aitem; + var clientID; + while(aitem = data.iterateNext()) { + clientID=aitem.href; + if(clientID.indexOf("clientId")!=-1) { + clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length); + break; + } + } + + var multXpath = '//input[@name="chk"][@type="checkbox"]'; + var titleXpath = '//a[@class="bold"]'; + var mInfos = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmt; + var mInfo; + mInfo = mInfos.iterateNext(); + titleElmt = titleElmts.iterateNext(); + + var items = new Array(); + + do { + //Get item ID + + var str= mInfo.value; + str= str.replace("retrieveGroup", "sid"); + var url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1"; + items[url] = Zotero.Utilities.trimInternal(titleElmt.textContent); + + } while((mInfo = mInfos.iterateNext()) && (titleElmt = titleElmts.iterateNext())); + + items = Zotero.selectItems(items); + if(!items) return true; + + + //Array of URLs for the doGet + var uris = new Array(); + + //Clear Basket + uris.push(host+"/pqdweb?RQT=531&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=532&clientId="+clientID); + + //Add URLS to the basket + for(var bibcode in items) { + uris.push(bibcode); + } + + //Export basket as a RIS file + uris.push(host+"/pqdweb?RQT=532&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID); + + parseRIS(uris); + + } else { + + //Get Client ID + var xpath = '//a'; + var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var aitem; + var clientID; + while(aitem = data.iterateNext()) { + clientID=aitem.href; + if(clientID.indexOf("clientId")!=-1) { + clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length); + break; + } + } + + //Get item ID + var xpath = '//input[@name="marked"][@type="checkbox"]'; + var str= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + str= str.replace("retrieveGroup", "sid"); + + //Array of URLs for the doGet + var uris = new Array(); + + //Clear Basket + uris.push(host+"/pqdweb?RQT=531&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=532&clientId="+clientID); + + //Create URL to add item to basket + url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1"; + Zotero.debug("RIS URL: "+url); + + uris.push(url); + + //Export basket as a RIS file + uris.push(host+"/pqdweb?RQT=532&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID); + uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID); + + parseRIS(uris); + + } + } + +} +\ No newline at end of file diff --git a/translators/Probing the Past.js b/translators/Probing the Past.js @@ -0,0 +1,102 @@ +{ + "translatorID":"095239e7-c18c-4f45-a932-bcf4a9e48c08", + "translatorType":4, + "label":"Probing the Past", + "creator":"Adam Crymble", + "target":"http://chnm.gmu.edu/probateinventory/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//td/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.location.href.match("document")) { + return "book"; + } + +} + +//Probing the Past translator; Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + + var newItem = new Zotero.Item("book"); + + var title = doc.evaluate('//h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var author = title.split(", "); + author = author[1] + " " + author[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + + newItem.title = "Probate of " + author; + + var citation = doc.evaluate('//table[@id="browseinfo"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var citation = citation.split(": "); + citation[1] = citation[1].replace("County/City", ''); + + + citation[2] = citation[2].replace("State", ''); + for (var i = 0; i < citation.length; i++) { + citation[i] = citation[i].replace(/^\s*|\s*$/g, ''); + } + Zotero.debug(citation); + + newItem.date = citation[1]; + newItem.place = citation[2] + ", " + citation[3]; + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titlesCount = doc.evaluate('count (//td/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_date; + var next_title; + var next_town; + + for (var i = 0; i < titlesCount.numberValue/3; i++) { + + next_date = titles.iterateNext(); + next_title = titles.iterateNext(); + + items[next_title.href] = next_title.textContent; + + next_town = titles.iterateNext(); + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Progress of Theoretical Physics.js b/translators/Progress of Theoretical Physics.js @@ -0,0 +1,79 @@ +{ + "translatorID":"0b356cb6-7fa1-4662-b6e8-7ffc9ca2cd4a", + "translatorType":4, + "label":"Progress of Theoretical Physics", + "creator":"Michael Berkowitz", + "target":"http://ptp.ipap.jp/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-23 09:45:00" +} + +function detectWeb(doc, url) { + if (doc.title.match(/search result/) || doc.title.match(/Table of Contents/)) { + return "multiple"; + } else if (url.match(/getarticle\?/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title.toLowerCase().match(/search result/)) { + var titles = doc.evaluate('/html/body//li//b', doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate('/html/body//li/a', doc, null, XPathResult.ANY_TYPE, null); + var title; + var link; + while ((title = titles.iterateNext()) && (link = links.iterateNext())) { + items[link.href] = Zotero.Utilities.trimInternal(title.textContent); + } + } else if (doc.title.toLowerCase().match(/table of contents/)) { + var xpath = doc.evaluate('/html/body/ul/li/a', doc, null, XPathResult.ANY_TYPE, null); + var text; + while (text = xpath.iterateNext()) { + items[text.href] = Zotero.Utilities.trimInternal(text.textContent); + } + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.ISSN = '0033-068X'; + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//h2[@class="title"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (doc.evaluate('//h2[@class="subtitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + item.title = item.title + ": " + Zotero.Utilities.trimInternal(doc.evaluate('//h2[@class="subtitle"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//p[@class="abstract"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(doc.evaluate('/html/body/p[@class="author"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent)); + authors = authors.replace(/[*()]+/g, "").split(/(,\s+|\band\b)/); + for each (var aut in authors) { + if (!aut.match(/(,|and)/)) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } + var info = Zotero.Utilities.trimInternal(doc.evaluate('//h4[@class="info"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + info = info.match(/Vol\.\s+(\d+)\s+No\.\s+(\d+)\s+\((\d+)\)\s+pp\.\s+([\d-]+)\s+URL\s+:\s+(.*)\s+DOI\s+:\s+(.*)$/); + item.volume = info[1]; + item.issue = info[2]; + item.date = info[3]; + item.pages = info[4]; + item.url = info[5]; + item.DOI = info[6]; + var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + item.attachments = [ + {url:item.url, title:"PTP Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"PTP Full Text PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Project Gutenberg.js b/translators/Project Gutenberg.js @@ -0,0 +1,175 @@ +{ + "translatorID":"d770e7d2-106c-4396-8c32-b35cdc46376c", + "translatorType":0, + "label":"Project Gutenberg", + "creator":"Adam Crymble", + "target":"http://www.gutenberg.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-11 20:40:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("etext")||doc.location.href.match("ebooks")) { + return "book"; + } else if (doc.location.href.match("catalog")) { + return "multiple"; + } +} + +//Project Gutenberg translator. Code by Adam Crymble. + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var odd = "yes"; + var creatorType = new Array(); + var creatorField = new Array(); + var creatorContent = new Array(); + + var newItem = new Zotero.Item("book"); + + var headingsEven = doc.evaluate('//tr[@class="oddrow"]/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var headingsEvenCount = doc.evaluate('count(//tr[@class="oddrow"]/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var headingsOdd = doc.evaluate('//tr[@class="evenrow"]/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var headingsOddCount = doc.evaluate('count(//tr[@class="evenrow"]/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var content = doc.evaluate('//div[@class="pgdbdata"]/table/tbody//td', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i = 0; i < headingsEvenCount.numberValue + headingsOddCount.numberValue; i++) { + if (odd == "yes") { + fieldTitle = headingsOdd.iterateNext().textContent.replace(/\s+/g, ''); + odd = "no"; + } else { + fieldTitle = headingsEven.iterateNext().textContent.replace(/\s+/g, ''); + odd = "yes"; + } + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(content.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + + if (fieldTitle == "Creator") { + + creatorType.push("author"); + creatorField.push("Creator"); + creatorContent.push(dataTags[fieldTitle]); + + } else if (fieldTitle == "Illustrator") { + + creatorType.push("illustrator"); + creatorField.push("Illustrator"); + creatorContent.push(dataTags[fieldTitle]); + + }else if (fieldTitle == "Translator") { + + creatorType.push("translator"); + creatorField.push("Translator"); + creatorContent.push(dataTags[fieldTitle]); + + } else if (fieldTitle == "Editor") { + + creatorType.push("editor"); + creatorField.push("Editor"); + creatorContent.push(dataTags[fieldTitle]); + + } else if (fieldTitle == "Commentator") { + + creatorType.push("commentator"); + creatorField.push("Commentator"); + creatorContent.push(dataTags[fieldTitle]); + + } else if (fieldTitle == "Contributor") { + + creatorType.push("contributor"); + creatorField.push("Contributor"); + creatorContent.push(dataTags[fieldTitle]); + } + if (fieldTitle == "Imprint") { + var place = dataTags["Imprint"].split(":"); + newItem.place = place[0]; + Zotero.debug(place); + } + + if (fieldTitle == "Subject") { + newItem.tags[i] = dataTags["Subject"]; + } + } + + for (var i = 0; i < creatorType.length; i++) { + if (creatorContent[i].match(", ")) { + + var author = creatorContent[i].split(", "); + var author = author[1] + " " + author[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, creatorType[i])); + } else { + + newItem.creators.push(Zotero.Utilities.cleanAuthor(creatorContent[i], creatorType[i])); + } + } + + + if (dataTags["EText-No."]) { + newItem.callNumber = "EText-No. " + dataTags["EText-No."]; + } + + if (dataTags["ReleaseDate"]) { + newItem.date = "Release Date " + dataTags["ReleaseDate"]; + } + + if (dataTags["LoCClass"]) { + newItem.extra = "LoC Class " + dataTags["LoCClass"]; + } + + associateData (newItem, dataTags, "Title", "title"); + associateData (newItem, dataTags, "Language", "language"); + associateData (newItem, dataTags, "CopyrightStatus", "rights"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var allLinks = doc.evaluate('//td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count(//td/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + for (var i = 0; i < xPathCount.numberValue; i++) { + next_title = allLinks.iterateNext(); + if (next_title.href.match("etext")) { + items[next_title.href] = next_title.textContent; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Project MUSE.js b/translators/Project MUSE.js @@ -0,0 +1,127 @@ +{ + "translatorID":"c54d1932-73ce-dfd4-a943-109380e06574", + "translatorType":4, + "label":"Project MUSE", + "creator":"Simon Kornblith", + "target":"https?://[^/]*muse\\.jhu\\.edu[^/]*/(?:journals/[^/]+/[^/]+/[^/]+\\.html|search/results)", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-21 15:45:00" +} + +function detectWeb(doc, url) { + var searchRe = new RegExp("^https?://[^/]+/search/results"); + if(searchRe.test(url)) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var searchRe = new RegExp("^https?://[^/]+/search/results"); + if(detectWeb(doc, url) == "multiple") { + var items = new Array(); + var attachments = new Array(); + var pdfRe = /\.pdf$/i; + var htmlRe = /\.html$/i; + + var tableRows = doc.evaluate('//div[@id="advancedsearch"]/save_form/table//tr', + doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + // aid (article id) is what we need to get it all as one file + var input = doc.evaluate('.//input[@name="aid"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + var title = doc.evaluate('.//div[@class="title"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(input && input.value && title && title.textContent) { + items[input.value] = title.textContent; + + var aTags = tableRow.getElementsByTagName("a"); + + // get attachments + attachments[input.value] = new Array(); + for(var i=0; i<aTags.length; i++) { + if(pdfRe.test(aTags[i].href)) { + attachments[input.value].push({url:aTags[i].href, + title:"Project MUSE Full Text PDF", + mimeType:"application/pdf"}); + } else if(htmlRe.test(aTags[i].href)) { + attachments[input.value].push({url:aTags[i].href, + title:"Project MUSE Snapshot", + mimeType:"text/html"}); + } + } + } + } + items = Zotero.selectItems(items); + if(!items) { + return true; + } + + var articleString = ""; + var newAttachments = new Array(); + for(var i in items) { + articleString += "&aid="+i; + newAttachments.push(attachments[i]); + } + + Zotero.Utilities.HTTP.doGet("http://muse.jhu.edu/search/export.cgi?exporttype=endnote"+articleString, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes && item.notes[0]) { + item.extra = item.notes[0].note; + delete item.notes; + item.notes = undefined; + } + item.attachments = newAttachments.shift(); + item.complete(); + }); + translator.translate(); + Zotero.done(); + }, function() {}); + + Zotero.wait(); + } else { + var hostRe = new RegExp("^(http://[^/]+)/"); + var m = hostRe.exec(url); + var host = m[1]; + + var getPDF = doc.evaluate('//a[text() = "[Access article in PDF]"]', doc, + nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + var newUrl = url.replace(host, host+"/metadata/zotero"); + Zotero.Utilities.HTTP.doGet(newUrl, function(text) { + var translator = Zotero.loadTranslator("import"); + //set RIS translator + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if(item.notes && item.notes[0]) { + item.extra = item.notes[0].note; + delete item.notes; + item.notes = undefined; + } + item.attachments.splice(0); + item.attachments.push({document:doc, title:"Project MUSE Snapshot"}); + if(getPDF) { + item.attachments.push({title:"Project MUSE Full Text PDF", mimeType:"application/pdf", + url:getPDF.href}); + } + + item.complete(); + }); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/Protein Data Bank.js b/translators/Protein Data Bank.js @@ -0,0 +1,86 @@ +{ + "translatorID":"e16095ae-986c-4117-9cb6-20f3b7a52f64", + "translatorType":4, + "label":"Protein Data Bank", + "creator":"Michael Berkowitz", + "target":"http://www.pdb.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-02-19 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.title.indexOf("Query Results") != -1) { + return "multiple"; + } else if (url.indexOf("structureId") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var proteins = new Array(); + if (detectWeb(doc, url) == "multiple") { + //search results + var items = new Object(); + var xpath = '//a[@class="qrb_title"]'; + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href.match(/structureId=(.*)/)[1]] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + proteins.push(i); + } + } else { + proteins = [url.match(/structureId=(.*)/)[1]]; + } + + Zotero.debug(proteins); + for (var p in proteins) { + var xmlstr = 'http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=xml&headerOnly=YES&structureId=' + proteins[p]; + Zotero.debug(xmlstr); + + Zotero.Utilities.HTTP.doGet(xmlstr, function(text) { + var item = new Zotero.Item("journalArticle"); + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "").replace(/PDBx\:/g, ""); + var article = text.split('<citation id="primary">'); + var art = article[1].split(/<\/citation>\n/); + art = "<citation>" + art[0] + "</citation>"; + var xml = new XML(art); + var info = text.split('<database_PDB_revCategory>')[1].split('</database_PDB_revCategory>')[0]; + var xml2 = new XML("<PDB_revCategory>" + info + "</PDB_revCategory>"); + var aus = text.split('<citation_authorCategory>')[1].split('</citation_authorCategory>')[0]; + aus = "<authors>" + aus + "</authors>"; + var xml3 = new XML(aus); + + item.title = xml..title.text().toString(); + item.publicationTitle = xml..journal_abbrev.text().toString(); + item.volume = xml..journal_volume.text().toString(); + item.pages = xml..page_first.text().toString() + "-" + xml..page_last.text().toString(); + item.ISSN = xml..journal_id_ISSN.text().toString(); + item.extra = "PubMed ID: " + xml..pdbx_database_id_PubMed.text().toString(); + if (xml..pdbx_database_id_DOI.length()) { + item.DOI = xml..pdbx_database_id_DOI.text().toString(); + } + item.date = xml2..date_original.text().toString(); + item.url = 'http://www.pdb.org/pdb/explore/explore.do?structureId=' + xml2..replaces.text().toString(); + + var authors = xml3..citation_author.toString().split(/\n/); + for (var i in authors) { + var name = authors[i].match(/name=\"([^"]+)\"/)[1].split(", ");; + Zotero.debug(name); + item.creators.push({firstName:name[1], lastName:name[0], creatorType:"author"}); + } + item.attachments = [ + {url:item.url, title:"PDB Snapshot", mimeType:"text/html"}, + {url:'http://www.pdb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId=' + proteins[p], title:"Protein Data Bank .pdb File", mimeType:"chemical/x-pdb"} + ] + item.complete(); + }); + Zotero.done; + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/PubMed Central.js b/translators/PubMed Central.js @@ -0,0 +1,92 @@ +{ + "translatorID":"27ee5b2c-2a5a-4afc-a0aa-d386642d4eed", + "translatorType":4, + "label":"PubMed Central", + "creator":"Michael Berkowitz", + "target":"http://[^/]*.nih.gov/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//table[@id="ResultPanel"]//td[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("articlerender") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var tagMap = {journal_title:"publicationTitle", + title:"title", + date:"date", + issue:"issue", + volume:"volume", + doi:"DOI", + fulltext_html_url:"url" + } + var URIs = new Array(); + var items = new Object(); + if (doc.title.indexOf("PMC Results") != -1) { + var titlex = '//div[@class="toc-entry"]/div/div[@class="toc-title"]'; + var linkx = '//div[@class="toc-entry"]/div/a[@class="toc-link"][1]'; + + var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null); + var next_title = titles.iterateNext(); + var links = doc.evaluate(linkx, doc, null, XPathResult.ANY_TYPE, null); + var next_link = links.iterateNext(); + while (next_title && next_link) { + items[next_link.href] = next_title.textContent; + next_title = titles.iterateNext(); + next_link = links.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + URIs.push(i); + } + } else { + URIs.push(url); + } + for each (var link in URIs) { + Zotero.Utilities.HTTP.doGet(link, function(text) { + var tags = new Object(); + var meta = text.match(/<meta[^>]*>/gi); + for (var i in meta) { + var item = meta[i].match(/=\"([^"]*)\"/g); + if (item[0].substring(2, 10) == 'citation') { + tags[item[0].substring(11, item[0].length - 1)] = item[1].substring(2, item[1].length - 1); + } + } + var newItem = new Zotero.Item("journalArticle"); + for (var tag in tagMap) { + newItem[tagMap[tag]] = Zotero.Utilities.unescapeHTML(tags[tag]); + } + for (var i in meta) { + if (meta[i].match(/DC.Contributor/)) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.unescapeHTML(meta[i].match(/content=\"([^"]*)\">/)[1]), "author")); + } + } + newItem.attachments.push({url:tags["fulltext_html_url"], title:"PubMed Central Snapshot", mimeType:"text/html"}); + if (tags["pdf_url"]) { + newItem.attachments.push({url:tags["pdf_url"], title:"PubMed Central Full Text PDF", mimeType:"application/pdf"}); + } + newItem.url = tags["fulltext_html_url"]; + if (!newItem.url) newItem.url = tags["abstract_html_url"]; + newItem.extra = text.match(/PMC\d+/)[0]; + newItem.journalAbbreviation = text.match(/span class=\"citation-abbreviation\">([^<]+)</)[1]; + newItem.pages = text.match(/span class=\"citation-flpages\">([^<]+)</)[1].replace(/[\.:\s]/g, ""); + + if (text.match(/Abstract<\/div>([^<]+)</)) { + var abstract = text.match(/Abstract<\/div>([^<]+)</)[1]; + } else if (text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)) { + var abstract = text.match(/\"section-content\"><!\-\-article\-meta\-\->([^<]+)/)[1]; + } + if (abstract) newItem.abstractNote = abstract; + newItem.complete(); + }); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/RDF.js b/translators/RDF.js @@ -0,0 +1,594 @@ +{ + "translatorID":"5e3ad958-ac79-463d-812b-a86a9235c28f", + "translatorType":1, + "label":"RDF", + "creator":"Simon Kornblith", + "target":"rdf", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-22 15:55:00" +} + +Zotero.configure("dataMode", "rdf"); + +function detectImport() { + // unfortunately, Mozilla will let you create a data source from any type + // of XML, so we need to make sure there are actually nodes + + var nodes = Zotero.RDF.getAllResources(); + if(nodes) { + return true; + } +} + +var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + +var n = { + bib:"http://purl.org/net/biblio#", + dc:"http://purl.org/dc/elements/1.1/", + dcterms:"http://purl.org/dc/terms/", + prism:"http://prismstandard.org/namespaces/1.2/basic/", + foaf:"http://xmlns.com/foaf/0.1/", + vcard:"http://nwalsh.com/rdf/vCard#", + link:"http://purl.org/rss/1.0/modules/link/", + z:"http://www.zotero.org/namespaces/export#" +}; + +var callNumberTypes = [n.dcterms+"LCC", n.dcterms+"DDC", n.dcterms+"UDC"]; + +var defaultUnknownType = "book"; + +// gets the first result set for a property that can be encoded in multiple +// ontologies +function getFirstResults(node, properties, onlyOneString) { + for(var i=0; i<properties.length; i++) { + var result = Zotero.RDF.getTargets(node, properties[i]); + if(result) { + if(onlyOneString) { + // onlyOneString means we won't return nsIRDFResources, only + // actual literals + if(typeof(result[0]) != "object") { + return result[0]; + } + } else { + return result; + } + } + } + return; // return undefined on failure +} + +// adds creators to an item given a list of creator nodes +function handleCreators(newItem, creators, creatorType) { + if(!creators) { + return; + } + + if(typeof(creators[0]) != "string") { // see if creators are in a container + try { + var creators = Zotero.RDF.getContainerElements(creators[0]); + } catch(e) {} + } + + if(typeof(creators[0]) == "string") { // support creators encoded as strings + for(var i in creators) { + if(typeof(creators[i]) != "object") { + newItem.creators.push(Zotero.Utilities.cleanAuthor(creators[i], creatorType, true)); + } + } + } else { // also support foaf + for(var i in creators) { + var type = Zotero.RDF.getTargets(creators[i], rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + if(type == n.foaf+"Person") { // author is FOAF type person + var creator = new Array(); + creator.lastName = getFirstResults(creators[i], + [n.foaf+"surname", n.foaf+"family_name"], true); + creator.firstName = getFirstResults(creators[i], + [n.foaf+"givenname", n.foaf+"firstName"], true); + creator.creatorType = creatorType; + newItem.creators.push(creator); + } + } + } + } +} + +// processes collections recursively +function processCollection(node, collection) { + if(!collection) { + collection = new Array(); + } + collection.type = "collection"; + collection.name = getFirstResults(node, [n.dc+"title"], true); + collection.children = new Array(); + + // check for children + var children = getFirstResults(node, [n.dcterms+"hasPart"]); + for each(var child in children) { + var type = Zotero.RDF.getTargets(child, rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + } + + if(type == n.bib+"Collection" || type == n.z+"Collection") { + // for collections, process recursively + collection.children.push(processCollection(child)); + } else { + // all other items are added by ID + collection.children.push({id:Zotero.RDF.getResourceURI(child), type:"item"}); + } + } + + return collection; +} + +function processSeeAlso(node, newItem) { + var relations; + newItem.itemID = Zotero.RDF.getResourceURI(node); + newItem.seeAlso = new Array(); + if(relations = getFirstResults(node, [n.dc+"relation"])) { + for each(var relation in relations) { + newItem.seeAlso.push(Zotero.RDF.getResourceURI(relation)); + } + } +} + +function processTags(node, newItem) { + var subjects; + newItem.tags = new Array(); + if(subjects = getFirstResults(node, [n.dc+"subject"])) { + for each(var subject in subjects) { + if(typeof(subject) == "string") { // a regular tag + newItem.tags.push(subject); + } else { + // a call number + var type = Zotero.RDF.getTargets(subject, rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + if(type == n.z+"AutomaticTag") { + newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1}); + } + } + } + } + } +} + +// gets the node with a given type from an array +function getNodeByType(nodes, type) { + if(!nodes) { + return false; + } + + for each(var node in nodes) { + var nodeType = Zotero.RDF.getTargets(node, rdf+"type"); + if(nodeType) { + nodeType = Zotero.RDF.getResourceURI(nodeType[0]); + if(nodeType == type) { // we have a node of the correct type + return node; + } + } + } + return false; +} + +// returns true if this resource is part of another (related by any arc besides +// dc:relation or dcterms:hasPart) +// +// used to differentiate independent notes and files +function isPart(node) { + var arcs = Zotero.RDF.getArcsIn(node); + var skip = false; + for each(var arc in arcs) { + arc = Zotero.RDF.getResourceURI(arc); + if(arc != n.dc+"relation" && arc != n.dcterms+"hasPart") { + // related to another item by some arc besides see also + skip = true; + } + } + return skip; +} + +function importItem(newItem, node, type) { + var container = undefined; + + // also deal with type detection based on parts, so we can differentiate + // magazine and journal articles, and find container elements + var isPartOf = getFirstResults(node, [n.dcterms+"isPartOf"]); + + // get parts of parts, because parts are sections of wholes. + if(isPartOf) { + for(var i=0; i<isPartOf.length; i++) { + var subParts = getFirstResults(isPartOf[i], [n.dcterms+"isPartOf"]); + if(subParts) { + isPartOf = isPartOf.concat(subParts); + } + } + } + + if(type) { + if(type == n.bib+"Book") { + newItem.itemType = "book"; + } else if(type == n.bib+"BookSection") { + newItem.itemType = "bookSection"; + container = getNodeByType(isPartOf, n.bib+"Book"); + } else if(type == n.bib+"Article") { // choose between journal, + // newspaper, and magazine + // articles + // use of container = (not container ==) is intentional + if(container = getNodeByType(isPartOf, n.bib+"Journal")) { + newItem.itemType = "journalArticle"; + } else if(container = getNodeByType(isPartOf, n.bib+"Periodical")) { + newItem.itemType = "magazineArticle"; + } else if(container = getNodeByType(isPartOf, n.bib+"Newspaper")) { + newItem.itemType = "newspaperArticle"; + } + } else if(type == n.bib+"Thesis") { + newItem.itemType = "thesis"; + } else if(type == n.bib+"Letter") { + newItem.itemType = "letter"; + } else if(type == n.bib+"Manuscript") { + newItem.itemType = "manuscript"; + } else if(type == n.bib+"Interview") { + newItem.itemType = "interview"; + } else if(type == n.bib+"MotionPicture") { + newItem.itemType = "film"; + } else if(type == n.bib+"Illustration") { + newItem.itemType = "artwork"; + } else if(type == n.bib+"Document") { + if(container = getNodeByType(isPartOf, n.bib+"CourtReporter")) { + newItem.itemType = "case"; + } else { + newItem.itemType = "webpage"; + } + } else if(type == n.bib+"Memo") { + newItem.itemType = "note"; + } else if(type == n.z+"Attachment") { + // unless processing of independent attachment is intended, don't + // process + + // process as file + newItem.itemType = "attachment"; + + var path = getFirstResults(node, [rdf+"resource"]); + if(path) { + newItem.path = Zotero.RDF.getResourceURI(path[0]); + } + newItem.charset = getFirstResults(node, [n.link+"charset"], true); + newItem.mimeType = getFirstResults(node, [n.link+"type"], true); + } else if(type == n.bib+"Report") { + newItem.itemType = "report"; + } else if(type == n.bib+"Legislation") { + newItem.itemType = "statute"; + } else if(type == n.bib+"Patent") { + newItem.itemType = "patent"; + } else if(type == n.bib+"Image") { + newItem.itemType = "artwork"; + } else if(type == n.bib+"Recording") { + newItem.itemType = "audioRecording"; + } + } + + // check to see if we recognize the type in the fs or dc namespaces + var zoteroType = getFirstResults(node, [n.z+"itemType", n.z+"type", n.dc+"type"], true); + if(Zotero.Utilities.itemTypeExists(zoteroType)) { + newItem.itemType = zoteroType; + } + + if(newItem.itemType == "blogPost") { + container = getNodeByType(isPartOf, n.z+"Blog"); + } else if(newItem.itemType == "forumPost") { + container = getNodeByType(isPartOf, n.z+"Forum"); + } else if(newItem.itemType == "webpage") { + container = getNodeByType(isPartOf, n.z+"Website"); + } + + // title + newItem.title = getFirstResults(node, [n.dc+"title"], true); + if(!newItem.itemType && !newItem.title) { // require the title + // (if not a known type) + return false; + } + + if(!newItem.itemType) { + newItem.itemType = defaultUnknownType; + } + + // regular author-type creators + var possibleCreatorTypes = Zotero.Utilities.getCreatorsForType(newItem.itemType); + for each(var creatorType in possibleCreatorTypes) { + if(creatorType == "author") { + var creators = getFirstResults(node, [n.bib+"authors", n.dc+"creator"]); + } else if(creatorType == "editor" || creatorType == "contributor") { + var creators = getFirstResults(node, [n.bib+creatorType+"s"]); + } else { + var creators = getFirstResults(node, [n.z+creatorType+"s"]); + } + + if(creators) handleCreators(newItem, creators, creatorType); + } + + // source + newItem.source = getFirstResults(node, [n.dc+"source"], true); + + // rights + newItem.rights = getFirstResults(node, [n.dc+"rights"], true); + + // section + var section = getNodeByType(isPartOf, n.bib+"Part"); + if(section) { + newItem.section = getFirstResults(section, [n.dc+"title"], true); + } + + // publication + if(container) { + newItem.publicationTitle = getFirstResults(container, [n.dc+"title"], true); + // these fields mean the same thing + newItem.reporter = newItem.publicationTitle; + } + + // series + var series = getNodeByType(isPartOf, n.bib+"Series"); + if(series) { + newItem.series = getFirstResults(series, [n.dc+"title"], true); + newItem.seriesTitle = getFirstResults(series, [n.dcterms+"alternative"], true); + newItem.seriesText = getFirstResults(series, [n.dc+"description"], true); + newItem.seriesNumber = getFirstResults(series, [n.dc+"identifier"], true); + } + + // volume + newItem.volume = getFirstResults((container ? container : node), [n.prism+"volume"], true); + + // issue + newItem.issue = getFirstResults((container ? container : node), [n.prism+"number"], true); + // these mean the same thing + newItem.patentNumber = newItem.number = newItem.issue; + + // edition + newItem.edition = getFirstResults(node, [n.prism+"edition"], true); + // these fields mean the same thing + newItem.version = newItem.edition; + + // pages + newItem.pages = getFirstResults(node, [n.bib+"pages"], true); + + // mediums + newItem.artworkMedium = newItem.interviewMedium = getFirstResults(node, [n.dcterms+"medium"], true); + + // publisher + var publisher = getFirstResults(node, [n.dc+"publisher"]); + if(publisher) { + if(typeof(publisher[0]) == "string") { + newItem.publisher = publisher[0]; + } else { + var type = Zotero.RDF.getTargets(publisher[0], rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + if(type == n.foaf+"Organization") { // handle foaf organizational publishers + newItem.publisher = getFirstResults(publisher[0], [n.foaf+"name"], true); + var place = getFirstResults(publisher[0], [n.vcard+"adr"]); + if(place) { + newItem.place = getFirstResults(place[0], [n.vcard+"locality"]); + } + } + } + } + } + + // these fields mean the same thing + newItem.distributor = newItem.label = newItem.company = newItem.institution = newItem.publisher; + + // date + newItem.date = getFirstResults(node, [n.dc+"date"], true); + // accessDate + newItem.accessDate = getFirstResults(node, [n.dcterms+"dateSubmitted"], true); + // issueDate + newItem.issueDate = getFirstResults(node, [n.dcterms+"issued"], true); + // lastModified + newItem.lastModified = getFirstResults(node, [n.dcterms+"modified"], true); + + // identifier + var identifiers = getFirstResults(node, [n.dc+"identifier"]); + if(container) { + var containerIdentifiers = getFirstResults(container, [n.dc+"identifier"]); + // concatenate sets of identifiers + if(containerIdentifiers) { + if(identifiers) { + identifiers = identifiers.concat(containerIdentifiers); + } else { + identifiers = containerIdentifiers; + } + } + } + + if(identifiers) { + for(var i in identifiers) { + if(typeof(identifiers[i]) == "string") { + // grab other things + var beforeSpace = identifiers[i].substr(0, identifiers[i].indexOf(" ")).toUpperCase(); + + if(beforeSpace == "ISBN") { + newItem.ISBN = identifiers[i].substr(5).toUpperCase(); + } else if(beforeSpace == "ISSN") { + newItem.ISSN = identifiers[i].substr(5).toUpperCase(); + } else if(beforeSpace == "DOI") { + newItem.DOI = identifiers[i].substr(4); + } else if(!newItem.accessionNumber) { + newItem.accessionNumber = identifiers[i]; + } + } else { + // grab URLs + var type = Zotero.RDF.getTargets(identifiers[i], rdf+"type"); + if(type && (type = Zotero.RDF.getResourceURI(type[0])) && type == n.dcterms+"URI") { + newItem.url = getFirstResults(identifiers[i], [rdf+"value"], true); + } + } + } + } + + // archiveLocation + newItem.archiveLocation = getFirstResults(node, [n.dc+"coverage"], true); + + // abstract + newItem.abstractNote = getFirstResults(node, [n.dcterms+"abstract"], true); + + // type + var type = getFirstResults(node, [n.dc+"type"], true); + // these all mean the same thing + var typeProperties = ["reportType", "videoRecordingType", "letterType", + "manuscriptType", "mapType", "thesisType", "websiteType", + "audioRecordingType", "presentationType", "postType", + "audioFileType"]; + for each(var property in typeProperties) { + newItem[property] = type; + } + + // conferenceName + var conference = getFirstResults(node, [n.bib+"presentedAt"]); + if(conference) { + conference = conference[0]; + if(typeof(conference) == "string") { + newItem.conferenceName = conference; + } else { + newItem.conferenceName = getFirstResults(conference, [n.dc+"title"], true); + } + } + + // journalAbbreviation + newItem.journalAbbreviation = getFirstResults((container ? container : node), [n.dcterms+"alternative"], true); + + // see also + processSeeAlso(node, newItem); + + // description/attachment note + if(newItem.itemType == "attachment") { + newItem.note = getFirstResults(node, [n.dc+"description"], true); + } else { + newItem.extra = getFirstResults(node, [n.dc+"description"], true); + } + + /** NOTES **/ + + var referencedBy = Zotero.RDF.getTargets(node, n.dcterms+"isReferencedBy"); + for each(var referentNode in referencedBy) { + var type = Zotero.RDF.getTargets(referentNode, rdf+"type"); + if(type && Zotero.RDF.getResourceURI(type[0]) == n.bib+"Memo") { + // if this is a memo + var note = new Array(); + note.note = getFirstResults(referentNode, [rdf+"value", n.dc+"description"], true); + if(note.note != undefined) { + // handle see also + processSeeAlso(referentNode, note); + processTags(referentNode, note); + + // add note + newItem.notes.push(note); + } + } + } + + if(newItem.itemType == "note") { + // add note for standalone + newItem.note = getFirstResults(node, [rdf+"value", n.dc+"description"], true); + } + + /** TAGS **/ + + var subjects = getFirstResults(node, [n.dc+"subject"]); + for each(var subject in subjects) { + if(typeof(subject) == "string") { // a regular tag + newItem.tags.push(subject); + } else { // a call number or automatic tag + var type = Zotero.RDF.getTargets(subject, rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + if(Zotero.Utilities.inArray(type, callNumberTypes)) { + newItem.callNumber = getFirstResults(subject, [rdf+"value"], true); + } else if(type == n.z+"AutomaticTag") { + newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1}); + } + } + } + } + + /** ATTACHMENTS **/ + var relations = getFirstResults(node, [n.link+"link"]); + for each(var relation in relations) { + var type = Zotero.RDF.getTargets(relation, rdf+"type"); + if(Zotero.RDF.getResourceURI(type[0]) == n.z+"Attachment") { + var attachment = new Zotero.Item(); + newItem.attachments.push(attachment); + importItem(attachment, relation, n.z+"Attachment"); + } + } + + /** OTHER FIELDS **/ + var arcs = Zotero.RDF.getArcsOut(node); + for each(var arc in arcs) { + var uri = Zotero.RDF.getResourceURI(arc); + if(uri.substr(0, n.z.length) == n.z) { + var property = uri.substr(n.z.length); + newItem[property] = Zotero.RDF.getTargets(node, n.z+property)[0]; + } + } + + return true; +} + +function doImport() { + var nodes = Zotero.RDF.getAllResources(); + if(!nodes) { + return false; + } + + // keep track of collections while we're looping through + var collections = new Array(); + + for each(var node in nodes) { + var newItem = new Zotero.Item(); + newItem.itemID = Zotero.RDF.getResourceURI(node); + + // figure out if this is a part of another resource, or a linked + // attachment + if(Zotero.RDF.getSources(node, n.dcterms+"isPartOf") || + Zotero.RDF.getSources(node, n.bib+"presentedAt") || + Zotero.RDF.getSources(node, n.link+"link")) { + continue; + } + + // type + var type = Zotero.RDF.getTargets(node, rdf+"type"); + if(type) { + type = Zotero.RDF.getResourceURI(type[0]); + + // skip if this is not an independent attachment, + if((type == n.z+"Attachment" || type == n.bib+"Memo") && isPart(node)) { + continue; + } else if(type == n.bib+"Collection" || type == n.z+"Collection") { + // skip collections until all the items are done + collections.push(node); + continue; + } + } else { + type = false; + } + + if(importItem(newItem, node, type)) { + newItem.complete(); + } + } + + /* COLLECTIONS */ + + for each(var collection in collections) { + if(!Zotero.RDF.getArcsIn(collection)) { + var newCollection = new Zotero.Collection(); + processCollection(collection, newCollection); + newCollection.complete(); + } + } +} +\ No newline at end of file diff --git a/translators/RIS.js b/translators/RIS.js @@ -0,0 +1,522 @@ +{ + "translatorID":"32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7", + "translatorType":3, + "label":"RIS", + "creator":"Simon Kornblith", + "target":"ris", + "minVersion":"1.0.2", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 23:50:00" +} + +Zotero.configure("dataMode", "line"); +Zotero.addOption("exportNotes", true); +Zotero.addOption("exportCharset", "UTF-8"); + +function detectImport() { + var line; + var i = 0; + while((line = Zotero.read()) !== "false") { + line = line.replace(/^\s+/, ""); + if(line != "") { + if(line.substr(0, 6).match(/^TY {1,2}- /)) { + return true; + } else { + if(i++ > 3) { + return false; + } + } + } + } +} + +var fieldMap = { + ID:"itemID", + T1:"title", + T3:"series", + JF:"publicationTitle", + CP:"place", + JA:"journalAbbreviation", + M3:"DOI" +}; + +var inputFieldMap = { + TI:"title", + CT:"title", + CY:"place" +}; + +// TODO: figure out if these are the best types for letter, interview, webpage +var typeMap = { + book:"BOOK", + bookSection:"CHAP", + journalArticle:"JOUR", + magazineArticle:"MGZN", + newspaperArticle:"NEWS", + thesis:"THES", + letter:"PCOMM", + manuscript:"PAMP", + interview:"PCOMM", + film:"MPCT", + artwork:"ART", + report:"RPRT", + bill:"BILL", + case:"CASE", + hearing:"HEAR", + patent:"PAT", + statute:"STAT", + map:"MAP", + blogPost:"ELEC", + webpage:"ELEC", + instantMessage:"ICOMM", + forumPost:"ICOMM", + email:"ICOMM", + audioRecording:"SOUND", + presentation:"GEN", + videoRecording:"VIDEO", + tvBroadcast:"GEN", + radioBroadcast:"GEN", + podcast:"GEN", + computerProgram:"COMP", + conferencePaper:"CONF", + document:"GEN" +}; + +// supplements outputTypeMap for importing +// TODO: DATA, MUSIC +var inputTypeMap = { + ABST:"journalArticle", + ADVS:"film", + CTLG:"magazineArticle", + INPR:"manuscript", + JFULL:"journalArticle", + PAMP:"manuscript", + SER:"book", + SLIDE:"artwork", + UNBILL:"manuscript" +}; + +function processTag(item, tag, value) { + if (Zotero.Utilities.unescapeHTML) { + value = Zotero.Utilities.unescapeHTML(value.replace("\n", "<br>", "g")); + } + + if(fieldMap[tag]) { + item[fieldMap[tag]] = value; + } else if(inputFieldMap[tag]) { + item[inputFieldMap[tag]] = value; + } else if(tag == "TY") { + // look for type + + // first check typeMap + for(var i in typeMap) { + if(value == typeMap[i]) { + item.itemType = i; + } + } + // then check inputTypeMap + if(!item.itemType) { + if(inputTypeMap[value]) { + item.itemType = inputTypeMap[value]; + } else { + // default to generic from inputTypeMap + item.itemType = inputTypeMap["GEN"]; + } + } + } else if(tag == "JO") { + if (item.itemType == "conferencePaper"){ + item.conferenceName = value; + } else { + item.publicationTitle = value; + } + } else if(tag == "BT") { + // ignore, unless this is a book or unpublished work, as per spec + if(item.itemType == "book" || item.itemType == "manuscript") { + item.title = value; + } else { + item.backupPublicationTitle = value; + } + } else if(tag == "T2") { + item.backupPublicationTitle = value; + } else if(tag == "A1" || tag == "AU") { + // primary author (patent: inventor) + // store Zotero "creator type" in temporary variable + var tempType; + if (item.itemType == "patent") { + tempType = "inventor"; + } else { + tempType = "author"; + } + var names = value.split(/, ?/); + item.creators.push({lastName:names[0], firstName:names[1], creatorType:tempType}); + } else if(tag == "A2" || tag == "ED") { + // contributing author (patent: assignee) + if (item.itemType == "patent") { + if (item.assignee) { + // Patents can have multiple assignees (applicants) but Zotero only allows a single + // assignee field, so we have to concatenate them together + item.assignee += ", "+value; + } else { + item.assignee = value; + } + } else { + var names = value.split(/, ?/); + item.creators.push({lastName:names[0], firstName:names[1], creatorType:"contributor"}); + } + } else if(tag == "Y1" || tag == "PY") { + // year or date + var dateParts = value.split("/"); + + if(dateParts.length == 1) { + // technically, if there's only one date part, the file isn't valid + // RIS, but EndNote writes this, so we have to too + // Nick: RIS spec example records also only contain a single part + // even though it says the slashes are not optional (?) + item.date = value; + } else { + // in the case that we have a year and other data, format that way + + var month = parseInt(dateParts[1]); + if(month) { + month--; + } else { + month = undefined; + } + + item.date = Zotero.Utilities.formatDate({year:dateParts[0], + month:month, + day:dateParts[2], + part:dateParts[3]}); + } + } else if(tag == "Y2") { + // the secondary date field can mean two things, a secondary date, or an + // invalid EndNote-style date. let's see which one this is. + // patent: application (filing) date -- do not append to date field + // for now. Zotero needs a filing date field added to make use of this. + var dateParts = value.split("/"); + if(dateParts.length != 4 && item.itemType != "patent") { + // an invalid date and not a patent. + // It's from EndNote or Delphion (YYYY-MM-DD) + if(item.date && value.indexOf(item.date) == -1) { + // append existing year + value += " " + item.date; + } + item.date = value; + } + // ToDo: Handle correctly formatted Y2 fields (secondary date) + } else if(tag == "N1" || tag == "AB") { + // notes + if(value != item.title) { // why does EndNote do this!? + item.notes.push({note:value}); + } + } else if(tag == "N2") { + // abstract + item.abstractNote = value; + } else if(tag == "KW") { + // keywords/tags + + // technically, treating newlines as new tags breaks the RIS spec, but + // it's required to work with EndNote + item.tags = item.tags.concat(value.split("\n")); + } else if(tag == "SP") { + // start page + if(!item.pages) { + item.pages = value; + } else if(item.pages[0] == "-") { // already have ending page + item.pages = value + item.pages; + } else { // multiple ranges? hey, it's a possibility + item.pages += ", "+value; + } + } else if(tag == "EP") { + // end page + if(value) { + if(!item.pages) { + item.pages = value; + } else if(value != item.pages) { + item.pages += "-"+value; + } + } + } else if(tag == "SN") { + // ISSN/ISBN - just add both + if(!item.ISBN) { + item.ISBN = value; + } + if(!item.ISSN) { + item.ISSN = value; + } + } else if(tag == "UR" || tag == "L1" || tag == "L2" || tag == "L4") { + // URL + if(!item.url) { + item.url = value; + } + if(tag == "UR") { + item.attachments.push({url:value}); + } else if(tag == "L1") { + item.attachments.push({url:value, mimeType:"application/pdf", + title:"Full Text (PDF)", downloadable:true}); + } else if(tag == "L2") { + item.attachments.push({url:value, mimeType:"text/html", + title:"Full Text (HTML)", downloadable:true}); + } else if(tag == "L4") { + item.attachments.push({url:value, + title:"Image", downloadable:true}); + } + } else if (tag == "IS") { + // Issue Number (patent: patentNumber) + if (item.itemType == "patent") { + item.patentNumber = value; + } else { + item.issue = value; + } + } else if (tag == "VL") { + // Volume Number (patent: applicationNumber) + if (item.itemType == "patent") { + item.applicationNumber = value; + } else { + item.volume = value; + } + } else if (tag == "PB") { + // publisher (patent: references) + if (item.itemType == "patent") { + item.references = value; + } else { + item.publisher = value; + } + } else if (tag == "M1" || tag == "M2") { + // Miscellaneous fields + if (!item.extra) { + item.extra = value; + } else { + item.extra += "; "+value; + } + } +} + +function completeItem(item) { + // if backup publication title exists but not proper, use backup + // (hack to get newspaper titles from EndNote) + if(item.backupPublicationTitle) { + if(!item.publicationTitle) { + item.publicationTitle = item.backupPublicationTitle; + } + item.backupPublicationTitle = undefined; + } + // hack for sites like Nature, which only use JA, journal abbreviation + if(item.journalAbbreviation && !item.publicationTitle){ + item.publicationTitle = item.journalAbbreviation; + } + item.complete(); +} + +function doImport(attachments) { + var line = true; + var tag = data = false; + do { // first valid line is type + line = Zotero.read(); + line = line.replace(/^\s+/, ""); + } while(line !== false && !line.substr(0, 6).match(/^TY {1,2}- /)); + + var item = new Zotero.Item(); + var i = 0; + if(attachments && attachments[i]) { + item.attachments = attachments[i]; + } + + var tag = "TY"; + + // Handle out-of-spec old EndNote exports + if (line.substr(0, 5) == "TY - ") { + var data = line.substr(5); + } + else { + var data = line.substr(6); + } + + var rawLine; + while((rawLine = Zotero.read()) !== false) { // until EOF + // trim leading space if this line is not part of a note + line = rawLine.replace(/^\s+/, ""); + if(line.substr(2, 4) == " - " || line == "ER -" || line.substr(0, 5) == "TY - ") { + // if this line is a tag, take a look at the previous line to map + // its tag + if(tag) { + Zotero.debug("tag: '"+tag+"'; data: '"+data+"'"); + processTag(item, tag, data); + } + + // then fetch the tag and data from this line + tag = line.substr(0,2); + + // Handle out-of-spec old EndNote exports + if (line.substr(0, 5) == "TY - ") { + data = line.substr(5); + } + else { + data = line.substr(6); + } + + if(tag == "ER") { // ER signals end of reference + // unset info + tag = data = false; + // new item + completeItem(item); + item = new Zotero.Item(); + i++; + if(attachments && attachments[i]) { + item.attachments = attachments[i]; + } + } + } else { + // otherwise, assume this is data from the previous line continued + if(tag == "N1" || tag == "N2" || tag == "AB" || tag == "KW") { + // preserve line endings for N1/N2/AB fields, for EndNote + // compatibility + data += "\n"+rawLine; + } else if(tag) { + // otherwise, follow the RIS spec + if(data[data.length-1] == " ") { + data += rawLine; + } else { + data += " "+rawLine; + } + } + } + } + + if(tag && tag != "ER") { // save any unprocessed tags + Zotero.debug(tag); + processTag(item, tag, data); + completeItem(item); + } +} + +function addTag(tag, value) { + if(value) { + Zotero.write(tag+" - "+value+"\r\n"); + } +} + +function doExport() { + var item; + + while(item = Zotero.nextItem()) { + // can't store independent notes in RIS + if(item.itemType == "note" || item.itemType == "attachment") { + continue; + } + + // type + addTag("TY", typeMap[item.itemType] ? typeMap[item.itemType] : "GEN"); + + // use field map + for(var j in fieldMap) { + if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]); + } + + // creators + for(var j in item.creators) { + // only two types, primary and secondary + var risTag; + // authors and inventors are primary creators + if (item.creators[j].creatorType == "author" || item.creators[j].creatorType == "inventor") { + risTag = "A1"; + } else { + risTag = "A2"; + } + + addTag(risTag, item.creators[j].lastName+","+item.creators[j].firstName); + } + + // assignee (patent) + if(item.assignee) { + addTag("A2", item.assignee); + } + + // volume (patent: applicationNumber) + if(item.volume || item.applicationNumber) { + var value = (item.volume) ? item.volume : item.applicationNumber; + addTag("VL", value); + } + + // issue (patent: patentNumber) + if(item.issue || item.patentNumber) { + var value = (item.issue) ? item.issue : item.patentNumber; + addTag("IS", value); + } + + // publisher (patent: references) + if(item.publisher || item.references) { + var value = (item.publisher) ? item.publisher : item.references; + addTag("PB", value); + } + + + // date + if(item.date) { + var date = Zotero.Utilities.strToDate(item.date); + var string = date.year+"/"; + if(date.month != undefined) { + // deal with javascript months + date.month++; + if(date.month < 10) string += "0"; + string += date.month; + } + string += "/"; + if(date.day != undefined) { + if(date.day < 10) string += "0"; + string += date.day; + } + string += "/"; + if(date.part != undefined) { + string += date.part; + } + addTag("PY", string); + } + + // notes + if(Zotero.getOption("exportNotes")) { + for(var j in item.notes) { + addTag("N1", item.notes[j].note.replace(/(?:\r\n?|\n)/g, "\r\n")); + } + } + + if(item.abstractNote) { + addTag("N2", item.abstractNote.replace(/(?:\r\n?|\n)/g, "\r\n")); + } + else if(item.abstract) { + // patent type has abstract + addTag("N2", item.abstract.replace(/(?:\r\n?|\n)/g, "\r\n")); + } + + // tags + for each(var tag in item.tags) { + addTag("KW", tag.tag); + } + + // pages + if(item.pages) { + if(item.itemType == "book") { + addTag("EP", item.pages); + } else { + var range = Zotero.Utilities.getPageRange(item.pages); + addTag("SP", range[0]); + addTag("EP", range[1]); + } + } + + // ISBN/ISSN + addTag("SN", item.ISBN); + addTag("SN", item.ISSN); + + // URL + if(item.url) { + addTag("UR", item.url); + } else if(item.source && item.source.substr(0, 7) == "http://") { + addTag("UR", item.source); + } + + Zotero.write("ER - \r\n\r\n"); + } +} +\ No newline at end of file diff --git a/translators/RSC Publishing.js b/translators/RSC Publishing.js @@ -0,0 +1,438 @@ +{ + "translatorID":"1c34744d-690f-4cac-b31b-b7f0c90ac14d", + "translatorType":4, + "label":"RSC Publishing", + "creator":"Ramesh Srigiriraju", + "target":"http://(:?www\\.|google\\.)?rsc\\.org/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-12-21 16:00:00" +} + +function detectWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals"); + if(journalreg.test(url)) { + var browspath='//div/p/a[text()="Use advanced search"]'; + if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; + var searchpath='//a[text()="Back to Search Form"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; + var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]'; + if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "journalArticle"; + } + var magpath='//div/h3[text()="Link to journal article"]'; + if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "magazineArticle"; + var magbrows='//div/h4[@class="newstitle"]/a'; + if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; + var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]'; + if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; + var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks"); + if(bookreg.test(url)) { + var pagepath='//title/text()'; + var page=doc.evaluate(pagepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index") + ||(page=="Book Series")) + return "multiple"; + var chappath='//dt/img[@alt="Chapter"]'; + var singpath='//h3[text()="Table of Contents"]'; + if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "bookSection"; + else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "book"; + } + var searchpath='//div/p[@class="title"][text()="Search Results"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + return "multiple"; +} + +function doChap(newItem, chaptext) { + var chapdata=chaptext.split("<br>"); + for(var pos=chapdata.length-2; pos>=0; pos--) { + chapdata[pos]=Zotero.Utilities.cleanTags(chapdata[pos]); + if(chapdata[pos].indexOf("Editors")!=-1) { + var editors=chapdata[pos].split(","); + for(var i=0; i<=editors.length-1; i++) { + editors[i]=Zotero.Utilities.cleanString(editors[i]); + var names=editors[i].split(" "); + var creators=new Array(); + if(i==0) + creators.firstName=names[1]; + else + creators.firstName=names[0]; + creators.lastName=names[names.length-1]; + creators.creatorType="editor"; + newItem.creators.push(creators); + } + } + if(chapdata[pos].indexOf("Authors")!=-1) { + var authors=chapdata[pos].split(","); + for(var i=0; i<=authors.length-1; i++) { + authors[i]=Zotero.Utilities.cleanString(authors[i]); + var names=authors[i].split(" "); + var creators=new Array(); + if(i==0) + creators.firstName=names[1]; + else + creators.firstName=names[0]; + creators.lastName=names[names.length-1]; + creators.creatorType="editor"; + newItem.creators.push(creators); + } + } + if(chapdata[pos].indexOf("DOI")!=-1) + newItem.itemID=chapdata[pos].substring(chapdata[pos].indexOf("1")); + if(chapdata[pos].indexOf("Book")!=-1) + newItem.bookTitle=chapdata[pos].substring(chapdata[pos].indexOf(" ")+1); + } +} +function doBook(newItem, bookdata) { + var fields=bookdata.split("<br>"); + for(var pos=fields.length-2; pos>=0; pos--) { + fields[pos]=Zotero.Utilities.cleanTags(fields[pos]); + if(fields[pos].indexOf("Volume")!=-1) { + var i=fields[pos].lastIndexOf(";"); + var vol; + if(i!=-1) + vol=fields[pos].substring(i+1); + else + vol=fields[pos].substring(fields[pos].lastIndexOf(" ")); + newItem.volume=Zotero.Utilities.cleanString(vol); + } + if(fields[pos].indexOf("Edition")!=-1) { + var i=fields[pos].lastIndexOf(";"); + if(i!=-1) + ed=fields[pos].substring(i+1); + else + ed=fields[pos].substring(fields[pos].lastIndexOf(" ")); + newItem.edition=Zotero.Utilities.cleanString(ed); + } + if(fields[pos].indexOf("Copyright")!=-1) { + var i=fields[pos].lastIndexOf(";"); + var date; + if(i!=-1) + date=fields[pos].substring(i+1); + else + date=fields[pos].substring(fields[pos].indexOf(":")+2); + newItem.date=Zotero.Utilities.cleanString(date); + } + if(fields[pos].indexOf("ISBN")!=-1&&fields[pos].indexOf("print")!=-1) { + var i=fields[pos].lastIndexOf(";"); + var isbn; + if(i!=-1) + isbn=fields[pos].substring(i+1); + else + isbn=fields[pos].substring(fields[pos].indexOf(":")+2); + newItem.ISBN=Zotero.Utilities.cleanString(isbn); + } + if(fields[pos].indexOf("Author")!=-1||fields[pos].indexOf("Editor")!=-1) { + var authors=fields[pos].split(","); + for(var i=0; i<=authors.length-1; i++) { + authors[i]=Zotero.Utilities.cleanString(authors[i]); + var names=authors[i].split(" "); + var creators=new Array(); + creators.firstName=names[0]; + creators.lastName=names[names.length-2]; + if(names[names.length-1]=="(Editor)") + creators.creatorType="editor"; + if(names[names.length-1]=="(Author)") + creators.creatorType="author"; + newItem.creators.push(creators); + } + } + if(fields[pos].indexOf("DOI:")!=-1) + newItem.itemID=fields[pos].substring(fields[pos].indexOf("1")); + } +} +function doWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals"); + if(journalreg.test(url)) { + var browspath='//div/p/a[text()="Use advanced search"]'; + if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doipath='//p[strong/text()="DOI:"]/a/text()'; + var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titlpath='//p/strong/a'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items=new Array(); + var doi; + while(doi=dois.iterateNext()) + items[doi.nodeValue]=Zotero.Utilities.cleanString(titles.iterateNext().textContent); + items=Zotero.selectItems(items); + var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?"; + for(var codes in items) { + var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="; + string+=codes.substring(codes.indexOf("/")+1)+"&type=refman"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + // fix bad Y1 tags, which have wrong spacing and typically terminate with "///" + text = text.replace("Y1 - ", "Y1 - "); + trans.setString(text); + trans.translate(); + Zotero.done(); + }); + } + } + var searchpath='//a[text()="Back to Search Form"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doipath='//p[strong/text()="DOI:"]/a/text()'; + var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titlpath='//form/div/h5'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var items=new Array(); + while(title=titles.iterateNext()) + items[dois.iterateNext().nodeValue]=title.textContent; + items=Zotero.selectItems(items); + var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?"; + for(var codes in items) { + var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="; + string+=codes.substring(codes.indexOf("/")+1)+"&type=refman"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + // fix bad Y1 tags, which have wrong spacing and typically terminate with "///" + text = text.replace("Y1 - ", "Y1 - "); + trans.setString(text); + trans.translate(); + Zotero.done(); + }); + } + } + var singpath='//ul/li/a[text()="HTML Article" or text()="PDF"]'; + if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doipath='//div/p[strong/text()="DOI:"]'; + var text=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var doi=text.substring(text.indexOf("/")+1); + var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="+doi; + string+="&type=refman"; + Zotero.Utilities.HTTP.doGet(string, function(text) { + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + // fix bad Y1 tags, which have wrong spacing and typically terminate with "///" + text = text.replace("Y1 - ", "Y1 - "); + trans.setString(text); + trans.setHandler("itemDone", function(obj, newItem) { + var url2=newItem.url; + var stringy; + var archpath='//div[h3/text()="Journals archive purchaser access"]'; + if(doc.evaluate(archpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var stringy="http://www.rsc.org/ejarchive/"; + stringy+=url2.substring(url2.lastIndexOf("/")+1)+".pdf"; + newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"}); + } + else { + var stringy="http://www.rsc.org/delivery/_ArticleLinking/DisplayArticleForFree.cfm?doi="; + stringy+=url2.substring(url2.lastIndexOf("/")+1); + newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"}); + } + newItem.complete(); + }); + trans.translate(); + Zotero.done(); + }); + } + } + var magpath='//div/h3[text()="Link to journal article"]'; + if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var newItem=new Zotero.Item("magazineArticle"); + var titlpath='//div/h2/div[@class="header"]/text()'; + newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var authpath='//em/text()'; + var auth=doc.evaluate(authpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var authors=auth.split(","); + if(newItem.title.indexOf("Interview")==-1) + for(var i=0; i<=authors.length-1; i++) { + authors[i]=Zotero.Utilities.cleanString(authors[i]); + var names=authors[i].split(" "); + var creator=new Array(); + creator.firstName=names[0]; + creator.lastName=names[names.length-1]; + newItem.creators.push(creator); + } + var textpath='//div[@id="content"]//text()'; + var text=doc.evaluate(textpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var temp; + while(temp=text.iterateNext()) + if(temp.nodeValue==newItem.title) { + newItem.date=text.iterateNext().nodeValue; + break; + } + var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()'; + var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var prev; + while(temp=data.iterateNext()) { + if(temp.nodeValue.indexOf("Chemi")!=-1) + newItem.publication=temp.nodeValue; + prev=temp; + } + newItem.issue=prev.nodeValue; + newItem.complete(); + } + var magbrows='//div/h4[@class="newstitle"]/a'; + if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titlpath='//h4[@class="newstitle"]/a'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var items=new Array(); + while(title=titles.iterateNext()) + items[title.href]=title.textContent; + items=Zotero.selectItems(items); + for(var linx in items) { + var newItem=new Zotero.Item("magazineArticle"); + newItem.url=linx; + newItem.title=items[linx]; + var datepath='//div[h4/a/text()="'+items[linx]+'"]/h4[@class="datetext"]/text()'; + newItem.date=doc.evaluate(datepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var datapath= '//div[@id="breadcrumbs"]/ul/li/a/text()'; + var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var prev; + var temp; + while(temp=data.iterateNext()) { + if(temp.nodeValue.indexOf("Chemi")!=-1) + newItem.publication=temp.nodeValue; + prev=temp; + } + if(prev.nodeValue!=newItem.publication) + newItem.issue=prev.nodeValue; + newItem.complete(); + } + } + var magsearch='//p[@class="more"]/strong/a[text()="Search RSC journals"]'; + if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titlpath='//div/p/a'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + titlpath='//blockquote/p/a[span/@class="l"]'; + var titles2=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null) + var title; + var items=new Array(); + while(title=titles.iterateNext()) + items[title.href]=title.textContent; + while(title=titles2.iterateNext()) + items[title.href]=title.textContent; + items=Zotero.selectItems(items); + for(var linx in items) { + var newItem=new Zotero.Item("magazineArticle"); + newItem.url=linx; + newItem.title=items[linx]; + newItem.complete(); + } + } + var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks"); + if(bookreg.test(url)) { + var browspath='//title/text()'; + var page=doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index") + ||(page=="Book Series")) { + var doipath='//dd/p/a/text()'; + var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var items=new Array(); + var title; + while(title=dois.iterateNext()) { + var doi=dois.iterateNext().nodeValue; + items[doi.substring(doi.indexOf("1"))]=title.nodeValue; + } + items=Zotero.selectItems(items); + for(var codes in items) { + var newItem=new Zotero.Item("book"); + newItem.itemID=codes; + newItem.title=items[codes]; + var itempath='//dd/p[contains(a[2]/text(), "'+codes+'")]'; + var itempath2='//dd/p[contains(a/text(), "'+codes+'")]'; + var data; + if(data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + data=data.innerHTML; + else if(data=doc.evaluate(itempath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + data=data.innerHTML; + doBook(newItem, data); + newItem.complete(); + } + } + var chappath='//dt/img[@alt="Chapter"]'; + var singpath='//h3[text()="Table of Contents"]'; + if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var newItem=new Zotero.Item("bookSection"); + var titlpath='//span/h3/text()'; + var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + newItem.title=titles.iterateNext().nodeValue; + newItem.bookTitle=titles.iterateNext().nodeValue; + var datapath='//dd/p'; + var entries=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var chaptext=entries.iterateNext().innerHTML; + doChap(newItem, chaptext); + var bookdata=entries.iterateNext().innerHTML; + doBook(newItem, bookdata); + var linkpath='//td[1][@class="td1"]/a[1]'; + var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var pdflink; + while(pdflink=linx.iterateNext()) + newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"}); + newItem.complete(); + } + else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var newItem=new Zotero.Item("book"); + var itempath='//dd/p'; + var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML; + doBook(newItem, data); + var titlpath='//div/h2/text()'; + newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var linkpath='//td[1][@class="td1"]/a[1]'; + var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var pdflink; + while(pdflink=linx.iterateNext()) + newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"}); + newItem.complete(); + } + } + var searchpath='//div/p[@class="title"][text()="Search Results"]'; + if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var doipath='//dd/p/a/text()'; + var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var title; + var items=new Array(); + while(title=dois.iterateNext()) { + var doi=dois.iterateNext().nodeValue; + items[doi.substring(doi.indexOf("1"))]=title.nodeValue; + } + items=Zotero.selectItems(items); + for(var codes in items) { + var itempath='//dd/p[contains(a/text(), "'+codes+'")]'; + var newpath='//dd[contains(p[2]/a/text(), "'+codes+'")]/p[1]/strong/text()'; + var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML; + if(data.indexOf("Book:")!=-1) { + var newItem=new Zotero.Item("bookSection"); + newItem.itemID=codes; + newItem.title=items[codes]; + doChap(newItem, data); + newItem.complete(); + } + else { + var newItem=new Zotero.Item("book"); + var newdata=doc.evaluate(newpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + if(newdata.indexOf("Volume")!=-1) + newItem.volume=newdata.substring(newdata.lastIndexOf(" ")+1); + else + newItem.series=newdata; + newItem.itemID=codes; + newItem.title=items[codes]; + doBook(newItem, data); + newItem.complete(); + } + } + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/RePEc.js b/translators/RePEc.js @@ -0,0 +1,181 @@ +{ + "translatorID":"411f9a8b-64f3-4465-b7df-a3c988b602f3", + "translatorType":4, + "label":"RePEc", + "creator":"Asa Kusuma", + "target":"^https?://ideas\\.repec\\.org/", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-26 15:17:22" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var singXpath = '//html/body/a/table/tbody/tr/td/font/b'; + var multXpath = '//html/body/h2'; + + + + if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1) + return "multiple"; + } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +function strrev(str) { + if (!str) return ''; + var revstr=''; + for (i = str.length-1; i>=0; i--) + revstr+=str.charAt(i) + return revstr; +} + + +function parseRIS(uris) { + + + Zotero.Utilities.HTTP.doGet(uris, function(text){ + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + Zotero.done(); + }, function() {}); + Zotero.wait(); +} + +function doWeb(doc, url) { + + + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var singXpath = '//html/body/a/table/tbody/tr/td/font/b'; + var multXpath = '//html/body/h2'; + + + + if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1) + + + shortXpath = '//html/body/strong/a'; + longXpath = '//html/body/dl/dt/strong/a'; + var multXpath=''; + if(doc.evaluate(shortXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + multXpath=shortXpath; + + } else { + multXpath=longXpath; + + } + + + var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titleElmt; + var bibElmt; + bibElmt = bibElmts.iterateNext(); + titleElmt = titleElmts.iterateNext(); + + var items = new Array(); + + do { + + var bibcode = bibElmt.href; + + bibcode=bibcode.substr(24); + + bibcode=strrev(bibcode); + bibcode=bibcode.substr(5,bibcode.length); + bibcode=strrev(bibcode); + + //Replace slashes with colons + bibcode=bibcode.replace("/",":","g"); + + //Insert colons between numbers and letters and letters and numbers + bibcode=bibcode.replace(/([A-Za-z])([0-9])/g, + function (str, p1, p2, offset, s) { + return p1 + ":" + p2; + } + ) + + bibcode=bibcode.replace(/([0-9])([A-Za-z])/g, + function (str, p1, p2, offset, s) { + return p1 + ":" + p2; + } + ) + + items[bibcode] = Zotero.Utilities.cleanString(titleElmt.textContent); + + } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())); + + items = Zotero.selectItems(items); + if(!items) return true; + + var bibcodes=""; + var uris = new Array(); + for(var bibcode in items) { + + var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc"; + getURL = getURL + bibcode + "&output=3"; + + uris.push(getURL); + } + + parseRIS(uris); + + + + + } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + var bibcode = url; + + bibcode=bibcode.substr(24); + + bibcode=strrev(bibcode); + bibcode=bibcode.substr(5,bibcode.length); + bibcode=strrev(bibcode); + + + //Replace slashes with colons + bibcode=bibcode.replace("/",":","g"); + + //Insert colons between numbers and letters and letters and numbers + bibcode=bibcode.replace(/([A-Za-z])([0-9])/g, + function (str, p1, p2, offset, s) { + return p1 + ":" + p2; + } + ) + + bibcode=bibcode.replace(/([0-9])([A-Za-z])/g, + function (str, p1, p2, offset, s) { + return p1 + ":" + p2; + } + ) + + + var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc"; + getURL = getURL + bibcode + "&output=3"; + + var idarray = new Array(); + idarray.push(getURL); + parseRIS(idarray); + + } + + +} +\ No newline at end of file diff --git a/translators/ReferBibIX.js b/translators/ReferBibIX.js @@ -0,0 +1,285 @@ +{ + "translatorID":"881f60f2-0802-411a-9228-ce5f47b64c7d", + "translatorType":3, + "label":"Refer/BibIX", + "creator":"Simon Kornblith", + "target":"txt", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 23:50:00" +} + +Zotero.configure("dataMode", "line"); +Zotero.addOption("exportCharset", "UTF-8"); + +function detectImport() { + var lineRe = /%[A-Z0-9\*\$] .+/; + var line; + var matched = 0; + while((line = Zotero.read()) !== "false") { + line = line.replace(/^\s+/, ""); + if(line != "") { + if(lineRe.test(line)) { + matched++; + if(matched == 2) { + // threshold is two lines + return true; + } + } else { + return false; + } + } + } +} + +var fieldMap = { + T:"title", + S:"series", + V:"volume", + N:"issue", + C:"place", + I:"publisher", + R:"type", + P:"pages", + W:"archiveLocation", + "*":"rights", + "@":"ISBN", + L:"callNumber", + M:"accessionNumber", + U:"url", + 7:"edition", + X:"abstractNote" +}; + +var inputFieldMap = { + J:"publicationTitle", + B:"publicationTitle", + 9:"type" +}; + +// TODO: figure out if these are the best types for personal communication +var typeMap = { + book:"Book", + bookSection:"Book Section", + journalArticle:"Journal Article", + magazineArticle:"Magazine Article", + newspaperArticle:"Newspaper Article", + thesis:"Thesis", + letter:"Personal Communication", + manuscript:"Unpublished Work", + interview:"Personal Communication", + film:"Film or Broadcast", + artwork:"Artwork", + webpage:"Web Page", + report:"Report", + bill:"Bill", + "case":"Case", + hearing:"Hearing", + patent:"Patent", + statute:"Statute", + email:"Personal Communication", + map:"Map", + blogPost:"Web Page", + instantMessage:"Personal Communication", + forumPost:"Web Page", + audioRecording:"Audiovisual Material", + presentation:"Report", + videoRecording:"Audiovisual Material", + tvBroadcast:"Film or Broadcast", + radioBroadcast:"Film or Broadcast", + podcast:"Audiovisual Material", + computerProgram:"Computer Program", + conferencePaper:"Conference Paper", + document:"Generic", + encyclopediaArticle:"Encyclopedia", + dictionaryEntry:"Dictionary" +}; + +// supplements outputTypeMap for importing +// TODO: BILL, CASE, COMP, CONF, DATA, HEAR, MUSIC, PAT, SOUND, STAT +var inputTypeMap = { + "Ancient Text":"book", + "Audiovisual Material":"videoRecording", + "Generic":"book", + "Chart or Table":"artwork", + "Classical Work":"book", + "Conference Proceedings":"conferencePaper", + "Conference Paper":"conferencePaper", + "Edited Book":"book", + "Electronic Article":"journalArticle", + "Electronic Book":"book", + "Equation":"artwork", + "Figure":"artwork", + "Government Document":"document", + "Grant":"document", + "Legal Rule or Regulation":"statute", + "Online Database":"webpage", + "Online Multimedia":"webpage", + "Electronic Source":"webpage" +}; + +var isEndNote = false; + +function processTag(item, tag, value) { + value = Zotero.Utilities.trim(value); + if(fieldMap[tag]) { + item[fieldMap[tag]] = value; + } else if(inputFieldMap[tag]) { + item[inputFieldMap[tag]] = value; + } else if(tag == "0") { + if(inputTypeMap[value]) { // first check inputTypeMap + item.itemType = inputTypeMap[value] + } else { // then check typeMap + for(var i in typeMap) { + if(value == typeMap[i]) { + item.itemType = i; + break; + } + } + // fall back to generic + if(!item.itemType) item.itemType = inputTypeMap["Generic"]; + } + } else if(tag == "A" || tag == "E" || tag == "?") { + if(tag == "A") { + var type = "author"; + } else if(tag == "E") { + var type = "editor"; + } else if(tag == "?") { + var type = "translator"; + } + + item.creators.push(Zotero.Utilities.cleanAuthor(value, type, value.indexOf(",") != -1)); + } else if(tag == "Q") { + item.creators.push({creatorType:"author", lastName:value, fieldMode:true}); + } else if(tag == "H" || tag == "O") { + item.extra += "\n"+value; + } else if(tag == "Z") { + item.notes.push({note:value}); + } else if(tag == "D") { + if(item.date) { + if(item.date.indexOf(value) == -1) { + item.date += " "+value; + } + } else { + item.date = value; + } + } else if(tag == "8") { + if(item.date) { + if(value.indexOf(item.date) == -1) { + item.date += " "+value; + } + } else { + item.date = value; + } + } else if(tag == "K") { + item.tags = value.split("\n"); + } +} + +function doImport() { + var line = true; + var tag = data = false; + do { // first valid line is type + Zotero.debug("ignoring "+line); + line = Zotero.read(); + line = line.replace(/^\s+/, ""); + } while(line !== false && line[0] != "%"); + + var item = new Zotero.Item(); + + var tag = line[1]; + var data = line.substr(3); + while((line = Zotero.read()) !== false) { // until EOF + line = line.replace(/^\s+/, ""); + if(!line) { + if(tag) { + processTag(item, tag, data); + // unset info + tag = data = readRecordEntry = false; + // new item + item.complete(); + item = new Zotero.Item(); + } + } else if(line[0] == "%" && line[2] == " ") { + // if this line is a tag, take a look at the previous line to map + // its tag + if(tag) { + processTag(item, tag, data); + } + + // then fetch the tag and data from this line + tag = line[1]; + data = line.substr(3); + } else { + // otherwise, assume this is data from the previous line continued + if(tag) { + data += "\n"+line; + } + } + } + + if(tag) { // save any unprocessed tags + processTag(item, tag, data); + item.complete(); + } +} + +function addTag(tag, value) { + if(value) { + Zotero.write("%"+tag+" "+value+"\r\n"); + } +} + +function doExport() { + var item; + while(item = Zotero.nextItem()) { + // can't store independent notes in RIS + if(item.itemType == "note" || item.itemType == "attachment") { + continue; + } + + // type + addTag("0", typeMap[item.itemType] ? typeMap[item.itemType] : "Generic"); + + // use field map + for(var j in fieldMap) { + if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]); + } + + //handle J & B tags correctly + if (item["publicationTitle"]) { + if (item.itemType == "journalArticle") { + addTag("J", item["publicationTitle"]); + } else { + addTag("B", item["publicationTitle"]); + } + } + + // creators + for(var j in item.creators) { + var referTag = "A"; + if(item.creators[j].creatorType == "editor") { + referTag = "E"; + } else if(item.creators[j].creatorType == "translator") { + referTag = "?"; + } + + addTag(referTag, item.creators[j].lastName+(item.creators[j].firstName ? ", "+item.creators[j].firstName : "")); + } + + // date + addTag("D", item.date); + + // tags + if(item.tags) { + var keywordTag = ""; + for each(var tag in item.tags) { + keywordTag += "\r\n"+tag.tag; + } + addTag("K", keywordTag.substr(2)); + } + Zotero.write("\r\n"); + } +} +\ No newline at end of file diff --git a/translators/ReliefWeb.js b/translators/ReliefWeb.js @@ -0,0 +1,58 @@ +{ + "translatorID":"6f5f1b24-7519-4314-880f-d7004fbcfe7e", + "translatorType":4, + "label":"ReliefWeb", + "creator":"Michael Berkowitz", + "target":"http://(www.)?reliefweb.int/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-10 06:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/(S|s)earch(R|r)esults/)) { + return "multiple"; + } else if (url.match(/(O|o)pen(D|d)ocument/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//div[@id="View"]/table/tbody/tr/td[4][@class="docView"]/a', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.trimInternal(link.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.debug(arts); + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="docTitle"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.date = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="link"]/p[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(6)); + item.url = doc.location.href; + if (doc.evaluate('//div[@id="docBody"]/p/i',doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var auts = doc.evaluate('//div[@id="docBody"]/p/i', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="docBody"]/p[1]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(auts, "")); + auts = auts.replace('By ', "").split(/\//); + for each (var aut in auts) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + } else { + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="docBody"]/p[1]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Reuters.js b/translators/Reuters.js @@ -0,0 +1,37 @@ +{ + "translatorID":"83979786-44af-494a-9ddb-46654e0486ef", + "translatorType":4, + "label":"Reuters", + "creator":"Michael Berkowitz", + "target":"http://(www\\.)?reuters.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-07 14:50:00" +} + +function detectWeb(doc, url) { + if (url.match(/article/)) { + return "newspaperArticle"; + } +} + +function doWeb(doc, url) { + var item = new Zotero.Item("newspaperArticle"); + + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//div[@class="article primaryContent"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.date = doc.evaluate('//div[@class="timestampHeader"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/^.*\d{4}/)[0]; + var byline = doc.evaluate('//div[@id="resizeableText"]/p[1]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (byline.match(/^By/)) { + var authors = byline.substr(3).split(','); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.abstractNote = doc.evaluate('//div[@id="resizeableText"]/p[2]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/\-\s+(.*)$/)[1]; + } else { + item.abstractNote = byline.match(/\-\s+(.*)$/)[1]; + } + item.url = url; + item.complete(); +} +\ No newline at end of file diff --git a/translators/Revues.org.js b/translators/Revues.org.js @@ -0,0 +1,71 @@ +{ + "translatorID":"87766765-919e-4d3b-9071-3dd7efe984c8", + "translatorType":4, + "label":"Revues.org", + "creator":"Michael Berkowitz", + "target":"http://.*\\.revues\\.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-16 20:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext() + || doc.evaluate('//ul[@class="summary"]//div[@class="title"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//h1[@id="docTitle"]/span[@class="text"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || url.match(/document\d+/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + if (doc.evaluate('//ul[@class="summary"]//div[@class="title"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//ul[@class="summary"]//div[@class="title"]/a'; + } else if (doc.evaluate('//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//div[@id="inside"]/div[@class="sommaire"]/dl[@class="documents"]/dd[@class="titre"]/a'; + } + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var title; + var items = new Object(); + while (title = titles.iterateNext()) { + items[title.href] = title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var metas = doc.evaluate('//meta', doc, null, XPathResult.ANY_TYPE, null); + var meta; + var data = new Object(); + while (meta = metas.iterateNext()) { + if (data[meta.name]) { + data[meta.name.toLowerCase()] = data[meta.name.toLowerCase()] + ";" + meta.content; + } else { + data[meta.name.toLowerCase()] = meta.content + } + } + var item = new Zotero.Item("journalArticle"); + item.url = data['url']; + var authors = data['author'].split(';'); + for each (var aut in authors) { + if (aut.match(/\w+/)) item.creators.push(Zotero.Utilities.cleanAuthor(aut.replace(/(.*)\s([^\s]+)$/, "$2 $1"), "author")); + } + item.tags = data['dc.subject'].split(/,\s+/); + item.date = data['dc.date']; + item.title = data['dc.title']; + if (data['dc.relation.ispartof']) item.publicationTitle = data['dc.relation.ispartof'].match(/^[^,]+/)[0]; + item.abstractNote = data['description']; + if (!item.abstractNote && data['dc.description']) item.abstractNote = data['dc.description']; + + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Royal Historical Society.js b/translators/Royal Historical Society.js @@ -0,0 +1,73 @@ +{ + "translatorID":"a69deb08-47d9-46ad-afca-bc3a2499ad34", + "translatorType":4, + "label":"Royal Historical Society", + "creator":"Michael Berkowitz", + "target":"http://www.rhs.ac.uk/bibl/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 00:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr/td[3][@class="bib_data"]/a[@class="bibref"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//a[text() = "View records in XML"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +function doWeb(doc, url) { + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//a[@class="bibref"]'; + var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + items[result.href] = Zotero.Utilities.trimInternal(result.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i.replace(/DATABASE=[^&]+/, "DATABASE=xmlcatalo")); + } + } else { + books = [url.replace(/DATABASE=[^&]+/, "DATABASE=xmlcatalo")]; + } + for each (var link in books) { + Zotero.Utilities.HTTP.doGet(link, function(text) { + text = text.replace(/<\?[^?]+\?>/, ""); + var xml = new XML(text); + xml = xml..recordList; + + var itemtype = "book"; + if (xml..journal_title.length() != 0) itemtype = "journalArticle"; + + var item = new Zotero.Item(itemtype); + item.title = Zotero.Utilities.capitalizeTitle(xml..title.toString()); + for (var i = 0; i < xml..author.length(); i++) { + var name = xml..author[i].toString().match(/^[^,]+,[^,]+/)[0].split(/,\s+/); + item.creators.push({lastName:name[0], firstName:name[1], creatorType:"author"}); + } + if (item.itemType == "book") { + item.place = xml..place_of_publication.toString(); + item.publisher = xml..publisher.toString(); + item.date = xml..publication_year.toString(); + } else if (item.itemType == "journalArticle") { + item.publicationTitle = xml..journal_title.toString(); + var voliss = xml..journal_number.split(":"); + Zotero.debug(voliss); + item.volume = voliss[0]; + item.issue = voliss[1]; + item.date = xml..journal_issue_year; + item.pages = xml..journal_pages; + } + + item.complete(); + }); + Zotero.done; + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Royal Society Publishing.js b/translators/Royal Society Publishing.js @@ -0,0 +1,65 @@ +{ + "translatorID":"56ea09bc-57ee-4f50-976e-cf7cb1f6c6d8", + "translatorType":4, + "label":"Royal Society Publishing", + "creator":"Michael Berkowitz", + "target":"http://journals.royalsociety.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-23 09:45:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//div[@class="listItemName"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//div[contains(@id, "ExportDiv")]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +function makeURL(str, type) { + var m = str.match(/content\/([^/]+)/)[1]; + if (type == "ris") { + return "http://journals.royalsociety.org/export.mpx?code=" + m + "&mode=ris"; + } else if (type == "pdf") { + return "http://journals.royalsociety.org/content/" + m + "/fulltext.pdf"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//div[@class="listItemName"]/a', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + for each (var link in arts) { + var newurl = makeURL(link, "ris"); + var pdfurl = makeURL(link, "pdf"); + Zotero.Utilities.HTTP.doGet(newurl, function(text) { + Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:link, title:"Royal Society Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"Royal Society PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + }); + } +} +\ No newline at end of file diff --git a/translators/SAE International.js b/translators/SAE International.js @@ -0,0 +1,74 @@ +{ + "translatorID":"e9632edc-8032-4dc5-b2d4-284d481583e6", + "translatorType":4, + "label":"SAE International", + "creator":"Michael Berkowitz", + "target":"http://www.sae.org/", + "minVersion":"1.0", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td[2][@class="search-results"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/\/books\//)) {return "book";} + else if (url.match(/\/papers\//)) {return "conferencePaper";} +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//td[2][@class="search-results"]/a', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var type = detectWeb(doc, doc.location.href); + if (type == "paper") { + var data = new Object(); + var metas = doc.evaluate('//meta', doc, null, XPathResult.ANY_TYPE, null); + var meta; + while (meta = metas.iterateNext()) { + name = meta.name; + content = meta.content; + if (data[name]) { + data[name] = data[name] + ";" + content; + } else { + data[name] = content; + } + } + var item = new Zotero.Item("conferencePaper"); + item.title = doc.evaluate('//title', doc, null, XPathResult.ANY_TYPe, null).iterateNext().textContent; + item.data = data['publ_date']; + item.url = data['identifier_url']; + var authors = data['author'].split(/\s+;/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//td[1][@class="spg spg-left"]/p[strong[contains(text(), "Abstract")]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(9)); + } else if (type = "book") { + var item = new Zotero.Item("book"); + var data = doc.evaluate('//p[strong[contains(text(), "ISBN")]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.ISBN = data.match(/ISBN Number:\s+([\d\-]+)/)[1]; + item.date = data.match(/Date Published:\s+(.*)\n/)[1]; + item.url = doc.location.href; + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//title', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//td[1][@class="spg spg-left"]/p[contains(text(), ".")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + item.attachments = [{url:item.url, title:item.title, mimeType:"text/html"}]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/SPIE Digital Library.js b/translators/SPIE Digital Library.js @@ -0,0 +1,57 @@ +{ + "translatorID":"48d3b115-7e09-4134-ad5d-0beda6296761", + "translatorType":4, + "label":"SPIE Digital Library", + "creator":"Michael Berkowitz", + "target":"http://(?:spiedl|spiedigitallibrary)\\.aip\\.org/", + "minVersion":"1.0", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//table[@class="searchResultsTable"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//div[@id="articletoolsdisplay"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +//http://spiedl.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=JBOPFO000013000002024024000001&downloadcitation=+Go+ + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var results = doc.evaluate('//table[@class="searchResultsTable"]/tbody/tr', doc, null, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = doc.evaluate('.//td[3]/a[1]', result, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var id = doc.evaluate('.//td[2]/input', result, null, XPathResult.ANY_TYPE, null).iterateNext().value; + items[id] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + var id = doc.evaluate('//input[@name="SelectCheck"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().value; + arts = [id]; + } + + var getstr1 = 'http://' + doc.location.host + '/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck='; + var getstr2 = '&downloadcitation=+Go+'; + for each (var id in arts) { + var get = getstr1 + id + getstr2; + Zotero.Utilities.HTTP.doGet(get, function(text) { + Zotero.debug(text); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + }); + } + +} +\ No newline at end of file diff --git a/translators/SPIRES.js b/translators/SPIRES.js @@ -0,0 +1,85 @@ +{ + "translatorID":"232903bc-7307-4058-bb1a-27cfe3e4e655", + "translatorType":4, + "label":"SPIRES", + "creator":"Sean Takats", + "target":"^http://www.slac.stanford.edu/spires/find/hep/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-04-23 17:00:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var citations = doc.evaluate('//dl/dd/a[text()="BibTeX"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var citation = citations.iterateNext(); + var titles = doc.evaluate('//p/b[1]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var title = titles.iterateNext(); + if(citation && title) { + // search page + return "multiple"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var citations = doc.evaluate('//dl/dd/a[text()="BibTeX"]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var citation = citations.iterateNext(); +// var titles = doc.evaluate('//p/b[1]', doc, nsResolver, +// XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//p[b[1]]', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var title = titles.iterateNext(); + if(citation && title) { + // search page + var items = new Object(); + do { + items[citation.href] = Zotero.Utilities.cleanString(title.textContent); + } while((citation=citations.iterateNext()) && (title=titles.iterateNext())) + + items = Zotero.selectItems(items); + if(!items) return true; + + var newUris = new Array(); + for(var id in items) { + newUris.push(id); + } + } else { + //single result page? + } + + Zotero.Utilities.HTTP.doGet(newUris, function(text) { + var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g); + var bibTeXString = ""; + for each(var citation in m) { + // kill pre tags + citation = citation.substring(5, citation.length-6); + bibTeXString += citation; + } + + // import using BibTeX + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); + translator.setString(bibTeXString); + translator.setHandler("itemDone", function(obj, item) { + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/SSRN.js b/translators/SSRN.js @@ -0,0 +1,105 @@ +{ + "translatorID":"b61c224b-34b6-4bfd-8a76-a476e7092d43", + "translatorType":4, + "label":"SSRN", + "creator":"Michael Berkowitz", + "target":"http://papers\\.ssrn\\.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-07 17:00:00" +} + +function detectWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + if (doc.evaluate('//font/strong/a[substring(@class, 1, 4) = "text"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.indexOf("abstract_id") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace=doc.documentElement.namespaceURI; + var nsResolver=namespace?function(prefix) { + return (prefix=="x")?namespace:null; + }:null; + + var uris = new Array(); + + if (doc.evaluate('//font/strong/a[substring(@class, 1, 4) = "text"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var items = new Object(); + var xpath = '//font/strong/a[substring(@class, 1, 4) = "text"]'; + var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_title = titles.iterateNext(); + while (next_title) { + items[next_title.href] = next_title.textContent; + next_title = titles.iterateNext(); + } + items = Zotero.selectItems(items); + for (var i in items) { + uris.push(i); + } + } else { + uris.push(url); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { + if (doc.evaluate('//span[@id="knownuser"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var id = doc.location.href.match(/abstract_id=(\d+)/)[1]; + if (doc.evaluate('//a[@title="Download from Social Science Research Network"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var pdfurl = doc.evaluate('//a[@title="Download from Social Science Research Network"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + } + var newURL = 'http://papers.ssrn.com/sol3/RefExport.cfm?abstract_id=' + id + '&format=3'; + Zotero.Utilities.HTTP.doGet(newURL, function(text) { + var ris=text.match(/<input type=\"Hidden\"\s+name=\"hdnContent\"\s+value=\"([^"]*)\">/)[1]; + var trans=Zotero.loadTranslator("import"); + trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + trans.setString(ris); + trans.setHandler("itemDone", function(obj, item) { + item.itemType = "journalArticle"; + var tags = new Array(); + for each (var tag in item.tags) { + var newtags = tag.split(","); + for each (var newtag in newtags) tags.push(newtag); + } + item.tags = tags; + item.attachments = [{url:item.url, title:"SSRN Snapshot", mimeType:"text/html"}]; + if (pdfurl) item.attachments.push({url:pdfurl, title:"SSRN Full Text PDF", mimeType:"application/pdf"}); + item.complete(); + }); + trans.translate(); + }); + } else { + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.capitalizeTitle(Zotero.Utilities.trimInternal(doc.evaluate('//tbody/tr/td[2]/font/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent)); + var authors = doc.evaluate('//tr/td/center/font/a[@class="textlink"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var author; + while (author = authors.iterateNext()) { + var aut = Zotero.Utilities.capitalizeTitle(Zotero.Utilities.trimInternal(author.textContent)); + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//td[strong/font]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10); + item.tags = Zotero.Utilities.trimInternal(doc.evaluate('//font[contains(text(), "Key")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).substr(10).split(/,\s+/); + item.publicationTitle = "SSRN eLibrary"; + + var bits = doc.evaluate('//tr/td/center/font', doc, nsResolver, XPathResult.ANY_TYPE, null); + var bit; + while (bit = bits.iterateNext()) { + if (bit.textContent.match(/\d{4}/)) item.date = Zotero.Utilities.trimInternal(bit.textContent); + } + item.url = doc.location.href; + if (doc.evaluate('//a[@title="Download from Social Science Research Network"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var pdfurl = doc.evaluate('//a[@title="Download from Social Science Research Network"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + } + item.attachments = [{url:item.url, title:"SSRN Snapshot", mimeType:"text/html"}]; + if (pdfurl) item.attachments.push({url:pdfurl, title:"SSRN Full Text PDF", mimeType:"application/pdf"}); + item.complete(); + } + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Sage Journals Online.js b/translators/Sage Journals Online.js @@ -0,0 +1,77 @@ +{ + "translatorID":"636c8ea6-2af7-4488-8ccd-ea280e4a7a98", + "translatorType":4, + "label":"Sage Journals Online", + "creator":"Michael Berkowitz", + "target":"http://[^/]*\\.sagepub\\.com[^/]*/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-04 20:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("searchresults") != -1 || (doc.title.indexOf("Table of Contents") != -1)) { + return "multiple"; + } else if (url.indexOf("cgi/content") != -1) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title.indexOf("Table of Contents") != -1) { + var searchx = '//div[@id="maincontent"]/div[@class="contentarea"]/table[@class="toc"]/tbody/tr/td[2][@class="rightcol"]/form/dl/dd'; + var titlex = './/strong'; + } else { + var searchx = '//form[@id="search_results"]/div[@class="resultsitem"]/div[2]'; + var titlex = './/label'; + } + var linkx = './/a[1]'; + var searchres = doc.evaluate(searchx, doc, null, XPathResult.ANY_TYPE, null); + var next_res; + while (next_res = searchres.iterateNext()) { + var title = doc.evaluate(titlex, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate(linkx, next_res, null, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + var newurls = new Array(); + for each (var i in arts) { + newurls.push(i); + } + Zotero.Utilities.HTTP.doGet(arts, function(text) { + var id = text.match(/=([^=]+)\">\s*Add to Saved Citations/)[1]; + var newurl = newurls.shift(); + var pdfurl = newurl.replace(/content\/[^/]+/, "reprint") + ".pdf"; + var get = 'http://online.sagepub.com/cgi/citmgr?type=refman&gca=' + id; + Zotero.Utilities.HTTP.doGet(get, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + if (text.match(/N1(.*)\n/)) { + var doi = text.match(/N1\s+\-\s+(.*)\n/)[1]; + } + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:newurl, title:"Sage Journals Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"Sage Journals Full Text PDF", mimeType:"application/pdf"} + ]; + if (doi) item.DOI = doi; + if (item.notes) item.notes = []; + item.complete(); + }); + translator.translate(); + }); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/SciELO.js b/translators/SciELO.js @@ -0,0 +1,106 @@ +{ + "translatorID":"3eabecf9-663a-4774-a3e6-0790d2732eed", + "translatorType":4, + "label":"SciELO", + "creator":"Michael Berkowitz", + "target":"http://(www.)?scielo.(org|br)/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-30 08:00:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("wxis.exe") != -1) { + if (doc.evaluate('//*[@class="isoref"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + } else if (url.indexOf("issuetoc") != -1) { + return "multiple" + } else if (url.indexOf("&pid=") != -1) { + return "journalArticle"; + } else { + Zotero.debug("ok"); + } +} + +function makeURL(host, str) { + return 'http://www.scielo.br/scieloOrg/php/articleXML.php?pid=' + str.match(/pid=([^&]+)/)[1]; +} + +function doWeb(doc, url) { + var host = doc.location.host; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (url.indexOf(".exe") != -1) { + var titlepath = '//font[@class="isoref"]/font[@class="negrito"]'; + var linkpath = '//font[@class="isoref"]/a[@class="isoref"]'; + } else { + var titlepath = '//font[@class="normal"]/b/b[1]'; + var linkpath = '//tr/td/div/a[1]'; + } + var titles = doc.evaluate(titlepath, doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate(linkpath, doc, null, XPathResult.ANY_TYPE, null); + var next_title; + var next_link; + while ((next_title = titles.iterateNext()) && (next_link = links.iterateNext())) { + items[next_link.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(makeURL(host, i)); + } + } else { + arts = [makeURL(host, url)]; + } + Zotero.Utilities.HTTP.doGet(arts, function(text) { + var item = new Zotero.Item("journalArticle"); + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "").replace(/<self-uri.*\/self\-uri>/g, ""); + var journal = text.split("<journal-meta>")[1].split("</journal-meta>")[0]; + journal = "<journal>" + journal + "</journal>"; + journal = journal.replace(/\-([a-z])/g, "$1"); + var xml2 = new XML(journal); + var art = text.split("<article-meta>")[1].split("</article-meta>")[0]; + art = "<article>" + art + "</article>"; + art = art.replace(/\-([a-z])/g, "$1"); + var xml3 = new XML(art); + + item.publicationTitle = xml2..journaltitle.text().toString(); + item.journalAbbreviation = xml2..abbrevjournaltitle.text().toString(); + item.ISSN = xml2..issn.text().toString(); + item.publisher = xml2..publisher..publishername.text().toString(); + item.title = xml3..titlegroup..articletitle.text().toString(); + for (var i = 0 ; i < xml3..contribgroup..contrib.length() ; i++) { + var name = xml3..contribgroup..contrib[i]..name; + item.creators.push({firstName:name..givennames.text().toString(), lastName:name..surname.text().toString(), creatorType:"author"}); + } + + var date = xml3..pubdate[0]; + var day = date..day.text().toString(); + var month = date..month.text().toString(); + var year = date..year.text().toString(); + + date = year; + if (month != "00") { + date = month + "/" + date; + } + if (day != "00") { + date = day + "/" + date; + } + item.date = date; + item.volume = xml3..volume.text().toString(); + item.pages = xml3..fpage.text().toString() + "-" + xml3..lpage.text().toString(); + + for (var i = 0 ; i < xml3..kwdgroup..kwd.length() ; i++) { + item.tags.push(xml3..kwdgroup..kwd[i].text().toString()); + } + + item.attachments = [ + {url:url, title:"SciELO Snapshot", mimeType:"text/html"} + ]; + + item.complete(); + }); +} +\ No newline at end of file diff --git a/translators/Science Links Japan.js b/translators/Science Links Japan.js @@ -0,0 +1,73 @@ +{ + "translatorID":"c0d7d260-d795-4782-9446-f6c403a7922c", + "translatorType":4, + "label":"Science Links Japan", + "creator":"Michael Berkowitz", + "target":"http://sciencelinks.jp/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + if (url.match(/result/) || url.match(/journal/)) { + return "multiple"; + } else if (url.match(/article/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var ns = doc.documentElement.namespaceURI; + nsR = ns ? function(prefix) { + if (prefix == 'x') return ns; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, "(article|display\.php)"); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var data = new Array(); + var bits = doc.evaluate('//div[@id="result_detail"]/table/tbody/tr/td', doc, nsR, XPathResult.ANY_TYPE, null); + var bit; + while (bit = bits.iterateNext()) { + data.push(Zotero.Utilities.trimInternal(bit.textContent)); + } + var item = new Zotero.Item("journalArticle"); + for each (var datum in data) { + if (datum.match(/^Title;/)) { + item.title = Zotero.Utilities.capitalizeTitle(datum.match(/Title;(.*)$/)[1]); + } else if (datum.match(/^Author;/)) { + var auts = datum.match(/\b[A-Z'\-]+\s+[A-Z'\-]+/g); + for each (var aut in auts) { + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.capitalizeTitle(aut, true), "author")); + } + } else if (datum.match(/^Journal Title;/)) { + item.publicationTitle = datum.match(/;(.*)$/)[1]; + } else if (datum.match(/^ISSN/)) { + item.ISSN = datum.match(/[\d\-]+/)[0]; + } else if (datum.match(/^VOL/)) { + var voliss = datum.match(/^VOL\.([^;]*);NO\.([^;]*);PAGE\.([^(]*)\((\d+)\)/); + item.volume = voliss[1]; + item.issue = voliss[2]; + item.pages = voliss[3]; + item.date = voliss[4]; + } else if (datum.match(/^Abstract/)) { + item.abstractNote = datum.match(/;(.*)/)[1]; + } + } + item.url = doc.location.href; + item.attachments = [{url:item.url, title:"Science Links Japan Snapshot", mimeType:"text/html"}]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ScienceDirect.js b/translators/ScienceDirect.js @@ -0,0 +1,175 @@ +{ + "translatorID":"b6d0a7a-d076-48ae-b2f0-b6de28b194e", + "translatorType":4, + "label":"ScienceDirect", + "creator":"Michael Berkowitz", + "target":"https?://[^/]*www\\.sciencedirect\\.com[^/]*/science(\\/article)?(\\?(?:.+\\&|)ob=(?:ArticleURL|ArticleListURL|PublicationURL))?", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + if ((url.indexOf("_ob=DownloadURL") != -1) || doc.title == "ScienceDirect Login") { + return false; + } + if((!url.match("pdf") && url.indexOf("_ob=ArticleURL") == -1 && url.indexOf("/article/") == -1) || url.indexOf("/journal/") != -1) { + return "multiple"; + } else if (!url.match("pdf")) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (!doc.evaluate('//img[contains(@src, "guest_user.gif")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var articles = new Array(); + if(detectWeb(doc, url) == "multiple") { + //search page + var items = new Object(); + var xpath; + if (url.indexOf("_ob=PublicationURL") != -1) { + // not sure if this case still arises. may need to be fixed at some point + xpath = '//table[@class="txt"]/tbody/tr/td[2]'; + } else { + xpath = '//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a'; + } + var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_row; + while (next_row = rows.iterateNext()) { + var title = next_row.textContent; + var link = next_row.href; + if (!title.match(/PDF \(/) && !title.match(/Related Articles/)) items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var doi = newDoc.evaluate('//div[@class="articleHeaderInner"][@id="articleHeader"]/a[contains(text(), "doi")]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(4); + var PDF = newDoc.evaluate('//a[@class="noul" and div/div[contains(text(), "PDF")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + var url = newDoc.location.href; + var get = newDoc.evaluate('//a[img[contains(@src, "exportarticle_a.gif")]]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + Zotero.Utilities.HTTP.doGet(get, function(text) { + var md5 = text.match(/<input type=hidden name=md5 value=([^>]+)>/)[1]; + var acct = text.match(/<input type=hidden name=_acct value=([^>]+)>/)[1]; + var userid = text.match(/<input type=hidden name=_userid value=([^>]+)>/)[1]; + var uoikey = text.match(/<input type=hidden name=_uoikey value=([^>]+)>/)[1]; + if (text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)) { + var alid = text.match(/<input type=hidden name=_ArticleListID value=([^>]+)>/)[1]; + } + if (alid) { + var docID = "_ArticleListID=" + alid + "&_uoikey=" + uoikey; + } else { + var docID = "_uoikey=" + uoikey; + } + var post = "_ob=DownloadURL&_method=finish&_acct=" + acct + "&_userid=" + userid + "&_docType=FLA&" + docID + "&md5=" + md5 + "&count=1&JAVASCRIPT_ON=Y&format=cite-abs&citation-type=RIS&Export=Export&x=26&y=17"; + var baseurl = url.match(/https?:\/\/[^/]+\//)[0]; + Zotero.Utilities.HTTP.doPost(baseurl + 'science', post, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:url, title:"ScienceDirect Snapshot", mimeType:"text/html"}, + {url:PDF, title:"ScienceDirect Full Text PDF", mimeType:"application/pdf"} + ]; + + + if(item.notes[0]) { + item.abstractNote = item.notes[0].note; + item.notes = new Array(); + } + if (doi) { + item.DOI = doi; + } + item.complete(); + }); + translator.translate(); + }); + }); + }, function() {Zotero.done;}); + } else { + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (url.indexOf("_ob=PublicationURL") != -1) { + xpath = '//table[@class="txt"]/tbody/tr[1]/td[2]'; + // not sure whether this case still exists + } else { + xpath = '//div[@class="font3"][@id="bodyMainResults"]/table/tbody/tr/td[2]/a'; + } + var rows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var next_row; + while (next_row = rows.iterateNext()) { + var title = next_row.textContent; + var link = next_row.href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, function(doc2) { + var item = new Zotero.Item("journalArticle"); + item.repository = "ScienceDirect"; + item.url = doc2.location.href; + var title = doc2.title.match(/^[^-]+\-([^:]+):(.*)$/); + item.title = Zotero.Utilities.trimInternal(title[2]); + item.publicationTitle = Zotero.Utilities.trimInternal(title[1]); + voliss = doc2.evaluate('//div[@class="pageText"][@id="sdBody"]/table/tbody/tr/td[1]', doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (voliss.match(/Volume\s+\d+/)) item.volume = voliss.match(/Volume\s+(\d+)/)[1]; + if (voliss.match(/Issues?\s+[^,]+/)) item.issue = voliss.match(/Issues?\s+([^,]+)/)[1]; + if (voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)) item.date = voliss.match(/(J|F|M|A|S|O|N|D)\w+\s+\d{4}/)[0]; + if (voliss.match(/Pages?\s+[^,^\s]+/)) item.pages = voliss.match(/Pages?\s+([^,^\s]+)/)[1]; + item.DOI = doc2.evaluate('//div[@class="articleHeaderInner"][@id="articleHeader"]/a[contains(text(), "doi")]', doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(4); + var abspath = '//div[@class="articleHeaderInner"][@id="articleHeader"]/div[@class="articleText"]/p'; + var absx = doc2.evaluate(abspath, doc2, nsResolver, XPathResult.ANY_TYPE, null); + var ab; + item.abstractNote = "" + while (ab = absx.iterateNext()) { + item.abstractNote += Zotero.Utilities.trimInternal(ab.textContent) + " "; + } + if (item.abstractNote.substr(0, 7) == "Summary") { + item.abstractNote = item.abstractNote.substr(9); + } + var tagpath = '//div[@class="articleText"]/p[strong[starts-with(text(), "Keywords:")]]'; + if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + if (doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1]) { + var tags = doc2.evaluate(tagpath, doc2, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(":")[1].split(";"); + for (var i in tags) { + item.tags.push(Zotero.Utilities.trimInternal(tags[i])); + } + } + } + item.attachments.push({url:doc2.location.href, title:"ScienceDirect Snapshot", mimeType:"text/html"}); + Zotero.Utilities.HTTP.doGet(item.url, function(text) { + var aus = text.match(/<strong>\s+<p>.*<\/strong>/)[0].replace(/<sup>/g, "$").replace(/<\/sup>/g, "$"); + aus = aus.replace(/\$[^$]*\$/g, ""); + aus = aus.replace(/<a[^>]*>/g, "$").replace(/<\/a[^>]*>/g, "$"); + aus = aus.replace(/\$[^$]*\$/g, ""); + aus = Zotero.Utilities.cleanTags(aus); + aus = aus.split(/(,|and)/); + for (var a in aus) { + if (aus[a] != "," && aus[a] != "and" && aus[a].match(/\w+/)) { + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aus[a]), "author")); + } + } + item.complete(); + }); + }, function() {Zotero.done;}); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/ScientificCommons.js b/translators/ScientificCommons.js @@ -0,0 +1,89 @@ +{ + "translatorID":"19643c25-a4b2-480d-91b7-4e0b761fb6ad", + "translatorType":4, + "label":"ScientificCommons", + "creator":"Sean Takats", + "target":"^http://(?:en|de|www)\\.scientificcommons\\.org", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-03-16 03:00:00" +} + +function detectWeb(doc, url) { + var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/; + var m = articleRe.exec(url); + + if(m) { + return "journalArticle"; + } else { + var frontRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/$/; + if(frontRe.test(url)) return "multiple"; + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var listElt = doc.evaluate('//div[@id="content_search_details"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (listElt) return "multiple"; + } + return false; +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var hostRe = new RegExp("^(http://[^/]+)/"); + var m = hostRe.exec(url); + var host = m[1]; + + var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/; + m = articleRe.exec(url); + var uris = new Array(); + + if(m) { + var idElt = doc.evaluate('//div[@id="publication_id"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if (idElt) { + uris.push(host + "/export/ris/" + idElt.textContent); + } else { + return false; + } + } else { + var items = new Array(); + var listElts = doc.evaluate('//div[@class="content_element"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var id; + var link; + var title; + while (listElt = listElts.iterateNext()) { + id = doc.evaluate('./@id', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + link = host + "/export/ris/" + id; + title = doc.evaluate('.//p[@class="title"]', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + items[link] = Zotero.Utilities.cleanString(title); + } + + items = Zotero.selectItems(items); + if(!items) return true; + + for(var uri in items) { + uris.push(uri); + } + } + + Zotero.Utilities.HTTP.doGet(uris, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + // add attachment support? + item.complete(); + }); + translator.translate(); + Zotero.done(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Scitation.js b/translators/Scitation.js @@ -0,0 +1,80 @@ +{ + "translatorID":"d75381ee-7d8d-4a3b-a595-b9190a06f43f", + "translatorType":4, + "label":"Scitation", + "creator":"Eugeniy Mikhailov", + "target":"^https?://(?:www\\.)?scitation.aip.org", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-09-02 13:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var multids = doc.evaluate('//tr/td/input[@type="checkbox" and @name="SelectCheck"]',doc, nsResolver, XPathResult.ANY_TYPE, null); + var singid = doc.evaluate('//input[@type="hidden" and @name="SelectCheck"]',doc, nsResolver, XPathResult.ANY_TYPE, null); + + if (multids.iterateNext()){ + return "multiple"; + } else if (singid.iterateNext()){ + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var multids = doc.evaluate('//tr/td/input[@type="checkbox" and @name="SelectCheck"]',doc, nsResolver, XPathResult.ANY_TYPE, null); + var singids = doc.evaluate('//input[@type="hidden" and @name="SelectCheck"]',doc, nsResolver, XPathResult.ANY_TYPE, null); + var multid; + var singid; + var getstring = "/getabs/servlet/GetCitation?PrefType=ARTICLE&PrefAction=Add+Selected&fn=open_isi&source=scitation&downloadcitation=+Go+"; + if (multid = multids.iterateNext()){ + var titles = new Array(); + var ids = new Array(); + var items = new Array(); + var title; + do { + title = doc.evaluate('../..//a[1]',multid, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + items[multid.value] = Zotero.Utilities.cleanString(title.textContent); + } while (multid =multids.iterateNext()); + + items = Zotero.selectItems(items); + if(!items) return true; + + for(var i in items) { + getstring = getstring + "&SelectCheck=" + i; + } + } else if (singid = singids.iterateNext()){ + getstring = getstring + "&SelectCheck=" + singid.value; + } + + var hostRe = new RegExp("^(https?://[^/]+)/"); + var m = hostRe.exec(url); + var host = m[1]; + var newuri = host + getstring; + Zotero.Utilities.HTTP.doGet(newuri, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var doi = text.match(/ER\s{2}\-\s.*org\/(.*)\n/)[1]; + if (doi) item.DOI = doi; + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Scopus.js b/translators/Scopus.js @@ -0,0 +1,75 @@ +{ + "translatorID":"a14ac3eb-64a0-4179-970c-92ecc2fec992", + "translatorType":4, + "label":"Scopus", + "creator":"Michael Berkowitz", + "target":"http://[^/]*www.scopus.com[^/]*", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-01 04:50:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("/results/") != -1) { + return "multiple"; + } else if (url.indexOf("/record/") != -1) { + return "journalArticle"; + } +} + +function getEID(url) { + return url.match(/eid=([^&]+)/)[1]; +} + +function returnURL(eid) { + return 'http://www.scopus.com/scopus/citation/output.url?origin=recordpage&eid=' + eid + '&src=s&view=CiteAbsKeywsRefs'; +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + if (detectWeb(doc, url) == "multiple") { + items = new Object(); + var boxes = doc.evaluate('//table/tbody/tr[@class]/td[@class="fldtextPad"][1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var box; + while (box = boxes.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate('.//span[@class="txtBoldOnly"]', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate('.//a[@class="outwardLink"]', box, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(returnURL(getEID(i))); + } + } else { + articles = [returnURL(getEID(url))]; + } + Zotero.Utilities.processDocuments(articles, function(newDoc) { + var eid = getEID(newDoc.location.href); + var stateKey = newDoc.evaluate('//input[@name="stateKey"]', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + var get = 'http://www.scopus.com/scopus/citation/export.url'; + var post = 'origin=recordpage&sid=&src=s&stateKey=' + stateKey + '&eid=' + eid + '&sort=&exportFormat=RIS&view=CiteAbsKeyws&selectedCitationInformationItemsAll=on'; + Zotero.Utilities.HTTP.doPost(get, post, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + if (item.notes[0]['note']) { + item.abstractNote = item.notes[0]['note']; + item.notes = new Array(); + item.complete(); + } + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/SlideShare.js b/translators/SlideShare.js @@ -0,0 +1,75 @@ +{ + "translatorID":"0cc8e259-106e-4793-8c26-6ec8114a9160", + "translatorType":4, + "label":"SlideShare", + "creator":"Michael Berkowitz", + "target":"http://www.slideshare.net/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":99, + "inRepository":true, + "lastUpdated":"2008-02-13 11:30:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("search") != -1) { + return "multiple"; + } else if (doc.evaluate('//div[@class="slideProfile"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "presentation"; + } +} + +function doWeb(doc, url) { + var loggedin = false; + if (doc.evaluate('//a[@class="green_link"][text() = "logout"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + loggedin = true; + } + var shows = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//div[@class="search_list_box"]/div[@class="text_12"]/a', doc, null, XPathResult.ANY_TYPE, null); + var next_link; + while (next_link = links.iterateNext()) { + items[next_link.href] = Zotero.Utilities.trimInternal(next_link.textContent); + } + items = Zotero.selectItems(items); + if (!items) { + return true; + } + for (var i in items) { + shows.push(i); + } + } else { + shows = [url]; + } + Zotero.Utilities.processDocuments(shows, function(newDoc) { + var downloadable = true; + if (newDoc.evaluate('//p[@class="upload_p_left"][contains(text(), "Download not available")]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + downloadable = false; + } + var item = new Zotero.Item("presentation"); + item.title = newDoc.evaluate('//div[@class="slideProfile"]//h3', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var creator = newDoc.evaluate('//div[@class="slideProfile"]//p/a[@class="blue_link_normal"]', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + item.creators.push(Zotero.Utilities.cleanAuthor(creator, "author")); + var tags = newDoc.evaluate('//a[@class="grey_tags"]', newDoc, null, XPathResult.ANY_TYPE, null); + var next_tag; + while (next_tag = tags.iterateNext()) { + item.tags.push(Zotero.Utilities.trimInternal(next_tag.textContent)); + } + var newurl = newDoc.location.href; + item.url = newurl; + item.repository = "SlideShare"; + var pdfurl; + if (newurl.substr(-1) == "/") { + pdfurl = newurl + "download"; + } else { + pdfurl = newurl + "/download"; + } + if (loggedin) { + if (downloadable) { + item.attachments.push({url:pdfurl, title:"SlideShare Slide Show", mimeType:"application/pdf"}); + } + } + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/SpringerLink.js b/translators/SpringerLink.js @@ -0,0 +1,105 @@ +{ + "translatorID":"f8765470-5ace-4a31-b4bd-4327b960ccd", + "translatorType":4, + "label":"SpringerLink", + "creator":"Simon Kornblith and Michael Berkowitz", + "target":"https?://(www\\.)*springerlink\\.com|springerlink.metapress.com[^/]*/content/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-12 18:40:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if((doc.title == "SpringerLink - All Search Results") || (doc.title == "SpringerLink - Journal Issue")) { + return "multiple"; + } else if(doc.title == "SpringerLink - Book Chapter") { + return "bookSection"; + } else if (doc.title == "SpringerLink - Book") { + return "book"; + } else if (doc.title == "SpringerLink - Journal Article") { + return "journalArticle"; + } else if(doc.evaluate('//a[text() = "RIS"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var m = url.match(/https?:\/\/[^\/]+/); + var host = m[0]; + + if(detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.title == "SpringerLink - Journal Issue") { + var items = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("table")[8], '/content/[^/]+/\\?p=[^&]+&pi='); + } else { + var results = doc.evaluate('//div[@class="listItemName"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + items[result.href] = Zotero.Utilities.trimInternal(result.textContent); + } + } + items = Zotero.selectItems(items); + if(!items) return true; + + var urls = new Array(); + for(var url in items) { + urls.push(url); + } + } else { + var urls = [url]; + } + + var RIS = new Array(); + + for each(var item in urls) { + var m = item.match(/\/content\/([^/]+)/); + RIS.push(host+"/export.mpx?code="+m[1]+"&mode=ris"); + } + Zotero.Utilities.HTTP.doGet(RIS, function(text) { + // load translator for RIS + text = text.replace("CHAPTER", "CHAP"); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var url = urls.shift(); + var m = url.match(/https?:\/\/[^\/]+\/content\/[^\/]+\/?/); + item.attachments = [ + {url:url, title:"SpringerLink Snapshot", mimeType:"text/html"}, + {url:m[0]+"fulltext.pdf", title:"SpringerLink Full Text PDF", mimeType:"application/pdf"} + ]; + + var oldCreators = item.creators; + item.creators = new Array(); + for each (var creator in oldCreators) { + if (creator['lastName'] + creator['firstName'] != "") { + var fName = creator['firstName'] ? creator['firstName'] : ""; + item.creators.push({firstName:Zotero.Utilities.trimInternal(fName), lastName:creator['lastName'], creatorType:"author"}); + } + } + + // fix incorrect chapters + if(item.publicationTitle && item.itemType == "book") item.title = item.publicationTitle; + + // fix "V" in volume + if(item.volume) { + item.volume = item.volume.replace("V", ""); + } + item.complete(); + }); + translator.translate(); + }, function() { Zotero.done() }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Stuff.co.nz.js b/translators/Stuff.co.nz.js @@ -0,0 +1,107 @@ +{ + "translatorID":"631ff0c7-2e64-4279-a9c9-ad9518d40f2b", + "translatorType":4, + "label":"Stuff.co.nz", + "creator":"Michael Berkowitz", + "target":"^http://(www.)?stuff.co.nz/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-08-14 22:15:00" +} + +function detectWeb(doc, url) { + if ((doc.location.href.indexOf("search-results") != -1) || (doc.location.href.indexOf("/blogs/blogs/") != -1 )) { + return "multiple"; + } else if ((doc.location.href.indexOf("blogs") != -1) && (url != "http://www.stuff.co.nz/blogs/blogs") && (url != "http://stuff.co.nz/blogs/blogs")) { + return "blogPost"; + } else if (doc.location.href.indexOf("html") == (doc.location.href.length - 4)){ + return "newspaperArticle"; + } +} + +function scrape(doc, url) { + if (doc.location.href.indexOf("html") != -1) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.url = doc.location.href; + newItem.publicationTitle = "Stuff.co.nz"; + newItem.title = doc.title.split(" - ")[0]; + + //abstract + var xpath = '//div[@id="leftcol_story"]/p/strong'; + newItem.abstractNote = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + + //date and author + var xpath = '//div[@id="story_headline"]'; + var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n+/)[2].split(" | "); + + newItem.date = Zotero.Utilities.cleanString(info[1].split(",")[1]); + + var author = Zotero.Utilities.cleanString(info[0]); + if (author.substr(0,2).toLowerCase() == "by") { + author = author.substr(3); + if (author.indexOf(" - ") != -1) { + author = author.split(" - ")[0].split(" "); + } else { + author = author.split(" "); + } + for (var i = 0 ; i < author.length ; i++) { + author[i] = author[i][0] + author[i].substr(1).toLowerCase(); + var creator = author.join(" "); + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(creator, "author")); + } else { + newItem.extra = author; + } + } else if (doc.location.href.indexOf("blogs") != -1) { + var newItem = new Zotero.Item("blogPost"); + newItem.url = doc.location.href; + + //post title + var xpath = '//div[@class="post"]/h2[@class="storytitle"]/a'; + newItem.title = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + //date and author + var xpath = '//div[@class="meta"][@id="postdate"]' + var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(" | "); + var byline = Zotero.Utilities.cleanString(info[0]).split(" in "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[0], "author")); + newItem.blogTitle = byline[1]; + var date = Zotero.Utilities.cleanString(info[1]).split("m "); + newItem.date = date[1]; + } + newItem.complete(); +} + +function doWeb(doc, url) { + var URLS = new Array(); + + //multiple + if ((url.indexOf("search-results") != -1) || (url.indexOf("blogs/blogs/") != -1)) { + if (url.indexOf("search-results") != -1) { + var xpath = '//div[@id="leftcol_story"]/p/a'; + } else if (url.indexOf("blogs/blogs/") != -1) { + var xpath = '//h2[@class="storytitle"]/a'; + } + + var items = new Object(); + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var newTitle = titles.iterateNext(); + while (newTitle) { + items[newTitle.href] = newTitle.textContent; + newTitle = titles.iterateNext(); + } + + items = Zotero.selectItems(items); + + for (var i in items) { + URLS.push(i); + } + } else { + URLS.push(url); + } + + Zotero.Utilities.processDocuments(URLS, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Sudoc.js b/translators/Sudoc.js @@ -0,0 +1,200 @@ +{ + "translatorID":"1b9ed730-69c7-40b0-8a06-517a89a3a278", + "translatorType":4, + "label":"Sudoc", + "creator":"Sean Takats and Michael Berkowitz", + "target":"^http://www\\.sudoc\\.abes\\.fr", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-19 17:30:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//table/tbody/tr/td[1][@class="preslabel"]/strong'; + var multxpath = '//a[@id="InitialFocusPoint"]'; + var elt; + + if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + else if (elt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) + { + var contenu = elt.textContent; + var numRegexp = /(Num.ro.de.notice|Record.number)/; + var m = numRegexp.exec(contenu); + if (m) { + // On a bien une notice d"ouvrage, on doit chercher limage + // pour choisir le type de document + var imgXpath = '/html/body/table/tbody/tr/td[1]/p/img/@src'; + var imgsrc = doc.evaluate(imgXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + if (imgsrc){ + if (imgsrc.indexOf("icon_per.gif") > 0){ + return "book"; + } else if (imgsrc.indexOf("icon_books.gif") > 0){ + return "book"; + } else if (imgsrc.indexOf("icon_thesis.gif") > 0){ + return "thesis"; + } else if (imgsrc.indexOf("icon_art.gif") > 0){ + return "journalArticle"; + } else { + return "book"; + } + } + } + } +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var rowXpath = '//tr[td[@class="preslabel"]]'; + var tableRows = doc.evaluate(rowXpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + + var newItem = new Zotero.Item(); + // TODO add other item types using detectWeb's icon checking code + newItem.itemType = "book"; + var imgXpath = '/html/body/table/tbody/tr/td[1]/p/img/@src'; + var imgsrc = doc.evaluate(imgXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + if (imgsrc){ + if (imgsrc.indexOf("icon_per.gif") > 0){ + newItem.itemType = "book"; + } else if (imgsrc.indexOf("icon_books.gif") > 0){ + newItem.itemType = "book"; + } else if (imgsrc.indexOf("icon_thesis.gif") > 0){ + newItem.itemType = "thesis"; + } else if (imgsrc.indexOf("icon_art.gif") > 0){ + newItem.itemType = "journalArticle"; + } else { + newItem.itemType = "book"; + } + } else { + newItem.itemType = "book"; + } + while (tableRow = tableRows.iterateNext()) + { + var field = doc.evaluate('./td[1]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var value = doc.evaluate('./td[2]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + field = Zotero.Utilities.superCleanString(field); + field = field.replace(/(\(s\))?\s*:\s*$/, ""); + if (field == "Titre" || field == "Title"){ + Zotero.debug("title = " + value); + value = value.replace(/(\[[^\]]+\])/g,""); + newItem.title = value.split(" / ")[0]; + } + if (field.substr(0,6) == "Auteur" || field.substr(0,6) == "Author"){ + var authors = doc.evaluate('./td[2]/a', tableRow, nsResolver, XPathResult.ANY_TYPE, null); + var author; + while (author = authors.iterateNext()){ + var authorText = author.textContent; + var authorParts = authorText.split(" ("); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authorParts[0], "author", true)); + } + } + if (field.substr(0,4) == "Date"){ + newItem.date = value; + } + if (field.substr(0,7) == "Editeur" || field.substr(0,9) == "Publisher"){ + var pubParts = value.split(" : "); + newItem.place = pubParts[0]; + // needs error checking below to avoid error + if (pubParts[1] ) { + pubParts = pubParts[1].split(", "); + newItem.publisher = pubParts[0]; + } + } + if (field.substr(0,4) == "ISBN" || field.substr(0,4) == "ISSN"){ + newItem.ISBN = value.split(" (")[0]; + } + if (field == "Description") { + var m = value.match(/([0-9]+) (?:[pP])/); + if (m) { + newItem.pages = m[1]; + } + } + if (field.substr(0,5) == "Serie" || field.substr(0,10) == "Collection"){ + newItem.series = value; + } + if (field.substr(0,6) == "Sujets" || field.substr(0,8) == "Subjects"){ + var subjectElmts = doc.evaluate('./td[2]/a', tableRow, nsResolver, XPathResult.ANY_TYPE, null); + var subject; + var subjects; + while (subject = subjectElmts.iterateNext()){ + subjects = subject.textContent.split(" -- "); + newItem.tags = newItem.tags.concat(subjects); + } + } + if (field == "In" || field == "Dans"){ + var jtitle = value.replace(/(\[[^\]]+\])/g,""); + jtitle = jtitle.split(" / ")[0]; + jtitle = jtitle.split(" - ")[0]; + newItem.publicationTitle = jtitle; + //get page numbers + var m = value.match(/(?:[Pp]\. )([0-9\-]+)/); + if (m) { + newItem.pages = m[1]; + } + //get ISBN or ISSN + m = value.match(/(?:ISSN|ISBN) ([0-9Xx\-]+)/); + if (m) { + newItem.ISBN = m[1]; + newItem.ISSN = m[1]; + } + // publicationTitle, issue/volume + } + // TODO Pages, Notes, Description, Language, Annexes + } + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var multxpath = '//a[@id="InitialFocusPoint"]'; + var elt; + + if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var newUrl = doc.evaluate('//base/@href', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var xpath = '//tr/td[3]/a'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + var links = new Array(); + var availableItems = new Array(); + var i = 0; + do { + var link = doc.evaluate('./@href', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; + var searchTitle = elmt.textContent; + availableItems[i] = searchTitle; + links[i] = link; + i++; + } while (elmt = elmts.iterateNext()); + var items = Zotero.selectItems(availableItems); + + if(!items) { + return true; + } + var uris = new Array(); + for(var i in items) { + uris.push(newUrl + links[i]); + } + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + Zotero.wait(); + } + else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/Sydney Morning Herald.js b/translators/Sydney Morning Herald.js @@ -0,0 +1,84 @@ +{ + "translatorID":"19120a71-17a8-4629-936a-ccdf899b9861", + "translatorType":4, + "label":"Sydney Morning Herald", + "creator":"Michael Berkowitz", + "target":"^http://(www|search).smh.com.au/(news|siteSearch|articles)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":99, + "inRepository":true, + "lastUpdated":"2007-08-14 22:15:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.indexOf("news") != -1 || doc.location.href.indexOf("articles") != -1) { + return "newspaperArticle"; + } else if (doc.location.href.indexOf("siteSearch") != -1) { + return "multiple"; + } +} + +function regexMeta(str, item) { + var re = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/; + var stuff = str.match(re); + if (stuff[1] == "byline") { + authors = stuff[2].split(" and "); + for (var i = 0 ; i < authors.length ; i++) { + item.creators.push(Zotero.Utilities.cleanAuthor(authors[i].split(" in ")[0], "author")); + } + } else if (stuff[1] == "sitecategories") { + item.section = stuff[2]; + } else if (stuff[1] == "publishdate") { + item.date = stuff[2].split(/\s+/)[0]; + } +} + +function doWeb(doc, url) { + var articles = new Array(); + if (doc.location.href.indexOf("siteSearch") != -1) { + var items = new Array(); + var xpath = '//div[@class="searchresults"]/dl/dt/a'; + var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var thing = stuff.iterateNext(); + while (thing) { + items[thing.href] = thing.textContent; + thing = stuff.iterateNext(); + } + + items = Zotero.selectItems(items); + + for (var i in items) { + articles.push(i); + } + } else { + articles.push(url); + } + for (var i = 0 ; i < articles.length ; i++) { + var url = articles[i] + Zotero.Utilities.HTTP.doGet(url, function(text) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "Sydney Morning Herald"; + newItem.url = url; + newItem.ISSN = "0312-6315"; + //title + var t = /<HEADLINE>(.*)<\/HEADLINE>/; + newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1])); + //hooray for real meta tags! + var meta = /<meta\s+name=(.*)\/>/g; + var metaTags = text.match(meta); + for (var i = 0 ; i <metaTags.length ; i++) { + regexMeta(metaTags[i], newItem); + } + //abstract + var abs = /meta name=\"Description\" content=\"([^\"]*)\"/; + var abstract = text.match(abs)[1].split(/\s+/); + abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase(); + abstract = abstract.join(" "); + newItem.abstractNote = Zotero.Utilities.unescapeHTML(abstract.substr(0, abstract.length - 3)); + newItem.complete(); + Zotero.done(); + }, function() {}); + } + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Age.js b/translators/The Age.js @@ -0,0 +1,109 @@ +{ + "translatorID":"efb3c424-daa9-40c9-8ee2-983d2802b27a", + "translatorType":4, + "label":"The Age", + "creator":"Michael Berkowitz", + "target":"^http://(www|search).theage.com.au/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-08-14 22:15:00" +} + +function detectWeb(doc, url) { + if (url.indexOf("siteSearch.ac") != -1) { + return "multiple"; + } else if (url.indexOf("html") != -1) { + return "newspaperArticle"; + } +} + +function scrape(url) { + Zotero.Utilities.HTTP.doGet(url, function(text) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.ISSN = "0312-6307"; + newItem.url =url; + newItem.publicationTitle = "The Age"; + Zotero.debug(url); + + //title + var t = /<HEADLINE>(.*)<\/HEADLINE>/; + newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]).split(" - ")[0]); + + //meta tags? (except abstract, for some reason) + var m = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/g; + var metaTags = text.match(m); + var metaInfo = new Object(); + var metaNames = new Array(); + var m2 = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/; + for (var i = 0 ; i < metaTags.length ; i++) { + var stuff = metaTags[i].match(m2); + metaInfo[stuff[1]] = stuff[2]; + metaNames.push(stuff[1]); + } + + for (var i = 0 ; i <metaNames.length ; i++) { + if (metaNames[i] == "sitecategories") { + newItem.section = metaInfo[metaNames[i]].split(",")[0]; + } else if (metaNames[i] == "publishdate") { + newItem.date = metaInfo[metaNames[i]].split(/\s+/)[0]; + } else if (metaNames[i] == "byline") { + var byline = metaInfo[metaNames[i]].split(",")[0]; + if (byline.indexOf(" and ") != -1) { + byline = byline.split(" and "); + for (var j = 0 ; j < byline.length ; j++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[j], "author")); + } + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(byline, "author")); + } + } else if (metaNames[i] == "keywords") { + var keywords = metaInfo[metaNames[i]].split(","); + for (var k = 0 ; k < keywords.length ; k++) { + if (keywords[k].length > 1) { + newItem.tags.push(Zotero.Utilities.unescapeHTML(keywords[k][0].toUpperCase() + keywords[k].substr(1).toLowerCase())); + } + } + } + } + + //abstract + var a = /\"Description\"\s+content=\"([^\"]*)\"/; + newItem.abstractNote = Zotero.Utilities.unescapeHTML(text.match(a)[1].substring(0, text.match(a)[1].length - 3)); + + newItem.complete(); + Zotero.done(); + }, function() {}); +} + +function doWeb(doc, url) { + var URLS = new Array(); + if (url.indexOf("siteSearch.ac") != -1) { + var xpath = '//div[@class="searchresults"]/dl/dt/a'; + var titles = new Object(); + var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var newest = stuff.iterateNext(); + while (newest) { + titles[newest.href] = newest.textContent; + newest = stuff.iterateNext(); + } + + var items = Zotero.selectItems(titles); + + for (var i in items) { + URLS.push(i.split("u=")[1].replace(/%3A/g,":").replace(/%2F/g,"/").split("&")[0]); + } + } else { + URLS.push(url); + } + + Zotero.debug(URLS); + + Zotero.Utilities.HTTP.doPost(URLS, "", function(text) { + for (var i = 0 ; i < URLS.length ; i++) { + scrape(URLS[i]); + } + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Australian.js b/translators/The Australian.js @@ -0,0 +1,104 @@ +{ + "translatorID":"393afc28-212d-47dd-be87-ec51bc7a58a4", + "translatorType":4, + "label":"The Australian", + "creator":"Michael Berkowitz", + "target":"^http://(searchresults|www.theaustralian).news.com.au/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-08-14 22:20:00" +} + +function detectWeb(doc, url) { + if (url == "http://searchresults.news.com.au/servlet/Search" || url.indexOf("siteSearch") != -1) { + return "multiple"; + } else if (url.indexOf("story") != -1) { + return "newspaperArticle"; + } +} + +function scrape(url) { + Zotero.Utilities.HTTP.doGet(url, function(text) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.url = url; + newItem.publicationTitle = "The Australian"; + + //title + var t = /<title>(.*)<\/title>/; + newItem.title = Zotero.Utilities.capitalizeTitle(text.match(t)[1].split(" | ")[0]); + + //abstract + var abs = /meta name=\"description\"\s+content=\"(.*)\"/; + var abstract = Zotero.Utilities.unescapeHTML(text.match(abs)[1]).split(" "); + abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase(); + newItem.abstractNote = abstract.join(" "); + + //tags + var t = /meta name=\"keywords\"\s+content=\"(.*)\"/; + var tags = text.match(t)[1].split(/,\s+/); + for (var i = 0 ; i < tags.length ; i++) { + newItem.tags.push(Zotero.Utilities.unescapeHTML(tags[i])); + } + + //section + var sec = /active\"><a[^>]*>(.*)<\/a>/; + if (text.match(sec)) { + newItem.section = text.match(sec)[1]; + } + + //timestamp + var t = /<em class=\"timestamp\">(.*)<\/em>/; + newItem.date = text.match(t)[1]; + + //byline + var by = /<div\s+class=\"module-subheader\"><p>(.*)/; + if (text.match(by)[1]) { + var byline = text.match(by)[1]; + var authors = new Array(); + if (byline.indexOf(",") != -1) { + byline = byline.split(",")[0]; + } + if (byline.indexOf(" and ") != -1) { + var authors = byline.split(" and "); + } else { + authors.push(byline); + } + for (var i = 0 ; i < authors.length ; i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + } + + newItem.complete(); + Zotero.debug(newItem); + + Zotero.done(); + }, function() {}); +} + +function doWeb(doc, url) { + var URLS = new Array(); + var newItems = new Object(); + if (url == "http://searchresults.news.com.au/servlet/Search") { + var articles = new Array(); + var xpath = '//ol/li/h4[@class="heading"]/a'; + //var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + + newItems = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("h4"), /^http:\/\//); + newItems = Zotero.selectItems(newItems); + } else { + newItems[url] = doc.title.split(" | ")[0]; + } + + for (var i in newItems) { + URLS.push(i); + } + + Zotero.debug(URLS); + Zotero.Utilities.HTTP.doPost(URLS, "", function(text) { + for (var i = 0 ; i < URLS.length ; i++) { + scrape(URLS[i]); + } + }); +} +\ No newline at end of file diff --git a/translators/The Boston Globe.js b/translators/The Boston Globe.js @@ -0,0 +1,143 @@ +{ + "translatorID":"1f245496-4c1b-406a-8641-d286b3888231", + "translatorType":4, + "label":"The Boston Globe", + "creator":"Adam Crymble", + "target":"http://(www|search).boston.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-06 08:45:00" +} + +function detectWeb(doc, url) { + if (url.match("search.boston.com")) { + return "multiple"; + } else if (doc.evaluate('//div[@id="headTools"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "newspaperArticle"; + } else if (doc.evaluate('//div[@id="blogEntry"]/h1/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "blogPost"; + } +} + +//Boston Globe and Boston.com Translator. Code by Adam Crymble + +function scrape (doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + }: null; + + //sets variables that remain constant in both formats + + if (doc.evaluate('//span[@id="dateline"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathDateResults = doc.evaluate ('//span[@id="dateline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + if (doc.evaluate('//span[@id="byline"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xPathAuthorResults= doc.evaluate ('//span[@id="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + + //sets variables unique to the blog posts on Boston.com + + if (doc.evaluate('//div[@id="blogEntry"]/h1/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + + var newItem =new Zotero.Item("blogPost"); + newItem.publicationTitle = "Boston.com"; + + //title + var xPathTitle = '//div[@id="blogEntry"]/h1/a'; + + //date + var articleDate = xPathDateResults.iterateNext().textContent; + newItem.date = articleDate; + + //author + var articleAuthor = xPathAuthorResults.iterateNext().textContent.replace(/Posted by /i, ''); + articleAuthor = articleAuthor.split(','); + var authorName = articleAuthor[0].split("and "); + + //else it sets the variables unique to the articles on the Boston Globe + + } else if (doc.evaluate('//div[@id="headTools"]/h1', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The Boston Globe"; + + //title + var xPathTitle = '//div[@id="headTools"]/h1'; + + //date + if (doc.evaluate('//span[@id="dateline"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var articleDate = xPathDateResults.iterateNext().textContent; + if (articleDate.match('/')) { + articleDate = articleDate.split('/'); + newItem.date = articleDate[1]; + } else { + newItem.date = articleDate; + } + + } + + //author(s) + var articleAuthor = xPathAuthorResults.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + articleAuthor= articleAuthor.substr(3); + var authorName = articleAuthor.split("and "); + + + //byline + if (doc.evaluate('//div[@id="headTools"]/h2', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate ('//div[@id="headTools"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + } + + //creates title using xPaths defined above + var xPathTitleResults = doc.evaluate (xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null); + newItem.title = xPathTitleResults.iterateNext().textContent; + + //pushes author(s) + + for (var i=0; i<authorName.length; i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authorName[i], "author")); + } + + newItem.url = doc.location.href; + + newItem.complete(); +} + + +function doWeb (doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + }: null; + + var uris= new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var result = doc.evaluate('//div[@class="regTZ"]/a[@class="titleLink"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = result.iterateNext(); + Zotero.debug(elmt); + while (elmt) { + //items.push(elmt.href); + items[elmt.href] = elmt.textContent; + elmt = result.iterateNext(); + } + + items = Zotero.selectItems(items); + + if (!items) { + return true; + } + + for (var i in items) { + uris.push(i); + } + } else + uris.push(url); + Zotero.debug(uris); + Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Chronicle of Higher Education.js b/translators/The Chronicle of Higher Education.js @@ -0,0 +1,120 @@ +{ + "translatorID":"1e6d1529-246f-4429-84e2-1f1b180b250d", + "translatorType":4, + "label":"The Chronicle of Higher Education", + "creator":"Simon Kornblith", + "target":"^http://chronicle\\.com/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-12 23:41:00" +} + +function detectWeb(doc, url) { + var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\// + if(articleRegexp.test(url)) { + if(doc.location.href.indexOf("weekly") != -1) { + return "magazineArticle"; + } else { + return "webpage"; + } + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags.namedItem(field)) { + newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content")); + } +} + +function scrape(doc) { + if(doc.location.href.indexOf("weekly") != -1) { + var newItem = new Zotero.Item("magazineArticle"); + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // go in search of pages + var content = doc.evaluate('/html/body/table[@class="layout"]/tbody/tr[1]/td[@class="content"]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(content) { + var pagesRegexp = /http:\/\/chronicle.com\nSection: [^\n]+\nVolume [0-9]+, Issue [0-9]+, Pages? ([A-Z0-9\-]+)/; + var m = pagesRegexp.exec(content.textContent); + if(m) { + newItem.pages = m[1]; + } + } + } else { + var newItem = new Zotero.Item("webpage"); + } + newItem.publicationTitle = "The Chronicle of Higher Education"; + newItem.ISSN = "0009-5982"; + + newItem.url = doc.location.href; + var metaTags = doc.getElementsByTagName("meta"); + + newItem.attachments.push({document:doc, title:"Chronicle of Higher Education Snapshot"}); + + associateMeta(newItem, metaTags, "published_date", "date"); + associateMeta(newItem, metaTags, "headline", "title"); + associateMeta(newItem, metaTags, "section", "section"); + associateMeta(newItem, metaTags, "volume", "volume"); + associateMeta(newItem, metaTags, "issue", "issue"); + + if(metaTags.namedItem("byline")) { + var author = Zotero.Utilities.cleanString(metaTags.namedItem("byline").getAttribute("content")); + if(author.substr(0, 3).toLowerCase() == "by ") { + author = author.substr(3); + } + + var authors = author.split(" and "); + for each(var author in authors) { + // fix capitalization + var words = author.split(" "); + for(var i in words) { + words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase(); + } + author = words.join(" "); + + if(words[0] == "The") { + newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true}); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\//; + if(articleRegexp.test(url)) { + scrape(doc); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, '^http://chronicle\\.com/(?:daily|weekly)/[^/]+/'); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/The Economist.js b/translators/The Economist.js @@ -0,0 +1,117 @@ +{ + "translatorID":"6ec8008d-b206-4a4c-8d0a-8ef33807703b", + "translatorType":4, + "label":"The Economist", + "creator":"Michael Berkowitz", + "target":"^http://(www.)?economist.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-22 20:30:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.indexOf("search") != -1) { + return "multiple"; + } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1 || doc.location.href.indexOf("cityPage") != -1) { + return "magazineArticle"; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + newItem = new Zotero.Item("magazineArticle"); + newItem.ISSN = "0013-0613"; + newItem.url = doc.location.href; + newItem.publicationTitle = "The Economist"; + + + //get headline + var title = new Array(); + if (doc.title && doc.title != "" && doc.title != "Economist.com") { + title = doc.title.split(" | "); + } else { + title.push(doc.evaluate('//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/font/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + + if (title.length == 1) { + title.push = title; + } else { + title = title.slice(0, title.length - 1); + title = title.join(": "); + } + newItem.title = title; + + if (doc.evaluate('//div[@class="clear"][@id="pay-barrier"]/div[@class="col-right"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { + newItem.extra = "(Subscription only)"; + } + + //get abstract + if (doc.evaluate('//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { + newItem.abstractNote = doc.evaluate('//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else if (doc.evaluate('//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { + newItem.abstractNote = doc.evaluate('//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } else if (doc.evaluate('//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/p[3]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/p[3]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + if (newItem.abstractNote) newItem.abstractNote = Zotero.Utilities.trimInternal(newItem.abstractNote); + //get date and extra stuff + if (doc.evaluate('//div[@class="col-left"]/p[@class="info"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { + newItem.date = doc.evaluate('//div[@class="col-left"]/p[@class="info"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(0,13); + } + + var url = doc.location.href; + newItem.attachments = [ + {url:url.replace("displaystory", "PrinterFriendly"), title:"The Economist Snapshot", mimeType:"text/html"} + ]; + + newItem.complete(); +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x" ) return namespace; else return null; + } : null; + + var urls = new Array(); + + if (doc.title == "Search | Economist.com") { + var items = new Array(); + var uris = new Array(); + var results = doc.evaluate('//ol[@class="search-results"]/li/h2/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var headline = results.iterateNext(); + while (headline) { + items.push(headline.textContent); + uris.push(headline.href); + headline = results.iterateNext(); + } + + var newItems = new Object(); + for (var i = 0 ; i <items.length ; i++) { + newItems[items[i]] = uris[i]; + } + var newItems = Zotero.Utilities.getItemArray(doc, doc, '^http://(www.)*economist.com/(.*/)*(displaystory.cfm|cityPage.cfm)'); + newItems = Zotero.selectItems(newItems); + if (!newItems) { + return true; + } + + for (var i in newItems) { + urls.push(i); + } + } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1) { + urls.push(url); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Free Dictionary.js b/translators/The Free Dictionary.js @@ -0,0 +1,29 @@ +{ + "translatorID":"0c661209-5ec8-402b-8f18-7dec6ae37d95", + "translatorType":4, + "label":"The Free Dictionary", + "creator":"Michael Berkowitz", + "target":"http://(.*\\.)?thefreedictionary.com/(\\w+)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-15 00:30:00" +} + +function detectWeb(doc, url) { + return "dictionaryEntry"; +} + +function doWeb(doc, url) { + var item = new Zotero.Item('dictionaryEntry'); + item.title = Zotero.Utilities.capitalizeTitle(url.replace("+", " ").match(/[^/]+$/)[0]); + item.dictionaryTitle = "The Free Dictionary"; + var defs = doc.evaluate('//div[@class="pseg"]', doc, null, XPathResult.ANY_TYPE, null); + var def; + while (def = defs.iterateNext()) { + item.notes.push({note:Zotero.Utilities.trimInternal(def.textContent)}); + } + item.url = + item.complete(); +} +\ No newline at end of file diff --git a/translators/The Globe and Mail.js b/translators/The Globe and Mail.js @@ -0,0 +1,221 @@ +{ + "translatorID":"e0234bcf-bc56-4577-aa94-fe86a27f6fd6", + "translatorType":4, + "label":"The Globe and Mail", + "creator":"Adam Crymble", + "target":"http://www.theglobeandmail.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var metaTags = new Object(); + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + + } + + if (doc.evaluate('//div[@id="header"]/h2/a/img', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var printEdition1 = doc.evaluate('//div[@id="header"]/h2/a/img', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().src; + if (printEdition1.match("printedition")) { + return "newspaperArticle"; + } + } + + if (doc.evaluate('//p[@id="continueReading"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var payPerView = doc.evaluate('//p[@id="continueReading"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (payPerView == "purchase this article") { + return "newspaperArticle"; + } + } + + if (metaTags["article_id"]) { + return "newspaperArticle"; + + } else if (doc.title.match('globeandmail.com: Search')) { + return "multiple"; + } + + if (doc.evaluate('//ul[@id="utility"]/li[@class="email"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var blogCheck = doc.evaluate('//ul[@id="utility"]/li[@class="email"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var blogCheck1 = blogCheck.iterateNext().textContent; + if (blogCheck1.match("blog")) { + if (doc.location.href.match("story")) { + return "blogPost"; + } + } + } +} + +//Translator for the Globe and Mail newspaper: code by Adam Crymble + +function associateMeta (newItem, metaTags, field, zoteroField) { + if (metaTags[field]) { + newItem[zoteroField] = metaTags[field]; + } +} + +function scrape(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if (detectWeb(doc, url) == "blogPost") { + var newItem = new Zotero.Item("blogPost"); + + var title = doc.evaluate('//div[@id="headline"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null); + newItem.title = title.iterateNext().textContent; + + var blogger = doc.evaluate('//div[@id="author"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + var bloggerName = blogger.iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + var bloggerName1 = bloggerName.split(","); + newItem.creators.push(Zotero.Utilities.cleanAuthor(bloggerName1[0], "author")); + } + var noMetaType = 0; + + if (detectWeb(doc, url) == "newspaperArticle") { + var newItem = new Zotero.Item("newspaperArticle"); + + //checks if the article is from the "Print Edition" which doesn't contain meta data. + if (doc.evaluate('//div[@id="header"]/h2/a/img', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var printEdition1 = doc.evaluate('//div[@id="header"]/h2/a/img', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().src; + if (printEdition1.match("printedition")) { + noMetaType = 1; + if (doc.evaluate('//div[@id="author"]/p[@class="article-date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.date= doc.evaluate('//div[@id="author"]/p[@class="article-date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + } + } + + //checks if the article is a Pay per view article. + if (doc.evaluate('//p[@id="continueReading"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var payPerView = doc.evaluate('//p[@id="continueReading"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (payPerView == "purchase this article") { + noMetaType = 1; + } + } + + //format for the "Print Edition" and "Pay per view" articles + if (noMetaType = 1) { + noMetaType = 1; + if (doc.evaluate('//div[@id="headline"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.title = doc.evaluate('//div[@id="headline"]/h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + if (doc.evaluate('//div[@id="author"]/p[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//div[@id="author"]/p[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + noMetaType = 0; + } + + var metaTags = new Object(); + var tagsContent = new Array(); + + //get data + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content")); + } + + //author + if (metaTags["byline"]) { + var author = metaTags["byline"]; + } + + //date + if (metaTags["pubdate"]) { + var month = metaTags["pubdate"].substr(4, 2); + var day = metaTags["pubdate"].substr(6, 2); + var year = metaTags["pubdate"].substr(0, 4); + + newItem.date = (year + "-" + month + "-"+ day); + } + + //tags + if (metaTags["article_keywords"]) { + tagsContent = metaTags["article_keywords"].split("; "); + } + + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i] != (" ") && tagsContent[i] != ("")) { + newItem.tags[i] = tagsContent[i]; + } + } + + associateMeta (newItem, metaTags, "headline", "title"); + associateMeta (newItem, metaTags, "summary", "abstractNote"); + associateMeta (newItem, metaTags, "desk", "section"); + associateMeta (newItem, metaTags, "article_id", "callNumber"); + associateMeta (newItem, metaTags, "credit", "rights"); + + //rest of author (shared between both newspaperArticle types) + if (author) { + + + if (author.substr(0,3).toLowerCase() == "by ") { + author= author.substr(3); + } + + var authors = author.toLowerCase().split(" and "); + for each(var author in authors) { + var words = author.split(" "); + + for (var i in words) { + if (words[i] != "") { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + } + author = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + } + + newItem.url = doc.location.href; + newItem.complete(); + +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var next_title = new Array(); + + var titlesCount = doc.evaluate('count (//h3[@class="storyLink"]/a)', doc, nsResolver, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate('//h3[@class="storyLink"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i < titlesCount.numberValue; i++) { + next_title = titles.iterateNext(); + + if (next_title.href.match("story")) { + items[next_title.href] = next_title.textContent; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Hamilton Spectator.js b/translators/The Hamilton Spectator.js @@ -0,0 +1,114 @@ +{ + "translatorID":"c9338ed5-b512-4967-8ffe-ab9c973559ef", + "translatorType":4, + "label":"The Hamilton Spectator", + "creator":"Adam Crymble", + "target":"http://www.thespec.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search")) { + return "multiple"; + } else if (doc.location.href.match("article")) { + return "newspaperArticle"; + } +} + +//Hamilton Spectator translator. code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + + if (doc.title.match("TheSpec.com - ")) { + var lineBreak = doc.title.lastIndexOf(" - "); + newItem.section = doc.title.substr(14, lineBreak-14); + } + + var xPathAbstract = '//span[@class="subhead1"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___SubTitle1__"]'; + if (doc.evaluate(xPathAbstract, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate(xPathAbstract, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var xPathAuthor1 = '//span[@class="articleAuthor"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Author1__"]'; + if (doc.evaluate(xPathAuthor1, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author1 = doc.evaluate(xPathAuthor1, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (author1.match(", ")) { + author1 = author1.split(", "); + author1 = author1[0]; + } + var words = author1.toLowerCase().split(/\s/); + + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + + author1 = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1, "author")); + } + + var xPathAuthor2 = '//span[@class="articleAuthor"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Author2__"]'; + if (doc.evaluate(xPathAuthor2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author2 = doc.evaluate(xPathAuthor2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + if (author2.match(", ")) { + author2 = author2.split(", "); + author2 = author2[0]; + } + var words = author2.toLowerCase().split(/\s/); + + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + + author2 = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author2, "author")); + } + + var xPathTitle = '//span[@class="headlineArticle"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Title__"]'; + newItem.title = doc.evaluate(xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + newItem.url = doc.location.href; + newItem.publicationTitle = "The Hamilton Spectator"; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.href.match("article") && !next_title.href.match("229246") && !next_title.textContent.match(/\s\s\s/)) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/The Hindu.js b/translators/The Hindu.js @@ -0,0 +1,97 @@ +{ + "translatorID":"9499c586-d672-42d6-9ec4-ee9594dcc571", + "translatorType":4, + "label":"The Hindu", + "creator":"Prashant Iyengar and Michael Berkowitz", + "target":"http://(www.)?hindu.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-08 20:30:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//h2[@class="r"]/a[@class="l"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else { + return "newspaperArticle"; + } +} + + +function regexMeta(str, item) { + var re = /NAME\=\"([\w\W]*?)\"\s+CONTENT\=\"([\w\W]*?)\"/; + var stuff = str.match(re); + if (stuff) + { + if (stuff[1] == "PAGEHEAD") { + item.section = stuff[2].split(/\s+/)[0]; + } + if (stuff[1] == "ZONE") { + item.place = stuff[2].split(/\s+/)[0]; + } + if (stuff[1] == "PAGENUMBER") { + item.pages = stuff[2].split(/\s+/)[0]; + } + + + + } +} + + + +function doWeb(doc, url) { + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var xpath = '//h2[@class="r"]/a[@class="l"]'; + var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var link; + var items = new Object(); + while (link = links.iterateNext()) { + items[link.href] = link.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + + } else { arts = [url]; } + for each (var art in arts) { + Zotero.debug(art); + Zotero.Utilities.HTTP.doGet(art, function(text) { + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The Hindu"; + newItem.url = art; + //title + var t = /\<TITLE\>[\w\W]*\:([\w\W]*?)<\/TITLE/; + newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1])); + + var ti = /\<FONT color\=black\>(.*)?\<\/FONT\>/; + newItem.date = text.match(ti)[1]; + + var auth = /\<font class\=storyhead[\w\W]*?justify\>([\w\W]*?)\<p\>/; + if (text.match(auth)) + { + //newItem.author=Zotero.Utilities.cleanAuthor(text.match(auth)[1]); + cleanauth=Zotero.Utilities.cleanTags(text.match(auth)[1]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(cleanauth, "author")); + + } + + newItem.websiteTitle="The Hindu"; + newItem.edition="Online"; + + //hooray for real meta tags! + var meta = /<META NAME[\w\W]*?\>/g; + var metaTags = text.match(meta); + for (var i = 0 ; i <metaTags.length ; i++) { + regexMeta(metaTags[i], newItem); + } + newItem.complete(); + Zotero.done(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/The Microfinance Gateway.js b/translators/The Microfinance Gateway.js @@ -0,0 +1,59 @@ +{ + "translatorID":"2cd7d362-5fba-423a-887f-579ed343e751", + "translatorType":4, + "label":"The Microfinance Gateway", + "creator":"Michael Berkowitz", + "target":"http://(www.)?microfinancegateway.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-06 08:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/results\.php/) || url.match(/search/)) { + return "multiple"; + } else if (url.match(/content\/article/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var ns = doc.documentElement.namespaceURI; + var nsResolver = ns ? function (prefix) { + if (prefix == 'x') return ns; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = Zotero.Utilities.getItemArray(doc, doc, "content/article/detail"); + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//td[2][@class="main_content_box"]/h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var authors = Zotero.Utilities.trimInternal(doc.evaluate('//div[@class="source"]/strong', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent).split(/(\.,|&)/); + for each (var aut in authors) { + if (aut.match(/\w+/)) { + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author", true)); + } + } + item.url = doc.location.href; + item.date = Zotero.Utilities.trimInternal(doc.evaluate('//span[@class="date"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//span[@class="summary"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var pdfurl = doc.evaluate('//div[@class="articleTopics"]/div/a[1]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href; + item.publicationTitle = doc.evaluate('//div[@class="articleTopics"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Published\s+by:\s+(.*)\n/)[1]; + item.attachments = [ + {url:item.url, title:item.title + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.title + " PDF", mimeType:"application/pdf"} + ]; + + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/The New York Review of Books.js b/translators/The New York Review of Books.js @@ -0,0 +1,106 @@ +{ + "translatorID":"4c164cc8-be7b-4d02-bfbf-37a5622dfd56", + "translatorType":4, + "label":"The New York Review of Books", + "creator":"Simon Kornblith", + "target":"^https?://www\\.nybooks\\.com/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-12-14 00:40:00" +} + +function detectWeb(doc, url) { + var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+\/?/ + if(articleRegexp.test(url)) { + return "journalArticle"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + if(metaTags.namedItem(field)) { + newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content")); + } +} + +function scrape(doc) { + var newItem = new Zotero.Item("journalArticle"); + newItem.publicationTitle = "The New York Review of Books"; + newItem.ISSN = "0028-7504"; + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + newItem.url = doc.location.href; + var metaTags = doc.getElementsByTagName("meta"); + + newItem.attachments.push({document:doc, title:"New York Review of Books Snapshot"}); + + associateMeta(newItem, metaTags, "dc.title", "title"); + + var info = doc.evaluate('//div[@id="center-content"]/h4[@class="date"]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + + if(info) { + // get date (which is in an a tag) + newItem.date = doc.evaluate("./a", info, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext(); + if(newItem.date) { + newItem.date = newItem.date.textContent; + } + + info = Zotero.Utilities.cleanString(info.textContent); + + // get volume and issue + var infoRe = /Volume ([0-9]+), Number ([0-9]+)/; + var m = infoRe.exec(info); + if(m) { + newItem.volume = m[1]; + newItem.issue = m[2]; + } + } + + + var authors = doc.evaluate('//div[@id="center-content"]/h4/a[substring(@href, 1, 9) = "/authors/"]', + doc, nsResolver, XPathResult.ANY_TYPE, null); + + + var author; + while(author = authors.iterateNext()) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author", false)); + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+/ + if(articleRegexp.test(url)) { + scrape(doc); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, "^https?://www\\.nybooks\\.com/articles/[0-9]+/?"); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/The Open Library.js b/translators/The Open Library.js @@ -0,0 +1,173 @@ +{ + "translatorID":"96b54986-16c7-45ea-b296-fde962d658b2", + "translatorType":4, + "label":"The Open Library", + "creator":"Adam Crymble", + "target":"http://openlibrary.org", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-24 05:30:00" +} + +function detectWeb(doc, url) { + + if (doc.location.href.match("search")) { + return "multiple"; + } else if (doc.evaluate('//div[@class="title-pad"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } + +} + +//Open Library Translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + newItem.title = doc.evaluate('//div[@class="title-pad"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + if (doc.evaluate('//div[@id="header"]/div[@class="subtitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@id="header"]/div[@class="subtitle"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + var m = 0; + if (doc.evaluate('//div[@id="statement"]/span[@class="book-details-italic"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var publisher = doc.evaluate('//div[@id="statement"]/span[@class="book-details-italic"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var publisher1 = publisher.split(/\n/); + for (var i= 0; i < publisher1.length; i++) { + publisher1[i] = publisher1[i].replace(/^\s*|\s+$/g, ''); + if (publisher1[i].match("Published in ")) { + newItem.date = publisher1[i].substr(13, publisher1[i].length-3); + m = i+1; + } else if (publisher1[i].match(/\(/)) { + newItem.place = publisher1[i]; + } + } + + if (m > 0) { + newItem.publisher = publisher1[m]; + } + } + + var headers = doc.evaluate('//td[1]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//td[2]', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//td[1])', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent.replace(/\s+/g, ''); + dataTags[fieldTitle] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + //author + if (doc.evaluate('//div[@id="statement"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate('//div[@id="statement"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var author = author.split(/\n/); + for (var i in author) { + author[i] = author[i].replace(/^\s*|\s*$/g, ''); + if (author[i].match(/^by/)) { + author = author[i].substr(3); + + if (author.match(", ")) { + if (author.match(/\s/)) { + var wordcount = author.split(/\s/); + + if (wordcount.length > 3) { + + var words = author.split(", "); + for (var k in words) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(words[k], "author")); + } + + } else { + + var words = author.split(", "); + author = words[1] + " " + words[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + break; + } + } + } else { + + newItem.creators.push({lastName: author, creatorType: "creator"}); + break; + } + } + } + } + + var m = 0; + if (dataTags["Subject:"]) { + if (dataTags["Subject:"].match(/\n/)) { + tagsContent = dataTags["Subject:"].split(/\n/); + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[m] = tagsContent[i]; + m++; + } + } + } else { + newItem.tags = dataTags["Subject:"]; + } + } + + if (dataTags["ISBN13:"]) { + newItem.extra = "ISBN 13: " + dataTags["ISBN13:"]; + } + + associateData (newItem, dataTags, "Language:", "language"); + associateData (newItem, dataTags, "ISBN10:", "ISBN"); + associateData (newItem, dataTags, "Series:", "series"); + associateData (newItem, dataTags, "Edition:", "edition"); + associateData (newItem, dataTags, "Pagination:", "pages"); + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//td[2][@class="result-text"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Time-Blog.com.js b/translators/Time-Blog.com.js @@ -0,0 +1,139 @@ +{ + "translatorID":"b33bbb49-03d2-4175-91c4-3840501bc953", + "translatorType":4, + "label":"Time-Blog.com", + "creator":"Michael Berkowitz", + "target":"^http://time-blog.com/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-07-31 16:45:00" +} + +function detectWeb(doc, url) { + if (url.substr(-4,4) == "html") { + return "blogPost"; + } else { + return "multiple"; + } +} + +function scrape(doc, url) { + var newItem = new Zotero.Item("blogPost"); + + newItem.url = doc.location.href; + newItem.title = doc.title.substr(0, doc.title.indexOf(" - ")); + + var titleRE = new RegExp('^http://time-blog.com/([^/]*)/'); + var title = titleRE.exec(doc.location.href)[1].split("_"); + for (var i = 0 ; i < title.length ; i++) { + title[i] = title[i][0].toUpperCase() + title[i].substr(1).toLowerCase(); + } + newItem.blogTitle = title.join(" "); + var metaTags = new Object(); + + var metaTagHTML = doc.getElementsByTagName("meta"); + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content"); + } + + if (metaTags["description"]) { + newItem.abstractNote = Zotero.Utilities.cleanString(Zotero.Utilities.cleanTags(metaTags["description"])); + } + + if (metaTags["date"]) { + var date = metaTags["date"]; + var months = new Object(); + months["jan"] = "January"; + months["feb"] = "February"; + months["mar"] = "March"; + months["apr"] = "April"; + months["may"] = "May"; + months["jun"] = "June"; + months["jul"] = "July"; + months["aug"] = "August"; + months["sep"] = "September"; + months["oct"] = "October"; + months["nov"] = "November"; + months["dec"] = "December"; + date = date.split(".").join("").split(", "); + date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1]; + newItem.date = date.join(", "); + } + + if (metaTags["keywords"]) { + newItem.tags = metaTags["keywords"].split(", "); + for (var i in newItem.tags) { + if (newItem.tags[i] == "" || newItem.tags[i] == " ") { + break; + } else { + var words = newItem.tags[i].split(" "); + for (var j = 0 ; j < words.length ; j++) { + if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) { + words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase(); + } + } + } + newItem.tags[i] = words.join(" "); + } + } + + if (doc.evaluate('//span[@class="postedby"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var byline = Zotero.Utilities.cleanString(doc.evaluate('//span[@class="postedby"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (byline.substr(0,9).toLowerCase() == "posted by") { + byline = byline.substr(10).split(" "); + } else { + byline.split(" "); + } + for (var i = 0; i < byline.length ; i++) { + byline[i] = byline[i][0].toUpperCase() + byline[i].substr(1).toLowerCase(); + } + newItem.creators.push(Zotero.Utilities.cleanAuthor(byline.join(" "), "author")); + } else if (newItem.blogTitle == "Theag") { + newItem.creators.push(Zotero.Utilities.cleanAuthor("Matthew Yeomans", "author")); + newItem.blogTitle = "the Aggregator"; + } + + Zotero.debug(newItem); + + newItem.complete(); + +} + +function doWeb(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + + var URIS = new Array(); + + var xpath = '//h1[@class="entryTitle"]/a'; + var articles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var art = articles.iterateNext(); + var arts = new Array(); + var urls = new Array(); + while (art) { + arts.push(art.textContent); + urls.push(art.href); + art = articles.iterateNext(); + } + if (arts.length > 1) { + var items = new Object; + for (var i = 0; i < arts.length ; i++ ) { + items[urls[i]] = arts[i]; + } + items = Zotero.selectItems(items); + + for (i in items) { + URIS.push(i); + } + } else { + URIS.push(url); + } + Zotero.Utilities.processDocuments(URIS, scrape, function() { Zotero.done(); } ); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Time.com.js b/translators/Time.com.js @@ -0,0 +1,160 @@ +{ + "translatorID":"d9be934c-edb9-490c-a88d-34e2ee106cd7", + "translatorType":4, + "label":"Time.com", + "creator":"Michael Berkowitz", + "target":"http://www.time.com/time/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + if (doc.title == "TIME Magazine - Search Results") { + return "multiple"; + } else { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + + var xpath = '//meta[@name="byline"]'; + var xpath2 = '//div[@class="byline"]'; + var xpath3 = '//div[@class="copy"]/div[@class="byline"]'; + if ((doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath3, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) ) { + if (url.substr(-4,4) == "html") { + return "magazineArticle"; + } + } + } +} + + +function associateMeta(newItem, metaTags, field, zoteroField) { + if (metaTags[field]) { + newItem[zoteroField] = Zotero.Utilities.trimInternal(metaTags[field]); + } +} + +function scrape(doc, url) { + var newItem = new Zotero.Item("magazineArticle"); + newItem.publicationTitle = "Time"; + newItem.ISSN = "0040-718X"; + newItem.url = doc.location.href; + var metaTags = new Object(); + + var metaTagHTML = doc.getElementsByTagName("meta") + for (var i = 0 ; i < metaTagHTML.length ; i++) { + metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content"); + } + + if (metaTags["head"]) { + associateMeta(newItem, metaTags, "head", "title"); + } else if (doc.title.length > 7) { + newItem.title = doc.title.substr(0, doc.title.length - 7); + } else { + newItem.title = "No Title"; + } + + if (metaTags["description"]) { + associateMeta(newItem, metaTags, "description", "abstractNote"); + } + + if (metaTags["date"]) { + var date = metaTags["date"]; + var months = new Object(); + months["jan"] = "January"; + months["feb"] = "February"; + months["mar"] = "March"; + months["apr"] = "April"; + months["may"] = "May"; + months["jun"] = "June"; + months["jul"] = "July"; + months["aug"] = "August"; + months["sep"] = "September"; + months["oct"] = "October"; + months["nov"] = "November"; + months["dec"] = "December"; + date = date.split(".").join("").split(", ").slice(1); + date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1]; + newItem.date = date.join(", "); + } + if (metaTags["keywords"]) { + newItem.tags = Zotero.Utilities.trimInternal(metaTags["keywords"]).split(", "); + for (var i in newItem.tags) { + if (newItem.tags[i] == "" || newItem.tags[i] == " ") { + break; + } else { + var words = newItem.tags[i].split(" "); + for (var j = 0 ; j < words.length ; j++) { + Zotero.debug(words[j]); + if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) { + words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase(); + } + } + } + newItem.tags[i] = words.join(" "); + } + } + + if (metaTags["byline"]) { + var byline = Zotero.Utilities.trimInternal(metaTags["byline"]); + var byline1 = byline.split(" and "); + for (var i = 0 ; i < byline1.length ; i++) { + var byline2 = byline1[i].split("/"); + for (var j = 0 ; j < byline2.length ; j++) { + byline2[j] = Zotero.Utilities.trimInternal(byline2[j]); + if (byline2[j].indexOf(" ") == -1) { + if (byline2[j].length == 2) { + newItem.extra = byline2[j]; + } else { + newItem.extra = byline2[j][0].toUpperCase() + byline2[j].substr(1).toLowerCase(); + } + } else { + byline3 = byline2[j].split(" "); + for (var x = 0 ; x < byline3.length ; x++) { + byline3[x] = byline3[x][0].toUpperCase() + byline3[x].substr(1).toLowerCase(); + } + byline3 = byline3.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(byline3, "author")); + } + } + } + } + newItem.attachments.push({document:doc, title:doc.title}); + newItem.complete(); +} + + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == "x") return namespace; else return null; + } : null; + + var urls = new Array(); + if (doc.title == "TIME Magazine - Search Results") { + var items = new Array(); + var items = Zotero.Utilities.getItemArray(doc, doc.getElementById("search_results").getElementsByTagName("h3"), '^http://www.time.com/time/.*\.html$'); + + items = Zotero.selectItems(items); + + if (!items) { + return true; + } + + for (var i in items) { + if (i.match("covers") == null) { + urls.push(i); + } + } + } else if (doc.evaluate('//meta[@name="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//div[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('//div[@class="copy"]/div[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) { + urls.push(doc.location.href); + } + Zotero.Utilities.processDocuments(urls, function(newDoc) { + scrape(newDoc); + }, function() { Zotero.done; } ); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Toronto Star.js b/translators/Toronto Star.js @@ -0,0 +1,121 @@ +{ + "translatorID":"6b0b11a6-9b77-4b49-b768-6b715792aa37", + "translatorType":4, + "label":"Toronto Star", + "creator":"Adam Crymble", + "target":"http://www.thestar.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("search") && !doc.location.href.match("classifieds")) { + return "multiple"; + } else if (doc.location.href.match("article")) { + return "newspaperArticle"; + } +} + +//Toronto Star translator. code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + + if (doc.title.match("TheStar.com | ")) { + var lineBreak = doc.title.lastIndexOf(" |"); + newItem.section = doc.title.substr(14, lineBreak-14); + } + + var byLine = doc.evaluate('//div[@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article"]/div/span', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var nextEntry; + while (nextEntry = byLine.iterateNext()) { + if (nextEntry.textContent.match(" PM") || nextEntry.textContent.match(" AM") && nextEntry.textContent.match(/\d\d\d\d/)) { + newItem.date = nextEntry.textContent; + } else { + newItem.abstractNote = nextEntry.textContent; + } + } + + var author1 = new Array(); + var k = 0; + + if (doc.evaluate('//span[@class="articleAuthor"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var author = doc.evaluate(xPathAuthor, doc, nsResolver, XPathResult.ANY_TYPE, null); + var authorName; + + while (authorName = author.iterateNext()) { + author1.push(authorName.textContent); + k++; + } + + if (k>1) { + for (k in author1) { + var words = author1[k].toLowerCase().split(/\s/); + + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + + author1[k] = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[k], "author")); + } + } else { + + var words = author1[0].toLowerCase().split(/\s/); + for (var i in words) { + words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase(); + } + author1[0] = words.join(" "); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author1[0], "author")); + } + } + + var xPathTitle = '//span[@class="headlineArticle"][@id="ctl00_ContentPlaceHolder_article_NavWebPart_Article_ctl00___Title__"]'; + newItem.title = doc.evaluate(xPathTitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + newItem.url = doc.location.href; + newItem.publicationTitle = "The Toronto Star"; + newItem.ISSN = "0319-0781"; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + if (next_title.href.match("http://www.thestar.com") && next_title.href.match("article") && !next_title.href.match("generic") && !next_title.href.match("static")) { + items[next_title.href] = next_title.textContent; + } + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/UBC Library Catalog.js b/translators/UBC Library Catalog.js @@ -0,0 +1,182 @@ +{ + "translatorID":"35d6c82d-4749-4cc5-9e12-2924307df28f", + "translatorType":4, + "label":"UBC Library Catalog", + "creator":"Adam Crymble", + "target":"http://webcat(1||2).library.ubc", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + + if (doc.evaluate('//tbody/tr/td[1]/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.evaluate('//center/h4/i/strong/bdo', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "book"; + } +} + +//UBC Library Catalog translator. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var tagsContent = new Array(); + var headersArray = new Array(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + var headers = doc.evaluate('//form/table/tbody/tr/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount= doc.evaluate('count (//form/table/tbody/tr/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var contents = doc.evaluate('//form/table', doc, nsResolver, XPathResult.ANY_TYPE, null); + var dump = contents.iterateNext(); + + + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + if (fieldTitle.match(/\w/)) { + headersArray.push(fieldTitle); + } + } + + var contentsArray = new Array(); + var j = 0; + contents = contents.iterateNext().textContent.replace(/\s\s/g, ''); + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.lastIndexOf(headersArray[i]); + + var headerLength = headersArray[i].length; + + contentsArray.push(contents.substr(fieldIndex+headerLength)); + contents = contents.substr(0, fieldIndex); + + fieldTitle = headersArray[i].replace(/\s+/g, ''); + if (fieldTitle == "Subject(s):") { + if (contentsArray[j].match(". ")) { + var tagsContent = contentsArray[j].split(". ") + } else if (contentsArray[j].match(/\n/)) { + var tagsContent = contentsArray[j].split(/\n/); + } else { + newItem.tags = contentsArray[j]; + var noMoreTags = 1; + } + + } + dataTags[fieldTitle] = contentsArray[j].replace(/^\s*|\s+$/g, ''); + + j++; + } + + j = 0; + + if (noMoreTags != 1) { + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + newItem.tags[j] = tagsContent[i].replace(/^\s*|\s+$/g, ''); + j++; + } + } + } + + if (dataTags["MainAuthor:"]) { + var author = dataTags["MainAuthor:"]; + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["OtherAuthor(s):"]) { + var author = dataTags["OtherAuthor(s):"]; + + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + if (dataTags["Published:"]) { + if (dataTags["Published:"].match(": ")) { + var imprint = dataTags["Published:"]; + + var place1 = imprint.indexOf(": "); + + newItem.place = imprint.substr(0, place1); + + var imprint2 = imprint.substr(place1+2); + + if (imprint2.match(/\d\d\d/)) { + var date1 = imprint2.lastIndexOf(/\d\d\d/); + var date2 = imprint2.substr(date1-4); + newItem.date = date2; + newItem.publisher = imprint2.substr(0, imprint2.length-(newItem.date.length+2)); + } else { + newItem.publisher = imprint2; + } + } else { + newItem.publisher = dataTags["Published:"] + } + } + + associateData (newItem, dataTags, "Title:", "title"); + associateData (newItem, dataTags, "CallNumber:", "callNumber"); + associateData (newItem, dataTags, "Description:", "pages"); + associateData (newItem, dataTags, "Location:", "repository"); + + newItem.url = doc.location.href; + + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + var titles = doc.evaluate('//form/table/tbody/tr/td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/US National Archives Research Catalog.js b/translators/US National Archives Research Catalog.js @@ -0,0 +1,168 @@ +{ + "translatorID":"f8b5501a-1acc-4ffa-a0a5-594add5e6bd3", + "translatorType":4, + "label":"US National Archives Research Catalog", + "creator":"Adam Crymble", + "target":"http://arcweb.archives.gov", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("ShowArchivalDescriptions") || doc.location.href.match("ShowDODescriptions")) { + return "multiple"; + } else if (doc.location.href.match("ShowFullRecord") && doc.location.href.match("showFullDescriptionTabs/details")) { + return "book"; + } +} + +//US National Archives. Code by Adam Crymble + +function associateData (newItem, dataTags, field, zoteroField) { + if (dataTags[field]) { + newItem[zoteroField] = dataTags[field]; + } +} + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + var fieldTitle; + + var newItem = new Zotero.Item("book"); + + var contents2 = doc.evaluate('//td[1]/div[@class="sT"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (var i = 0; i < 3; i++) { + if (i == 0) { + newItem.title = contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + } else if (i == 1) { + newItem.extra = contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + } else if (i == 2) { + newItem.locInArchive= contents2.iterateNext().textContent.replace(/^\s*|\s+$/g, ''); + } + } + + var headers = doc.evaluate('//tbody/tr/th', doc, nsResolver, XPathResult.ANY_TYPE, null); + var contents = doc.evaluate('//body/div[@class="genPad"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var xPathCount = doc.evaluate('count (//tbody/tr/th)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var headersArray = new Array(); + var oneHeader = ''; + + if (xPathCount.numberValue > 1) { + for (var i = 0; i < xPathCount.numberValue; i++) { + fieldTitle = headers.iterateNext().textContent; + headersArray.push(fieldTitle); + } + } else { + oneHeader = (headers.iterateNext().textContent); + } + + var contentsArray = new Array(); + var j = 0; + + if (oneHeader.length<1) { + + for (var i = headersArray.length-1; i> -1; i--) { + + var fieldIndex = contents.lastIndexOf(headersArray[i]); + var fieldIndexLength = headersArray[i].length; + + contentsArray.push(contents.substr(fieldIndex)); + contents = contents.substr(0, fieldIndex); + fieldTitle = headersArray[i].replace(/\s+/g, ''); + + dataTags[fieldTitle] = contentsArray[j].substr(fieldIndexLength).replace(/^\s*|\s+$/g, ''); + + j++; + } + } + j = 0; + var k = 0; + var tagsContent = new Array(); + + if (dataTags["IndexTerms:"]) { + if (dataTags["IndexTerms:"].match(/\n/)){ + var tagsContent = dataTags["IndexTerms:"].split(/\n/); + } else { + if (!dataTags["IndexTerms:"].match("Subjects Represented in the Archival Material")) { + newItem.tags = dataTags["IndexTerms:"]; + } + } + if (tagsContent.length > 1) { + for (var i = 0; i < tagsContent.length; i++) { + if (tagsContent[i].match(/\w/)) { + if (k == 1) { + newItem.tags[j] = tagsContent[i]; + j++; + } + k = 1; + } + } + } + } + + associateData (newItem, dataTags, "ProductionDate(s):", "date"); + associateData (newItem, dataTags, "PartOf:", "series"); + associateData (newItem, dataTags, "VariantControlNumber(s):", "callNumber"); + + if (dataTags["Creator(s):"]) { + var author = dataTags["Creator(s):"]; + if (author.match(", ")) { + var authors = author.split(", "); + author = authors[1] + " " + authors[0]; + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } else { + newItem.creators.push({lastName: author, creatorType: "creator"}); + } + } + + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + + if (doc.evaluate('//div[@class="sT"]/p/strong[@class="sFC"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//div[@class="sT"]/p/strong[@class="sFC"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + } else if (doc.evaluate('//td[3]/div[@class="sT"]/p/strong[@class="sFC"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var titles = doc.evaluate('//td[3]/div[@class="sT"]/p/strong[@class="sFC"]/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + + } + + + + var next_title; + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Universiteit van Amsterdam.js b/translators/Universiteit van Amsterdam.js @@ -0,0 +1,106 @@ +{ + "translatorID":"675306d2-fca9-466f-b33d-1e3cc1bfd091", + "translatorType":4, + "label":"Universiteit van Amsterdam", + "creator":"Michael Berkowitz", + "target":"http://opc.uva.nl:8080/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-18 08:55:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//td[3][@class="hit"]/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.title.match("results/titledata")) { + return "book"; + } +} + +function scrape(item, langTags, data) { + for (var tag in data) { + tag = tag.toLowerCase(); + if (langTags[tag] == "creators") { + var authors = data[tag].split(","); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(Zotero.Utilities.trimInternal(aut), "author")); + } + } else if (langTags[tag] == "tags") { + var kws = data[tag].split(/(,|;)/); + for each (var key in kws) { + if (key.match(/\w+/)) item.tags.push(Zotero.Utilities.trimInternal(key)); + } + } else if (langTags[tag] == "publisher") { + var pub = data[tag].split(/\s*:\s*/); + item.place = pub[0]; + item.publisher = pub[1]; + } else { + item[langTags[tag]] = data[tag]; + } + } +} + +var tagsEN = { + "title":"title", + "author(s)":"creators", + "publisher":"publisher", + "year":"date", + "isbn":"ISBN", + "subject headings":"tags", + "subject heading person":"tags", + "call number":"callNumber" +} + +var tagsNE = { + "titel":"title", + "auteur(s)":"creators", + "uitgever":"publisher", + "jaar":"date", + "isbn":"ISBN", + "trefwoorden":"tags", + "trefwoord persoon":"tags", + "plaatsnummer":"callNumber" +} + +function doWeb(doc, url) { + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var links = doc.evaluate('//td[3][@class="hit"]/a', doc, null, XPathResult.ANY_TYPE, null); + var link; + while (link = links.iterateNext()) { + items[link.href] = Zotero.Utilities.trimInternal(link.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(i); + } + } else { + books = [url]; + } + Zotero.Utilities.processDocuments(books, function(newDoc) { + var data = new Object(); + var box = newDoc.evaluate('//table/tbody/tr[1]/td[2]/table/tbody/tr', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext(); + var tags = newDoc.evaluate('//table/tbody/tr[1]/td[2]/table/tbody/tr/td[1]', newDoc, null, XPathResult.ANY_TYPE, null); + var values = newDoc.evaluate('//table/tbody/tr[1]/td[2]/table/tbody/tr/td[2]', newDoc, null, XPathResult.ANY_TYPE, null); + var tag; + var value; + while ((tag = tags.iterateNext()) && (value = values.iterateNext())) { + tag = Zotero.Utilities.trimInternal(tag.textContent).replace(/:/, "").toLowerCase(); + if (tagsEN[tag] || tagsNE[tag]) { + data[tag] = Zotero.Utilities.trimInternal(value.textContent); + } + } + item = new Zotero.Item("book"); + var lingTags = new Array(); + if (data['titel']) { + lingTags = tagsNE; + } if (data['title']) { + lingTags = tagsEN; + } + scrape(item, lingTags, data); + item.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/University of Chicago.js b/translators/University of Chicago.js @@ -0,0 +1,112 @@ +{ + "translatorID":"df966c80-c199-4329-ab02-fa410c8eb6dc", + "translatorType":4, + "label":"University of Chicago", + "creator":"Sean Takats", + "target":"https?://[^/]*journals\\.uchicago\\.edu[^/]*/(?:doi/abs|doi/full|toc)", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-04-28 17:50:00" +} + +function detectWeb(doc, url) { + if(url.indexOf("toc") != -1) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var post = ""; + + var fulltext = new Object(); + + if(url.indexOf("toc") != -1) { + var items = new Array(); + var links = new Array(); + + var tableRows = doc.evaluate('//li[div[@class="articleListing_col3"]/label][//input[@name="doi"]]', doc, + nsResolver, XPathResult.ANY_TYPE, null); + var tableRow; + // Go through table rows + while(tableRow = tableRows.iterateNext()) { + var id = doc.evaluate('.//input[@name="doi"]', tableRow, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext().value; + items[id] = Zotero.Utilities.trimInternal(doc.evaluate('.//label', tableRow, + nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + var items = Zotero.selectItems(items); + if(!items) return true; + + // find all fulltext links so we can determine where we can scrape the fulltext article + var fulltextLinks = doc.evaluate('//a[starts-with(text(), "Full Text")]', doc, + nsResolver, XPathResult.ANY_TYPE, null); + var fulltextLink; + while(fulltextLink = fulltextLinks.iterateNext()) { + links.push(fulltextLink.href.toString()); + } + + for(var i in items) { + post += "doi="+encodeURIComponent(i)+"&"; + + // check for fulltext links + for each(var link in links) { + if(link.indexOf(i) != -1) { + fulltext[i] = true; + break; + } + } + } + } else { + var m = url.match(/https?:\/\/[^\/]+\/doi\/[^\/]+\/([^\?]+)(\?|$)/); + if (m) { + var doi = m[1]; + } else { + m = url.match(/https?:\/\/[^\/]+\/links\/doi\/([^\?]+)(\?|$)/); + var doi = m[1]; + } + post += "doi="+encodeURIComponent(doi)+"&"; + + if(url.indexOf("doi/full") != -1 || + doc.evaluate('//img[@alt="Full Text Article"]', doc, nsResolver, XPathResult.ANY_TYPE, + null).iterateNext()) { + fulltext[doi] = true; + } + } + + post += "include=cit&downloadFileName=deadbeef&format=refman&direct=on&submit=Download+article+citation+data"; + Zotero.Utilities.HTTP.doPost("http://www.journals.uchicago.edu/action/downloadCitation", post, function(text) { + // load translator for RIS + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + item.attachments = [ + {url:item.url, title:"University of Chicago Journals Snapshot", mimeType:"text/html"}, + {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"University of Chicago Full Text PDF", mimeType:"application/pdf"} + ]; + if (item.notes[0]['note']) item.DOI = Zotero.Utilities.trimInternal(item.notes[0]['note'].substr(4)); + item.notes = new Array(); + // use fulltext if possible + if(fulltext[item.DOI]) { + item.attachments[0].url = item.attachments[0].url.replace("/doi/abs", "/doi/full"); + } + + item.complete(); + }); + translator.translate(); + + Zotero.done(); + }); + + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Unqualified Dublin Core RDF.js b/translators/Unqualified Dublin Core RDF.js @@ -0,0 +1,122 @@ +{ + "translatorID":"6e372642-ed9d-4934-b5d1-c11ac758ebb7", + "translatorType":2, + "label":"Unqualified Dublin Core RDF", + "creator":"Simon Kornblith", + "target":"rdf", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2006-10-02 17:00:00" +} + +Zotero.configure("dataMode", "rdf"); + +function doExport() { + var dc = "http://purl.org/dc/elements/1.1/"; + Zotero.RDF.addNamespace("dc", dc); + + var item; + while(item = Zotero.nextItem()) { + if(item.itemType == "note" || item.itemType == "attachment") { + continue; + } + + var resource; + if(item.ISBN) { + resource = "urn:isbn:"+item.ISBN; + } else if(item.url) { + resource = item.url; + } else { + // just specify a node ID + resource = Zotero.RDF.newResource(); + } + + /** CORE FIELDS **/ + + // title + if(item.title) { + Zotero.RDF.addStatement(resource, dc+"title", item.title, true); + } + + // type + Zotero.RDF.addStatement(resource, dc+"type", item.itemType, true); + + // creators + for(var j in item.creators) { + // put creators in lastName, firstName format (although DC doesn't specify) + var creator = item.creators[j].lastName; + if(item.creators[j].firstName) { + creator += ", "+item.creators[j].firstName; + } + + if(item.creators[j].creatorType == "author") { + Zotero.RDF.addStatement(resource, dc+"creator", creator, true); + } else { + Zotero.RDF.addStatement(resource, dc+"contributor", creator, true); + } + } + + /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/ + + // source + if(item.source) { + Zotero.RDF.addStatement(resource, dc+"source", item.source, true); + } + + // accessionNumber as generic ID + if(item.accessionNumber) { + Zotero.RDF.addStatement(resource, dc+"identifier", item.accessionNumber, true); + } + + // rights + if(item.rights) { + Zotero.RDF.addStatement(resource, dc+"rights", item.rights, true); + } + + /** SUPPLEMENTAL FIELDS **/ + + // TODO - create text citation and OpenURL citation to handle volume, number, pages, issue, place + + // publisher/distributor + if(item.publisher) { + Zotero.RDF.addStatement(resource, dc+"publisher", item.publisher, true); + } else if(item.distributor) { + Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true); + } else if(item.institution) { + Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true); + } + + // date/year + if(item.date) { + Zotero.RDF.addStatement(resource, dc+"date", item.date, true); + } + + // ISBN/ISSN/DOI + if(item.ISBN) { + Zotero.RDF.addStatement(resource, dc+"identifier", "ISBN "+item.ISBN, true); + } + if(item.ISSN) { + Zotero.RDF.addStatement(resource, dc+"identifier", "ISSN "+item.ISSN, true); + } + if(item.DOI) { + Zotero.RDF.addStatement(resource, dc+"identifier", "DOI "+item.DOI, true); + } + + // callNumber + if(item.callNumber) { + Zotero.RDF.addStatement(resource, dc+"identifier", item.callNumber, true); + } + + // archiveLocation + if(item.archiveLocation) { + Zotero.RDF.addStatement(resource, dc+"coverage", item.archiveLocation, true); + } + + // medium + if(item.medium) { + Zotero.RDF.addStatement(resource, dcterms+"medium", item.medium, true); + } + } +} +\ No newline at end of file diff --git a/translators/Vanderbilt eJournals.js b/translators/Vanderbilt eJournals.js @@ -0,0 +1,83 @@ +{ + "translatorID":"882f70a8-b8ad-403e-bd76-cb160224999d", + "translatorType":4, + "label":"Vanderbilt eJournals", + "creator":"Michael Berkowitz", + "target":"http://ejournals.library.vanderbilt.edu/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-19 17:20:00" +} + +function detectWeb(doc, url) { + if (url.match(/viewarticle.php/)) { + return "journalArticle"; + } else if (url.match(/viewissue.php/) || url.match(/search.php/)) { + return "multiple"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function (prefix) { + if (prefix == 'x') return n; else return null; + } : null; + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + if (doc.evaluate('/html/body/table/tbody/tr/td[2]/ul/li', doc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var results = doc.evaluate('/html/body/table/tbody/tr/td[2]/ul/li', doc, ns, XPathResult.ANY_TYPE, null); + var titleX = './span[@class="toctitle"]'; + var linkX = './/a[contains(text(), "Abstract")]'; + /*var res; + while (res = results.iterateNext()) { + var title = doc.evaluate('./span[@class="toctitle"]', res, ns, XPathResult.ANY_TYPE, null).iterateNext.textContent; + var link = doc.evaluate('.//a[contains(text(), "Abstract")]', res, ns, XPathResult.ANY_TYPE, null).iterateNext.href; + items[link] = title; + }*/ + } else { + var results = doc.evaluate('//tr[td[3]//a[contains(text(), "Abstract")]]', doc, ns, XPathResult.ANY_TYPE, null); + var titleX = './td[2]'; + var linkX = './td[3]//a'; + } + var res; + while (res = results.iterateNext()) { + var title = doc.evaluate(titleX, res, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate(linkX, res, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = Zotero.Utilities.trimInternal(title); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i); + } + } else { + arts = [url]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + var gets = doc.location.href.match(/^(http:\/\/[^/]+\/[^/]+\/).*id=(\d+)/); + var risurl = gets[1] + 'rst/rst.php?op=capture_cite&id=' + gets[2] + '&cite=refman'; + Zotero.Utilities.HTTP.doGet(risurl, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var voliss = item.publicationTitle.split(/;/); + item.publicationTitle = voliss[0]; + voliss = voliss[1].match(/Vol\.\s+(\d+)(,\s+No\.\s+(\d+))?\s+\((\d+)\)/); + item.volume = voliss[1]; + if (voliss[3]) item.issue = voliss[3]; + item.date = voliss[4]; + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }); + translator.translate(); + }); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Verniana-Jules Verne Studies.js b/translators/Verniana-Jules Verne Studies.js @@ -0,0 +1,83 @@ +{ + "translatorID":"cdf8269c-86b9-4039-9bc4-9d998c67740e", + "translatorType":4, + "label":"Verniana-Jules Verne Studies", + "creator":"Michael Berkowitz", + "target":"http://jv.gilead.org.il/studies/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-21 19:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/article\/view/)) { + return "journalArticle"; + } else if (url.match(/(issue|advancedResults)/)) { + return "multiple"; + } +} + +function prepNos(link) { + if (link.match(/\d+\/\d+$/)) { + var nos = link.match(/\d+\/\d+$/)[0]; + } else { + var nos = link.match(/\d+$/)[0] + '/0'; + } + return 'http://jv.gilead.org.il/studies/index.php/studies/rt/captureCite/' + nos + '/RefManCitationPlugin'; +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//tr[td/a[2]]'; + if (url.match(/issue/)) { + var titlex = './td[1]'; + var linkx = './td[2]/a[contains(text(), "HTML")]'; + } else if (url.match(/advanced/)) { + var titlex = './td[2]'; + var linkx = './td[3]/a[contains(text(), "HTML")]'; + } + var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(prepNos(i)); + } + } else { + arts = [prepNos(url)]; + } + Zotero.Utilities.HTTP.doGet(arts, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var auts = new Array(); + for each (var aut in item.creators) { + auts.push(Zotero.Utilities.cleanAuthor(aut.lastName, "author")); + } + item.creators = auts; + item.attachments = [{url:item.url, title:"Verniana Snapshot", mimeType:"text/html"}]; + var bits = item.publicationTitle.split(/;/); + item.publicationTitle = bits[0]; + var voliss = bits[1].match(/Vol\s+(\d+)\s+\((\d+)\)/); + item.volume = voliss[1]; + item.date = voliss[2]; + item.complete(); + }); + translator.translate(); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Wikipedia Citation Templates.js b/translators/Wikipedia Citation Templates.js @@ -0,0 +1,337 @@ +{ + "translatorID":"3f50aaac-7acc-4350-acd0-59cb77faf620", + "translatorType":2, + "label":"Wikipedia Citation Templates", + "creator":"Simon Kornblith", + "target":null, + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-17 22:05:00" +} + +Zotero.addOption("exportCharset", "UTF-8"); + +var fieldMap = { + edition:"edition", + publisher:"publisher", + doi:"DOI", + isbn:"ISBN", + issn:"ISSN", + conference:"conferenceName", + volume:"volume", + issue:"issue", + pages:"pages", + number:"episodeNumber" +}; + +var typeMap = { + book:"Cite book", + bookSection:"Cite book", + journalArticle:"Cite journal", + magazineArticle:"Cite news", + newspaperArticle:"Cite news", + thesis:"Cite paper", + letter:"Cite", + manuscript:"Cite book", + interview:"Cite interview", + film:"Cite video", + artwork:"Cite", + webpage:"Cite web", + report:"Cite conference", + bill:"Cite", + hearing:"Cite", + patent:"Cite", + statute:"Cite", + email:"Cite email", + map:"Cite", + blogPost:"Cite web", + instantMessage:"Cite", + forumPost:"Cite web", + audioRecording:"Cite", + presentation:"Cite paper", + videoRecording:"Cite video", + tvBroadcast:"Cite episode", + radioBroadcast:"Cite episode", + podcast:"Cite podcast", + computerProgram:"Cite", + conferencePaper:"Cite conference", + document:"Cite", + encyclopediaArticle:"Cite encyclopedia", + dictionaryEntry:"Cite encyclopedia" +}; + +function formatAuthors(authors, useTypes) { + var text = ""; + for each(var author in authors) { + text += ", "+author.firstName; + if(author.firstName && author.lastName) text += " "; + text += author.lastName; + if(useTypes) text += " ("+Zotero.Utilities.getLocalizedCreatorType(author.creatorType)+")"; + } + return text.substr(2); +} + +function formatFirstAuthor(authors, useTypes) { + var firstCreator = authors.shift(); + var field = firstCreator.lastName; + if(firstCreator.lastName && firstCreator.firstName) field += ", "; + field += firstCreator.firstName; + if(useTypes) field += " ("+Zotero.Utilities.getLocalizedCreatorType(firstCreator.creatorType)+")"; + return field; +} + +function formatDate(date) { + var date = date.substr(0, date.indexOf(" ")); + if(date.substr(4, 3) == "-00") { + date = date.substr(0, 4); + } else if(date.substr(7, 3) == "-00") { + date = date.substr(0, 7); + } + return date; +} + +function doExport() { + var first = true; + while(item = Zotero.nextItem()) { + // determine type + var type = typeMap[item.itemType]; + if(!type) type = "Cite"; + + var properties = new Object(); + + for(var wikiField in fieldMap) { + var zoteroField = fieldMap[wikiField]; + if(item[zoteroField]) properties[wikiField] = item[zoteroField]; + } + + if(item.creators && item.creators.length) { + if(type == "Cite episode") { + // now add additional creators + properties.credits = formatAuthors(item.creators, true); + } else if(type == "Cite video") { + properties.people = ""; + + // make first creator first, last + properties.people = formatFirstAuthor(item.creators, true); + // now add additional creators + if(item.creators.length) properties.people += ", "+formatAuthors(item.creators, true); + + // use type + if(item.type) { + properties.medium = item.type; + } + } else if(type == "Cite email") { + // get rid of non-authors + for(var i in item.creators) { + if(item.creators[i].creatorType != "author") { + // drop contributors + item.creators.splice(i, 1); + } + } + + // make first authors first, last + properties.author = formatFirstAuthor(item.creators); + // add supplemental authors + if(item.creators.length) { + properties.author += ", "+formatAuthors(item.creators); + } + } else if(type == "Cite interview") { + // check for an interviewer or translator + var interviewers = []; + var translators = []; + for(var i in item.creators) { + if(item.creators[i].creatorType == "translator") { + translators = translators.concat(item.creators.splice(i, 1)); + } else if(item.creators[i].creatorType == "interviewer") { + interviewers = interviewers.concat(item.creators.splice(i, 1)); + } else if(item.creators[i].creatorType == "contributor") { + // drop contributors + item.creators.splice(i, 1); + } + } + + // interviewers + if(interviewers.length) { + properties.interviewer = formatAuthors([interviewers.shift()]); + if(interviewers.length) properties.cointerviewers = formatAuthors(interviewers); + } + // translators + if(translators.length) { + properties.cointerviewers = (properties.cointerviewers ? properties.cointerviewers+", " : ""); + properties.cointerviewers += formatAuthors(translators); + } + // interviewees + if(item.creators.length) { + // take up to 4 interviewees + var i = 1; + while((interviewee = item.creators.shift()) && i <= 4) { + var lastKey = "last"; + var firstKey = "first"; + if(i != 1) { + lastKey += i; + firstKey += i; + } + + properties[lastKey] = interviewee.lastName; + properties[firstKey] = interviewee.firstName; + } + } + // medium + if(item.medium) { + properties.type = item.medium + } + } else { + // check for an editor or translator + var editors = []; + var translators = []; + for(var i in item.creators) { + if(item.creators[i].creatorType == "translator") { + translators = translators.concat(item.creators.splice(i, 1)); + } else if(item.creators[i].creatorType == "editor") { + editors = editors.concat(item.creators.splice(i, 1)); + } else if(item.creators[i].creatorType == "contributor") { + // drop contributors + item.creators.splice(i, 1); + } + } + + // editors + var others = ""; + if(editors.length) { + var editorText = formatAuthors(editors)+(editors.length == 1 ? " (ed.)" : " (eds.)"); + if(item.itemType == "bookSection" || type == "Cite conference" || type == "Cite encyclopedia") { + // as per docs, use editor only for chapters + properties.editors = editorText; + } else { + others = editorText; + } + } + // translators + if(translators.length) { + if(others) others += ", "; + others += formatAuthors(translators)+" (trans.)"; + } + + // pop off first author, if there is one + if(item.creators.length) { + var firstAuthor = item.creators.shift(); + properties.last = firstAuthor.lastName; + properties.first = firstAuthor.firstName; + + // add supplemental authors + if(item.creators.length) { + properties.coauthors = formatAuthors(item.creators); + } + } + + // attach others + if(others) { + if(type == "Cite book") { + properties.others = others; + } else { + properties.coauthors = (properties.coauthors ? properties.coauthors+", " : ""); + properties.coauthors += others; + } + } + } + } + + if(item.itemType == "bookSection") { + properties.title = item.publicationTitle; + properties.chapter = item.title;; + } else { + properties.title = item.title; + + if(type == "Cite journal") { + properties.journal = item.publicationTitle; + } else if(type == "Cite conference") { + properties.booktitle = item.publicationTitle; + } else if(type == "Cite encyclopedia") { + properties.encyclopedia = item.publicationTitle; + } else { + properties.work = item.publicationTitle; + } + } + + if(type == "Cite web" && item.type) { + properties.format = item.type; + } + + if(item.place) { + if(type == "Cite episode") { + properties.city = item.place; + } else { + properties.location = item.place; + } + } + + if(item.series) { + properties.series = item.series; + } else if(item.seriesTitle) { + properties.series = item.seriesTitle; + } else if(item.seriesText) { + properties.series = item.seriesText; + } + + if(item.accessDate) { + properties.accessdate = formatDate(item.accessDate); + } + + if(item.date) { + if(type == "Cite email") { + properties.senddate = formatDate(item.date); + } else { + var date = Zotero.Utilities.strToDate(item.date); + var mm = "00"; + var dd = "00"; + if (date["month"] != undefined){ + mm = date["month"]; + mm = mm + 1; + if (mm < 10){ + mm = "0" + mm; + } + } + if (date["day"] != undefined){ + dd = date["day"]; + if (dd < 10){ + dd = "0" + dd; + } + } + if (date["year"] != undefined){ + var yyyy = date["year"].toString(); + while (yyyy.length < 4){ + yyyy = "0"+yyyy; + } + properties.date = formatDate(yyyy+"-"+mm+"-"+dd+" "); + } + } + } + + if(item.runningTime) { + if(type == "Cite episode") { + properties.minutes = item.runningTime; + } else { + properties.time = item.runningTime; + } + } + + if(item.url && item.accessDate) { + if(item.itemType == "bookSection") { + properties.chapterurl = item.url; + } else { + properties.url = item.url; + } + } + + // write out properties + Zotero.write((first ? "" : "\r\n\r\n") + "{{"+type); + for(var key in properties) { + if(properties[key]) Zotero.write("\r\n| "+key+" = "+properties[key]); + } + Zotero.write("\r\n}}"); + + first = false; + } +} +\ No newline at end of file diff --git a/translators/Wildlife Biology in Practice.js b/translators/Wildlife Biology in Practice.js @@ -0,0 +1,83 @@ +{ + "translatorID":"b33af0e1-d122-45b2-b144-4b4eedd12d5d", + "translatorType":4, + "label":"Wildlife Biology in Practice", + "creator":"Michael Berkowitz", + "target":"http://www.socpvs.org/journals/index.php/wbp", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-21 19:15:00" +} + +function detectWeb(doc, url) { + if (url.match(/showToc/) || url.match(/advancedResults/)) { + return "multiple"; + } else if (url.match(/article/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var xpath = '//tr[td/a[2]]'; + if (url.match(/issue/)) { + var linkx = './td[2]/a[1]'; + var titlex = './td[1]'; + } else if (url.match(/advanced/)) { + var linkx = './td[3]/a[1]'; + var titlex = './td[2]'; + } + var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = Zotero.Utilities.trimInternal(title); + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i.replace(/view/, "viewArticle")); + } + } else { + arts = [url.replace(/viewRST/, "viewArticle")]; + } + Zotero.Utilities.processDocuments(arts, function(doc) { + var item = new Zotero.Item("journalArticle"); + var voliss = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="main"]/h2', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + voliss = voliss.match(/^([^,]+),\s+([^;]+);\s+(\d+)\((\d+)\);\s+([^;]+)/); + item.journalAbbreviation = voliss[1]; + item.date = voliss[2]; + item.issue = voliss[3]; + item.volume = voliss[4]; + item.pages = voliss[5]; + var authors = doc.evaluate('//div[@id="authorDetails"]/ul[@class="lista"]/li/strong/a', doc, ns, XPathResult.ANY_TYPE, null); + var author; + while (author = authors.iterateNext()) { + item.creators.push(Zotero.Utilities.cleanAuthor(author.title.match(/^\w+\b\s+(.*)\s+\b\w+$/)[1], "author")); + } + item.publicationTitle = "Wildlife Biology in Practice"; + item.ISSN = "1646-2742"; + item.DOI = doc.evaluate('//div[@id="copyArticle"]/a[1]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/doi:\s+([^\s]+)/)[1]; + item.url = doc.location.href; + item.title = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="content"]/h3', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.abstractNote = Zotero.Utilities.trimInternal(doc.evaluate('//div[@id="abstract"]/blockquote/p', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + item.tags = doc.evaluate('//div[@id="abstract"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Keywords:\s+([^\.]+)/)[1].split(/,\s+/); + + var pdfurl = doc.evaluate('//div[@id="rt"]/a[@class="action noarrow"]', doc, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + item.attachments = [ + {url:item.url, title:item.publicationTitle + " Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:item.publicationTitle + " PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Wiley InterScience.js b/translators/Wiley InterScience.js @@ -0,0 +1,109 @@ +{ + "translatorID":"fe728bc9-595a-4f03-98fc-766f1d8d0936", + "translatorType":4, + "label":"Wiley InterScience", + "creator":"Sean Takats and Michael Berkowitz", + "target":"https?:\\/\\/(?:www3\\.|www\\.)?interscience\\.wiley\\.com[^\\/]*\\/(?:search\\/|(cgi-bin|journal)\\/[0-9]+\\/abstract|journal)", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-02 11:00:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//input[@name="ID"][@type="checkbox"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } + if (url.match(/journal\/\d+\/(issue|home)$/)) { + return "multiple"; + } + var m = url.match(/https?:\/\/[^\/]*\/(cgi-bin|journal)(\/(abstract|summary))?\/[0-9]+\/abstract/); + if (m){ + return "journalArticle"; + } +} + +function doWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var host = 'http://' + doc.location.host + "/"; + Zotero.debug(host); + var m = url.match(/https?:\/\/[^\/]*\/(journal|cgi-bin\/summary)\/([0-9]+)\/(abstract)?/); + var ids = new Array(); + if(detectWeb(doc, url) == "multiple") { //search + var id; + var title; + var availableItems = new Array(); + var xpath = '//tr[td/input[@name="ID"][@type="checkbox"]]'; + if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + do { + title = doc.evaluate('./td/strong', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + id = doc.evaluate('./td/input[@name="ID"][@type="checkbox"]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value; + availableItems[id] = title; + } while (elmt = elmts.iterateNext()) + } else { + var xpath = '//div[@id="contentCell"]/div[*/a]'; + var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var elmt = elmts.iterateNext(); + do { + title = Zotero.Utilities.trimInternal(doc.evaluate('.//strong', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + id = doc.evaluate('.//a[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href.match(/abstract\/([\d]+)\//)[1]; + availableItems[id] = title; + } while (elmt = elmts.iterateNext()) + } + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + for(var id in items) { + ids.push(id); + } + + } else if (m){ //single article + ids.push(m[2]); + } + for each (id in ids) { + var uri = host + 'tools/citex'; + var poststring = "clienttype=1&subtype=1&mode=1&version=1&id=" + id; + Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) { + uri = host+"tools/CitEx"; + poststring = "mode=2&format=3&type=2&file=3&exportCitation.x=16&exportCitation.y=10&exportCitation=submit"; + Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) { + var m = text.match(/%A\s(.*)/); //following lines fix Wiley's incorrect %A tag (should be separate tags for each author) + if (m){ + var newauthors =""; + var authors = m[1].split(",") + for each (var author in authors){ + if (author != ""){ + newauthors = newauthors + "%A "+Zotero.Utilities.unescapeHTML(Zotero.Utilities.trimInternal(author))+"\n"; + } + } + text = text.replace(/%A\s.*\n/, newauthors); + } + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); //EndNote/Refer/BibIX + translator.setString(text); + translator.setHandler("itemDone", function(obj, item) { + var pdfurl = 'http://download.interscience.wiley.com/cgi-bin/fulltext?ID=' + id + '&PLACEBO=IE.pdf&mode=pdf'; + item.attachments.push({url:pdfurl, title:"Wiley Interscience PDF", mimeType:"application/pdf"}); + item.DOI = item.url.match(/\.org\/(.*)$/)[1]; + item.complete(); + }); + translator.translate(); + Zotero.done(); + }); + }); + }; + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Winnipeg Free Press.js b/translators/Winnipeg Free Press.js @@ -0,0 +1,98 @@ +{ + "translatorID":"1d82cbdf-703d-4f96-9ae2-246af21bb96e", + "translatorType":4, + "label":"Winnipeg Free Press", + "creator":"Adam Crymble", + "target":"http://www.winnipegfreepress", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-06 17:00:00" +} + +function detectWeb(doc, url) { + if (doc.location.href.match("articles") || doc.location.href.match("story")) { + return "newspaperArticle"; + } +} + +//Winnipeg Free Press Translator. Code by Adam Crymble +//works for single entries only. + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + + newItem.title = doc.evaluate('//h3', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + + if (doc.evaluate('//div[@id="middlecol"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.abstractNote = doc.evaluate('//div[@id="middlecol"]/h4', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.replace(/^\s*|\s*$/g, ''); + } + + if (doc.evaluate('//div[@id="bylines"]/p[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + var byline = doc.evaluate('//p[@class="byline"]', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var k = 0; + var byLineArray = new Array(); + var nextByLine; + + while (nextByLine = byline.iterateNext()) { + byLineArray.push(nextByLine.textContent.replace(/^\s*|\s*$/g, '')); + k++; + } + + if (k>1) { + for (var i = 0; i < byLineArray.length; i++) { + if (byLineArray[i].match("Updated:")) { + newItem.date = byLineArray[i].substr(9).replace(/^\s*|\s*$/g, ''); + } else if (byLineArray[i].match("bylineParse") && byLineArray[i].substr(13).match(/\w/)) { + + var author = (byLineArray[i].substr(13)); + var authorLength = author.length/2; + var author = author.substr(0 + authorLength); + var m = 0; + + if (author.match(" - ")) { + var author = author.split(' - '); + } else if (author.match(", ")) { + var author = author.split(', '); + } else if (author.match(/ By /)) { + var author = author.split(/By/); + author[0] = author[1]; + } else if (author.match(/By:/)) { + var author = author.split(/By:/); + author[0] = author[1]; + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + m = 1; + } + + if (m == 0) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author[0], "author")); + } + } + } + } + } + + newItem.publicationTitle = "Winnipeg Free Press"; + newItem.url = doc.location.href; + newItem.complete(); +} + +function doWeb (doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + }: null; + + var uris= new Array(); + uris.push(url); + Zotero.Utilities.processDocuments(uris, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Women in Judaism.js b/translators/Women in Judaism.js @@ -0,0 +1,85 @@ +{ + "translatorID":"d2416f31-4f24-4e18-8c66-06122af5bc2c", + "translatorType":4, + "label":"Women in Judaism", + "creator":"Michael Berkowitz", + "target":"http://jps.library.utoronto.ca/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-20 19:10:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//tr[td/a[2]]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (url.match(/article\/view/)) { + return "journalArticle"; + } +} + +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var arts = new Array(); + if (detectWeb(doc, url) == "multiple") { + var xpath = '//tr[td/a[2]]'; + if (url.match(/search/)) { + var titlex = './td[2]'; + var linkx = './td[3]/a[1]'; + } else if (url.match(/issue/)) { + var titlex = './td[1]'; + var linkx = './td[2]/a[1]'; + } + var items = new Object(); + var results = doc.evaluate(xpath, doc, ns, XPathResult.ANY_TYPE, null); + var result; + while (result = results.iterateNext()) { + var title = Zotero.Utilities.trimInternal(doc.evaluate(titlex, result, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + var link = doc.evaluate(linkx, result, ns, XPathResult.ANY_TYPE, null).iterateNext().href; + items[link] = title; + } + items = Zotero.selectItems(items); + for (var i in items) { + arts.push(i.replace("view", "viewArticle")); + } + } else { + arts = [url]; + } + Zotero.debug(arts); + Zotero.Utilities.processDocuments(arts,function(doc) { + var newDoc = doc; + //var newDoc = doc.defaultView.window.frames[0].document; + Zotero.debug(newDoc.location.href); + + var item = new Zotero.Item("journalArticle"); + if (newDoc.evaluate('//div[@class="Section1"]/div/p/b/span', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + item.title = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[@class="Section1"]/div/p/b/span', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } else { + item.title = Zotero.Utilities.trimInternal(newDoc.evaluate('//div[@id="content"]/h3', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + var absX = '//div[@id="content"]/div[2]'; + if (newDoc.evaluate(absX, newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) item.abstractNote = Zotero.Utilities.trimInternal(newDoc.evaluate(absX, newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent); + if (newDoc.evaluate('//div[@id="content"]/div/i', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext()) { + var authors = newDoc.evaluate('//div[@id="content"]/div/i', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/,\s+/); + for each (var aut in authors) { + item.creators.push(Zotero.Utilities.cleanAuthor(aut, "author")); + } + var voliss = newDoc.evaluate('//div[@id="breadcrumb"]/a[2]', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/(\d+)/g); + item.volume = voliss[0]; + item.issue = voliss[1]; + item.date = voliss[2]; + } + var pdfurl = doc.evaluate('//a[contains(text(), "PDF")]', newDoc, ns, XPathResult.ANY_TYPE, null).iterateNext().href.replace("view", "download"); + item.attachments = [ + {url:doc.location.href, title:"Women In Judaism Snapshot", mimeType:"text/html"}, + {url:pdfurl, title:"Women In Judaism PDF", mimeType:"application/pdf"} + ]; + item.complete(); + }, function() {Zotero.done;}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/World History Connected.js b/translators/World History Connected.js @@ -0,0 +1,125 @@ +{ + "translatorID":"0507797c-9bc4-4374-92ca-9e3763b6922b", + "translatorType":4, + "label":"World History Connected", + "creator":"Frederick Gibbs", + "target":"worldhistoryconnected\\.press|historycooperative.*/whc/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-05-06 08:15:00" +} + +function associateMeta(newItem, metaTags, field, zoteroField) { + var field = metaTags.namedItem(field); + if(field) { + newItem[zoteroField] = field.getAttribute("content"); + } +} + +function scrape(doc) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("journalArticle"); + newItem.url = doc.location.href; + + var titlePath; + var bookTitle; + var month, year; + var metaTags = doc.getElementsByTagName("meta"); + + associateMeta(newItem, metaTags, "Journal", "publicationTitle"); + associateMeta(newItem, metaTags, "Volume", "volume"); + associateMeta(newItem, metaTags, "Issue", "issue"); + + // in the case of book reviews, the title field is blank + //but quotes are not escaped properly, so if an article title begins with quotes, then the title tag looks blank even though it is not. + //(though semantically it is) + //they use the meta tag 'FileType' to indicate Aritlce or Book Review. silly, but we can use it. + + if (metaTags.namedItem('FileType').getAttribute("content") == 'Book Review') { + //for a book review, title of reviewed book is + titlePath = '/html/body/table[4]/tbody/tr[3]/td[1]/i'; + newItem.title = "Review of " + doc.evaluate(titlePath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + } else { + //it would be nice to grab the title from the meta tags, but quotations are properly escaped and the tags are therefore malformed. + titlePath = '/html/body/table[4]/tbody/tr[2]/td[1]/h2/font/b'; + newItem.title = Zotero.Utilities.superCleanString(doc.evaluate(titlePath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); + } + + var author = metaTags.namedItem("Author"); + if(author) { + var authors = author.getAttribute("content").split(" and "); + for(j in authors) { + authors[j] = authors[j].replace("Reviewed by ", ""); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author")); + } + } + + var month = metaTags.namedItem("PublicationMonth"); + var year = metaTags.namedItem("PublicationYear"); + if(month && year) { + newItem.date = month.getAttribute("content")+" "+year.getAttribute("content"); + } + + newItem.attachments.push({document:doc, title:"World History Connected Snapshot"}); + + newItem.complete(); +} + +function doWeb(doc, url) { + + var searchLinks; + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + if(doc.title.indexOf("Contents") != -1 || doc.title.indexOf("Search results") != -1) { + + if(doc.title.indexOf("Contents") != -1) { + searchLinks = doc.evaluate('//tbody/tr[2]/td[1]/table/tbody/tr/td/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + else if ( doc.title.indexOf("Search results") != -1) { + searchLinks = doc.evaluate('/html/body/dl/dt/strong/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + var link; + var title; + var items = new Object(); + + while (elmt = searchLinks.iterateNext()) { + Zotero.debug(elmt.href); + title = Zotero.Utilities.superCleanString(elmt.textContent); + link = elmt.href; + if (title && link){ + items[link] = title; + } + } + + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var uris = new Array(); + for(var i in items) { + uris.push(i); + } + + Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) }, + function() { Zotero.done(); }, null); + + Zotero.wait(); + } else { + scrape(doc); + } +} +\ No newline at end of file diff --git a/translators/Worldcat.org.js b/translators/Worldcat.org.js @@ -0,0 +1,64 @@ +{ + "translatorID":"490909d7-7d79-4c7a-a136-77df618d4db2", + "translatorType":4, + "label":"Worldcat.org", + "creator":"Michael Berkowitz", + "target":"http://(www.)?worldcat.org/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-06-20 20:45:00" +} + +function detectWeb(doc, url) { + if (url.match(/search?/) && doc.evaluate('//input[@id="itemid"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else { + var type = doc.evaluate('//tbody/tr/td[2][img]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.toLowerCase().match(/(\w+);/)[1]; + switch (type) { + case "book": return "book"; + case "article": return "journalArticle"; + case "recording": + case "disc": return "audioRecording"; + case "tape": return "videoRecording"; + } + } +} + +function ENify(str) { + return str.match(/^[^&]+/)[0] + '?page=endnote&client=worldcat.org-detailed_record'; +} +function doWeb(doc, url) { + var n = doc.documentElement.namespaceURI; + var ns = n ? function(prefix) { + if (prefix == 'x') return n; else return null; + } : null; + + var books = new Array(); + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var titles = doc.evaluate('//div[@class="name"]/a', doc, ns, XPathResult.ANY_TYPE, null); + var title; + while (title = titles.iterateNext()) { + items[title.href] = Zotero.Utilities.trimInternal(title.textContent); + } + items = Zotero.selectItems(items); + for (var i in items) { + books.push(ENify(i)); + } + } else { + var link = doc.evaluate('//a[contains(text(), "EndNote")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href; + books = [link]; + } + for each (var book in books) { + Zotero.Utilities.HTTP.doGet(book, function(text) { + text = text.replace("MUSIC", "PAMP"); + var translator = Zotero.loadTranslator("import"); + translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); + translator.setString(text); + translator.translate(); + }); + Zotero.wait(); + } +} +\ No newline at end of file diff --git a/translators/YouTube.js b/translators/YouTube.js @@ -0,0 +1,148 @@ +{ + "translatorID":"d3b1d34c-f8a1-43bb-9dd6-27aa6403b217", + "translatorType":4, + "label":"YouTube", + "creator":"Sean Takats and Michael Berkowitz", + "target":"https?://[^/]*youtube\\.com\\/", + "minVersion":"1.0.0rc4", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-03-30 08:30:00" +} + +function detectWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var xpath = '//input[@type="hidden" and @name="video_id"]'; + if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + return "videoRecording"; + } + if (doc.evaluate('//div[@class="vtitle"]/a[@class="vtitlelink" and contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } + if (doc.evaluate('//div[starts-with(@class, "vtitle")]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } + if (doc.evaluate('//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + return "multiple"; + } +} + + + +function doWeb(doc, url){ + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + var host = doc.location.host; + var video_ids = new Array(); + var xpath = '//input[@type="hidden" and @name="video_id"]'; + var elmts; + var elmt; + elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); + elmt = elmts.iterateNext(); + if(elmt) { + //single video + var video_id = elmt.value; + video_ids.push(video_id); + } else { + // multiple videos + var items = new Object(); + var videoRe = /\/watch\?v=([a-zA-Z0-9-_]+)/; +// search results + if (elmt = doc.evaluate('//div[@class="vtitle"]/a[@class="vtitlelink" and contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//div[@class="vtitle"]/a[@class="vtitlelink" and contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null); +// categories and community pages and user pages and browse pages + } else if (doc.evaluate('//div[starts-with(@class, "vtitle")]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//div[starts-with(@class, "vtitle")]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else if (doc.evaluate('//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){ + elmts = doc.evaluate('//div[@class="vltitle"]/div[@class="vlshortTitle"]/a[contains(@href, "/watch?v=")]', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + while (elmt = elmts.iterateNext()){ + var title = elmt.textContent; + title = Zotero.Utilities.trimInternal(title); + var link = elmt.href; + var m = videoRe(link); + var video_id = m[1]; + items[video_id] = title; + } + items = Zotero.selectItems(items); + if(!items) return true; + for(var i in items) { + video_ids.push(i); + } + } + getData(video_ids, host); +} + +function getData(ids, host){ + var uris = new Array(); + var url = "http://gdata.youtube.com/feeds/videos/"; + for each(var id in ids){ + uris.push(url+id); + } + Zotero.Utilities.HTTP.doGet(uris, function(text) { + // clean up header + text = text.replace(/<\?xml[^>]*\?>/, ""); + text = text.replace(/<entry[^>]*>/, "<entry>"); + // replace colons in XML tags + text = text.replace(/<media:/g, "<media_").replace(/<\/media:/g, "</media_"); +// text = text.replace(/<yt:/g, "<yt_").replace(/<\/yt:/g, "</yt_"); + text = text.replace(/yt:/g, "yt_"); + text = text.replace(/<gd:/g, "<gd_").replace(/<\/gd:/g, "</gd_"); + text = text.replace(/<\/?(georss|gml)[^>]+>/g, ""); + // pad xml + text = "<zotero>"+text+"</zotero>"; + var xml = new XML(text); + var newItem = new Zotero.Item("videoRecording"); + var title = ""; + var title = xml..media_title[0].text().toString(); + if (xml..media_title.length()){ + var title = Zotero.Utilities.cleanString(xml..media_title[0].text().toString()); + if (title == ""){ + title = " "; + } + newItem.title = title; + } + if (xml..media_keywords.length()){ + var keywords = xml..media_keywords[0].text().toString(); + keywords = keywords.split(","); + for each(var tag in keywords){ + newItem.tags.push(Zotero.Utilities.trimInternal(tag)); + } + } + if (xml..published.length()){ + var date = xml..published[0].text().toString(); + newItem.date = date.substr(0, 10); + } + if (xml..author.name.length()){ + var author = xml..author.name[0].text().toString(); + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "contributor", true)); + } + if (xml..media_player.length()){ + var url = xml..media_player[0].@url.toString(); + newItem.url = url; + newItem.attachments.push({title:"YouTube Link", snapshot:false, mimeType:"text/html", url:url}); + } + if (xml..yt_duration.length()){ + var runningTime = xml..yt_duration[0].@seconds.toString(); + newItem.runningTime = runningTime + " seconds"; + } + if (xml..media_description.length()){ + newItem.abstractNote = xml..media_description[0].text().toString(); + } + + var next_url = newItem.url.replace(/\/\/([^/]+)/, "//" + host).replace("watch?v=", "v/") + '&rel=1'; + Zotero.Utilities.loadDocument(next_url, function(newDoc) { + var new_url = newDoc.location.href.replace("swf/l.swf", "get_video"); + newItem.attachments.push({url:new_url, title:"YouTube Video Recording", mimeType:"video/x-flv"}); + newItem.complete(); + }, function() {Zotero.done;}); + }); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/Zotero RDF.js b/translators/Zotero RDF.js @@ -0,0 +1,456 @@ +{ + "translatorID":"14763d24-8ba0-45df-8f52-b8d1108e7ac9", + "translatorType":2, + "label":"Zotero RDF", + "creator":"Simon Kornblith", + "target":"rdf", + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":25, + "inRepository":true, + "lastUpdated":"2008-07-20 01:40:00" +} + +Zotero.configure("getCollections", true); +Zotero.configure("dataMode", "rdf"); +Zotero.addOption("exportNotes", true); +Zotero.addOption("exportFileData", false); + +var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + +var n = { + bib:"http://purl.org/net/biblio#", + dc:"http://purl.org/dc/elements/1.1/", + dcterms:"http://purl.org/dc/terms/", + prism:"http://prismstandard.org/namespaces/1.2/basic/", + foaf:"http://xmlns.com/foaf/0.1/", + vcard:"http://nwalsh.com/rdf/vCard#", + link:"http://purl.org/rss/1.0/modules/link/", + z:"http://www.zotero.org/namespaces/export#" +}; + +function generateSeeAlso(resource, seeAlso) { + for(var i in seeAlso) { + if(itemResources[seeAlso[i]]) { + Zotero.RDF.addStatement(resource, n.dc+"relation", itemResources[seeAlso[i]], false); + } + } +} + +function generateTags(resource, tags) { + Zotero.debug("processing tags"); + for each(var tag in tags) { + if(tag.type == 1) { + var tagResource = Zotero.RDF.newResource(); + // set tag type and value + Zotero.RDF.addStatement(tagResource, rdf+"type", n.z+"AutomaticTag", false); + Zotero.RDF.addStatement(tagResource, rdf+"value", tag.tag, true); + // add relationship to resource + Zotero.RDF.addStatement(resource, n.dc+"subject", tagResource, false); + } else { + Zotero.RDF.addStatement(resource, n.dc+"subject", tag.tag, true); + } + } +} + +function generateCollection(collection) { + var collectionResource = "#collection_"+collection.id; + Zotero.RDF.addStatement(collectionResource, rdf+"type", n.z+"Collection", false); + Zotero.RDF.addStatement(collectionResource, n.dc+"title", collection.name, true); + + var children = collection.children ? collection.children : collection.descendents; + if(!children) return; + for each(var child in children) { + // add child list items + if(child.type == "collection") { + Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", "#collection_"+child.id, false); + // do recursive processing of collections + generateCollection(child); + } else if(itemResources[child.id]) { + Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", itemResources[child.id], false); + } + } +} + +function generateItem(item, zoteroType, resource) { + var container = null; + var containerElement = null; + + /** CORE FIELDS **/ + + // type + var type = null; + if(zoteroType == "book") { + type = n.bib+"Book"; + } else if (zoteroType == "bookSection") { + type = n.bib+"BookSection"; + container = n.bib+"Book"; + } else if(zoteroType == "journalArticle") { + type = n.bib+"Article"; + container = n.bib+"Journal"; + } else if(zoteroType == "magazineArticle") { + type = n.bib+"Article"; + container = n.bib+"Periodical"; + } else if(zoteroType == "newspaperArticle") { + type = n.bib+"Article"; + container = n.bib+"Newspaper"; + } else if(zoteroType == "thesis") { + type = n.bib+"Thesis"; + } else if(zoteroType == "letter") { + type = n.bib+"Letter"; + } else if(zoteroType == "manuscript") { + type = n.bib+"Manuscript"; + } else if(zoteroType == "interview") { + type = n.bib+"Interview"; + } else if(zoteroType == "film") { + type = n.bib+"MotionPicture"; + } else if(zoteroType == "artwork") { + type = n.bib+"Illustration"; + } else if(zoteroType == "webpage") { + type = n.bib+"Document"; + container = n.z+"Website"; + } else if(zoteroType == "note") { + type = n.bib+"Memo"; + if(!Zotero.getOption("exportNotes")) { + return; + } + } else if(zoteroType == "attachment") { + type = n.z+"Attachment"; + } else if(zoteroType == "report") { + type = n.bib+"Report"; + } else if(zoteroType == "bill") { + type = n.bib+"Legislation"; + } else if(zoteroType == "case") { + type = n.bib+"Document"; // ?? + container = n.bib+"CourtReporter"; + } else if(zoteroType == "hearing") { + type = n.bib+"Report"; + } else if(zoteroType == "patent") { + type = n.bib+"Patent"; + } else if(zoteroType == "statute") { + type = n.bib+"Legislation"; + } else if(zoteroType == "email") { + type = n.bib+"Letter"; + } else if(zoteroType == "map") { + type = n.bib+"Image"; + } else if(zoteroType == "blogPost") { + type = n.bib+"Document"; + container = n.z+"Blog"; + } else if(zoteroType == "instantMessage") { + type = n.bib+"Letter"; + } else if(zoteroType == "forumPost") { + type = n.bib+"Document"; + container = n.z+"Forum"; + } else if(zoteroType == "audioRecording") { + type = n.bib+"Recording"; + } else if(zoteroType == "presentation") { + type = n.bib+"ConferenceProceedings"; + } else if(zoteroType == "videoRecording") { + type = n.bib+"Recording"; + } else if(zoteroType == "tvBroadcast") { + type = n.bib+"Recording"; + } else if(zoteroType == "radioBroadcast") { + type = n.bib+"Recording"; + } else if(zoteroType == "podcast") { + type = n.bib+"Recording"; + } else if(zoteroType == "computerProgram") { + type = n.bib+"Data"; + } + + if(type) { + Zotero.RDF.addStatement(resource, rdf+"type", type, false); + } + Zotero.RDF.addStatement(resource, n.z+"itemType", zoteroType, true); + + // generate section + if(item.section) { + var section = Zotero.RDF.newResource(); + // set section type + Zotero.RDF.addStatement(section, rdf+"type", n.bib+"Part", false); + // set section title + Zotero.RDF.addStatement(section, n.dc+"title", item.section, true); + // add relationship to resource + Zotero.RDF.addStatement(resource, n.dcterms+"isPartOf", section, false); + } + + // generate container + if(container) { + if(item.ISSN && !Zotero.RDF.getArcsIn("urn:issn:"+item.ISSN)) { + // use ISSN as container URI if no other item is + containerElement = "urn:issn:"+item.ISSN; + } else { + containerElement = Zotero.RDF.newResource(); + } + // attach container to section (if exists) or resource + Zotero.RDF.addStatement((section ? section : resource), n.dcterms+"isPartOf", containerElement, false); + // add container type + Zotero.RDF.addStatement(containerElement, rdf+"type", container, false); + } + + // generate series + if(item.series || item.seriesTitle || item.seriesText || item.seriesNumber) { + var series = Zotero.RDF.newResource(); + // set series type + Zotero.RDF.addStatement(series, rdf+"type", n.bib+"Series", false); + // add relationship to resource + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"isPartOf", series, false); + } + + // generate publisher + if(item.publisher || item.distributor || item.label || item.company || item.institution || item.place) { + var organization = Zotero.RDF.newResource(); + // set organization type + Zotero.RDF.addStatement(organization, rdf+"type", n.foaf+"Organization", false); + // add relationship to resource + Zotero.RDF.addStatement(resource, n.dc+"publisher", organization, false); + } + + var typeProperties = ["reportType", "videoRecordingType", "letterType", + "manuscriptType", "mapType", "thesisType", "websiteType", + "audioRecordingType", "presentationType", "postType", + "audioFileType"]; + var ignoreProperties = ["itemID", "itemType", "firstCreator", "dateAdded", + "dateModified", "section", "sourceItemID"]; + + // creators + if(item.creators) { // authors/editors/contributors + var creatorContainers = new Object(); + + // not yet in biblio + var biblioCreatorTypes = ["author", "editor", "contributor"]; + + for(var j in item.creators) { + var creator = Zotero.RDF.newResource(); + Zotero.RDF.addStatement(creator, rdf+"type", n.foaf+"Person", false); + // gee. an entire vocabulary for describing people, and these aren't even + // standardized in it. oh well. using them anyway. + Zotero.RDF.addStatement(creator, n.foaf+"surname", item.creators[j].lastName, true); + Zotero.RDF.addStatement(creator, n.foaf+"givenname", item.creators[j].firstName, true); + + if(biblioCreatorTypes.indexOf(item.creators[j].creatorType) != -1) { + var cTag = n.bib+item.creators[j].creatorType+"s"; + } else { + var cTag = n.z+item.creators[j].creatorType+"s"; + } + + if(!creatorContainers[cTag]) { + var creatorResource = Zotero.RDF.newResource(); + // create new seq for author type + creatorContainers[cTag] = Zotero.RDF.newContainer("seq", creatorResource); + // attach container to resource + Zotero.RDF.addStatement(resource, cTag, creatorResource, false); + } + Zotero.RDF.addContainerElement(creatorContainers[cTag], creator, false); + } + } + + // notes + if(item.notes && Zotero.getOption("exportNotes")) { + for(var j in item.notes) { + var noteResource = itemResources[item.notes[j].itemID]; + + // add note tag + Zotero.RDF.addStatement(noteResource, rdf+"type", n.bib+"Memo", false); + // add note item.notes + Zotero.RDF.addStatement(noteResource, rdf+"value", item.notes[j].note, true); + // add relationship between resource and note + Zotero.RDF.addStatement(resource, n.dcterms+"isReferencedBy", noteResource, false); + + // Add see also info to RDF + generateSeeAlso(noteResource, item.notes[j].seeAlso); + generateTags(noteResource, item.notes[j].tags); + } + } + + // child attachments + if(item.attachments) { + for each(var attachment in item.attachments) { + var attachmentResource = itemResources[attachment.itemID]; + Zotero.RDF.addStatement(resource, n.link+"link", attachmentResource, false); + generateItem(attachment, "attachment", attachmentResource); + } + } + + // relative file path for attachment items + if(item.path) { + Zotero.RDF.addStatement(resource, rdf+"resource", item.path, false); + } + + // seeAlso and tags + if(item.seeAlso) generateSeeAlso(resource, item.seeAlso); + if(item.tags) generateTags(resource, item.tags); + + for(var property in item.uniqueFields) { + var value = item[property]; + if(!value) continue; + + if(property == "title") { // title + Zotero.RDF.addStatement(resource, n.dc+"title", value, true); + } else if(property == "source") { // authors/editors/contributors + Zotero.RDF.addStatement(resource, n.dc+"source", value, true); + } else if(property == "url") { // url + // add url as identifier + var term = Zotero.RDF.newResource(); + // set term type + Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"URI", false); + // set url value + Zotero.RDF.addStatement(term, rdf+"value", value, true); + // add relationship to resource + Zotero.RDF.addStatement(resource, n.dc+"identifier", term, false); + } else if(property == "accessionNumber") { // accessionNumber as generic ID + Zotero.RDF.addStatement(resource, n.dc+"identifier", value, true); + } else if(property == "rights") { // rights + Zotero.RDF.addStatement(resource, n.dc+"rights", value, true); + } else if(property == "edition" || // edition + property == "version") { // version + Zotero.RDF.addStatement(resource, n.prism+"edition", value, true); + } else if(property == "date") { // date + Zotero.RDF.addStatement(resource, n.dc+"date", value, true); + } else if(property == "accessDate") { // accessDate + Zotero.RDF.addStatement(resource, n.dcterms+"dateSubmitted", value, true); + } else if(property == "issueDate") { // issueDate + Zotero.RDF.addStatement(resource, n.dcterms+"issued", value, true); + } else if(property == "pages") { // pages + // not yet part of biblio, but should be soon + Zotero.RDF.addStatement(resource, n.bib+"pages", value, true); + } else if(property == "extra") { // extra + Zotero.RDF.addStatement(resource, n.dc+"description", value, true); + } else if(property == "mimeType") { // mimeType + Zotero.RDF.addStatement(resource, n.link+"type", value, true); + } else if(property == "charset") { // charset + Zotero.RDF.addStatement(resource, n.link+"charset", value, true); + // THE FOLLOWING ARE ALL PART OF THE CONTAINER + } else if(property == "ISSN") { // ISSN + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISSN "+value, true); + } else if(property == "ISBN") { // ISBN + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISBN "+value, true); + } else if(property == "DOI") { // DOI + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "DOI "+value, true); + } else if(property == "publicationTitle" || // publicationTitle + property == "reporter") { // reporter + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"title", value, true); + } else if(property == "journalAbbreviation") { // journalAbbreviation + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"alternative", value, true); + } else if(property == "volume") { // volume + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"volume", value, true); + } else if(property == "issue" || // issue + property == "number" || // number + property == "patentNumber") { // patentNumber + Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"number", value, true); + } else if(property == "callNumber") { + var term = Zotero.RDF.newResource(); + // set term type + Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"LCC", false); + // set callNumber value + Zotero.RDF.addStatement(term, rdf+"value", value, true); + // add relationship to resource + Zotero.RDF.addStatement(resource, n.dc+"subject", term, false); + } else if(property == "abstractNote") { + Zotero.RDF.addStatement(resource, n.dcterms+"abstract", value, true); + // THE FOLLOWING ARE ALL PART OF THE SERIES + } else if(property == "series") { // series + Zotero.RDF.addStatement(series, n.dc+"title", value, true); + } else if(property == "seriesTitle") { // seriesTitle + Zotero.RDF.addStatement(series, n.dcterms+"alternative", value, true); + } else if(property == "seriesText") { // seriesText + Zotero.RDF.addStatement(series, n.dc+"description", value, true); + } else if(property == "seriesNumber") { // seriesNumber + Zotero.RDF.addStatement(series, n.dc+"identifier", value, true); + // THE FOLLOWING ARE ALL PART OF THE PUBLISHER + } else if(property == "publisher" || // publisher + property == "distributor" || // distributor (film) + property == "label" || // label (audioRecording) + property == "company" || // company (computerProgram) + property == "institution") { // institution (report) + Zotero.RDF.addStatement(organization, n.foaf+"name", value, true); + } else if(property == "place") { // place + var address = Zotero.RDF.newResource(); + // set address type + Zotero.RDF.addStatement(address, rdf+"type", n.vcard+"Address", false); + // set address locality + Zotero.RDF.addStatement(address, n.vcard+"locality", value, true); + // add relationship to organization + Zotero.RDF.addStatement(organization, n.vcard+"adr", address, false); + } else if(property == "archiveLocation") { // archiveLocation + Zotero.RDF.addStatement(resource, n.dc+"coverage", value, true); + } else if(property == "interviewMedium" || + property == "artworkMedium") { // medium + Zotero.RDF.addStatement(resource, n.dcterms+"medium", value, true); + } else if(property == "conferenceName") { + var conference = Zotero.RDF.newResource(); + // set conference type + Zotero.RDF.addStatement(conference, rdf+"type", n.bib+"Conference", false); + // set conference title + Zotero.RDF.addStatement(conference, n.dc+"title", value, true); + // add relationship to conference + Zotero.RDF.addStatement(resource, n.bib+"presentedAt", conference, false); + } else if(typeProperties.indexOf(property) != -1) { + Zotero.RDF.addStatement(resource, n.dc+"type", value, true); + // THE FOLLOWING RELATE TO NOTES + } else if(property == "note") { + if(Zotero.getOption("exportNotes")) { + if(item.itemType == "attachment") { + Zotero.RDF.addStatement(resource, n.dc+"description", value, true); + } else if(item.itemType == "note") { + Zotero.RDF.addStatement(resource, rdf+"value", value, true); + } + } + // THIS CATCHES ALL REMAINING PROPERTIES + } else if(ignoreProperties.indexOf(property) == -1) { + Zotero.debug("Zotero RDF: using Zotero namespace for property "+property); + Zotero.RDF.addStatement(resource, n.z+property, value, true); + } + } +} + +function doExport() { + // add namespaces + for(var i in n) { + Zotero.RDF.addNamespace(i, n[i]); + } + + // leave as global + itemResources = new Array(); + + // keep track of resources already assigned (in case two book items have the + // same ISBN, or something like that) + var usedResources = new Array(); + + var items = new Array(); + + // first, map each ID to a resource + while(item = Zotero.nextItem()) { + items.push(item); + + if(item.ISBN && !usedResources["urn:isbn:"+item.ISBN]) { + itemResources[item.itemID] = "urn:isbn:"+item.ISBN; + usedResources[itemResources[item.itemID]] = true; + } else if(item.itemType != "attachment" && item.url && !usedResources[item.url]) { + itemResources[item.itemID] = item.url; + usedResources[itemResources[item.itemID]] = true; + } else { + // just specify a node ID + itemResources[item.itemID] = "#item_"+item.itemID; + } + + for(var j in item.notes) { + itemResources[item.notes[j].itemID] = "#item_"+item.notes[j].itemID; + } + + for each(var attachment in item.attachments) { + // just specify a node ID + itemResources[attachment.itemID] = "#item_"+attachment.itemID; + } + } + + for each(item in items) { + // these items are global + generateItem(item, item.itemType, itemResources[item.itemID]); + } + + /** RDF COLLECTION STRUCTURE **/ + var collection; + while(collection = Zotero.nextCollection()) { + generateCollection(collection); + } +} +\ No newline at end of file diff --git a/translators/arXiv.org.js b/translators/arXiv.org.js @@ -0,0 +1,183 @@ +{ + "translatorID":"ecddda2e-4fc6-4aea-9f17-ef3b56d7377a", + "translatorType":4, + "label":"arXiv.org", + "creator":"Sean Takats and Michael Berkowitz", + "target":"http://(?:([^\\.]+\\.))?(?:(arxiv\\.org|xxx.lanl.gov)/(?:find/\\w|list/\\w|abs/)|eprintweb.org/S/(?:search|archive|article)(?!.*refs$)(?!.*cited$))", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-08-04 07:10:00" +} + +function detectWeb(doc, url) { + var searchRe = /^http:\/\/(?:([^\.]+\.))?(?:(arxiv\.org|xxx\.lanl\.gov)\/(?:find|list)|eprintweb.org\/S\/(?:archive|search$))/; + if(searchRe.test(url)) { + return "multiple"; + } else { + return "journalArticle"; + } +} + +function getPDF(articleID) { + return {url:"http://www.arxiv.org/pdf/" + articleID + ".pdf", + mimeType:"application/pdf", title:articleID + " PDF"}; +} + +function doWeb(doc, url) { + var eprintMultRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:search|archive)/; + var eprintMultM = eprintMultRe.exec(url); + + var eprintSingRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:article|search\/[0-9]+\/A[0-9]+)/; + var eprintSingM = eprintSingRe.exec(url); + + if (eprintMultM) { + var elmtsXPath = '//table/tbody/tr/td[@class="txt"]/a[text()="Abstract"]/../b'; + var titlesXPath = '//table/tbody/tr/td[@class="lti"]'; + var titleNode = './text()'; + } else { + var elmtsXPath = '//div[@id="dlpage"]/dl/dt/span[@class="list-identifier"]/a[1]'; + var titlesXPath = '//div[@id="dlpage"]/dl/dd/div[@class="meta"]/div[@class="list-title"]'; + } + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var elmts = doc.evaluate(elmtsXPath, doc, nsResolver, XPathResult.ANY_TYPE, null); + var titles = doc.evaluate(titlesXPath, doc, nsResolver, XPathResult.ANY_TYPE, null); + + var newURIs = new Array(); + var elmt = elmts.iterateNext(); + var title = titles.iterateNext(); + if (elmt && titles) { + var availableItems = new Array(); + var arXivCats = new Array(); + var arXivIDs = new Array(); + var i=0; + if (eprintMultM){ + do { + var newID = doc.evaluate('./text()', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + newID = newID.replace(/arXiv:/, ""); + newID = newID.replace(/\//g, "%2F"); + availableItems[i] = doc.evaluate(titleNode, title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + arXivIDs[i] = newID; + i++; + } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext())); + } + else{ + do { + var newID= elmt.textContent; + newID = newID.replace(/arXiv:/, ""); + newID = newID.replace(/\//g, "%2F"); + availableItems[i] = Zotero.Utilities.cleanString(title.textContent.replace(/^\s*Title:\s+/, "")); + arXivIDs[i] = newID; + i++; + } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext())); + } + var items = Zotero.selectItems(availableItems); + if(!items) { + return true; + } + for(var i in items) { + newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivIDs[i] + "&metadataPrefix=oai_dc"); + + } + } + else { + if (eprintSingM){ + var titleID = doc.evaluate('//td[@class="ti"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var arXivID = doc.evaluate('//table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr[1]/td[@class="txt"]/b', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + arXivID = arXivID.substring(0, arXivID.indexOf(" ")); + arXivID = arXivID.replace(/arXiv:/, ""); + arXivID = arXivID.replace(/\//g, "%2F"); + } else { + var arXivID = doc.evaluate('//title', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var titleRe = /\[([^\]]*)]/; + var m = titleRe.exec(arXivID); + arXivID = m[1]; + arXivID = arXivID.replace(/\//g, "%2F"); + } + newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivID + "&metadataPrefix=oai_dc"); + + } + + Zotero.Utilities.HTTP.doGet(newURIs, function(text) { + var newItem = new Zotero.Item("journalArticle"); + // remove header + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + // fix non-compliant XML tags (colons) + text = text.replace(/<dc:/g, "<dc_").replace(/<\/dc:/g, "</dc_"); + text = text.replace(/<oai_dc:dc/g, "<oai_dc_dc").replace(/<\/oai_dc:dc/g, "</oai_dc_dc"); + text = text.replace(/<OAI-PMH[^>]*>/, "").replace(/<\/OAI-PMH[^>]*>/, ""); + text = "<zotero>" + text + "</zotero>"; + var xml = new XML(text); + var title; + var citation = xml.GetRecord.record.metadata.oai_dc_dc; + var test = xml..responseDate.text().toString(); + + if (citation.dc_title.length()){ + title = Zotero.Utilities.cleanString(citation.dc_title.text().toString()); + newItem.title = title; + } + Zotero.debug("article title: " + title); + var type = ""; + if(citation.dc_creator.length()) { + var authors = citation.dc_creator; + for(var j=0; j<authors.length(); j++) { + Zotero.debug("author: " + authors[j]); + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true)); + } + } + if (citation.dc_date.length()) { + var dates = citation.dc_date; + newItem.date = Zotero.Utilities.cleanString(dates[0].text().toString()); + } + if (citation.dc_description.length()) { + var descriptions = citation.dc_description; + for (var j=0; j<descriptions.length(); j++) { + var noteStr = Zotero.Utilities.cleanString(descriptions[j].text().toString()); + newItem.notes.push({note:noteStr}); + } + } + if (citation.dc_subject.length()) { + var subjects = citation.dc_subject; + for (var j=0; j<subjects.length(); j++) { + var subjectValue = Zotero.Utilities.cleanString(subjects[j].text().toString()); + newItem.tags.push(subjectValue); + } + } + if (citation.dc_identifier.length()) { + var identifiers = citation.dc_identifier; + for (var j=0; j<identifiers.length(); j++) { + var identifier = Zotero.Utilities.cleanString(identifiers[j].text().toString()); + if (identifier.substr(0, 4) == "doi:") { + newItem.DOI = identifier; + } + else if (identifier.substr(0, 7) == "http://") { + newItem.url = identifier; + } + else { + newItem.extra = identifier; + } + } + } + var articleID = ""; + if (xml.GetRecord.record.header.identifier.length()) { + articleID = xml.GetRecord.record.header.identifier.text().toString(); + articleID = articleID.substr(14); + newItem.publicationTitle = articleID; + } +// TODO add "arXiv.org" to bib data? + newItem.attachments.push({url:newItem.url, title:"arXiv.org Snapshot", mimeType:"text/html"}); + newItem.attachments.push(getPDF(articleID)); + if (newItem.notes[0]['note']) { + newItem.abstractNote = newItem.notes[0]['note']; + newItem.notes = new Array(); + } + newItem.complete(); + }, function() {Zotero.done();}, null); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/eMJA.js b/translators/eMJA.js @@ -0,0 +1,125 @@ +{ + "translatorID":"966a7612-900c-42d9-8780-2a3247548588", + "translatorType":4, + "label":"eMJA", + "creator":"Michael Berkowitz", + "target":"http://www.mja.com.au/", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-01-25 20:00:00" +} + +function detectWeb(doc, url) { + if (doc.evaluate('//p[@class="Pfoot"]/b/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate('/html/body/table/tbody/tr[1]/td[2]/a/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + return "multiple"; + } else if (doc.title.indexOf("eMJA:") != -1) { + return "journalArticle"; + } +} + +function senCase(string) { + var smallwords = Array("and", "a", "in", "the", "by", "of", "s", "on"); + var sen = string.split(/\b/); + for (var i = 0 ; i < sen.length; i++) { + if (sen[i].match(/\w+/)) { + if (smallwords.indexOf(sen[i]) != -1 && i != 0) { + sen[i] = sen[i].toLowerCase(); + } else { + sen[i] = sen[i][0].toUpperCase() + sen[i].substring(1).toLowerCase(); + } + } + } + return sen.join(""); +} + +function doWeb(doc, url) { + var URIs = new Array(); + + if (doc.evaluate('//p[@class="Pfoot"]/b/a', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//p[@class="Pfoot"]/b/a'; + } else if (doc.evaluate('//tr[1]/td[2]/a/b', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) { + var xpath = '//tr[1]/td[2]/a/b'; + var linkpath = '//tr[2]/td[2]/small[@class="gr"]'; + } + + if (xpath) { + if (linkpath) { + var items = new Object(); + var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var links = doc.evaluate(linkpath, doc, null, XPathResult.ANY_TYPE, null); + var title = titles.iterateNext(); + var link = links.iterateNext(); + while (title) { + //Zotero.debug(Zotero.Utilities.cleanString(title.textContent)); + //Zotero.debug(Zotero.Utilities.cleanString(link.textContent)); + items[Zotero.Utilities.cleanString(link.textContent)] = Zotero.Utilities.cleanString(title.textContent).substring(6); + title = titles.iterateNext(); + link = links.iterateNext(); + } + } else { + var items = new Object(); + var things = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null); + var next_thing = things.iterateNext(); + while (next_thing) { + items[next_thing.href] = senCase(Zotero.Utilities.cleanString(next_thing.textContent)); + next_thing = things.iterateNext(); + } + } + items = Zotero.selectItems(items); + Zotero.debug(items); + for (var i in items) { + URIs.push(i); + } + } else { + URIs.push(url); + } + Zotero.debug(URIs); + Zotero.Utilities.processDocuments(URIs, function(newDoc) { + var newItem = new Zotero.Item("journalArticle"); + newItem.title = senCase(newDoc.title.substring(6)); + + newItem.publicationTitle = "The Medical Journal of Australia"; + newItem.ISSN = "0025-729X"; + newItem.url = newDoc.location.href; + + //date + newItem.date = newDoc.evaluate('//meta[@name="date"]/@content', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substring(0,10); + + //voliss + var voliss = newDoc.evaluate('//meta[@name="citation"]/@content', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent; + //voliss = voliss.match(/[^\d]+(\d+)\s+\((\d+)\)/); + voliss = voliss.match(/;\s+(\d+)\s+\((\d+)[^:]+:\s+(.*)\.$/); + newItem.volume = voliss[1]; + newItem.issue = voliss[2]; + newItem.pages = voliss[3]; + + //authors + var authors = new Array(); + var apath = '//div[@class="By"]/span[@class="Pn"]'; + var author = newDoc.evaluate(apath, newDoc, null, XPathResult.ANY_TYPE, null); + var next_a = author.iterateNext(); + while (next_a) { + var name = next_a.textContent; + if (name.substring(0,1) == ",") { + name = name.substring(2); + } else if (name.substring(0,4) == " and") { + name = name.substring(5); + } + authors.push(name); + next_a = author.iterateNext(); + } + + for (var i in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + + //attachments + newItem.attachments = [ + {url:newDoc.location.href, title:"eMJA Snapshot", mimeType:"text/html"}, + {url:newDoc.location.href.replace(".html", ".pdf") , title:"eMJA PDF", mimeType:"application/pdf"} + ]; + newItem.complete(); + }, function() {Zotero.done;}); +} +\ No newline at end of file diff --git a/translators/informIT database.js b/translators/informIT database.js @@ -0,0 +1,185 @@ +{ + "translatorID":"add79dfd-7951-4c72-af1d-ce1d50aa4fb4", + "translatorType":4, + "label":"informIT database", + "creator":"Adam Crymble", + "target":"http://www.informit.com", + "minVersion":"1.0.0b4.r5", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2008-07-07 14:50:00" +} + +function detectWeb(doc, url) { + if (doc.title.match("Search Results")) { + return "multiple"; + } else if (doc.location.href.match("topics")) { + return "multiple"; + + } else if (doc.location.href.match("product")) { + return "book"; + } else if (doc.location.href.match("guides")) { + return "book"; + + } else if (doc.location.href.match("library")) { + return "bookSection"; + } else if (doc.location.href.match(/articles\/article/)) { + return "bookSection"; + } +} + +//informIT database translator. Code by Adam Crymble + +function scrape(doc, url) { + + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var dataTags = new Object(); + + //FOR GUIDES + if (doc.location.href.match("guides")) { + var newItem = new Zotero.Item("book"); + newItem.title = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + var authors = doc.evaluate('//div[@class="titling"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + //FOR ARTICLES + if (doc.location.href.match(/articles\/article/)) { + var newItem = new Zotero.Item("bookSection"); + + var contents = doc.evaluate('//div[@id="articleHeader"]/ul/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//div[@id="articleHeader"]/ul/li)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + var authors = contents.iterateNext().textContent.substr(3); + + if (doc.evaluate('//div[@class="relatedBook"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + newItem.bookTitle = doc.evaluate('//div[@class="relatedBook"]/p/a', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + } + + newItem.date = contents.iterateNext().textContent; + + var rights1; + if (xPathCount.numberValue> 2) { + newItem.rights = contents.iterateNext().textContent; + } + + newItem.title = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + } else if (doc.evaluate('//ul[@class="bibliography"]/li', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) { + + + //FOR STORE BOOKS + var newItem = new Zotero.Item("book"); + + var contents = doc.evaluate('//ul[@class="bibliography"]/li', doc, nsResolver, XPathResult.ANY_TYPE, null); + var xPathCount = doc.evaluate('count (//ul[@class="bibliography"]/li)', doc, nsResolver, XPathResult.ANY_TYPE, null); + + for (i=0; i<xPathCount.numberValue; i++) { + dataTags[i] = Zotero.Utilities.cleanTags(contents.iterateNext().textContent.replace(/^\s*|\s*$/g, '')); + } + + var authors = dataTags[0].substr(3); + + if (dataTags[1].match("Published")) { + var publisherInfo = dataTags[1].substr(10); + var date = publisherInfo.substr(0, 12); + newItem.date = date; + + if (publisherInfo.match("by ")) { + var publishCo = publisherInfo.split("by "); + newItem.publisher = publishCo[1]; + } + } + var extraStuff = dataTags[2].split(/\n/); + + var pageCut = extraStuff[0].indexOf("Pages"); + var dimensions = extraStuff[0].substr(0, pageCut).split("Dimensions "); + + newItem.description = "Dimensions: " + dimensions[1]; + newItem.pages = extraStuff[0].substr(pageCut+6); + newItem.edition = extraStuff[1].replace(/Edition\:\s| \s\s*/g, ''); + newItem.ISBN = extraStuff[2].substr(31, 18); + newItem.title = doc.evaluate('//h1', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + + + //FOR LIBRARY BOOKS + } else if (doc.location.href.match("library")) { + + var newItem = new Zotero.Item("bookSection"); + + newItem.title = doc.evaluate('//h2', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; + var meta = doc.evaluate('//div[@id="columnOne"]/p', doc, nsResolver, XPathResult.ANY_TYPE, null); + newItem.bookTitle = meta.iterateNext().textContent; + + var authors = meta.iterateNext().textContent.substr(3); + } + + //SHARED + var noMoreAuthor = 0; + + if (authors.match(" and ")) { + authors = authors.split(" and "); + } else if (authors.match(", ")) { + authors = authors.split(", "); + } else { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors, "author")); + noMoreAuthor = 1; + } + + if (authors.length>0 && noMoreAuthor != 1) { + + for (var i = 0; i < authors.length; i++) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author")); + } + } + + newItem.url = doc.location.href; + if (newItem.publisher) newItem.publisher = Zotero.Utilities.trimInternal(newItem.publisher); + newItem.complete(); +} + +function doWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var articles = new Array(); + + if (detectWeb(doc, url) == "multiple") { + var items = new Object(); + var next_title; + + //xPath for Topics pages, else xPaths for regular search pages. + if (doc.location.href.match("topics")) { + var titles = doc.evaluate('//div[@class="productList articles"]/dl/dt/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } else { + var titles = doc.evaluate('//td[3][@class="results"]/ul/li/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + var chapters = doc.evaluate('//dt/a', doc, nsResolver, XPathResult.ANY_TYPE, null); + } + + while (next_title = titles.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + + if (doc.title.match("Search Results")) { + while (next_title = chapters.iterateNext()) { + items[next_title.href] = next_title.textContent; + } + } + + items = Zotero.selectItems(items); + for (var i in items) { + articles.push(i); + } + } else { + articles = [url]; + } + Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();}); + Zotero.wait(); +} +\ No newline at end of file diff --git a/translators/unAPI.js b/translators/unAPI.js @@ -0,0 +1,253 @@ +{ + "translatorID":"e7e01cac-1e37-4da6-b078-a0e8343b0e98", + "translatorType":4, + "label":"unAPI", + "creator":"Simon Kornblith", + "target":null, + "minVersion":"1.0.0b4.r1", + "maxVersion":"", + "priority":200, + "inRepository":true, + "lastUpdated":"2007-08-04 23:15:00" +} + +var RECOGNIZABLE_FORMATS = ["mods", "marc", "endnote", "ris", "bibtex", "rdf"]; +var FORMAT_GUIDS = { + "mods":"0e2235e7-babf-413c-9acf-f27cce5f059c", + "marc":"a6ee60df-1ddc-4aae-bb25-45e0537be973", + "endnote":"881f60f2-0802-411a-9228-ce5f47b64c7d", + "ris":"32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7", + "bibtex":"9cb70025-a888-4a29-a210-93ec52da40d4", + "rdf":"5e3ad958-ac79-463d-812b-a86a9235c28f" +}; + +var unAPIResolver, unsearchedIds, foundIds, foundItems, foundFormat, foundFormatName; + +function detectWeb(doc, url) { + // initialize variables + unsearchedIds = []; + foundIds = []; + foundItems = []; + foundFormat = []; + foundFormatName = []; + + var nsResolver = doc.createNSResolver(doc.documentElement); + + // look for a resolver + unAPIResolver = doc.evaluate('//link[@rel="unapi-server"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(!unAPIResolver) return false; + unAPIResolver = unAPIResolver.getAttribute("href"); + + // look for abbrs + var abbrs = doc.getElementsByTagName("abbr"); + for each(var abbr in abbrs) { + if(abbr.getAttribute && abbr.getAttribute("class") && + abbr.getAttribute("class").split(" ").indexOf("unapi-id") != -1 && abbr.getAttribute("title")) { + // found an abbr + unsearchedIds.push(escape(abbr.getAttribute("title"))); + } + } + + if(!unsearchedIds.length) return false; + + // now we need to see if the server actually gives us bibliographic metadata. + + // one way to signal this is with a META tag + var zoteroMeta = doc.evaluate('//meta[@name="ZoteroItemType"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(zoteroMeta) return zoteroMeta.getAttribute("content"); + + // otherwise, things will be a bit more complicated, and we'll have to do some HTTP requests + Zotero.wait(); + + if(unsearchedIds.length == 1) { + // if there's only one abbr tag, we should go ahead and retrieve types for it + getItemType(); + } else { + // if there's more than one, we should first see if the resolver gives metadata for all of them + Zotero.Utilities.HTTP.doGet(unAPIResolver, function(text) { + var format = checkFormats(text); + if(format) { + // move unsearchedIds to foundIds + foundIds = unsearchedIds; + unsearchedIds = []; + // save format and formatName + foundFormat = format[0]; + foundFormatName = format[1]; + + Zotero.done("multiple"); + } else { + getItemType(); + } + }); + } +} + +function getItemType() { + // if there are no items left to search, use the only item's type (if there is one) or give up + if(!unsearchedIds.length) { + if(foundIds.length) { + getOnlyItem(); + } else { + Zotero.done(false); + } + return; + } + + var id = unsearchedIds.shift(); + Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) { + var format = checkFormats(text); + if(format) { + // save data + foundIds.push(id); + foundFormat.push(format[0]); + foundFormatName.push(format[1]); + + if(foundIds.length == 2) { + // this is our second; use multiple + Zotero.done("multiple"); + return; + } + } + + // keep going + getItemType(); + }); +} + +function checkFormats(text) { + text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, ""); + var xml = new XML(text); + + var foundFormat = new Object(); + + // this is such an ugly, disgusting hack, and I hate how Mozilla decided to neuter an ECMA standard + for each(var format in xml.format) { + var name = format.@name.toString(); + var lowerName = name.toLowerCase(); + + if(format.@namespace_uri == "http://www.loc.gov/mods/v3" || lowerName == "mods" || format.@docs == "http://www.loc.gov/standards/mods/") { + if(!foundFormat["mods"] || lowerName.indexOf("full") != -1) { + foundFormat["mods"] = escape(name); + } + } else if(lowerName.match(/^marc\b/)) { + if(!foundFormat["marc"] || lowerName.indexOf("utf8") != -1) { + foundFormat["marc"] = escape(name); + } + } else if(lowerName == "rdf_dc") { + foundFormat["rdf"] = escape(name); + } else if(format.@docs.text() == "http://www.refman.com/support/risformat_intro.asp" || lowerName.match(/^ris\b/)) { + if(!foundFormat["ris"] || lowerName.indexOf("utf8") != -1) { + foundFormat["ris"] = escape(name); + } + } else if(lowerName == "bibtex") { + foundFormat["bibtex"] = escape(name); + } else if(lowerName == "endnote") { + foundFormat["endnote"] = escape(name); + } + } + + // loop through again, this time respecting preferences + for each(var format in RECOGNIZABLE_FORMATS) { + if(foundFormat[format]) return [format, foundFormat[format]]; + } + + return false; +} + +function getOnlyItem() { + // retrieve the only item + retrieveItem(foundIds[0], foundFormat[0], foundFormatName[0], function(obj, item) { + foundItems.push(item); + Zotero.done(item.itemType); + }); +} + +function retrieveItem(id, format, formatName, callback) { + // retrieve URL + Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id+"&format="+formatName, function(text) { + var translator = Zotero.loadTranslator("import"); + translator.setTranslator(FORMAT_GUIDS[format]); + translator.setString(text); + translator.setHandler("itemDone", callback); + translator.translate(); + }); +} + +/** + * Get formats and names for all usable ids; when done, get all items + **/ +function getAllIds() { + if(!unsearchedIds.length) { + // once all ids have been gotten, get all items + getAllItems(); + return; + } + + var id = unsearchedIds.shift(); + Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) { + var format = checkFormats(text); + if(format) { + // save data + foundIds.push(id); + foundFormat.push(format[0]); + foundFormatName.push(format[1]); + } + + // keep going + getAllIds(); + }); +} + +/** + * Get all items; when done, show selectItems or scrape + **/ +function getAllItems() { + if(foundItems.length == foundIds.length) { + if(foundItems.length == 1) { + // if only one item, send complete() + foundItems[0].complete(); + } else if(foundItems.length > 0) { + // if multiple items, show selectItems + var itemTitles = []; + for(var i in foundItems) { + itemTitles[i] = foundItems[i].title; + } + + var chosenItems = Zotero.selectItems(itemTitles); + if(!chosenItems) Zotero.done(true); + + for(var i in chosenItems) { + foundItems[i].complete(); + } + } + + // reset items + foundItems = []; + + Zotero.done(); + return; + } + + var id = foundIds[foundItems.length]; + // foundFormat can be either a string or an array + if(typeof(foundFormat) == "string") { + var format = foundFormat; + var formatName = foundFormatName; + } else { + var format = foundFormat[foundItems.length]; + var formatName = foundFormatName[foundItems.length]; + } + + // get item + retrieveItem(id, format, formatName, function(obj, item) { + foundItems.push(item); + getAllItems(); + }); +} + +function doWeb() { + Zotero.wait(); + + // retrieve data for all ids + getAllIds(); +} +\ No newline at end of file diff --git a/translators/washingtonpost.com.js b/translators/washingtonpost.com.js @@ -0,0 +1,120 @@ +{ + "translatorID":"d1bf1c29-4432-4ada-8893-2e29fc88fd9e", + "translatorType":4, + "label":"washingtonpost.com", + "creator":"Simon Kornblith", + "target":"^http://www\\.washingtonpost\\.com/", + "minVersion":"1.0.0b3.r1", + "maxVersion":"", + "priority":100, + "inRepository":true, + "lastUpdated":"2007-06-21 20:10:00" +} + +function detectWeb(doc, url) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + // don't say we can scrape when we can't; make sure user is logged in + var signedIn = doc.evaluate('//a[text() = "Sign out" or text() = "Sign Out"]', + doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); + if(!signedIn) { + return; + } + + var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/ + if(articleRegexp.test(url)) { + return "newspaperArticle"; + } else { + var aTags = doc.getElementsByTagName("a"); + for(var i=0; i<aTags.length; i++) { + if(articleRegexp.test(aTags[i].href)) { + return "multiple"; + } + } + } +} + +function scrape(doc) { + var namespace = doc.documentElement.namespaceURI; + var nsResolver = namespace ? function(prefix) { + if (prefix == 'x') return namespace; else return null; + } : null; + + var newItem = new Zotero.Item("newspaperArticle"); + newItem.publicationTitle = "The Washington Post"; + newItem.ISSN = "0740-5421"; + + newItem.url = doc.location.href; + var metaTags = doc.getElementsByTagName("meta"); + + // Elena's code to grab print version (all pages) + snapshotURL=doc.location.href.replace(".html", "_pf.html"); + newItem.attachments.push({title:"Washington Post Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true}); + + // grab title from doc title + newItem.title = doc.title.replace(" - washingtonpost.com", ""); + + var byline = doc.evaluate('//div[@id="byline"]', doc, nsResolver, + XPathResult.ANY_TYPE, null).iterateNext(); + // grab authors from byline + if(byline) { + var authors = byline.textContent.substr(3).split(" and "); + for each(var author in authors) { + newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author")); + } + } + + var fonts = doc.evaluate('//div[@id="article"]/p/font/text()', doc, nsResolver, + XPathResult.ANY_TYPE, null); + var font; + while(font = fonts.iterateNext()) { + var pageRe = /([^;]+);(?:[\xA0 ]+Pages?[\xA0 ]+([A-Z0-9\-]+))?/ + // grab pages and date + Zotero.debug(Zotero.Utilities.cleanString(font.nodeValue)); + var m = pageRe.exec(font.nodeValue); + if(m) { + newItem.date = m[1]; + newItem.pages = m[2]; + break; + } + } + + // grab tags from meta tag + var keywords = doc.getElementsByTagName("meta"); + if(keywords) { + keywords = keywords.namedItem("keywords"); + if(keywords) { + keywords = keywords.getAttribute("content"); + if(keywords) { + newItem.tags = keywords.split(/, ?/); + } + } + } + + newItem.complete(); +} + +function doWeb(doc, url) { + var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/ + if(articleRegexp.test(url)) { + scrape(doc); + } else { + var items = Zotero.Utilities.getItemArray(doc, doc, articleRegexp); + items = Zotero.selectItems(items); + + if(!items) { + return true; + } + + var urls = new Array(); + for(var i in items) { + urls.push(i); + } + + Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); }); + Zotero.wait(); + } +} +\ No newline at end of file