16 import(
'lib.pkp.classes.plugins.GenericPlugin');
17 require_once(__DIR__ .
'/lib/vendor/autoload.php');
31 return __(
'plugins.generic.citationStyleLanguage.displayName');
38 return __(
'plugins.generic.citationStyleLanguage.description');
44 public function register($category, $path, $mainContextId =
null) {
45 $success = parent::register($category, $path, $mainContextId);
46 if (!
Config::getVar(
'general',
'installed') || defined(
'RUNNING_UPGRADE'))
return $success;
47 if ($success && $this->
getEnabled($mainContextId)) {
61 if (!empty($this->_citationStyles)) {
67 'id' =>
'acm-sig-proceedings',
68 'title' => __(
'plugins.generic.citationStyleLanguage.style.acm-sig-proceedings'),
73 'title' => __(
'plugins.generic.citationStyleLanguage.style.acs-nano'),
78 'title' => __(
'plugins.generic.citationStyleLanguage.style.apa'),
83 'id' =>
'associacao-brasileira-de-normas-tecnicas',
84 'title' => __(
'plugins.generic.citationStyleLanguage.style.associacao-brasileira-de-normas-tecnicas'),
88 'id' =>
'chicago-author-date',
89 'title' => __(
'plugins.generic.citationStyleLanguage.style.chicago-author-date'),
93 'id' =>
'harvard-cite-them-right',
94 'title' => __(
'plugins.generic.citationStyleLanguage.style.harvard-cite-them-right'),
99 'title' => __(
'plugins.generic.citationStyleLanguage.style.ieee'),
103 'id' =>
'modern-language-association',
104 'title' => __(
'plugins.generic.citationStyleLanguage.style.modern-language-association'),
108 'id' =>
'turabian-fullnote-bibliography',
109 'title' => __(
'plugins.generic.citationStyleLanguage.style.turabian-fullnote-bibliography'),
114 'title' => __(
'plugins.generic.citationStyleLanguage.style.vancouver'),
121 HookRegistry::call(
'CitationStyleLanguage::citationStyleDefaults', array(&$defaults, $this));
122 $this->_citationStyles = $defaults;
135 $primaryStyleName = $this->
getSetting($contextId,
'primaryCitationStyle');
136 if ($primaryStyleName) {
137 return $primaryStyleName;
141 $primaryStyles = array_filter($styles,
function($style) {
142 return !empty($style[
'isPrimary']);
145 $primaryStyle = count($primaryStyles) ? array_shift($primaryStyles) : array_shift($styles);
147 return $primaryStyle[
'id'];
158 $enabled = $this->
getSetting($contextId,
'enabledCitationStyles');
159 if (!is_array($enabled)) {
160 return array_filter($styles,
function($style) {
161 return !empty($style[
'isEnabled']);
164 return array_filter($styles,
function($style) use ($enabled) {
165 return in_array($style[
'id'], $enabled);
177 if (!empty($this->_citationDownloads)) {
184 'title' => __(
'plugins.generic.citationStyleLanguage.download.ris'),
187 'fileExtension' =>
'ris',
188 'contentType' =>
'application/x-Research-Info-Systems',
192 'title' => __(
'plugins.generic.citationStyleLanguage.download.bibtex'),
194 'fileExtension' =>
'bib',
195 'contentType' =>
'application/x-bibtex',
201 HookRegistry::call(
'CitationStyleLanguage::citationDownloadDefaults', array(&$defaults, $this));
202 $this->_citationDownloads = $defaults;
215 $enabled = $this->
getSetting($contextId,
'enabledCitationDownloads');
216 if (!is_array($enabled)) {
217 return array_filter($downloads,
function($style) {
218 return !empty($style[
'isEnabled']);
221 return array_filter($downloads,
function($style) use ($enabled) {
222 return in_array($style[
'id'], $enabled);
234 return array_values(array_map(
function($citation) {
return $citation[
'id']; }, $citations));
245 $styleConfig = array_filter($styleConfigs,
function($styleConfig) use ($styleId) {
246 return $styleConfig[
'id'] === $styleId;
248 return array_shift($styleConfig);
264 $publication = $args[3];
266 $contextId = $context ? $context->getId() : 0;
269 $citationArgs = array(
270 'submissionId' => $article->getId(),
271 'publicationId' => $publication->getId(),
273 $citationArgsJson = $citationArgs;
274 $citationArgsJson[
'return'] =
'json';
276 $templateMgr->assign(array(
278 'citationArgs' => $citationArgs,
279 'citationArgsJson' => $citationArgsJson,
284 $templateMgr->addJavaScript(
285 'citationStyleLanguage',
286 $request->getBaseUrl() .
'/' . $this->getPluginPath() .
'/js/articleCitation.js'
308 public function getCitation(
$request, $article, $citationStyle =
'apa', $issue =
null, $publication =
null) {
309 $publication = $publication ?? $article->getCurrentPublication();
311 $issue = $issue ?? $issueDao->getById($publication->getData(
'issueId'));
314 import(
'lib.pkp.classes.core.PKPString');
316 $citationData =
new stdClass();
317 $citationData->type =
'article-journal';
318 $citationData->id = $article->getId();
319 $citationData->title = htmlspecialchars($publication->getLocalizedFullTitle());
320 $citationData->{
'container-title'} = htmlspecialchars($context->getLocalizedName());
321 $citationData->{
'publisher-place'} = $this->getSetting($context->getId(),
'publisherLocation');
322 $citationData->abstract = htmlspecialchars($publication->getLocalizedData(
'abstract'));
324 $abbreviation = $context->getData(
'abbreviation', $context->getPrimaryLocale()) ?? $context->getData(
'acronym', $context->getPrimaryLocale());
325 if ($abbreviation) $citationData->{
'container-title-short'} = htmlspecialchars($abbreviation);
327 $citationData->volume = htmlspecialchars($issue->getData(
'volume'));
329 $citationData->issue = htmlspecialchars($issue->getData(
'number'));
332 if ($sectionId = $publication->getData(
'sectionId')) {
333 $section = $sectionDao->getById($sectionId);
334 if ($section && !$section->getHideTitle()) $citationData->section = htmlspecialchars($section->getTitle($context->getPrimaryLocale()));
337 $citationData->URL = $request->getDispatcher()->url(
343 $article->getBestId()
345 $citationData->accessed =
new stdClass();
346 $citationData->accessed->raw = date(
'Y-m-d');
348 $authors = $publication->getData(
'authors');
349 if (
count($authors)) {
350 $citationData->author = array();
351 foreach ($authors as $author) {
352 $currentAuthor =
new stdClass();
353 if (empty($author->getLocalizedFamilyName())) {
354 $currentAuthor->family = htmlspecialchars($author->getLocalizedGivenName());
356 $currentAuthor->family = htmlspecialchars($author->getLocalizedFamilyName());
357 $currentAuthor->given = htmlspecialchars($author->getLocalizedGivenName());
359 $citationData->author[] = $currentAuthor;
363 if ($publication->getData(
'datePublished')) {
364 $citationData->issued =
new stdClass();
365 $citationData->issued->raw = htmlspecialchars($publication->getData(
'datePublished'));
366 $publishedPublications = $article->getPublishedPublications();
367 if (
count($publishedPublications) > 1) {
368 $originalPublication = array_reduce($publishedPublications,
function($a, $b) {
369 return $a && $a->getId() < $b->getId() ? $a : $b;
371 $originalDate = $originalPublication->getData(
'datePublished');
372 if ($originalDate && $originalDate !== $publication->getData(
'datePublished')) {
373 $citationData->{
'original-date'} =
new stdClass();
374 $citationData->{
'original-date'}->raw = htmlspecialchars($originalPublication->getData(
'datePublished'));
377 } elseif ($issue->getPublished()) {
378 $citationData->issued =
new stdClass();
379 $citationData->issued->raw = htmlspecialchars($issue->getDatePublished());
382 if ($publication->getData(
'pages')) {
383 $citationData->page = htmlspecialchars($publication->getData(
'pages'));
386 HookRegistry::call(
'CitationStyleLanguage::citation', array(&$citationData, &$citationStyle, $article, $issue, $context, $publication));
392 $styleConfig = $this->getCitationStyleConfig($citationStyle);
393 if (!empty($styleConfig)) {
394 if (!empty($styleConfig[
'useTemplate'])) {
396 $templateMgr->assign(array(
397 'citationData' => $citationData,
398 'citationStyle' => $citationStyle,
399 'article' => $article,
400 'publication' => $publication,
402 'journal' => $context,
404 $citation = $templateMgr->fetch($styleConfig[
'useTemplate']);
406 $style = $this->loadStyle($styleConfig);
418 if (file_exists(dirname(__FILE__) .
'/lib/vendor/citation-style-language/locales/locales-' . $tryLocale .
'.xml'))
break;
420 $citeProc =
new CiteProc($style, $tryLocale);
421 $citation = $citeProc->render(array($citationData),
'bibliography');
434 public function loadStyle($styleConfig) {
435 if (!empty($styleConfig[
'useCsl'])) {
436 return file_get_contents($styleConfig[
'useCsl']);
438 return file_get_contents($this->getPluginPath() .
'/citation-styles/' . $styleConfig[
'id'] .
'.csl');
454 public function downloadCitation($request, $article, $citationStyle =
'ris', $issue =
null) {
455 $journal = $request->getContext();
459 $issue = $issueDao->getById($article->getCurrentPublication()->getData(
'issueId'));
462 $styleConfig = $this->getCitationStyleConfig($citationStyle);
463 if (empty($styleConfig)) {
467 $citation = trim(strip_tags($this->getCitation($request, $article, $citationStyle, $issue)));
472 $citation = str_replace(
'\n',
"\n", $citation);
474 $filename = substr(preg_replace(
'/[^a-zA-Z0-9_.-]/',
'', str_replace(
' ',
'-', $article->getLocalizedTitle())), 0, 60);
476 header(
'Content-Disposition: attachment; filename="' . $filename .
'.' . $styleConfig[
'fileExtension'] .
'"');
477 header(
'Content-Type: ' . $styleConfig[
'contentType']);
485 public function getActions($request, $actionArgs) {
487 $actions = parent::getActions($request, $actionArgs);
489 if (!$this->getEnabled()) {
493 $router = $request->getRouter();
494 import(
'lib.pkp.classes.linkAction.request.AjaxModal');
505 'verb' =>
'settings',
506 'plugin' => $this->getName(),
507 'category' =>
'generic'
510 $this->getDisplayName()
512 __(
'manager.plugins.settings'),
516 array_unshift($actions, $linkAction);
524 public function manage($args, $request) {
525 switch ($request->getUserVar(
'verb')) {
527 $this->
import(
'CitationStyleLanguageSettingsForm');
530 if ($request->getUserVar(
'save')) {
531 $form->readInputData();
532 if ($form->validate()) {
539 return new JSONMessage(
true, $form->fetch($request));
541 return parent::manage($args, $request);
551 public function setPageHandler($hookName, $params) {
553 if ($this->getEnabled() && $page ===
'citationstylelanguage') {
554 $this->
import(
'pages/CitationStyleLanguageHandler');
555 define(
'HANDLER_CLASS',
'CitationStyleLanguageHandler');