def run(self): bibtex_dir = self.options.get('bibtex_dir', 'bibtex') detail_page_dir = self.options.get('detail_page_dir', 'papers') highlight_authors = self.options.get('highlight_author', None) if highlight_authors: highlight_authors = highlight_authors.split(';') style = Style(self.site.config['BASE_URL'] + detail_page_dir if detail_page_dir else None) self.state.document.settings.record_dependencies.add(self.arguments[0]) parser = Parser() # Sort the publication entries by year reversed data = sorted(parser.parse_file(self.arguments[0]).entries.items(), key=lambda e: e[1].fields['year'], reverse=True) html = '<div class="publication-list">\n' cur_year = None if bibtex_dir: # create the bibtex dir if the option is set try: os.makedirs(os.path.sep.join((self.output_folder, bibtex_dir))) except OSError: # probably because the dir already exists pass if detail_page_dir: # create the detail page dir if the option is set try: os.makedirs( os.path.sep.join((self.output_folder, detail_page_dir))) except OSError: # probably because the dir already exists pass for label, entry in data: # print a year title when year changes if entry.fields['year'] != cur_year: if cur_year is not None: # not first year group html += '</ul>' cur_year = entry.fields['year'] html += '<h3>{}</h3>\n<ul>'.format(cur_year) entry.label = label # Pass label to the style. pub_html = list(style.format_entries( (entry, )))[0].text.render_as('html') if highlight_authors: # highlight one of several authors (usually oneself) for highlight_author in highlight_authors: pub_html = pub_html.replace( highlight_author.strip(), '<strong>{}</strong>'.format(highlight_author), 1) html += '<li class="publication" style="padding-bottom: 1em;">' + pub_html extra_links = "" if 'fulltext' in entry.fields: # the link to the full text, usually a link to the pdf file extra_links += '[<a href="{}">full text</a>] '.format( entry.fields['fulltext']) bibtex_fields = dict(entry.fields) # Collect and remove custom links (fields starting with "customlink") custom_links = dict() for key, value in bibtex_fields.items(): if key.startswith('customlink'): custom_links[key[len('customlink'):]] = value # custom fields (custom links) for key, value in custom_links.items(): extra_links += '[<a href="{}">{}</a>] '.format(value, key) # Remove some fields for the publicly available BibTeX file since they are mostly only # used by this plugin. for field_to_remove in ('abstract', 'fulltext'): if field_to_remove in bibtex_fields: del bibtex_fields[field_to_remove] # Prepare for the bib file. Note detail_page_dir may need bib_data later. bibtex_entry = Entry(entry.type, bibtex_fields, entry.persons) bib_data = BibliographyData(dict({label: bibtex_entry})) bib_string = bib_data.to_string('bibtex') extra_links += ''' [<a href="javascript:void(0)" onclick=" (function(target, id) {{ if ($('#' + id).css('display') == 'block') {{ $('#' + id).hide('fast'); $(target).text('BibTeX▼') }} else {{ $('#' + id).show('fast'); $(target).text('BibTeX▲') }} }})(this, '{}');">BibTeX▼</a>] '''.format('bibtex-' + label) if bibtex_dir: # write bib files to bibtex_dir for downloading bib_link = '{}/{}.bib'.format(bibtex_dir, label) bib_data.to_file('/'.join([self.output_folder, bib_link]), 'bibtex') if extra_links or detail_page_dir or 'abstract' in entry.fields: html += '<br>' # Add the abstract link. if 'abstract' in entry.fields: html += ''' [<a href="javascript:void(0)" onclick=" (function(target, id) {{ if ($('#' + id).css('display') == 'block') {{ $('#' + id).hide('fast'); $(target).text('abstract▼') }} else {{ $('#' + id).show('fast'); $(target).text('abstract▲') }} }})(this, '{}');">abstract▼</a>] '''.format( 'abstract-' + label) display_none = '<div id="{}" style="display:none"><pre>{}</pre></div>' bibtex_display = display_none.format('bibtex-' + label, bib_string) abstract_text = str(LaTeXParser(entry.fields['abstract']).parse() ) if 'abstract' in entry.fields else '' if detail_page_dir: # render the details page of a paper page_url = '/'.join((detail_page_dir, label + '.html')) html += '[<a href="{}">details</a>] '.format( self.site.config['BASE_URL'] + page_url) context = { 'title': str(LaTeXParser(entry.fields['title']).parse()), 'abstract': abstract_text, 'bibtex': bib_data.to_string('bibtex'), 'bibtex_link': '/' + bib_link if bibtex_dir else '', 'default_lang': self.site.config['DEFAULT_LANG'], 'label': label, 'lang': self.site.config['DEFAULT_LANG'], 'permalink': self.site.config['SITE_URL'] + page_url, 'reference': pub_html, 'extra_links': extra_links + bibtex_display } if 'fulltext' in entry.fields and entry.fields[ 'fulltext'].endswith('.pdf'): context['pdf'] = entry.fields['fulltext'] self.site.render_template( 'publication.tmpl', os.path.sep.join((self.output_folder, detail_page_dir, label + '.html')), context, ) html += extra_links # Add the hidden abstract and bibtex. if 'abstract' in entry.fields: html += ''' <div id="{}" class="publication-abstract" style="display:none"> <blockquote>{}</blockquote></div> '''.format('abstract-' + label, abstract_text) html += bibtex_display html += '</li>' if len(data) != 0: # publication list is nonempty html += '</ul>' html += '</div>' return [ nodes.raw('', html, format='html'), ]
def run(self): style = find_plugin('pybtex.style.formatting', self.options.get('style', 'unsrt'))() bibtex_dir = self.options.get('bibtex_dir', 'bibtex') detail_page_dir = self.options.get('detail_page_dir', 'papers') highlight_authors = self.options.get('highlight_author', None) if highlight_authors: highlight_authors = highlight_authors.split(';') self.state.document.settings.record_dependencies.add(self.arguments[0]) parser = Parser() # Sort the publication entries by year reversed data = sorted(parser.parse_file(self.arguments[0]).entries.items(), key=lambda e: e[1].fields['year'], reverse=True) html = '<div class="publication-list">\n' cur_year = None if bibtex_dir: # create the bibtex dir if the option is set try: os.mkdir(os.path.sep.join((self.output_folder, bibtex_dir))) except OSError: # probably because the dir already exists pass if detail_page_dir: # create the detail page dir if the option is set try: os.mkdir( os.path.sep.join((self.output_folder, detail_page_dir))) except OSError: # probably because the dir already exists pass for label, entry in data: # print a year title when year changes if entry.fields['year'] != cur_year: if cur_year is not None: # not first year group html += '</ul>' cur_year = entry.fields['year'] html += '<h3>{}</h3>\n<ul>'.format(cur_year) pub_html = list(style.format_entries( (entry, )))[0].text.render_as('html') if highlight_authors: # highlight one of several authors (usually oneself) for highlight_author in highlight_authors: pub_html = pub_html.replace( highlight_author.strip(), '<strong>{}</strong>'.format(highlight_author), 1) html += '<li class="publication" style="padding-bottom: 1em;">' + pub_html extra_links = "" bibtex_fields = dict(entry.fields) # Remove some fields for the publicly available BibTeX file since they are mostly only # used by this plugin. for field_to_remove in ('abstract', 'fulltext'): if field_to_remove in bibtex_fields: del bibtex_fields[field_to_remove] bibtex_entry = Entry(entry.type, bibtex_fields, entry.persons) # detail_page_dir may need bib_data later bib_data = BibliographyData(dict({label: bibtex_entry})) if bibtex_dir: # write bib files to bibtex_dir for downloading bib_link = '{}/{}.bib'.format(bibtex_dir, label) bib_data.to_file('/'.join([self.output_folder, bib_link]), 'bibtex') extra_links += '[<a href="{}">BibTeX</a>] '.format( self.site.config['BASE_URL'] + bib_link) if 'fulltext' in entry.fields: # the link to the full text, usually a link to the pdf file extra_links += '[<a href="{}">full text</a>] '.format( entry.fields['fulltext']) if extra_links or detail_page_dir: html += '<br>' html += extra_links if detail_page_dir: # render the details page of a paper page_url = '/'.join((detail_page_dir, label + '.html')) html += ' [<a href="{}">abstract and details</a>]'.format( self.site.config['BASE_URL'] + page_url) context = { 'title': str(LaTeXParser(entry.fields['title']).parse()), 'abstract': str(LaTeXParser(entry.fields['abstract']).parse()) if 'abstract' in entry.fields else '', 'bibtex': bib_data.to_string('bibtex'), 'bibtex_link': '/' + bib_link if bibtex_dir else '', 'default_lang': self.site.config['DEFAULT_LANG'], 'label': label, 'lang': self.site.config['DEFAULT_LANG'], 'permalink': self.site.config['SITE_URL'] + page_url, 'reference': pub_html, 'extra_links': extra_links } if 'fulltext' in entry.fields and entry.fields[ 'fulltext'].endswith('.pdf'): context['pdf'] = entry.fields['fulltext'] self.site.render_template( 'publication.tmpl', os.path.sep.join((self.output_folder, detail_page_dir, label + '.html')), context, ) html += '</li>' if len(data) != 0: # publication list is nonempty html += '</ul>' html += '</div>' return [ nodes.raw('', html, format='html'), ]
def from_latex(cls, latex): import codecs import latexcodec # noqa from pybtex.markup import LaTeXParser return LaTeXParser(codecs.decode(latex, 'ulatex')).parse()
def test_syntax_error(bad_input): with pytest.raises(PybtexSyntaxError): LaTeXParser(bad_input).parse()