# -*- 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-styled citations using bibtex files. It was 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.default_prio = config.get('default.priority', []).strip() self.default_link = config.get('default.link', []).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 get_people_full(self, lAuthor): authors = "" n = 1 for author in lAuthor: first = author.first_names if len(first) > 0 : for item in first: authors += "{i} ".format(i = str(item)) middle = author.middle_names if len(middle) > 0 : for item in middle: authors += "{i} ".format(i = str(item)) 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 return authors def get_people_short(self, lAuthor): authors = "" 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]) first = author.first_names if len(first) > 0 : authors += "," for item in first: authors += " {i}.".format(i = str(item[:1])) middle = author.middle_names if len(middle) > 0 : for item in middle: authors += " {i}.".format(i = str(item[:1])) if len(lAuthor) > 1: if n == (len(lAuthor) - 1): authors += " & " elif n < (len(lAuthor) -1): authors += ", " n = n + 1 return authors def get_pubYear(self, e): if "year" in e.fields.keys(): year = e.fields['year'] else: year = "" return year def get_title(self, e): if "title" in e.fields.keys(): title = e.fields['title'] else: title = "" return title def get_edition(self, e): if 'edition' in e.fields.keys(): edition = e.fields['edition'] edition = " ({ed}. Ed.)".format(ed = edition) else: edition = "" return edition def get_publisher(self, e): 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 = "" return publisher def get_pages(self, e): if 'pages' in e.fields.keys(): pages = e.fields['pages'] else: pages = "" return pages def get_issbn(self, e): if 'issbn' in e.fields.keys(): issbn = e.fields['issbn'] else: issbn = "" return issbn def get_note(self, e): if 'note' in e.fields.keys(): note = e.fields['note'] else: note = "" return note def get_url(self, e): if "url" in e.fields.keys() and len(e.fields['url']) > 0: link = e.fields['url'] else: link = "?" return link def get_editors_short(self, e): if "editor" in e.persons.keys(): editors = self.get_people_short(e.persons['editor']) else: editors = "" return editors def get_editors_full(self, e): if "editor" in e.persons.keys(): editors = self.get_people_full(e.persons['editor']) else: editors = "" return editors def get_authors_short(self, e): if "author" in e.persons.keys(): authors = self.get_people_short(e.persons['author']) else: authors = "" return authors def get_authors_full(self, e): if "author" in e.persons.keys(): authors = self.get_people_full(e.persons['author']) else: authors = "" return authors def citation_short_output(self, id, link=None): e = self.citation_entry(id) link = self.get_url(e) authors = self.get_authors_short(e) title = self.get_title(e) year = self.get_pubYear(e) edition = self.get_edition(e) publisher = self.get_publisher(e) output = '
  • {authors} ({pubYear}). {title}{edition}. {publisher}'.format(eid = id, link = link, authors = authors, pubYear = year, title = title, edition = edition, publisher = publisher) return output def citation_full_output(self, id): e = self.citation_entry(id) link = self.get_url(e) authors = self.get_authors_full(e) editors = self.get_editors_full(e) title = self.get_title(e) year = self.get_pubYear(e) edition = self.get_edition(e) pages = self.get_pages(e) issbn = self.get_issbn(e) note = self.get_note(e) publisher = self.get_publisher(e) output = """

    {title}

    {authors} ({pubYear})

    {note}

    {edition}
    {editors}
    {pages}
    {issbn}
    {publisher}
    """.format(eid = id, link = link, authors = authors, pubYear = year, title = title, edition = edition, publisher = publisher, editors = editors, pages = pages, issbn = issbn, note = note) return output def citation_base_cite(self,id,link="",output=""): e = self.citation_entry(id) if len(link) > 1: link = link elif self.default_prio == "url": link = self.get_url(e) if len(link) < 2: link = self.default_link else: link = self.default_link authors = self.get_authors_short(e) year = self.get_pubYear(e) output = output.format(link = link, id = id, authors = authors, pubYear = year) return output def citation_full_cite(self,id,link=""): output = self.citation_base_cite(id,link="",output="""({authors}, {pubYear})""") return output def citation_full_citeNP(self,id,link=""): output = self.citation_base_cite(id,link="",output="""{authors} ({pubYear})""") return output def on_setup_env(self, **extra): def decode_filter(value): """ Make sure that special chars like german umlaute or accents are displayed in unicode """ return LatexNodes2Text().latex_to_text(value.replace(" & ", " \& ")) 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.globals['citation_full_output'] = self.citation_full_output self.env.jinja_env.globals['citation_full_cite'] = self.citation_full_cite self.env.jinja_env.globals['citation_full_citeNP'] = self.citation_full_citeNP self.env.jinja_env.globals['citation_authors_short'] = self.get_authors_short self.env.jinja_env.globals['citation_authors_full'] = self.get_authors_full self.env.jinja_env.globals['citation_editors_short'] = self.get_editors_short self.env.jinja_env.globals['citation_editors_full'] = self.get_editors_full self.env.jinja_env.globals['citation_pubYear'] = self.get_pubYear self.env.jinja_env.globals['citation_edition'] = self.get_edition self.env.jinja_env.globals['citation_publisher'] = self.get_publisher self.env.jinja_env.globals['citation_title'] = self.get_title self.env.jinja_env.globals['citation_url'] = self.get_url self.env.jinja_env.globals['citation_issbn'] = self.get_issbn self.env.jinja_env.globals['citation_pages'] = self.get_pages self.env.jinja_env.globals['citation_note'] = self.get_note self.env.jinja_env.filters['decode'] = decode_filter