SPIRES script

From String Theory Wiki
Revision as of 23:28, 12 June 2007 by Tom (talk | contribs) (future features)
Jump to navigation Jump to search

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.