/*************************************************************************** * Copyright (C) 2004-2009 by Thomas Fischer * * fischer@unix-ag.uni-kl.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "entry.h" #include "fileexporterris.h" namespace BibTeX { FileExporterRIS::FileExporterRIS() : FileExporter() { // nothing } FileExporterRIS::~FileExporterRIS() { // nothing } bool FileExporterRIS::save( TQIODevice* iodevice, const Element* element, TQStringList* /*errorLog*/ ) { m_mutex.lock(); bool result = FALSE; TQTextStream stream( iodevice ); const Entry *entry = dynamic_cast( element ); if ( entry != NULL ) result = writeEntry( stream, entry ); m_mutex.unlock(); return result && !m_cancelFlag; } bool FileExporterRIS::save( TQIODevice* iodevice, const File* bibtexfile, TQStringList* /*errorLog*/ ) { m_mutex.lock(); bool result = TRUE; m_cancelFlag = FALSE; TQTextStream stream( iodevice ); int numElements = (int) bibtexfile->count(), i = 0; emit progress( 0, numElements ); for ( File::ElementList::const_iterator it = bibtexfile->elements.begin(); it != bibtexfile->elements.end() && result && !m_cancelFlag; it++ ) { Entry *entry = dynamic_cast( *it ); if ( entry != NULL ) { BibTeX::Entry *myEntry = bibtexfile->completeReferencedFieldsConst( entry ); result &= writeEntry( stream, myEntry ); delete myEntry; } emit progress( ++i, numElements ); } m_mutex.unlock(); return result && !m_cancelFlag; } void FileExporterRIS::cancel() { m_cancelFlag = TRUE; } bool FileExporterRIS::writeEntry( TQTextStream &stream, const Entry* entry ) { bool result = TRUE; tqDebug( "Writing Entry" ); switch ( entry->entryType() ) { case Entry::etBook: writeKeyValue( stream, "TY", "BOOK" ); break; case Entry::etInBook: writeKeyValue( stream, "TY", "CHAP" ); break; case Entry::etInProceedings: writeKeyValue( stream, "TY", "CONF" ); break; case Entry::etArticle: writeKeyValue( stream, "TY", "JOUR" ); break; case Entry::etTechReport: writeKeyValue( stream, "TY", "RPRT" ); break; case Entry::etPhDThesis: writeKeyValue( stream, "TY", "THES" ); break; default: writeKeyValue( stream, "TY", "GEN" ); } TQString year = ""; TQString month = ""; for ( Entry::EntryFields::ConstIterator it = entry->begin(); result && it != entry->end(); it++ ) { EntryField *field = *it; if ( field->fieldType() == EntryField::ftUnknown && field->fieldTypeName().startsWith( "RISfield_" ) ) result &= writeKeyValue( stream, field->fieldTypeName().right( 2 ), field->value()->simplifiedText() ); else if ( field->fieldType() == EntryField::ftAuthor ) { TQStringList authors = TQStringList::split( TQRegExp( "\\s+(,|and|&)\\s+", FALSE ), field->value() ->simplifiedText() ); for ( TQStringList::Iterator it = authors.begin(); result && it != authors.end(); ++it ) result &= writeKeyValue( stream, "AU", *it ); } else if ( field->fieldType() == EntryField::ftEditor ) { TQStringList authors = TQStringList::split( TQRegExp( "\\s+(,|and|&)\\s+", FALSE ), field->value() ->simplifiedText() ); for ( TQStringList::Iterator it = authors.begin(); result && it != authors.end(); ++it ) result &= writeKeyValue( stream, "ED", *it ); } else if ( field->fieldType() == EntryField::ftTitle ) result &= writeKeyValue( stream, "TI", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftJournal ) result &= writeKeyValue( stream, "JO", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftChapter ) result &= writeKeyValue( stream, "CP", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftISSN ) result &= writeKeyValue( stream, "SN", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftISBN ) result &= writeKeyValue( stream, "SN", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftVolume ) result &= writeKeyValue( stream, "VL", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftNumber ) result &= writeKeyValue( stream, "IS", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftNote ) result &= writeKeyValue( stream, "N1", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftAbstract ) result &= writeKeyValue( stream, "N2", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftPublisher ) result &= writeKeyValue( stream, "PB", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftLocation ) result &= writeKeyValue( stream, "CY", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftKeywords ) result &= writeKeyValue( stream, "KW", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftYear ) year = field->value() ->simplifiedText(); else if ( field->fieldType() == EntryField::ftMonth ) month = field->value() ->simplifiedText(); else if ( field->fieldType() == EntryField::ftAddress ) result &= writeKeyValue( stream, "AD", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftURL ) result &= writeKeyValue( stream, "UR", field->value() ->simplifiedText() ); else if ( field->fieldType() == EntryField::ftPages ) { TQStringList pageRange = TQStringList::split( TQRegExp( TQString( "--|-|%1" ).arg( TQChar( 0x2013 ) ) ), field->value() ->simplifiedText() ); if ( pageRange.count() == 2 ) { result &= writeKeyValue( stream, "SP", pageRange[ 0 ] ); result &= writeKeyValue( stream, "EP", pageRange[ 1 ] ); } } else if ( field->fieldTypeName().lower() == "doi" ) result &= writeKeyValue( stream, "UR", field->value() ->simplifiedText() ); } if ( !year.isEmpty() || !month.isEmpty() ) { result &= writeKeyValue( stream, "PY", TQString( "%1/%2//" ).arg( year ).arg( month ) ); } result &= writeKeyValue( stream, "ER", TQString() ); stream << endl; return result; } bool FileExporterRIS::writeKeyValue( TQTextStream &stream, const TQString& key, const TQString&value ) { stream << key << " - "; if ( !value.isEmpty() ) stream << value; stream << endl; tqDebug( "%s - %s", key.latin1(), value.latin1() ); return TRUE; } }