aclements / biblib Goto Github PK
View Code? Open in Web Editor NEWSimple, faithful BibTeX parser and algorithms for Python 3
License: MIT License
Simple, faithful BibTeX parser and algorithms for Python 3
License: MIT License
Hi I just installed biblib
and run the following simple example from the tutorials
import biblib
db = biblib.FileBibDB('path/to/file.bib', mode='r')
for entry in db.values():
print(entry)
I get the following error
Traceback (most recent call last):
File "/python3.6/site-packages/biblib/_entry.py", line 48, in __new__
return cls._registeredTypes[inputdict['ENTRYTYPE']](inputdict)
File "/python3.6/site-packages/biblib/_entry.py", line 48, in __new__
return cls._registeredTypes[inputdict['ENTRYTYPE']](inputdict)
File "/python3.6/site-packages/biblib/_entry.py", line 48, in __new__
return cls._registeredTypes[inputdict['ENTRYTYPE']](inputdict)
[Previous line repeated 997 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object
Even tried increasing the recursion stack but nothing
import sys
sys.setrecursionlimit(10000)
Any ideas?
When the parser tries to parse a BibTeX entry that it already has, using the Parser.parse()
function, does so using a recoverer.
The exception thrown should include information about why it failed, and, as seen in line 274 of bib.py
:
self._fail('repeated entry')
this is programmed. But the recoverer only throws the amount of input errors, not the message. Is there a way to catch this message? It is important to me to be able to know why the exception is being thrown.
Hi,
So there is a biblib package on PyPI which is unfortunately not the correct one, I was wondering though if there was any plan for releasing this one though. It would be super convenient for automation.
Cheers,
Thomas
How did you derive the parser from the WEB source? I'm trying to create a Javascript version of this lib, but the pascal produced from bibtex.web by tangle is very hard to read.
This is essentially abandonware. It has a dependency upon collections.Iterable, which was removed in python 3.10.
A valid @comment
command should be followed with a white space character, a comma, or a left brace. This is because BibTeX first scans for a identifier following @
(bibtex.web#L5433) and then determines if it's a comment (bibtex.web#L5465-L5470). Thus the comment
rule should be 'comment' &[ \t\n{(]
.
See the following LaTeX test case.
\documentclass{article}
\begin{filecontents}[noheader,overwrite]{\jobname.bib}
@comment @book{test-comment-1,
note = {The entry type is "book".}
}
@comment@book{test-comment-2,
note = {The entry type is "comment@book".}
}
\end{filecontents}
\begin{filecontents}[noheader,overwrite]{\jobname.bst}
ENTRY { note } { } { }
FUNCTION {default.type}
{ "type: " type$ * top$
"key: " cite$ * top$
}
FUNCTION {book} {default.type}
FUNCTION {comment@book} {default.type}
READ
ITERATE {call.type$}
\end{filecontents}
\begin{document}
\nocite{*}
\bibliographystyle{\jobname}
\bibliography{\jobname}
\end{document}
BibTeX treats comment@book
as the entry type.
This is BibTeX, Version 0.99d (TeX Live 2023)
The top-level auxiliary file: main.aux
The style file: main.bst
Database file #1: main.bib
type: book
key: test-comment-1
type: comment@book
key: test-comment-2
BTW, there are duplicated rules named comment
and they can be distinguished as "implicit comment" and "comment command".
This is a wonderful package, but I have run into a problem: In TeX and LaTeX, once can specify accents such as \H either in the form \H{o} or \H o. In the latter case, the NameParser code splits the second form incorrectly.
biblib.algo.parse_names("Sz\\H{o}l\\H{o}, Abel and Sz\\H ol\\H o, Baker")
[Name(first='Abel', von='', last='Sz\\H{o}l\\H{o}', jr=''),
Name(first='Baker', von='Sz\\H ol\\H', last='o', jr='')]
For reasons I don't understand, surrounding the second \H o with braces for Baker will parse that name correctly, even though the first \H o still contains a space.
biblib.algo.parse_names("Sz\\H ol{\\H o}, Baker")
[Name(first='Baker', von='', last='Sz\\H ol{\\H o}', jr='')]
This particular problem can be solved by converting to Unicode first
biblib.algo.parse_names(biblib.algo.tex_to_unicode("Sz\\H{o}l\\H{o}, Abel and Sz\\H ol\\H o, Baker"))
[Name(first='Abel', von='', last='Szőlő', jr=''),
Name(first='Baker', von='', last='Szőlő', jr='')]
but that approach strips out braces needed, for example, to specify an institution name and have it parsed as all being a last name, not split into name components. E.g.,
biblib.algo.parse_names(biblib.algo.tex_to_unicode("Sz\\H ol\H o, Baker and {NRC Committee}"))
[Name(first='Baker', von='', last='Szőlő', jr=''),
Name(first='NRC', von='', last='Committee', jr='')]
I think that the NameParser's algorithm must special-case accent specifiers such as \H, \r, \u, \v, etc., to be sure not to split tokens on spaces following them, just as it now special-cases spaces at a brace depth > 0.
Is this code the latest version? pypi has 0.1.2 available, but the version string in the code here is 0.1.0.
The pypi version also seems to require a non-existent module magic
and a module unidecode
which is not mentioned here in the source code...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.