citeproc-php is a full-featured CSL 1.0.1 processor that renders bibliographic metadata into html formatted citations or bibliographies using CSL stylesheets. citeproc-php renders bibliographies as well as citations (except of Citation-specific Options).
The Citation Style Language (CSL) is an XML-based format to describe the formatting of citations, notes and bibliographies, offering:
For additional documentation of CSL visit http://citationstyles.org.
The recommended way to install citeproc-php is through Composer.
$ curl -sS https://getcomposer.org/installer | php
Add the following lines to your composer.json
file in order to add required program libraries as well as CSL styles and locales:
{
"name": "vendor-name/program-name",
"repositories": [
{
"type": "package",
"package": {
"name": "citation-style-language/locales",
"version":"1.0.0",
"source": {
"type": "git",
"url": "https://github.com/citation-style-language/locales.git",
"reference": "master"
}
}
},
{
"type": "package",
"package": {
"name": "citation-style-language/styles",
"version":"1.0.0",
"source": {
"type": "git",
"url": "https://github.com/citation-style-language/styles.git",
"reference": "master"
}
}
}
],
"require": {
"citation-style-language/locales":"@dev",
"citation-style-language/styles":"@dev",
"seboettg/citeproc-php": "^2"
}
}
Next, run the Composer command to install the latest stable version of citeproc-php and its dependencies:
$ php composer.phar install --no-dev
After installing, you need to require Composer's autoloader:
require 'vendor/autoload.php';
You can then later update citeproc-php using composer:
$ composer.phar update --no-dev
If you have trouble using composer you will find further information on https://getcomposer.org/doc/.
citeproc-php renders bibliographical metadata into html formatted citations or bibliographies using a stylesheet which defines the citation rules.
Create a project folder:
$ mkdir mycslproject
$ cd mycslproject
First, you need json formatted metadata array of publication's metadata. There are a lot of services that supports CSL exports. For instance BibSonomy, Zotero, Mendeley. If you don't use any of these services, you can use the following test data for a first step.
[
{
"author": [
{
"family": "Doe",
"given": "James",
"suffix": "III"
}
],
"id": "item-1",
"issued": {
"date-parts": [
[
"2001"
]
]
},
"title": "My Anonymous Heritage",
"type": "book"
},
{
"author": [
{
"family": "Anderson",
"given": "John"
},
{
"family": "Brown",
"given": "John"
}
],
"id": "ITEM-2",
"type": "book",
"title": "Two authors writing a book"
}
]
Copy this into a file in your project root and name that file metadata.json
.
<?php
include "vendor/autoload.php";
use Seboettg\CiteProc\StyleSheet;
use Seboettg\CiteProc\CiteProc;
$data = file_get_contents("metadata.json");
$style = StyleSheet::loadStyleSheet("din-1505-2");
$citeProc = new CiteProc($style);
echo $citeProc->render(json_decode($data), "bibliography");
You can also render citations instead of bibliographies:
echo $citeProc->render(json_decode($data), "citation");
Since version 2.1 you have also the possibility to apply a filter so that just specific citations appear.
<p>This a wise sentence
<?php echo $citeProc->render($data, "citation", json_decode('[{"id":"item-1"}]')); ?>.</p>
<p>This is the most wise sentence
<?php echo $citeProc->render($data, "citation", json_decode('[{"id":"item-1"},{"id":"ITEM-2"}]')); ?>.</p>
Some CSL stylesheets use bibliography-specific style options like hanging indents or alignments. To get an effect of these options you can render separated Cascading Stylesheets using CiteProc.
You have to insert these styles within the <head>
tag of your html output page.
<?php
include "vendor/autoload.php";
use Seboettg\CiteProc\StyleSheet;
use Seboettg\CiteProc\CiteProc;
$data = file_get_contents("metadata.json");
$style = StyleSheet::loadStyleSheet("harvard-north-west-university");
$citeProc = new CiteProc($style);
$bibliography = $citeProc->render(json_decode($data), "bibliography");
$cssStyles = $citeProc->renderCssStyles();
?>
<html>
<head>
<title>CSL Test</title>
<style type="text/css" rel="stylesheet">
<?php echo $cssStyles; ?>
</style>
</head>
<body>
<h1>Bibliography</h1>
<?php echo $bibliography; ?>
</body>
</html>
Now, you can watch and test the output using PHP's internal web server:
$ php -S localhost:8080
Start your Browser and open the URL http://localhost:8080
.
Under examples
folder you will find another example script.
Since version 2.1, citeproc-php comes with additional features that are not a part of the CSL specifications.
You can enrich bibliographies and citations with additional HTML tags to inject links (i.e. to set a link to an author's CV), or to add other html markup.
<?php
include "vendor/autoload.php";
use Seboettg\CiteProc\StyleSheet;
use Seboettg\CiteProc\CiteProc;
$data = file_get_contents("metadata.json");
$style = StyleSheet::loadStyleSheet("elsevier-vancouver");
// pimp the title
$titleFunction = function($cslItem, $renderedText) {
return '<a href="https://example.org/publication/' . $cslItem->id . '">' . $renderedText . '</a>';
};
//pimp author names
$authorFunction = function($authorItem, $renderedText) {
if (isset($authorItem->id)) {
return '<a href="https://example.org/author/' . $authorItem->id . '">' . $renderedText . '</a>';
}
return $renderedText;
};
?>
As you can see, $titleFunction
wraps the title and $authorFunction
wraps author's name in a link.
Assign these functions to its associated CSL variable (in this case title and author) as follows.
<?php
$additionalMarkup = [
"title" => $titleFunction,
"author" => $authorFunction
];
$citeProc = new CiteProc($style, "en-US", $additionalMarkup);
?>
<html>
<head>
<title>CSL Test</title>
</head>
<body>
<h1>Bibliography</h1>
<?php echo $citeProc->render(json_decode($data), "bibliography"); ?>
</body>
</html>
You can also use custom Lambda Functions in order to enrich citations with additional HTML markup.
If you want to restrict citeproc-php to use a custom Lambda Function either for bibliographies or citations, or you want to apply different functions for both, you can define the array as follows:
<?php
$additionalMarkup = [
"bibliography" => [
"author" => $authorFunction,
"title" => $titleFunction,
"csl-entry" => function($cslItem, $renderedText) {
return '<a id="' . $cslItem->id .'" href="#' . $cslItem->id .'"></a>' . $renderedText;
}
],
"citation" => [
"citation-number" => function($cslItem, $renderedText) {
return '<a href="#' . $cslItem->id .'">'.$renderedText.'</a>';
}
]
];
$citeProc = new CiteProc($style, "en-US", $additionalMarkup);
?>
<p>This ia a wise sentence <?php echo $citeProc->render(json_decode($data), "citation", json_decode('[{"id":"item-1"}]')); ?>.</p>
<h3>Literature</h3>
<?php echo $citeProc->render(json_decode($data), "bibliography");
In this example each entry of the bibliography gets an anchor by its id
and the citation (in Elsevier-Vancouver style [1]) gets an URL with a fragment by its id
. Hence, every citation mark gets a link to its entry in the bibliography.
Further examples you will find in the example folder.
function ($item, $renderedValue) { ... }
) in their signature and must return a string.\stdClass
). The 2nd parameter is the rendered result of the associated item.csl-entry
is not a valid variable according to the CSL specifications. citeproc-php use csl-entry
to hook in and apply a custom Lambda Function after a whole citation item or bibliography entry is rendered. citeproc-php is an Open Source project. You can support it by reporting bugs, contributing code or contributing documentation.
Developing software is a hard job and one has to spend a lot of time. Every open-source developer is looking forward about esteem for his work. If you use citeproc-php and if you like it, star it and talk about it in Blogs.
Use the Issue Tracker in order to report a bug.
You are a developer and you like to help developing new features or bug fixes? Fork citeproc-php, setup a workspace and send a pull request.
I would suggest the following way:
$ git clone https://github.com/<yourname>/citeproc-php
$ cd <project-root>/tests/fixtures/basic-tests
$ ./processor.py -g
<?php
namespace Seboettg\CiteProc;
use PHPUnit\Framework\TestCase;
class MyNewClassTest extends TestCase { use TestSuiteTestCaseTrait; // ... public function testMyBrandNewFunction() { //my brand new function is the file name (without file extension) $this->_testRenderTestSuite("myBrandNewFunction"); } // ... }
* Implement or adapt your code as long as all tests finishing successfully
* Make sure that your test case covers relevant code parts
* Send a pull request
## Testing ##
You can also run test cases without IDE:
```bash
$ composer test