# -*- coding: utf-8 -*- import os from pylatexenc.latex2text import LatexNodes2Text from pybtex.database import parse_file from lektor.pluginsystem import Plugin class CitationPlugin(Plugin): name = 'lektor-citation' description = u'This Plugin should extend lektor with APA-style citations using bibtex files. It is based on the known lektor-bibtex-support plugin by arunpersaud.' def __init__(self, env, id): super().__init__(env, id) config = self.get_config() self.bibfile = config.get('Bibtex.file', []).strip() self.bib_data = parse_file(os.path.join(env.root_path, 'assets', self.bibfile)) def citation_entries(self): return self.bib_data.entries def citation_entry(self, id): return self.bib_data.entries[id] def citation_short_output(self, id, link=None): e = self.citation_entry(id) if "url" in e.fields.keys() and len(e.fields['url']) > 0: link = e.fields['url'] else: link = "?" authors = "" lAuthor = e.persons['author'] n = 1 for author in lAuthor: prelast = author.prelast_names if len(prelast) > 0: for item in prelast: authors += "{i} ".format(i = str(item)) authors += str(author.last_names[0]) if len(lAuthor) > 1: if n == (len(lAuthor) - 1): authors += " \& " elif n < (len(lAuthor) -1): authors += ", " n = n + 1 year = e.fields['year'] edition = "" if 'edition' in e.fields.keys(): edition = e.fields['edition'] edition = " ({ed}. Aufl.)".format(ed = edition) else: edition = "" if 'publisher' in e.fields.keys(): publisher = e.fields['publisher'] if 'address' in e.fields.keys(): location = e.fields['address'] publisher = " {location}: {publisher}.".format(location = location, publisher = publisher) elif publisher: publisher = " {publisher}.".format(publisher = publisher) else: publisher = "" output = '
  • {authors} ({pubYear}). {title}{edition}. {publisher}'.format(eid = id, link = link, authors = authors, pubYear = year, title = e.fields['title'], edition = edition, publisher = publisher) return output def on_setup_env(self, **extra): def decode_filter(value): return LatexNodes2Text().latex_to_text(value) self.env.jinja_env.globals['citation_entries'] = self.citation_entries self.env.jinja_env.globals['citation_entry'] = self.citation_entry self.env.jinja_env.globals['citation_short_output'] = self.citation_short_output self.env.jinja_env.filters['decode'] = decode_filter