/*************************************************************************** * 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 <tqfile.h> #include <tqapplication.h> #include <tqlayout.h> #include <tqlabel.h> #include <tqcheckbox.h> #include <kiconloader.h> #include <kcombobox.h> #include <kpushbutton.h> #include <tdelocale.h> #include <tdemessagebox.h> #include <klineedit.h> #include <tdeio/netaccess.h> #include <kurl.h> #include "settings.h" #include "fileimporterbibtex.h" #include "webqueryspireshep.h" namespace KBibTeX { const TQString WebQuerySpiresHep::mirrorNames[] = {i18n( "DESY (Germany)" ), i18n( "FNAL (U.S.A.)" ), i18n( "IHEP (Russia)" ), i18n( "Durham U (U.K.)" ), i18n( "SLAC (U.S.A.)" ), i18n( "YITP (Japan)" ), i18n( "LIPI (Indonesia)" )}; const TQString WebQuerySpiresHep::mirrorURLs[] = {"http://www-library.desy.de/cgi-bin/spiface", "http://www-spires.fnal.gov/spires", "http://usparc.ihep.su/spires", "http://www-spires.dur.ac.uk/spires", "http://www.slac.stanford.edu/spires", "http://www.yukawa.kyoto-u.ac.jp/spires", "http://www.spires.lipi.go.id/spires"}; WebQuerySpiresHepWidget::WebQuerySpiresHepWidget( TQWidget *parent, const char *name ) : WebQueryWidget( parent, name ) { init(); Settings *settings = Settings::self(); TQString value = settings->getWebQueryDefault( "SpiresHep_query" ); value = value == TQString::null ? "" : value; lineEditQuery->setText( value ); slotTextChanged( value, true ); value = settings->getWebQueryDefault( "SpiresHep_mirror" ); value = value == TQString::null || value.isEmpty() ? "0" : value; comboBoxMirror->setCurrentItem( value.toInt() ); value = settings->getWebQueryDefault( "SpiresHep_type" ); value = value == TQString::null || value.isEmpty() ? "0" : value; comboBoxType->setCurrentItem( value.toInt() ); } void WebQuerySpiresHepWidget::init() { TQVBoxLayout *vLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() ); TQHBoxLayout *hLayout = new TQHBoxLayout( ); vLayout->addLayout( hLayout ); comboBoxMirror = new KComboBox( false, this ); hLayout->addWidget( comboBoxMirror ); hLayout->setStretchFactor( comboBoxMirror, 7 ); hLayout->addSpacing( KDialog::spacingHint() * 2 ); for ( unsigned int i = 0; i < sizeof( WebQuerySpiresHep::mirrorNames ) / sizeof( WebQuerySpiresHep::mirrorNames[0] ); ++i ) comboBoxMirror->insertItem( WebQuerySpiresHep::mirrorNames[i] ); comboBoxMirror->setCurrentItem( 0 ); TQLabel *label = new TQLabel( i18n( "Type:" ), this ); hLayout->addWidget( label ); hLayout->setStretchFactor( label, 1 ); comboBoxType = new KComboBox( false, this ); label->setBuddy( comboBoxType ); hLayout->addWidget( comboBoxType ); hLayout->setStretchFactor( comboBoxType, 5 ); comboBoxType->insertItem( i18n( "raw query" ) ); comboBoxType->insertItem( i18n( "author" ) ); comboBoxType->insertItem( i18n( "title" ) ); comboBoxType->insertItem( i18n( "journal" ) ); comboBoxType->insertItem( i18n( "EPrint number" ) ); comboBoxType->insertItem( i18n( "report number" ) ); comboBoxType->insertItem( i18n( "keywords" ) ); comboBoxType->setCurrentItem( 0 ); hLayout = new TQHBoxLayout( ); vLayout->addLayout( hLayout ); KPushButton *clearSearchText = new KPushButton( this ); clearSearchText->setIconSet( TQIconSet( SmallIcon( "locationbar_erase" ) ) ); hLayout->addWidget( clearSearchText ); label = new TQLabel( i18n( "Search &term:" ), this ); hLayout->addWidget( label ); lineEditQuery = new KLineEdit( this ); hLayout->addWidget( lineEditQuery ); label->setBuddy( lineEditQuery ); connect( clearSearchText, SIGNAL( clicked() ), lineEditQuery, SLOT( clear() ) ); connect( lineEditQuery, SIGNAL( textChanged( const TQString& ) ), this, SLOT( slotTextChanged( const TQString& ) ) ); hLayout->setStretchFactor( lineEditQuery, 4 ); TDECompletion *completionQuery = lineEditQuery->completionObject(); m_checkBoxFetchAbstracts = new TQCheckBox( i18n( "Include abstracts from arxiv.org if available" ), this ); vLayout->addWidget( m_checkBoxFetchAbstracts ); connect( lineEditQuery, SIGNAL( returnPressed() ), this, SIGNAL( startSearch() ) ); connect( lineEditQuery, SIGNAL( returnPressed( const TQString& ) ), completionQuery, SLOT( addItem( const TQString& ) ) ); vLayout->addStretch( 1 ); } WebQuerySpiresHep::WebQuerySpiresHep( TQWidget* parent ): WebQuery( parent ) { m_widget = new WebQuerySpiresHepWidget( parent ); } WebQuerySpiresHep::~WebQuerySpiresHep() { delete m_widget; } TQString WebQuerySpiresHep::title() { return i18n( "SPIRES-HEP" ); } TQString WebQuerySpiresHep::disclaimer() { return i18n( "SPIRES-HEP Search" ); } TQString WebQuerySpiresHep::disclaimerURL() { return "http://www.slac.stanford.edu/spires/"; } WebQueryWidget *WebQuerySpiresHep::widget() { return m_widget; } void WebQuerySpiresHep::query() { const int maxEntries = 25; bool doFetchAbstracts = m_widget->m_checkBoxFetchAbstracts->isChecked(); int mirrorIdx = m_widget->comboBoxMirror->currentItem(); WebQuery::query(); Settings *settings = Settings::self(); settings->setWebQueryDefault( "SpiresHep_query", m_widget->lineEditQuery->text() ); settings->setWebQueryDefault( "SpiresHep_mirror", TQString::number( m_widget->comboBoxMirror->currentItem() ) ); settings->setWebQueryDefault( "SpiresHep_type", TQString::number( m_widget->comboBoxType->currentItem() ) ); setNumStages( 1 + doFetchAbstracts ? maxEntries : 0 ); TQString searchTerm = m_widget->lineEditQuery->text().stripWhiteSpace().replace( '$', "" ); if ( searchTerm.isEmpty() ) { setEndSearch( WebQuery::statusInvalidQuery ); return; } switch ( m_widget->comboBoxType->currentItem() ) { case 1: searchTerm = searchTerm.prepend( "fin a " ); break; case 2: searchTerm = searchTerm.prepend( "fin t " ); break; case 3: searchTerm = searchTerm.prepend( "fin j " ); break; case 4: searchTerm = searchTerm.prepend( "fin eprint " ); break; case 5: searchTerm = searchTerm.prepend( "fin r" ); break; case 6: searchTerm = searchTerm.prepend( "fin k" ); break; default: ;// nothing } KURL url = KURL( TQString( "%1/find/hep/www?rawcmd=%2&FORMAT=WWWBRIEFBIBTEX&SEQUENCE=" ).arg( mirrorURLs[mirrorIdx] ).arg( searchTerm.replace( "%", "%25" ).replace( "+", "%2B" ).replace( " ", "%20" ).replace( "#", "%23" ).replace( "&", "%26" ).replace( "?", "%3F" ) ) ); tqDebug( "url=%s", url.prettyURL().latin1() ); BibTeX::File *tmpBibFile = downloadBibTeXFile( url ); if ( tmpBibFile != NULL && !m_aborted ) { int count = 0; for ( BibTeX::File::ElementList::iterator it = tmpBibFile->begin(); count < maxEntries && it != tmpBibFile->end(); ++it, ++count ) { BibTeX::Entry *entry = dynamic_cast<BibTeX::Entry*>( *it ); if ( doFetchAbstracts ) { fetchArxivAbstract( entry ); enterNextStage(); } if ( entry != NULL ) emit foundEntry( new BibTeX::Entry( entry ), false ); } setEndSearch( WebQuery::statusSuccess ); } else if ( !m_aborted ) { TQString message = TDEIO::NetAccess::lastErrorString(); if ( message.isEmpty() ) message.prepend( '\n' ); message.prepend( TQString( i18n( "Querying database '%1' failed." ) ).arg( title() ) ); KMessageBox::error( m_parent, message ); setEndSearch( WebQuery::statusError ); } else setEndSearch( WebQuery::statusAborted ); if ( tmpBibFile != NULL ) delete tmpBibFile; } void WebQuerySpiresHep::fetchArxivAbstract( BibTeX::Entry *entry ) { BibTeX::EntryField *field = NULL; BibTeX::Value *value = NULL; TQString eprint = (( field = entry->getField( "eprint" ) ) ) && (( value = field->value() ) ) ? value->text() : TQString::null; TQString archivePrefix = (( field = entry->getField( "archivePrefix" ) ) ) && (( value = field->value() ) ) ? value->text() : TQString::null; if ( archivePrefix == "arXiv" && !eprint.isNull() ) { KURL absURL( TQString( "http://arxiv.org/abs/" ).append( eprint ) ); TQString abstract = download( absURL ); int p = abstract.find( "Abstract:</span>" ); if ( p > -1 ) { int p2 = abstract.find( "</", p + 14 ); abstract = abstract.mid( p + 16, p2 - p - 16 ).simplifyWhiteSpace(); BibTeX::EntryField * field = new BibTeX::EntryField( BibTeX::EntryField::ftAbstract ); entry->addField( field ); field->setValue( new BibTeX::Value( abstract ) ); field = new BibTeX::EntryField( "pdf" ); entry->addField( field ); field->setValue( new BibTeX::Value( TQString( "http://arxiv.org/pdf/" ).append( eprint ) ) ); field = new BibTeX::EntryField( BibTeX::EntryField::ftURL ); entry->addField( field ); field->setValue( new BibTeX::Value( TQString( "http://arxiv.org/abs/" ).append( eprint ) ) ); } } } } #include "webqueryspireshep.moc"