A CLI tool to manage bibtex entries using nickng/bibtex.
bibfuse creates an SQLite database file (--db
) from given BibTex files (*.bib
), and generates a single clean .bib
file (--out
).
The filtering formats can be defined in the config file (--config
). bibfuse takes the bibfuse.toml
in this package by default.
If no .bib
files are given, it just reads the database and updates the BibTex file.
% go get -u github.com/iomz/bibfuse/...
% bibfuse -h
Usage of bibfuse: [options] [.bib ... .bib]
-config string
The bibfuse.[toml|yml] defining the filters. (default "bibfuse.toml")
-db string
The SQLite file to read/write. (default "bib.db")
-no-optional
Suppress "OPTIONAL" fields in the resulting bibtex.
-no-todo
Suppress "TODO" fields in the resulting bibtex.
-out string
The resulting bibtex to write (it overrides if exists). (default "out.bib")
-show-empty
Do not hide empty fields in the resulting bibtex.
-smart
Use oneof selectively filters when importing bibtex.
-verbose
Print verbose messages.
-version
Print version.
% cat ref.bib
@article{someone2021a,
title = {{A Journal Article}},
}
% bibfuse ref.bib
2021/10/17 15:47:32 parsing ref.bib
2021/10/17 15:47:32 +1 new entries
2021/10/17 15:47:32 bib.db contains 1 entries
2021/10/17 15:47:32 1 entries written to out.bib
% cat out.bib
@article{someone2021a,
title = {{A Journal Article}},
author = "(TODO)",
url = "(OPTIONAL)",
doi = "(OPTIONAL)",
isbn = "(OPTIONAL)",
issn = "(OPTIONAL)",
journal = "(TODO)",
metanote = "(OPTIONAL)",
number = "(OPTIONAL)",
numpages = "(OPTIONAL)",
pages = "(OPTIONAL)",
publisher = "(OPTIONAL)",
volume = "(OPTIONAL)",
year = "(TODO)",
}
% cat ref.bib
@article{someone2021a,
title = {{A Journal Article}},
}
% docker run -v $(pwd):$(pwd) -w $(pwd) --rm iomz/bibfuse ref.bib
2021/10/17 13:53:33 parsing ref.bib
2021/10/17 13:53:33 +0 new entries
2021/10/17 13:53:33 bib.db contains 1 entries
2021/10/17 13:53:33 1 entries written to out.bib
% sqlite3 bib.db "SELECT * FROM entries;"
1|someone2021a|article|(TODO)|{A Journal Article}||(OPTIONAL)||(OPTIONAL)|(OPTIONAL)||(TODO)|(OPTIONAL)||(OPTIONAL)||(OPTIONAL)|(OPTIONAL)|(OPTIONAL)|(OPTIONAL)||||(OPTIONAL)||(OPTIONAL)|(TODO)
bibfuse reflects rather subjective opinion to filter and flag the required fields depending on the type, aiming for the compatibility with most of the research publication requirements.
bibfuse filters fields for each entry depending on the type: @article
, @book
, @incollection
, @inproceedings
, @mastersthesis
, @misc
, @phdthesis
, @techreport
, and @unpublished
as defined in bibfuse.toml
.
Mandatory fields are filled with (TODO)
while optional fileds are filled with (OPTIONAL)
.
In addition, you can define additional filters whose name starting with oneof_
to selectively discard some fields in presence of a specific fields with the -smart
option. For example, by default for the @article
type the default bibfuse.toml
has the following oneof_
filter:
oneof_doi_page = [
"doi",
"pages",
"numpages"
]
This checks each field in the order "doi", "pages", and "numpages" then after finding the first one of neither empty, "(OPTIONAL)", nor "(TODO)", bibfuse discards the remaining fields and does NOT store them in the database. Note that if you want to retain those fields, you should not use this -smart
option.
This feature enables rather concise bibliography in your manuscript while maintaining the accessibility to the cited documents through more efficient identities (e.g., DOI).
@article{mizutani2021article
title = {{Title of the Article}},
author = "(TODO)",
journal = "(TODO)",
year = "(TODO)",
doi = "(OPTIONAL)",
isbn = "(OPTIONAL)", % removed if doi exists
issn = "(OPTIONAL)", % removed if doi exists
metanote = "(OPTIONAL)",
number = "(OPTIONAL)", % removed if doi exists
numpages = "(OPTIONAL)", % removed if doi exists
pages = "(OPTIONAL)", % removed if doi exists
publisher = "(OPTIONAL)", % removed if doi exists
url = "(OPTIONAL)", % removed if doi exists
volume = "(OPTIONAL)", % removed if doi exists
}
@book{mizutani2021book,
title = {{Title of the Book}},
author = "(TODO)"
publisher = "(TODO)", % removed if doi exists
year = "(TODO)",
doi = "(OPTIONAL)",
edition = "(OPTIONAL)", % removed if doi exists
isbn = "(OPTIONAL)", % removed if doi exists
issn = "(OPTIONAL)", % removed if doi exists
metanote = "(OPTIONAL)",
url = "(OPTIONAL)", % removed if doi exists
}
@incollection{mizutani2012incollection,
title = {{Title of the Book Chapter}},
author = "(TODO)"
booktitle = "(TODO)",
publisher = "(TODO)", % removed if doi exists
year = "(TODO)",
doi = "(OPTIONAL)",
isbn = "(OPTIONAL)", % removed if doi exists
issn = "(OPTIONAL)", % removed if doi exists
metanote = "(OPTIONAL)",
numpages = "(OPTIONAL)", % removed if doi exists
pages = "(OPTIONAL)", % removed if doi exists
series = "(OPTIONAL)",
url = "(OPTIONAL)", % removed if doi exists
}
@inproceedings{mizutani2012inproceedings,
title = {{Title of the Conference Paper}},
author = "(TODO)"
booktitle = "(TODO)",
year = "(TODO)",
doi = "(OPTIONAL)",
isbn = "(OPTIONAL)", % removed if doi exists
issn = "(OPTIONAL)", % removed if doi exists
metanote = "(OPTIONAL)",
numpages = "(OPTIONAL)", % removed if doi exists
pages = "(OPTIONAL)", % removed if doi exists
publisher = "(OPTIONAL)", % removed if doi exists
series = "(OPTIONAL)",
url = "(OPTIONAL)", % removed if doi exists
}
@mastersthesis{mizutani2021mastersthesis,
title = {{Title of the Master's Thesis}},
author = "(TODO)",
url = "(OPTIONAL)",
metanote = "(OPTIONAL)",
school = "(TODO)",
year = "(TODO)",
}
@misc{mizutani2021misc,
title = "Title of the Resource",
author = "(TODO)"
note = "(TODO)",
url = "(TODO)",
year = "(TODO)",
institution = "(OPTIONAL)",
metanote = "(OPTIONAL)",
}
@phdthesis{mizutani2021phdthesis,
title = {{Title of the Ph.D. Thesis}},
author = "(TODO)",
url = "(OPTIONAL)",
metanote = "(OPTIONAL)",
school = "(TODO)",
year = "(TODO)",
}
@techreport{mizutani2021techreport,
title = {{Title of the Technical Document}},
author = "(TODO)",
institution = "(TODO)",
year = "(TODO)",
metanote = "(OPTIONAL)",
series = "(OPTIONAL)",
url = "(OPTIONAL)",
version = "(OPTIONAL)",
}
@unpublished{mizutani2021unpublished,
title = {{Title of the Unpublished Work}},
author = "(TODO)",
url = "(TODO)",
metanote = "(OPTIONAL)",
note = "(TODO)",
}
See CONTRIBUTING.md
.
See LICENSE
.
Iori Mizutani (@iomz)