SPIRES script: Difference between revisions
(typos) |
(future features) |
||
Line 94: | Line 94: | ||
python spires.py hep-th/9711200 --database database.html | python spires.py hep-th/9711200 --database database.html | ||
</pre> | </pre> | ||
===future features=== | |||
* It would be good to have an option to download eprints from the [http://www.arxiv.org arXiv]. Unfortunately the arXiv blocks wget downloads and there doesn't seem to be a way around this. | |||
* Battle-hardening for error handling. | |||
===comments and bugs=== | ===comments and bugs=== |
Revision as of 23:28, 12 June 2007
SPIRES script is a command line program written in Python that accesses information on papers in the SPIRES online high energy physics literature database. It can access title, author and BiBTeX records and update your local BiBTeX database and/or a local HTML record of the papers you have.
installation on a GNU/Linux system
The script requires the python interpreter and wget to be installed on your system. These are automatically installed on most GNU/Linux distributions, but check they are there by typing
python
and
wget
at the command line and see what happens.
If python and wget are present copy the script into a text file with a name such as spires.py.
To run it type
python spires.py hep-th/9711200
usage
The typical accepted inputs are the usual arXiv references or a SPIRES-style journal reference
python spires.py hep-th/9711200 python spires.py 0705.0303 python spires.py CMPHA,43,199
If no options are specified all possible outputs will be displayed
tom@fyodor:~$ python spires.py hep-th/9711200 @Article{Maldacena:1997re, author = "Maldacena, Juan M.", title = "The large N limit of superconformal field theories and supergravity", journal = "Adv. Theor. Math. Phys.", volume = "2", year = "1998", pages = "231-252", eprint = "hep-th/9711200", SLACcitation = "%%CITATION = HEP-TH/9711200;%%" } \cite{Maldacena:1997re} Maldacena, Juan M. The large N limit of superconformal field theories and supergravity <p><a href="http://arxiv.org/abs/hep-th/9711200">The large N limit of superconformal field theories and supergravity</a> by Maldacena, Juan M. (hep-th/9711200)</p>
To see all the options access the help page
tom@fyodor:~$ python spires.py -h SPIRES script Usage: python spires.py reference [ -hatbcevd ] [ --library library.bib ] [ --database database.html ] "reference" must be a standard arXiv reference, e.g. hep-th/9711200 or 0705.0303, or a SPIRES journal reference, e.g. CMPHA,43,199 Options: -h, --help displays this help message -a displays the author(s) -t displays the title -b displays the BiBTeX entry -c displays the LaTeX citation -e displays everything -v verbose mode -d displays an HTML database entry --library library.bib if it is not already in library.bib, appends the BiBTeX entry to library.bib --database database.html if it is not already in database.html, appends the HTML database entry to database.html
Each item can be specified individually with switches, e.g. -t for title, -a for authors, -b for BiBTeX entry, -c for LaTeX citation, -d for HTML database entry. For example
tom@fyodor:~$ python spires.py hep-th/9711200 -at Maldacena, Juan M. The large N limit of superconformal field theories and supergravity
If you have a BiBTeX database file such as library.bib then the script can update the file with the BiBTeX entry if it is not already present
python spires.py hep-th/9711200 --library library.bib
If you keep an HTML list of papers in database.html then the script can update the file
python spires.py hep-th/9711200 --database database.html
future features
- It would be good to have an option to download eprints from the arXiv. Unfortunately the arXiv blocks wget downloads and there doesn't seem to be a way around this.
- Battle-hardening for error handling.
comments and bugs
If you have any comments or find bugs, please contact Tom.
script
Copy the following into a text file with a name such as spires.py
#! /usr/bin/python ## SPIRES script version 0.1 ## Copyright 2007 Tom Brown ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public Licence as ## published by the Free Software Foundation; either version 2 of the ## License, or 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. ## The GNU General Public Licence is available at ## http://www.gnu.org/copyleft/gpl.html import sys, os, getopt, re libraryOpt = 0 databaseOpt = 0 authorOpt = 0 titleOpt = 0 bibtexOpt = 0 citeOpt = 0 verboseOpt = 0 htmlOpt = 0 try: options, arguments = getopt.gnu_getopt(sys.argv[1:], 'hatbcevd', ['help','library=', 'database=']) except getopt.error: print 'error: you tried to use an unknown option or the argument for an option that requires it was missing; try \'spires.py -h\' for more information' sys.exit(0) for o,a in options: if o in ('-h','--help'): print '''SPIRES script Usage: python spires.py reference [ -hatbcevd ] [ --library library.bib ] [ --database database.html ] "reference" must be a standard arXiv reference, e.g. hep-th/9711200 or 0705.0303, or a SPIRES journal reference, e.g. CMPHA,43,199 Options: -h, --help displays this help message -a displays the author(s) -t displays the title -b displays the BiBTeX entry -c displays the LaTeX citation -e displays everything -v verbose mode -d displays an HTML database entry --library library.bib if it is not already in library.bib, appends the BiBTeX entry to library.bib --database database.html if it is not already in database.html, appends the HTML database entry to database.html ''' sys.exit(0) elif o == '--library': if a == '': print '--library expects an argument' sys.exit(0) libraryOpt = 1 BiBTeXlibraryFileName = os.path.expanduser(a) print 'library file name is ' + BiBTeXlibraryFileName elif o == '--database': if a == '': print '--database expects an argument' sys.exit(0) databaseOpt = 1 databaseFileName = os.path.expanduser(a) print 'database file name is ' + databaseFileName elif o == '-a': authorOpt = 1 elif o == '-t': titleOpt = 1 elif o == '-b': bibtexOpt = 1 elif o == '-c': citeOpt = 1 elif o == '-d': htmlOpt = 1 elif o == '-e': authorOpt = 1 titleOpt = 1 bibtexOpt = 1 citeOpt = 1 htmlOpt = 1 elif o == '-v': verboseOpt = 1 if len(arguments) != 1: print 'you didn\'t specify a SPIRES reference' sys.exit(0) else: ref=arguments[0] if len(options) == 0: authorOpt = 1 titleOpt = 1 bibtexOpt = 1 citeOpt = 1 htmlOpt = 1 if verboseOpt: print 'reference is ' + ref oldeprint = 0 neweprint = 0 journal = 0 numbers = ['0','1','2','3','4','5','6','7','8','9'] # These tests are not infallible: for example 054/234 will be counted # as an old-style eprint if ref.count('/') > 0: oldeprint = 1 type = 'this is an old-style eprint reference' elif ref[0] in numbers: neweprint = 1 type = 'this is a new-style eprint reference' else: journal = 1 type = 'this is a journal reference' if verboseOpt: print type if oldeprint: os.system('wget http://www.slac.stanford.edu/spires/find/hep/wwwbriefbibtex?eprint=' + ref + ' -q -O spires.html') elif neweprint: os.system('wget http://www.slac.stanford.edu/spires/find/hep/wwwbriefbibtex?eprint=arXiv:' + ref + ' -q -O spires.html') elif journal: os.system('wget http://www.slac.stanford.edu/spires/find/hep/wwwbriefbibtex?j=' + ref + ' -q -O spires.html') spiresHTMLfile = open('spires.html', 'r') BiBTeX = spiresHTMLfile.read() spiresHTMLfile.close() os.remove('spires.html') if 'No records' in BiBTeX: print "no records were found in SPIRES to match your search, please try again" sys.exit(0) BiBTeX = BiBTeX[BiBTeX.find('@'):] BiBTeX = BiBTeX[:BiBTeX.find('}')+1] if bibtexOpt: print BiBTeX # remove excess white space and replace with a single space data = re.sub(r'\s+',r' ',BiBTeX) cite = data[data.find('{')+1:data.find(',')] if citeOpt: print '\cite{' + cite + '}' author = data[data.find('author'):] author = author[author.find('\"')+1:] author = author[:author.find('\"')] if authorOpt: print author title = data[data.find('title'):] title = title[title.find('\"')+1:] title = title[:title.find('\"')] if titleOpt: print title if libraryOpt: libraryfile = open(BiBTeXlibraryFileName, 'r+') library = libraryfile.read() if library.count(cite) == 0: print 'adding BiBTeX entry to bib_string.bib' #find the end of the file (the second argument means count from #the end of the file libraryfile.seek(0,2) libraryfile.write('\n' + BiBTeX + '\n') else: print 'BiBTeX entry already in library' libraryfile.close() if oldeprint: databaseEntry = '<p><a href=\"http://arxiv.org/abs/' + ref + '\">' + title + '</a> by ' + author + ' (' + ref + ')</p>' elif neweprint: databaseEntry = '<p><a href=\"http://arxiv.org/abs/' + ref + '\">' + title + '</a> by ' + author + ' (' + ref + ')</p>' elif journal: databaseEntry = '<p><a href=\"http://www.slac.stanford.edu/spires/find/hep/www?j=' + ref + '\">' + title + '</a> by ' + author + ' (' + ref + ')</p>' if htmlOpt: print databaseEntry if databaseOpt: databasefile = open(databaseFileName, 'r+') database = databasefile.read() if database.count(ref) == 0: print 'adding to database' databasefile.seek(0,2) databasefile.write('\n' + databaseEntry + '\n') else: print 'HTML entry already in database' databasefile.close()
licence
This script is Copyright 2007 Tom Brown and made available under the GNU General Public Licence.