X-Git-Url: https://git.sthu.org/?p=shutils.git;a=blobdiff_plain;f=bib2html.py;h=64286f25ed25a3c513164c6481194e67f8280be2;hp=111d1085db02106616cfcf92011846fab8c2f0f6;hb=HEAD;hpb=30117934eddd457d8abef2cb0ed11c48e2de71d9 diff --git a/bib2html.py b/bib2html.py index 111d108..7557cce 100755 --- a/bib2html.py +++ b/bib2html.py @@ -1,7 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """Creates a webpage with all entries of a .bib file""" -__version__ = "1.0" +__version__ = "1.1" __author__ = "Stefan Huber" __email__ = "shuber@sthu.org" @@ -31,11 +31,32 @@ __license__ = "MIT" # OTHER DEALINGS IN THE SOFTWARE. -import os, sys, getopt +import os, sys, getopt, re +import dateutil.parser def format_latex(text): - return text.replace('{', '').replace('}', '').replace('\\', '') + # Get rid of matching dollar signs + text = re.sub(r'\$([^\$]*)\$', r'\1', text) + + # Replace text + subst = { + '\\"a': 'ä', + '\\"o': 'ö', + '\\"u': 'u', + '\mathcal': '', + '{': '', + '}': '', + '\\': '', + '~': ' ', + '---': '–', + '--': '–', + } + + for a, b in subst.items(): + text = text.replace(a, b) + + return text def format_field_span(type, value): return "" + format_latex(value) + "" @@ -47,7 +68,7 @@ def format_field(bibentry, field, pre='', post=''): return "" def format_author(a): - return ' '.join(' '.join(p) for p in (a.first(), a.middle(), a.prelast(), a.last(), a.lineage()) if p) + return ' '.join(' '.join(p) for p in (a.first_names, a.middle_names, a.prelast_names, a.last_names, a.lineage_names) if p) def format_authors(entry): return ", ".join([format_author(a) for a in entry.persons['author']]) @@ -63,8 +84,9 @@ def format_details_article(entry): format_field(entry, 'number', pre='(', post=')')) line.append(format_field(entry, 'month', post=' ') + \ format_field(entry, 'year')) - line = filter(lambda l: l != "", line) + line.append(format_field(entry, 'note')) + line = filter(lambda l: l != "", line) return [where, ", ".join(line)] def format_details_inproceedings(entry): @@ -75,6 +97,24 @@ def format_details_inproceedings(entry): line.append(format_field(entry, 'address')) line.append(format_field(entry, 'month', post=' ') + \ format_field(entry, 'year')) + line.append(format_field(entry, 'isbn', pre='ISBN ')) + line.append(format_field(entry, 'note')) + + line = filter(lambda l: l != "", line) + return [where, ", ".join(line)] + +def format_details_incollection(entry): + where = format_field(entry, 'booktitle') + + line = [] + line.append(format_field(entry, 'publisher')) + line.append(format_field(entry, 'pages', pre='pp. ')) + line.append(format_field(entry, 'address')) + line.append(format_field(entry, 'month', post=' ') + \ + format_field(entry, 'year')) + line.append(format_field(entry, 'isbn', pre='ISBN ')) + line.append(format_field(entry, 'note')) + line = filter(lambda l: l != "", line) return [where, ", ".join(line)] @@ -83,6 +123,8 @@ def format_details_thesis(entry): line.append(format_field(entry, 'school')) line.append(format_field(entry, 'month', post=' ') + \ format_field(entry, 'year')) + line.append(format_field(entry, 'note')) + line = filter(lambda l: l != "", line) return [", ".join(line)] @@ -92,6 +134,18 @@ def format_details_book(entry): line.append(format_field(entry, 'isbn', pre='ISBN ')) line.append(format_field(entry, 'month', post=' ') + \ format_field(entry, 'year')) + line.append(format_field(entry, 'note')) + + line = filter(lambda l: l != "", line) + return [", ".join(line)] + +def format_details_patent(entry): + line = [] + line.append(format_field(entry, 'number', pre='Pat. ')) + line.append(format_field(entry, 'month', post=' ') + \ + format_field(entry, 'year')) + line.append(format_field(entry, 'note')) + line = filter(lambda l: l != "", line) return [", ".join(line)] @@ -99,10 +153,11 @@ def format_links(entry): doi = format_field(entry, 'doi', pre='[DOI]') webpdf = format_field(entry, 'webpdf', pre='[PDF]') weblink = format_field(entry, 'weblink', pre='[link]') + url = format_field(entry, 'url', pre='[url]') webslides = format_field(entry, 'webslides', pre='[slides]') weberrata = format_field(entry, 'weberrata', pre='[errata]') - return " ".join([doi, webpdf, weblink, webslides, weberrata]) + return " ".join([doi, webpdf, weblink, url, webslides, weberrata]) def format_entry(entry): lines = [] @@ -113,8 +168,12 @@ def format_entry(entry): lines.extend(format_details_article(entry)) elif entry.type=='inproceedings': lines.extend(format_details_inproceedings(entry)) + elif entry.type=='incollection': + lines.extend(format_details_incollection(entry)) elif entry.type=='book': lines.extend(format_details_book(entry)) + elif entry.type=='patent': + lines.extend(format_details_patent(entry)) elif entry.type in ['mastersthesis', 'phdthesis']: lines.extend(format_details_thesis(entry)) else: @@ -127,24 +186,38 @@ def format_entry(entry): return "
\n".join(lines) -def entryCompareDate(p1, p2): - k1, e1 = p1 - k2, e2 = p2 +def entryDateSortKey(p): + k, e = p + if 'date' in e.fields: + return e.fields['date'] - def toStr(e): - month2num = { 'jan' : '01', 'feb' : '02', 'mar' : '03', \ - 'apr' : '04', 'may' : '05', 'jun' : '06', \ - 'jul' : '07', 'aug' : '08', 'sep' : '09', \ - 'oct' : '10', 'nov' : '11', 'dec' : '12'} - month = e.fields['month'].lower()[0:3] - if month in month2num: - month = month2num[month] - else: - month = "" - return e.fields['year'] + "-" + month + month2num = { 'jan' : '01', 'feb' : '02', 'mar' : '03', \ + 'apr' : '04', 'may' : '05', 'jun' : '06', \ + 'jul' : '07', 'aug' : '08', 'sep' : '09', \ + 'oct' : '10', 'nov' : '11', 'dec' : '12'} - return cmp(toStr(e1), toStr(e2)) + if not 'month' in e.fields: + return e.fields['year'] + + month = e.fields['month'].lower()[0:3] + if month in month2num: + month = month2num[month] + else: + month = "" + + return e.fields['year'] + "-" + month + + +def entryGetYear(e): + if 'year' in e.fields: + return e.fields['year'] + + if 'date' in e.fields: + dt = dateutil.parser.isoparse(e.fields['date']) + return str(dt.year) + + return None def usage(): @@ -193,24 +266,23 @@ if __name__ == "__main__": bib_data = parser.parse_file(bibfile) entries = bib_data.entries - years = list(set([ b.fields['year'] for b in entries.values() ])) + years = list(set([entryGetYear(e) for e in entries.values()])) years.sort(reverse=True) for year in years: print("

" + year + "

") - iteritems = list(entries.iteritems()) - iteritems.sort(cmp=entryCompareDate, reverse=True) + iteritems = list(entries.items()) + iteritems.sort(key=entryDateSortKey, reverse=True) for key, entry in iteritems: - if entry.fields['year'] != year: + if entryGetYear(entry) != year: continue print("
") - print("[" + key + "]
") - - print(format_entry(entry).encode('utf8')) + print("[{}]
{}
".format(key, key, entry.type)) + e = format_entry(entry) + print(e) print("
\n") -