gl-website-deployer/publi_bib.php
2024-11-23 21:11:41 +01:00

168 lines
5.7 KiB
PHP

<?php
use RenanBr\BibTexParser\Listener;
use RenanBr\BibTexParser\Parser;
use RenanBr\BibTexParser\Processor;
use RenanBr\BibTexParser\Processor\NamesProcessor;
require dirname(__FILE__).'/common.php';
function removeBoundingBraces($str) {
// Trim whitespace first
$str = trim($str);
// Check if string starts with { and ends with }
if (strlen($str) >= 2) {
// Remove opening brace if it exists
if ($str[0] === '{') {
$str = substr($str, 1);
}
// After removing first brace, get new length
$length = strlen($str);
// Remove closing brace if it exists
if ($length > 0 && $str[$length - 1] === '}') {
$str = substr($str, 0, -1);
}
}
return $str;
}
function expandJournalAbbreviation($abbrev) {
// Define mapping of abbreviations (including LaTeX macros) to full journal names
$journalMap = [
// Standard abbreviations
'AJ' => 'The Astronomical Journal',
'ApJ' => 'The Astrophysical Journal',
'ApJL' => 'The Astrophysical Journal Letters',
'ApJS' => 'The Astrophysical Journal Supplement Series',
'ARA&A' => 'Annual Review of Astronomy and Astrophysics',
'ARAA' => 'Annual Review of Astronomy and Astrophysics',
'ARAP' => 'Annual Review of Astronomy and Astrophysics',
'MNRAS' => 'Monthly Notices of the Royal Astronomical Society',
'PASP' => 'Publications of the Astronomical Society of the Pacific',
'PASJ' => 'Publications of the Astronomical Society of Japan',
'A&A' => 'Astronomy & Astrophysics',
'A&AS' => 'Astronomy & Astrophysics Supplement Series',
// LaTeX macros
'\aj' => 'The Astronomical Journal',
'\apj' => 'The Astrophysical Journal',
'\apjl' => 'The Astrophysical Journal Letters',
'\apjlett' => 'The Astrophysical Journal Letters',
'\apjs' => 'The Astrophysical Journal Supplement Series',
'\apjsupp' => 'The Astrophysical Journal Supplement Series',
'\araa' => 'Annual Review of Astronomy and Astrophysics',
'\mnras' => 'Monthly Notices of the Royal Astronomical Society',
'\pasp' => 'Publications of the Astronomical Society of the Pacific',
'\pasj' => 'Publications of the Astronomical Society of Japan',
'\aap' => 'Astronomy & Astrophysics',
'\aaps' => 'Astronomy & Astrophysics Supplement Series',
'\aapr' => 'Astronomy & Astrophysics Reviews',
'\solphys' => 'Solar Physics',
'\pasa' => 'Publications of the Astronomical Society of Australia',
'\jcap' => 'Journal of Cosmology and Astroparticle Physics',
'\nat' => 'Nature',
'\science' => 'Science',
'\icarus' => 'Icarus',
'\prd' => 'Physical Review D',
'\prl' => 'Physical Review Letters',
'\grl' => 'Geophysical Research Letters',
'\jgr' => 'Journal of Geophysical Research',
'\baas' => 'Bulletin of the American Astronomical Society',
'\physrep' => 'Physics Reports',
'\apss' => 'Astrophysics and Space Science'
];
// Clean the input
$abbrev = trim($abbrev);
// Handle case sensitivity for standard abbreviations
if (!str_starts_with($abbrev, '\\') && isset($journalMap[strtoupper($abbrev)])) {
$abbrev = strtoupper($abbrev);
}
// Return the full name if found, otherwise return original abbreviation
return $journalMap[$abbrev] ?? $abbrev;
}
// Function to process text that might contain multiple journal references
function expandJournalReferences($text) {
// First handle LaTeX macros that might be followed by spaces or punctuation
$pattern = '/\\\\[a-zA-Z]+/';
$text = preg_replace_callback($pattern, function($matches) {
return expandJournalAbbreviation($matches[0]);
}, $text);
// Then handle standard abbreviations
$words = explode(' ', $text);
$result = [];
foreach ($words as $word) {
if (!str_starts_with($word, 'The ')) { // Avoid re-processing already expanded journals
$result[] = expandJournalAbbreviation($word);
} else {
$result[] = $word;
}
}
return implode(' ', $result);
}
$m = setup_mustache();
// Create and configure a Listener
$listener = new Listener();
$listener->addProcessor(new Processor\TagNameCaseProcessor(CASE_LOWER));
$listener->addProcessor(new NamesProcessor());
$listener->addProcessor(static function (array $entry) {
$entry['title'] = removeBoundingBraces($entry['title']);
if (isset($entry['journal'])) {
$entry['journal'] = expandJournalReferences($entry['journal']);
}
return $entry;
});
// Create a Parser and attach the listener
$parser = new Parser();
$parser->addListener($listener);
// Parse the content, then read processed data from the Listener
try {
$parser->parseFile('assets/bib/export-bibtex.bib');
$entries = $listener->export();
$tpl = $m->loadTemplate("publi_bib_html");
echo $tpl->render(
array(
'ROOT_URL' => $iap_root,
'title'=>'Guilhem Lavaux\'s publications',
'publi'=>$entries,
'configure_script'=>[
'MathJax = {
tex: {
inlineMath: [[\'$\', \'$\'], [\'\\\\(\', \'\\\\)\']]
}
};
'
],
'external_scripts'=>[
'src="https://polyfill.io/v3/polyfill.min.js?features=es6"',
'id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"'
],
'bar' => 'baz'));
} catch (Exception $e) {
echo $e->getMessage() . "<br/>";
}