;;; This file contains the needed macro to make a bibliography page. 
;;; Licence: GPL 
;;; Authors: Arnaud Legrand (idea, preliminary coding)
;;; Authors: Martin Quinson (proper, clean coding ;)

;;; This file contains two interface levels.

;;;;;;;;;;;;;;;;
;;; Higher level
;;;;;;;;;;;;;;;;

;;; <bibfile::summary file="????.bib">
;;;     Makes a sort of table of content, with clickable links to entries
;;; <bibfile::details file="????.bib" />
;;;     Actually make the entries.

;;; About the bibfile

;;; Be careful, my parser is really not robust. Please be kind and put one
;;; entry per line, no empty line inside the entry, exactly one empty line
;;; between entries, and so on.

;;; Each entry should be valid (ie, "@InProceding" should have "author",
;;;  "title", "booktitle" and "year"...). Make sure to give the key, too.

;;; In addition to the standard fields, you can/should add the following ones:
;;;  - "abstract": abstract in english
;;;  - "resume": abstract in french
;;;  - "ps", "pdf", "ppt": url where this doc can be downloaded
;;;  - "where": where it was submitted

;;;;;;;;;;;;;;;
;;; Lower level (now kinda deprecated)
;;;;;;;;;;;;;;;

;;; The squeleton of such an entry is:
;;; <bib (args)>
;;;   <bib::abstract>english abstract</bib::abstract>
;;;   <bib::resume>french abstract</bib::resume>
;;;   <bib::tex>BibTeX entry</bib::tex>
;;; </bib>

;;; The arguments of the bib tag are used to build a cute box for this entry.
;;; Here is the list:
;;;  title:   title of the paper
;;;  authors: authors of the paper
;;;  where:   where it was submitted
;;;  date:    when it was submitted
;;;  note:    any crappy text you want to put on the left of the title.
;;;           I use it to put a 'back to the top' link.
;;;  ps: pdf: ppt: the url of the document in the specified format
;;;  name:    Build an internal ancor with this name

;;;;;;;;;;;;;;;;;
;;; Perl function bibparse: parse a .bib file
;;;;;;;;;;;;;;;;;
<:
sub bibparse {
    my $file = shift;
    @entries=();
    $entrynb=0;
    open BIBHANDLE,"$file";
    
    foreach $entry ( split(/\n\n/,join("",<BIBHANDLE>)) ) {
      $entry =~ s/\n/§§/g;
      $entry =~ /\@(.*?){(.*)}/m;
      my $type=$1;
      my $entry=$2; $entry =~ s/§§/\n/g;
      ;;; Parse line
      $state=1;  ;;; 0 : wait for next block ; 1 : in block
      $nextname="name";
      $nextctn="";
      foreach $line (split(/\n/,$entry)) {
;;;        print "LINE:$line<br>\n";
	if ($state==0) { ;;; new block
	    $line =~ /^\s*(\S*)\s*=\s*(.*)$/;
	    $nextname = $1;
	    $nextctn = $2;
	    $nextname = lc($nextname);
	} else {
	    $nextctn .= $line;
	}
;;;	print "CTN=$nextctn=CTN<br>\n";
	$state=scalar (split(/\{/ , " $nextctn ")) - 
	       scalar (split(/\}/ , " $nextctn "));
	;;; Still in block if some '{' are open

;;;	print "STATE:$state<br>\n";
	if ($state==0) { ;;;done with this block
	    $nextctn =~ s/,\s*$//;
	    while ($nextctn =~ s/^\s*{(.*)}$/$1/) {}

	    $entries[$entrynb]{"bib$nextname"}="$nextctn";

	    $nextctn =~ s/\\\`(.)/&${1}grave;/g; 
            $nextctn =~ s/\\\'(.)/&${1}acute;/g;
            $nextctn =~ s/{//g;
            $nextctn =~ s/}//g;
            $nextctn =~ s/[~]/ /g;

	    $entries[$entrynb]{"$nextname"}="$nextctn";
	}
      }
      $entries[$entrynb]{'author'} =~ s/ and /, /g; 
      $entries[$entrynb]{'author'} =~ s/, ([^,]*)$/ and $1/;
      $entries[$entrynb ++]{'type'}=$type;
    }
    close BIBHANDLE;
    return \@entries;
}
:>

;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TAG: bibfile::summary
;;;;;;;;;;;;;;;;;;;;;;;;;

<define-tag bibfile::summary whitespace=delete>
  <preserve file><set-var %attributes>
   <perl>{
    <perl:assign $file><get-var file/></perl:assign>
    @file=@{bibparse($file)};

    <perl:print><table border=0></perl:print>
    my(%MONTH) = (
       jan => "Jan.",
       feb => "Febr.",
       mar => "March",
       apr => "April",
       may => "May",
       jun => "June",
       jul => "Jul.",
       aug => "Aug.",
       sep => "Sep.",
       oct => "Oct.",
       nov => "Nov.",
       dec => "Dec.",
    );
    foreach $ref (@file) {
      %entry = %{$ref};
      $where = $when = "";
      $where = $entry{'journal'}   if $entry{'journal'};
      $where = $entry{'booktitle'} if $entry{'booktitle'};
      $where = "Master thesis, $entry{'school'}" if $entry{'school'};

      $when = $entry{'month'};
      $when = lc $when; 
      $when = $MONTH{$when} or $entry{'month'};
      $when = "$when $entry{'year'}";

      <perl:print>
       <tr><td>[<a href=\"#$entry{'name'}\">$entry{'name'}</a>] </td>
       <td>$entry{'author'}. <b>$entry{'title'}.</b> $where, $when.</td></tr>
      </perl:print>
    }
    <perl:print></table></perl:print>
   }</perl>
  <restore file>
</define-tag>

;;;;;;;;;;;;;;;;;;;;;;;;;
;;; TAG: bibfile::details
;;;;;;;;;;;;;;;;;;;;;;;;;
<define-tag bibfile::details whitespace=delete>
  <preserve file><set-var %attributes>
    <perl>{
    <perl:assign $file><get-var file/></perl:assign>
    @file=@{bibparse($file)};

    foreach $ref (@file) {
      %entry = %{$ref};
;;;      foreach (keys %entry) {
;;;	  <perl:print>$_=DEBUT($entry{"$_"})FIN<br>\n</perl:print>
;;;      }
;;;      <perl:print><br></perl:print>;

      <perl:print>
        <a name="$entry{'name'}"></a>
        <table width="100%" border=0 cellspacing=0 cellpadding=0 
               class="navOutline">
         <tr><td>
         <table width="100%" border="0" cellspacing="1" cellpadding="0">
          <tr class="content"><td class="bibTitle" valign=middle>
           <b>$entry{'title'}.</b>
          </td>
          <td class="bibAttr" align=right>
      </perl:print>

      # Output the existing format
       my $first = 1;
       my $res;
       foreach my $format (qw(ps pdf ppt)) {
         if (defined($entry{"$format"}) && $entry{"$format"} =~ m/\S/) {
;;;           if ($first) {
;;;             $first=0;
;;;             $res = "  (";
;;;           } else {
;;;             $res .= ", ";
;;;           }
           $res .= "  <a href=\"".$entry{"bib$format"}."\"><img src=\"Utils/Icons/$format.gif\" width=32 height=32 border=0></a>";
         }
         print "[format=$format=".$entry{"bib$format"}."]" if $debug;
       }
       if (!$first) {
         $res .= ")";
       }
      <perl:print>$res \n</perl:print>

      if ($entry{'where'} ne "") {
        <perl:print><small>  $entry{'where'}.</small></perl:print>
      }
      if ($entry{'year'} ne "") {
        <perl:print><small>  $entry{'year'}.</small></perl:print>
      }      

      <perl:print>;;; End of title line
     </td>
    </tr>
    <tr>
     <td class="bibCtn" colspan="3">
      by <i>$entry{'author'}</i>.<br>
      <table align=left border=0 cellspacing=5>
       <tr>
        <td>  </td>
        <td align=left>
       </perl:print>;;; end of title line

       ;;; Abstract
       if ("$entry{'abstract'}" ne "") {
         <perl:print>
 	   <p gettext=no align=justify><i>$entry{'abstract'}</i></p><br>\n
         </perl:print>
       }

       ;;; Resume
       if ("$entry{'resume'}" ne "") {
         <perl:print>
 	   <p gettext=no align=justify><i>$entry{'resume'}</i></p><br>\n
         </perl:print>
       }

       ;;; BiBTeX
       my $fbegin='<font face=fixed>';
       my $fend='</font>';
       $bibtex="$fbegin\@$entry{'type'}\{$entry{'name'},$fend<br>";
       $bibtex .= "\n<table border=0>\n"; 
       @fields = qw(author institution organisation title school journal 
                    booktitle chapter crossref key edition editor publisher 
                    address note annote howpublished series number volume
                    pages month year);
#       print "XXXXXX ".$entry{'name'}."<br>\n";
       for ($i=0 ; $i < scalar @fields ; $i++) {
          $field=$fields[$i];
          if (defined ($entry{"$field"})){
#	    print "$field<br>\n";
            $bibtex.="<tr><td>  </td>";
	    $bibtex.="<td valign=top>$fbegin $field $fend</td>";
	    $bibtex.="<td valign=top>$fbegin = $fend</td>";
            $bibtex.="<td>$fbegin".'{'.$entry{"bib$field"}.'}';
            $bibtex.=',' unless $field eq "year";
            $bibtex.="$fend</td>\n";
          }
#	  else { print "pas $field<br>\n";}
       }
       $bibtex .= "</table>$fbegin\}$fend";

       ;;; End of entry
       <perl:print> 
        $bibtex
        </td>
       </tr>
      </table>
     </td>
    </tr>
   </table>
  </td>
 </tr>
</table><br><br>
</perl:print>
    }

   }</perl>
  <restore file>
</define-tag>


;;;;;;;;;;;;;;;;;;;;
;;; TAG: bib::resume
;;;;;;;;;;;;;;;;;;;;

<define-tag bib::resume endtag=required whitespace=delete>
  <i>%body</i><br><br>
</define-tag>

;;;;;;;;;;;;;;;;;;;;;;
;;; TAG: bib::abstract
;;;;;;;;;;;;;;;;;;;;;;

<define-tag bib::abstract endtag=required whitespace=delete>
  <i>%body</i><br><br>
</define-tag>

;;;;;;;;;;;;;;;;;
;;; TAG: bib::tex
;;;;;;;;;;;;;;;;;

<define-tag bib::tex endtag=required whitespace=delete>
  <pre>
    <protect pass=3-9>%body</protect>
  </pre>
</define-tag>

;;;;;;;;;;;;
;;; TAG: bib
;;;;;;;;;;;;

<define-tag bib endtag=required whitespace=delete>
<preserve title authors ps pdf ppt date note where name>
<set-var %attributes>
   
<if <get-var name/> <a name="<get-var name />"></a>>
<table width="100%" border=0 cellspacing=0 cellpadding=0 class="navOutline">
 <tr>
  <td>
   <table width="100%" border="0" cellspacing="1" cellpadding="0">
    <tr class="content">
     <td class="bibTitle" valign=middle>
      <b><get-var title />.</b>
     </td>
     <td class="bibAttr" align=right>
<perl>
  # Output the existing format
  my $ps; <perl:assign $ctn{'ps'}> <get-var ps  /></perl:assign>
  my $pdf;<perl:assign $ctn{'pdf'}><get-var pdf /></perl:assign>
  my $ppt;<perl:assign $ctn{'ppt'}><get-var ppt /></perl:assign>

  my $first = 1;
  my $res;
  foreach my $format (qw(ps pdf ppt)) {
    if (defined($ctn{"$format"}) && $ctn{"$format"} =~ m/\S/) {
      if ($first) {
        $first=0;
        $res = "  (";
      } else {
        $res .= ", ";
      }
      $res .= "<a href=\"".$ctn{"$format"}."\">$format</a>";
    }
    print "[format=$format=".$ctn{"$format"}."]" if $debug;
  }
  if (!$first) {
    $res .= ")";
  }
  <perl:print>$res \n</perl:print>
</perl>

<if <get-var where>
 <small>  <get-var where>.</small>
>
<if <get-var date>
 <small>  <get-var date>.</small>
>

     </td>
    </tr>
    <tr>
     <td class="bibCtn" colspan="3">
      by <i><get-var authors /></i><br>
      <get-var note />
      <table align=left border=0 cellspacing=5>
       <tr>
        <td>  </td>
        <td align=left>
         <p gettext=no align=justify>
          <perl>{<perl:assign>%body</perl:assign>}</perl>
        </td>
       </tr>
      </table>
     </td>
    </tr>
   </table>
  </td>
 </tr>
</table><br><br>
<restore title authors ps pdf ppt date note where name>
</define-tag>