From f72eeecac27577a6823f4984812ec5883f2a64f8 Mon Sep 17 00:00:00 2001 From: Matthieu Guillaumin Date: Thu, 28 Feb 2013 18:31:59 +0100 Subject: [PATCH] icons --- bibtexbrowser.php | 108 +++++++++++++++++++++++++++++++-------- icons/bib.png | Bin 0 -> 455 bytes icons/doi.png | Bin 0 -> 542 bytes icons/google_scholar.png | Bin 0 -> 11117 bytes icons/pdf.png | Bin 0 -> 567 bytes icons/slides.png | Bin 0 -> 451 bytes icons/url.png | Bin 0 -> 7696 bytes 7 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 icons/bib.png create mode 100644 icons/doi.png create mode 100644 icons/google_scholar.png create mode 100644 icons/pdf.png create mode 100644 icons/slides.png create mode 100644 icons/url.png diff --git a/bibtexbrowser.php b/bibtexbrowser.php index 45f7513..0683604 100644 --- a/bibtexbrowser.php +++ b/bibtexbrowser.php @@ -117,6 +117,13 @@ define('BIBTEXBROWSER','v20121205'); @define('METADATA_DC',true); @define('METADATA_EPRINTS',false); +/* to use provided icons, uncomment the next three lines */ +function e2i($e) { return "icons/".$e.".png"; } +$icons = json_encode(array("pdf" => e2i("pdf"), "bib" => e2i("bib"), "doi" => e2i("doi"), "url" => e2i("url"), "slides" => e2i("slides"), "poster" => e2i("slides"), "gsc" => e2i("google_scholar") )); +@define('ICONS',$icons); +@define('ICONS','[]'); +@define('Q_ICONS','icons'); + // in embedded mode, we still need a URL for displaying bibtex entries alone // this is usually resolved to bibtexbrowser.php // but can be overridden in bibtexbrowser.local.php @@ -147,6 +154,7 @@ See also zetDB(). function setDB() { list($db, $parsed, $updated, $saved) = _zetDB(@$_GET[Q_FILE]); $_GET[Q_DB] = $db; + $_GET[Q_ICONS] = (array) json_decode(ICONS); // not sure this is the best place for this action return $updated; } @@ -240,7 +248,7 @@ function _zetDB($bibtex_filenames) { && is_readable($compiledbib) && filesize($compiledbib)>0 ) { - $f = fopen($compiledbib,'r'); + $f = fopen($compiledbib,'r+'); //we use a lock to avoid that a call to bibbtexbrowser made while we write the object loads an incorrect object if (flock($f,LOCK_EX)) { $s = filesize($compiledbib); @@ -999,12 +1007,71 @@ class BibEntry { return "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']).'/'.$this->getURL(); } - /** returns a "[pdf]" link if relevant */ + /** Read the bibtex field $bibfield and return a link with icon or text + * e.g. given the bibtex entry: @article{myarticle, pdf={myarticle.pdf}}, + * $bibtexentry->getLink('pdf') creates a link to myarticle.pdf using the text '[pdf]' or the pdf icon specified in the bibtex file (cf. getIconOrTxt) + * getLink($bibfield,$icon,$def) specifies the icon key $icon and default text $def. + */ + function getLink($bibfield,$icon=NULL,$def=NULL) { + if ($icon==NULL) { $icon=$bibfield; } + $str = $this->getIconOrTxt($icon,$def); + if ($this->hasField($bibfield)) { + return ' '.$str.''; + } + return ''; + } + + /* a few specializations of getLink */ + + /** returns a "[url]" link if relevant. modified to exploit the new method, while keeping backward compatibility */ function getUrlLink() { - if ($this->hasField('url')) return ' [pdf]'; + return $this->getLink('url'); + } + + /** returns a "[bib]" link if relevant */ + function getBibLink() { + $bibstr = $this->getIconOrTxt('bib'); + $href = 'href="'.$this->getURL().'"'; + $link = "getKey()."\" {$href}>$bibstr"; + return $link; + } + + + /** DOI are a special kind of links, where the url depends on the doi */ + function getDoiLink() { + $str = $this->getIconOrTxt('doi'); + if ($this->hasField('doi')) { + return ' '.$str.''; + } + return ''; + } + + /** GS are a special kind of links, where the url depends on the google scholar id */ + function getGSLink() { + $str = $this->getIconOrTxt('gsc','cites'); + // Google Scholar ID + if ($this->hasField('gsid')) { + return ' '.$str.''; + } return ''; } + /** replace [$ext] with an icon whose url is defined in a string + * e.g. getIconOrTxt('pdf') will show the icon defined in $_GET[Q_ICONS]['pdf'] or print '[pdf]' + * or getIconOrTxt('pdf','paper') will show the icon defined by $_GET[Q_ICONS]['pdf'] or print '[paper]' + * The replacement text is also used if the url does not point to a valid file (using the "alt" property of the "img" html tag) + */ + function getIconOrTxt($ext,$def=NULL) { + if ($def==NULL) { $def=$ext; } + $icons = $_GET[Q_ICONS]; + if ( array_key_exists($ext,$icons) ) { + $str='['.$def.']'; + } else { + $str='['.$def.']'; + } + return $str; + } + /** Reruns the abstract */ function getAbstract() { if ($this->hasField('abstract')) return $this->getField('abstract'); @@ -1307,25 +1374,22 @@ class BibEntry { echo ''; echo bib2html($this); - $href = 'href="'.$this->getURL().'"'; - - if (BIBTEXBROWSER_BIBTEX_LINKS) { - // we add biburl and title to be able to retrieve this important information - // using Xpath expressions on the XHTML source - echo " getKey()."\" {$href}>[bibtex]"; - } - + // we add biburl and title to be able to retrieve this important information + // using Xpath expressions on the XHTML source + echo $this->getBibLink(); + // returns an empty string if no pdf present + echo $this->getLink('pdf'); // returns an empty string if no url present - echo $this->getUrlLink(); + echo $this->getLink('url'); + // returns an empty string if no slides present + echo $this->getLink('slides'); + // returns an empty string if no poster present + echo $this->getLink('poster'); + // Google Scholar ID. empty string if no gsid present + echo $this->getGSLink(); + // returns an empty string if no doi present + echo $this->getDoiLink(); - if ($this->hasField('doi')) { - echo ' [doi]'; - } - - // Google Scholar ID - if ($this->hasField('gsid')) { - echo ' [cites]'; - } echo "\n"; } @@ -2988,6 +3052,8 @@ function bibtexbrowserDefaultCSS() { .btb-nav { text-align: right; } +.bibitem img.icon { height: 1em; } + main(); -?> \ No newline at end of file +?> diff --git a/icons/bib.png b/icons/bib.png new file mode 100644 index 0000000000000000000000000000000000000000..976411ea778c0c8bee28064f05f7aea57787fa62 GIT binary patch literal 455 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 bJPO>!(boyp&l__8`~a&6RFkWbF$wxVS`WRc literal 0 HcmV?d00001 diff --git a/icons/pdf.png b/icons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..fbfb11cf3f11a97f5202a80aa5d3341a60a9bcba GIT binary patch literal 567 zcmV-70?7S|P)+AID>htI4@a5(2;o|MK$r@bLHS?DXd5@a#%3@3E%o>G0_2@8jd^^*bB$Qa1HQDC&D^=(e-1|!^erosK+xDK4+uP;j)hPw`f^(KJR9-x_VxAr+uP{a*yj6~hVHzx)z#$E(%}1lY4P##{{H{k z+UL&B-OS9}{r&&>`Tp0}<;ls~+Ni75yv6wV{?pUp{@Bv#>GB(*6&?Tp00DGTPE!Ct z=GbNc006g1L_t(|+D**o7QsLehT)YAc9V?|MDINW(R+&)-TmJTlI3`RK4<1b=$*mh z5zBZy6l?mVKe+;!_!g$doyi42$CgO>cg{-(^rIzE^>k*iNts(5?C0z=!`b}1(S=@Lm9@dpfqFx4LQ87Pe$9bmsayd_Lbb*qnM!A}Imj1ezYP$H z#)uG#Cww*l=L#q!7!t#h`T=lr9xoQL70(Y)*K0-AbW|YuPgfCqvtc<)tsx|XUAvrZq@wSJ{R%-@jc24>GJna6}54kcx3$f&8ZyLNp<^Y3uvFd z6}5NUriLG^=^HsY6|RLv3%p)+qs3*p^wM9aX0a{|ZjJ~)s;08*uEFe=28uJ)G#b8C zJ!Cj?YS+7U-8tp?&pA6&?q`>=zx?*8O0#47ZlKah_ildfRQT+6V8;iy9c!i=A2=m6 q!76yipZ;#)b@P5cnW}O19q$f3g#)?<_Eo?TX7F_Nb6Mw<&;$Tm->J(0 literal 0 HcmV?d00001 diff --git a/icons/url.png b/icons/url.png new file mode 100644 index 0000000000000000000000000000000000000000..716b280da8778150c76788f31d09aa0a3e52242d GIT binary patch literal 7696 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 KMNUMnLSTY9_x0fb literal 0 HcmV?d00001