Использование pybtex для преобразования из bibtex в форматированную HTML-библиографию, например, в гарвардском стиле
Я использую Django и храню bibtex в своей модели и хочу, чтобы мой вид мог передать ссылку в виде отформатированной строки HTML, похожей на стиль ссылок Гарварда.
Использование метода, описанного в Pybtex, не распознает вход в bibtex, я могу преобразовать строку bibtex в объект BibliographyData pybtex. Я полагаю, что можно перейти из этого в HTML-формат, основанный на документах https://pythonhosted.org/pybtex/api/formatting.html но я просто не могу заставить его работать.
Кажется, что Pybtex настроен для использования из командной строки, а не из python, и в Интернете очень мало примеров его использования. Кто-нибудь сделал что-нибудь подобное? Возможно, было бы проще передать bibtex моему шаблону и использовать библиотеку javascript, такую как https://github.com/pcooksey/bibtex-js чтобы попытаться получить приближение к стилю Гарварда?
1 ответ
Для этого я адаптировал некоторый код отсюда. Я не уверен, как называется этот конкретный стиль форматирования, но, скорее всего, вы можете изменить / отредактировать его. Вот как это выглядит:
import io
import six
import pybtex.database.input.bibtex
import pybtex.plugin
pybtex_style = pybtex.plugin.find_plugin('pybtex.style.formatting', 'plain')()
pybtex_html_backend = pybtex.plugin.find_plugin('pybtex.backends', 'html')()
pybtex_parser = pybtex.database.input.bibtex.Parser()
my_bibtex = '''
@Book{1985:lindley,
author = {D. Lindley},
title = {Making Decisions},
publisher = {Wiley},
year = {1985},
edition = {2nd},
}
'''
data = pybtex_parser.parse_stream(six.StringIO(my_bibtex))
data_formatted = pybtex_style.format_entries(six.itervalues(data.entries))
output = io.StringIO()
pybtex_html_backend.write_to_stream(data_formatted, output)
html = output.getvalue()
print (html)
Это создает следующую ссылку в формате HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><meta name="generator" content="Pybtex">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Bibliography</title>
</head>
<body>
<dl>
<dt>1</dt>
<dd>D. Lindley.
<em>Making Decisions</em>.
Wiley, 2nd edition, 1985.</dd>
</dl></body></html>
Я заметил командную строку pybtex-format
инструмент дает хороший результат для HTML:
$ pybtex-format myinput.bib myoutput.html
Итак, я перешел к исходному коду на pybtex/database/format/__main__.py
и нашел невероятно простое решение, которое подействовало на меня как шарм:
from pybtex.database.format import format_database
format_database('myinput.bib', 'myoutput.html', 'bibtex', 'html')
Вот мои входные и выходные файлы:
@inproceedings{Batista18b,
author = {Cassio Batista and Ana Larissa Dias and Nelson {Sampaio Neto}},
title = {Baseline Acoustic Models for Brazilian Portuguese Using Kaldi Tools},
year = {2018},
booktitle= {Proc. IberSPEECH 2018},
pages = {77--81},
doi = {10.21437/IberSPEECH.2018-17},
url = {http://dx.doi.org/10.21437/IberSPEECH.2018-17}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><meta name="generator" content="Pybtex">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Bibliography</title>
</head>
<body>
<dl>
<dt>1</dt>
<dd>Cassio Batista, Ana Larissa Dias, and Nelson <span class="bibtex-protected">Sampaio Neto</span>.
Baseline acoustic models for brazilian portuguese using kaldi tools.
In <em>Proc. IberSPEECH 2018</em>, 77–81. 2018.
URL: <a href="http://dx.doi.org/10.21437/IberSPEECH.2018-17">http://dx.doi.org/10.21437/IberSPEECH.2018-17</a>, <a href="https://doi.org/10.21437/IberSPEECH.2018-17">doi:10.21437/IberSPEECH.2018-17</a>.</dd>
</dl></body></html>