Merge pull request #185 from pubs/fix/177

Fix/177 convert latex to unicode before printing one-liner
main
Olivier Mangin 6 years ago committed by GitHub
commit 1c892bd64e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -19,6 +19,7 @@ six
# those are the additional packages required to run the tests # those are the additional packages required to run the tests
pyfakefs pyfakefs
certifi
ddt ddt
mock mock
pytest # optional (python setup.py test works without it), but possible nonetheless pytest # optional (python setup.py test works without it), but possible nonetheless

@ -54,7 +54,6 @@ def many_from_path(ui, bibpath, ignore=False):
bibpath = system_path(bibpath) bibpath = system_path(bibpath)
if os.path.isdir(bibpath): if os.path.isdir(bibpath):
print([os.path.splitext(f)[-1][1:] for f in os.listdir(bibpath)])
all_files = [os.path.join(bibpath, f) for f in os.listdir(bibpath) all_files = [os.path.join(bibpath, f) for f in os.listdir(bibpath)
if os.path.splitext(f)[-1][1:] == 'bib'] if os.path.splitext(f)[-1][1:] == 'bib']
else: else:

@ -122,7 +122,7 @@ class EnDecoder(object):
def decode_bibdata(self, bibdata): def decode_bibdata(self, bibdata):
"""Decodes bibdata from string. """Decodes bibdata from string.
If the decoding fails, returns a BibParseError. If the decoding fails, returns a BibDecodingError.
""" """
if len(bibdata) == 0: if len(bibdata) == 0:
error_msg = 'parsing error: the provided string has length zero.' error_msg = 'parsing error: the provided string has length zero.'
@ -131,7 +131,6 @@ class EnDecoder(object):
entries = bp.bparser.BibTexParser( entries = bp.bparser.BibTexParser(
bibdata, common_strings=True, customization=customizations, bibdata, common_strings=True, customization=customizations,
homogenize_fields=True).get_entry_dict() homogenize_fields=True).get_entry_dict()
# Remove id from bibtexparser attribute which is stored as citekey # Remove id from bibtexparser attribute which is stored as citekey
for e in entries: for e in entries:
entries[e].pop(BP_ID_KEY) entries[e].pop(BP_ID_KEY)
@ -140,6 +139,9 @@ class EnDecoder(object):
entries[e][TYPE_KEY] = t entries[e][TYPE_KEY] = t
if len(entries) > 0: if len(entries) > 0:
return entries return entries
else:
raise self.BibDecodingError(('no valid entry found in the provided data: '
' {}').format(bibdata), bibdata)
except (pyparsing.ParseException, pyparsing.ParseSyntaxException) as e: except (pyparsing.ParseException, pyparsing.ParseSyntaxException) as e:
error_msg = self._format_parsing_error(e) error_msg = self._format_parsing_error(e)
raise self.BibDecodingError(error_msg, bibdata) raise self.BibDecodingError(error_msg, bibdata)

@ -1,6 +1,8 @@
import copy import copy
from dateutil.parser import parse as datetime_parse from dateutil.parser import parse as datetime_parse
from bibtexparser.customization import convert_to_unicode
from . import bibstruct from . import bibstruct
from .p3 import ustr from .p3 import ustr
@ -102,6 +104,10 @@ class Paper(object):
def added(self, value): def added(self, value):
self.metadata['added'] = value self.metadata['added'] = value
def get_unicode_bibdata(self):
"""Converts latex in bibdata fields to unicode."""
return convert_to_unicode(self.bibdata)
@staticmethod @staticmethod
def from_bibentry(bibentry, citekey=None, metadata=None): def from_bibentry(bibentry, citekey=None, metadata=None):
bibentry_key, bibdata = bibstruct.get_entry(bibentry) bibentry_key, bibdata = bibstruct.get_entry(bibentry)

@ -64,7 +64,7 @@ def paper_oneliner(p, citekey_only=False):
if citekey_only: if citekey_only:
return p.citekey return p.citekey
else: else:
bibdesc = bib_oneliner(p.bibdata) bibdesc = bib_oneliner(p.get_unicode_bibdata())
doc_str = '' doc_str = ''
if p.docpath is not None: if p.docpath is not None:
doc_extension = os.path.splitext(p.docpath)[1] doc_extension = os.path.splitext(p.docpath)[1]

@ -60,7 +60,7 @@ setup(
], ],
test_suite='tests', test_suite='tests',
tests_require=['pyfakefs>=3.4', 'mock', 'ddt'], tests_require=['pyfakefs>=3.4', 'mock', 'ddt', 'certifi'],
# in order to avoid 'zipimport.ZipImportError: bad local file header' # in order to avoid 'zipimport.ZipImportError: bad local file header'
zip_safe=False, zip_safe=False,

@ -84,6 +84,18 @@ not_bibtex = """@misc{this looks,
""" """
bibtex_with_latex = """@article{kjaer2018large,
title={A large impact crater beneath Hiawatha Glacier in northwest Greenland},
author={Kj{\\ae}r, Kurt H and Larsen, Nicolaj K and Binder, Tobias and Bj{\\o}rk, Anders A and Eisen, Olaf and Fahnestock, Mark A and Funder, Svend and Garde, Adam A and Haack, Henning and Helm, Veit and others},
journal={Science advances},
volume={4},
number={11},
pages={eaar8173},
year={2018},
publisher={American Association for the Advancement of Science}
}
"""
sample_conf = """ sample_conf = """
[main] [main]

@ -4,7 +4,9 @@ import unittest
import dotdot import dotdot
import fixtures import fixtures
import str_fixtures
from pubs.paper import Paper from pubs.paper import Paper
from pubs.endecoder import EnDecoder
class TestAttributes(unittest.TestCase): class TestAttributes(unittest.TestCase):
@ -47,5 +49,20 @@ class TestAttributes(unittest.TestCase):
Paper(" ", fixtures.doe_bibdata) Paper(" ", fixtures.doe_bibdata)
class TestPaperUnicodeBibdata(unittest.TestCase):
def test_no_latex(self):
p = Paper.from_bibentry(fixtures.page_bibentry,
metadata=fixtures.page_metadata).deepcopy()
self.assertEqual(p.bibdata, p.get_unicode_bibdata())
def test_latex_converted(self):
bib = EnDecoder().decode_bibdata(str_fixtures.bibtex_with_latex)
p = Paper.from_bibentry(bib)
ubib = p.get_unicode_bibdata()
self.assertEqual(ubib['author'][0], u"Kjær, Kurt H")
self.assertEqual(ubib['author'][3], u"Bjørk, Anders A")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

@ -288,7 +288,7 @@ class TestAdd(URLContentTestCase):
def test_add_utf8_citekey(self): def test_add_utf8_citekey(self):
correct = ["", correct = ["",
("added to pubs:\n" ("added to pubs:\n"
"[hausdorff1949grundzüge] Hausdorff, Felix \"Grundzge der Mengenlehre\" (1949) \n"), "[hausdorff1949grundzüge] Hausdorff, Felix \"Grundzüge der Mengenlehre\" (1949) \n"),
"The 'hausdorff1949grundzüge' citekey has been renamed into 'アスキー'\n", "The 'hausdorff1949grundzüge' citekey has been renamed into 'アスキー'\n",
"The 'アスキー' citekey has been renamed into 'Ḽơᶉëᶆ_ȋṕšᶙṁ'\n" "The 'アスキー' citekey has been renamed into 'Ḽơᶉëᶆ_ȋṕšᶙṁ'\n"
] ]

Loading…
Cancel
Save