#! /usr/bin/env python # # Convert bib file to HTML # # TODO # take out tex fragments, backslash, braces etc # convert tex accents to HTML accents # do string substitution using templates # better handling of different reference types # probably needs more rigour in the HTML code # use CSS # Copyright (c) 2007, Peter Corke # # All rights reserved. # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * The name of the copyright holder may not be used to endorse or # promote products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. import Bibliography; import BibEntry; import BibTeX; import string; import sys; import time; import optparse; str = ""; def append(s): global str; str += s; def append_nl(s): global str; str += s + '\n'; class HBibEntry(BibEntry.BibEntry): def __init__(self, be): self.fieldDict = be.fieldDict; def display(self): append( "

" ); # put title if self.getURL(): append( '"%s", ' % (self.getURL(), self.getTitle()) ); else: append( '"%s", ' % self.getTitle() ); # put authors append( self.getAuthors() + '. ' ); month = self.getMonthName(); year = self.getYear(); # put more fields for k in ['Journal', 'Volume', 'Number', 'Booktitle', 'Address', 'Institution']: if k in self.fieldDict: append( self.fieldDict[k].strip('"') + ', ' ); eds = self.getEditorsNames(); if eds: append("eds. " + eds + ', '); if month: append( month ); if year > 0: append( " " + `year` ); else: if year > 0: append( ", " + `year` ); append( " (%s)" % be.getKey() ); append_nl( "

" ); ## parse switches p = optparse.OptionParser() p.add_option('--highlight', dest='highlight', action='store', type='str', help='highlight the specified word in the output'); #p.add_option('--resolve', dest='resolve', action='store_true', # help='resolve cross reference entries'); p.set_defaults(highlight=None); (opts, args) = p.parse_args() globals().update(opts.__dict__) if len(args) == 0 and sys.stdin.isatty(): p.print_help(); sys.exit(0); ## read the input files bib = BibTeX.BibTeX(); if args: for f in args: bib.parseFile(f); else: bib.parseFile(); bib.resolveAbbrev(); ## generate HTML append_nl( "" ); append_nl( "" ); append_nl( " Bibliography %s" % ( args[0] if args else '(stdin)',) ); append_nl( """ """ ); append_nl( "" ); append_nl( "" ); for be in bib: hb = HBibEntry(be); hb.display(); if highlight: str = string.replace(str, highlight, """%s""" % highlight); append_nl( "
" ); append_nl( "

Generated by bib2html at %s. bib2html by Peter Corke

" % time.asctime() ); append_nl( "" ); append_nl( "" ); print str;