All Projects â†’ renanbr â†’ bibtex-parser

renanbr / bibtex-parser

Licence: MIT license
BibTex Parser provides an API to read .bib files programmatically.

Programming Languages

PHP
23972 projects - #3 most used programming language
TeX
3793 projects
Makefile
30231 projects
Dockerfile
14818 projects

Projects that are alternatives of or similar to bibtex-parser

bibtex-js
Library for parsing .bib files, used in Bibliography.js 📚
Stars: ✭ 55 (+52.78%)
Mutual labels:  bibtex, bib
Zotero Better Bibtex
Make Zotero effective for us LaTeX holdouts
Stars: ✭ 2,336 (+6388.89%)
Mutual labels:  bibtex, bib
Bibcure
Bibcure helps in boring tasks by keeping your bibfile up to date and normalized...also allows you to easily download all papers inside your bibtex
Stars: ✭ 124 (+244.44%)
Mutual labels:  bibtex
bibmanager
A BibTeX manager for LaTeX projects
Stars: ✭ 52 (+44.44%)
Mutual labels:  bibtex
citeproc-el
A CSL 1.0.2 Citation Processor for Emacs.
Stars: ✭ 75 (+108.33%)
Mutual labels:  bibtex
Hugo Academic Cli
📚 Import academic publications from Bibtex to Hugo
Stars: ✭ 158 (+338.89%)
Mutual labels:  bibtex
my-writing-workflow
Tutorial for converting markdown files in to APA-formatted docs, based on my workflow.
Stars: ✭ 35 (-2.78%)
Mutual labels:  bibtex
Bibtool
BibTool is a tool for manipulating BibTeX data bases. BibTeX provides a mean to integrate citations into LaTeX documents. BibTool allows the manipulation of BibTeX files which goes beyond the possibilities -- and intentions -- of BibTeX.
Stars: ✭ 121 (+236.11%)
Mutual labels:  bibtex
PubViz
PubViz is a tool for interactive visualization of publication data in BibTeX.
Stars: ✭ 14 (-61.11%)
Mutual labels:  bibtex
Gscholar
Query Google Scholar with Python
Stars: ✭ 209 (+480.56%)
Mutual labels:  bibtex
proofengineering-bib
BibTeX bibliographies for proof engineering-related papers
Stars: ✭ 24 (-33.33%)
Mutual labels:  bibtex
Bibtex Js
BibTeX-js can parse a BibTeX-file and render it as part of an HTML file. This way, you can easily add a list of publications to your private homepage or display a list of recommended publications for a seminar. The way the entries are display can be customized using a simple template system and CSS.
Stars: ✭ 184 (+411.11%)
Mutual labels:  bibtex
Citation.js
Citation.js converts formats like BibTeX, Wikidata JSON and ContentMine JSON to CSL-JSON to convert to other formats like APA, Vancouver and back to BibTeX.
Stars: ✭ 171 (+375%)
Mutual labels:  bibtex
bib2xhtml
Convert BibTeX references into XHTML
Stars: ✭ 35 (-2.78%)
Mutual labels:  bibtex
Rdpack
R package Rdpack provides functions and macros facilitating writing and management of R documentation.
Stars: ✭ 21 (-41.67%)
Mutual labels:  bibtex
Bib Publication List
Interactive publications lists with JavaScript + Bibtex
Stars: ✭ 122 (+238.89%)
Mutual labels:  bibtex
Jabref
Graphical Java application for managing BibTeX and biblatex (.bib) databases
Stars: ✭ 2,385 (+6525%)
Mutual labels:  bibtex
html2biblatex
A tiny bookmarklet for exporting web pages to BibLaTeX (all browsers / no installation).
Stars: ✭ 73 (+102.78%)
Mutual labels:  bibtex
JabRef-Browser-Extension
Browser extension for JabRef to allow importing of new items directly from the browser.
Stars: ✭ 73 (+102.78%)
Mutual labels:  bibtex
LaTeX-Templates
Document templates composed using LaTeX for my college assignments and projects (Applicable for any other university or college) ✨
Stars: ✭ 18 (-50%)
Mutual labels:  bibtex

PHP BibTeX Parser 2.x

This is a BibTeX parser written in PHP.

BibTeX logo PHP logo

Tests codecov Static Analysis Coding Standards

You are browsing the documentation of BibTeX Parser 2.x, the latest version.

Table of contents

Installing

composer require renanbr/bibtex-parser

Usage

use RenanBr\BibTexParser\Listener;
use RenanBr\BibTexParser\Parser;
use RenanBr\BibTexParser\Processor;

require 'vendor/autoload.php';

$bibtex = <<<BIBTEX
@article{einstein1916relativity,
  title={Relativity: The Special and General Theory},
  author={Einstein, Albert},
  year={1916}
}
BIBTEX;

// Create and configure a Listener
$listener = new Listener();
$listener->addProcessor(new Processor\TagNameCaseProcessor(CASE_LOWER));
// $listener->addProcessor(new Processor\NamesProcessor());
// $listener->addProcessor(new Processor\KeywordsProcessor());
// $listener->addProcessor(new Processor\DateProcessor());
// $listener->addProcessor(new Processor\FillMissingProcessor([/* ... */]));
// $listener->addProcessor(new Processor\TrimProcessor());
// $listener->addProcessor(new Processor\UrlFromDoiProcessor());
// $listener->addProcessor(new Processor\LatexToUnicodeProcessor());
// ... you can append as many Processors as you want

// Create a Parser and attach the listener
$parser = new Parser();
$parser->addListener($listener);

// Parse the content, then read processed data from the Listener
$parser->parseString($bibtex); // or parseFile('/path/to/file.bib')
$entries = $listener->export();

print_r($entries);

This will output:

Array
(
    [0] => Array
        (
            [_type] => article
            [citation-key] => einstein1916relativity
            [title] => Relativity: The Special and General Theory
            [author] => Einstein, Albert
            [year] => 1916
        )
)

Vocabulary

BibTeX is all about "entry", "tag's name" and "tag's content".

A BibTeX entry consists of the type (the word after @), a citation-key and a number of tags which define various characteristics of the specific BibTeX entry. (...) A BibTeX tag is specified by its name followed by an equals sign, and the content.

Source: http://www.bibtex.org/Format/

Note: This library considers "type" and "citation-key" as tags. This behavior can be changed implementing your own Listener.

Processors

Processor is a callable that receives an entry as argument and returns a modified entry.

This library contains three main parts:

  • Parser class, responsible for detecting units inside a BibTeX input;
  • Listener class, responsible for gathering units and transforming them into a list of entries;
  • Processor classes, responsible for manipulating entries.

Despite you can't configure the Parser, you can append as many Processor as you want to the Listener through Listener::addProcessor() before exporting the contents. Be aware that Listener provides, by default, these features:

  • Found entries are reachable through Listener::export() method;
  • Tag content concatenation;
    • e.g. hello # " world" tag's content will generate hello world string
  • Tag content abbreviation handling;
    • e.g. @string{foo="bar"} @misc{bar=foo} will make $entries[1]['bar'] assume bar as value
  • Publication's type exposed as _type tag;
  • Citation key exposed as citation-key tag;
  • Original entry text exposed as _original tag.

This project ships some useful processors.

Tag name case

In BibTeX the tag's names aren't case-sensitive. This library exposes entries as array, in which keys are case-sensitive. To avoid this misunderstanding, you can force the tags' name character case using TagNameCaseProcessor.

Usage
use RenanBr\BibTexParser\Processor\TagNameCaseProcessor;

$listener->addProcessor(new TagNameCaseProcessor(CASE_UPPER)); // or CASE_LOWER
@article{
  title={BibTeX rocks}
}
Array
(
    [0] => Array
        (
            [TYPE] => article
            [TITLE] => BibTeX rocks
        )
)

Authors and editors

BibTeX recognizes four parts of an author's name: First Von Last Jr. If you would like to parse the author and editor tags included in your entries, you can use the NamesProcessor class.

Usage
use RenanBr\BibTexParser\Processor\NamesProcessor;

$listener->addProcessor(new NamesProcessor());
@article{
  title={Relativity: The Special and General Theory},
  author={Einstein, Albert}
}
Array
(
    [0] => Array
        (
            [type] => article
            [title] => Relativity: The Special and General Theory
            [author] => Array
                (
                    [0] => Array
                        (
                            [first] => Albert
                            [von] =>
                            [last] => Einstein
                            [jr] =>
                        )
                )
        )
)

Keywords

The keywords tag contains a list of expressions represented as string, you might want to read them as an array instead.

Usage
use RenanBr\BibTexParser\Processor\KeywordsProcessor;

$listener->addProcessor(new KeywordsProcessor());
@misc{
  title={The End of Theory: The Data Deluge Makes the Scientific Method Obsolete},
  keywords={big data, data deluge, scientific method}
}
Array
(
    [0] => Array
        (
            [type] => misc
            [title] => The End of Theory: The Data Deluge Makes the Scientific Method Obsolete
            [keywords] => Array
                (
                    [0] => big data
                    [1] => data deluge
                    [2] => scientific method
                )
        )
)

Date

It adds a new tag _date as DateTimeImmutable. This processor adds the new tag if and only if this the tags month and year are fulfilled.

Usage
use RenanBr\BibTexParser\Processor\DateProcessor;

$listener->addProcessor(new DateProcessor());
@misc{
  month="1~oct",
  year=2000
}
Array
(
    [0] => Array
        (
            [type] => misc
            [month] => 1~oct
            [year] => 2000
            [_date] => DateTimeImmutable Object
                (
                    [date] => 2000-10-01 00:00:00.000000
                    [timezone_type] => 3
                    [timezone] => UTC
                )
        )
)

Fill missing tag

It puts a default value to some missing field.

Usage
use RenanBr\BibTexParser\Processor\FillMissingProcessor;

$listener->addProcessor(new FillMissingProcessor([
    'title' => 'This entry has no title',
    'year' => 1970,
]));
@misc{
}

@misc{
    title="I do exist"
}
Array
(
    [0] => Array
        (
            [type] => misc
            [title] => This entry has no title
            [year] => 1970
        )
    [1] => Array
        (
            [type] => misc
            [title] => I do exist
            [year] => 1970
        )
)

Trim tags

Apply trim() to all tags.

Usage
use RenanBr\BibTexParser\Processor\TrimProcessor;

$listener->addProcessor(new TrimProcessor());
@misc{
  title=" too much space  "
}
Array
(
    [0] => Array
        (
            [type] => misc
            [title] => too much space
        )

)

Determine URL from the DOI

Sets url tag with DOI if doi tag is present and url tag is missing.

Usage
use RenanBr\BibTexParser\Processor\UrlFromDoiProcessor;

$listener->addProcessor(new UrlFromDoiProcessor());
@misc{
  doi="qwerty"
}

@misc{
  doi="azerty",
  url="http://example.org"
}
Array
(
    [0] => Array
        (
            [type] => misc
            [doi] => qwerty
            [url] => https://doi.org/qwerty
        )

    [1] => Array
        (
            [type] => misc
            [doi] => azerty
            [url] => http://example.org
        )
)

LaTeX to unicode

BibTeX files store LaTeX contents. You might want to read them as unicode instead. The LatexToUnicodeProcessor class solves this problem, but before adding the processor to the listener you must:

Usage
use RenanBr\BibTexParser\Processor\LatexToUnicodeProcessor;

$listener->addProcessor(new LatexToUnicodeProcessor());
@article{
  title={Caf\\'{e}s and bars}
}
Array
(
    [0] => Array
        (
            [type] => article
            [title] => Cafés and bars
        )
)

Note: Order matters, add this processor as the last.

Custom

The Listener::addProcessor() method expects a callable as argument. In the example shown below, we append the text with laser to the title tags for all entries.

Usage
$listener->addProcessor(static function (array $entry) {
    $entry['title'] .= ' with laser';
    return $entry;
});
@article{
  title={BibTeX rocks}
}
Array
(
    [0] => Array
        (
            [type] => article
            [title] => BibTeX rocks with laser
        )
)

Handling errors

This library throws two types of exception: ParserException and ProcessorException. The first one may happen during the data extraction. When it occurs it probably means the parsed BibTeX isn't valid. The second exception may happen during the data processing. When it occurs it means the listener's processors can't handle properly the data found. Both implement ExceptionInterface.

use RenanBr\BibTexParser\Exception\ExceptionInterface;
use RenanBr\BibTexParser\Exception\ParserException;
use RenanBr\BibTexParser\Exception\ProcessorException;

try {
    // ... parser and listener configuration

    $parser->parseFile('/path/to/file.bib');
    $entries = $listener->export();
} catch (ParserException $exception) {
    // The BibTeX isn't valid
} catch (ProcessorException $exception) {
    // Listener's processors aren't able to handle data found
} catch (ExceptionInterface $exception) {
    // Alternatively, you can use this exception to catch all of them at once
}

Advanced usage

The core of this library contains these main classes:

  • RenanBr\BibTexParser\Parser responsible for detecting units inside a BibTeX input;
  • RenanBr\BibTexParser\ListenerInterface responsible for treating units found.

You can attach listeners to the parser through Parser::addListener(). The parser is able to detect BibTeX units, such as "type", "tag's name", "tag's content". As the parser finds a unit, it triggers the listeners attached to it.

You can code your own listener! All you have to do is handle units.

namespace RenanBr\BibTexParser;

interface ListenerInterface
{
    /**
     * Called when an unit is found.
     *
     * @param string $text    The original content of the unit found.
     *                        Escape character will not be sent.
     * @param string $type    The type of unit found.
     *                        It can assume one of Parser's constant value.
     * @param array  $context Contains details of the unit found.
     */
    public function bibTexUnitFound($text, $type, array $context);
}

$type may assume one of these values:

  • Parser::TYPE
  • Parser::CITATION_KEY
  • Parser::TAG_NAME
  • Parser::RAW_TAG_CONTENT
  • Parser::BRACED_TAG_CONTENT
  • Parser::QUOTED_TAG_CONTENT
  • Parser::ENTRY

$context is an array with these keys:

  • offset contains the $text's beginning position. It may be useful, for example, to seek on a file pointer;
  • length contains the original $text's length. It may differ from string length sent to the listener because may there are escaped characters.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].