bib2html.py: Add incollection bibtype
[shutils.git] / bib2html.py
index 5d5b4db16f6e75bbd796858d792714130052a614..7557ccead879e23eb94afeab328bc2420e01a5cc 100755 (executable)
@@ -32,6 +32,7 @@ __license__ = "MIT"
 
 
 import os, sys, getopt, re
+import dateutil.parser
 
 
 def format_latex(text):
@@ -102,6 +103,21 @@ def format_details_inproceedings(entry):
     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)]
+
 def format_details_thesis(entry):
     line = []
     line.append(format_field(entry, 'school'))
@@ -123,6 +139,16 @@ def format_details_book(entry):
     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)]
+
 def format_links(entry):
     doi = format_field(entry, 'doi', pre='<a href="http://dx.doi.org/', post='">[DOI]</a>')
     webpdf = format_field(entry, 'webpdf', pre='<a href="', post='">[PDF]</a>')
@@ -142,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:
@@ -159,6 +189,9 @@ def format_entry(entry):
 def entryDateSortKey(p):
     k, e = p
 
+    if 'date' in e.fields:
+        return e.fields['date']
+
     month2num = { 'jan' : '01', 'feb' : '02', 'mar' : '03', \
             'apr' : '04', 'may' : '05', 'jun' : '06', \
             'jul' : '07', 'aug' : '08', 'sep' : '09', \
@@ -176,6 +209,17 @@ def entryDateSortKey(p):
     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():
     """Print usage text of this program"""
 
@@ -222,7 +266,7 @@ 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:
@@ -233,14 +277,12 @@ if __name__ == "__main__":
         iteritems.sort(key=entryDateSortKey, reverse=True)
         for key, entry in iteritems:
 
-            if entry.fields['year'] != year:
+            if entryGetYear(entry) != year:
                 continue
 
             print("<div class=bibentry>")
-            print("<a class=bibentry_key id=" + key + ">[" + key + "]</a><br/>")
-
+            print("<a class=bibentry_key id={}>[{}]</a><br/><span class=bibentry_type>{}</span><br/>".format(key, key, entry.type))
             e = format_entry(entry)
             print(e)
 
             print("</div>\n")
-