Blame templates/html/bib2xhtml.pl

Packit 1c1d7e
#
Packit 1c1d7e
# Below is a stripped down version of bib2xhtml used by doxygen.
Packit 1c1d7e
# For the full version see http://www.spinellis.gr/sw/textproc/bib2xhtml/
Packit 1c1d7e
#
Packit 1c1d7e
# Convert from bibtex to XHTML.
Packit 1c1d7e
#
Packit 1c1d7e
# (C) Copyright 1995, 1996 David Hull.
Packit 1c1d7e
# (David Hull / hull@cs.uiuc.edu / http://www.uiuc.edu/ph/www/dlhull)
Packit 1c1d7e
#
Packit 1c1d7e
# (C) Copyright 2002-2010 Diomidis Spinellis
Packit 1c1d7e
# http://www.spinellis.gr
Packit 1c1d7e
#
Packit 1c1d7e
# This program is free software.  You can redistribute it and/or modify
Packit 1c1d7e
# it under the terms of the GNU General Public License.  See the
Packit 1c1d7e
# files README and COPYING for details.
Packit 1c1d7e
#
Packit 1c1d7e
# This source code contains UTF-8 characters.  You might want to use
Packit 1c1d7e
# an appropriate editor, if you want to view/modify the LaTeX to Unicode
Packit 1c1d7e
# substitution commands.
Packit 1c1d7e
#
Packit 1c1d7e
Packit 1c1d7e
use Getopt::Std;
Packit 1c1d7e
use open IO => ':crlf';
Packit 1c1d7e
$label_styles{'numbered'} = 	$LABEL_NUMBERED = 	2;
Packit 1c1d7e
$list_start[$LABEL_NUMBERED] = 'dl class="citelist"';
Packit 1c1d7e
$list_end[$LABEL_NUMBERED] = "/dl";
Packit 1c1d7e
@tmpfiles = ();
Packit 1c1d7e
sub html_ent {
Packit 1c1d7e
	s/\\i\b/i/g;
Packit 1c1d7e
	s/\\\'(\001\d+)\{([AEIOUaeiou])\1\}/&$2acute;/gs;
Packit 1c1d7e
	s/\\\'([AEIOUaeiou])/&$1acute;/g;
Packit 1c1d7e
	s/\\\`(\001\d+)\{([AEIOUaeiou])\1\}/&$2grave;/gs;
Packit 1c1d7e
	s/\\\`([AEIOUaeiou])/&$1grave;/g;
Packit 1c1d7e
	s/\\\"(\001\d+)\{([AEIOUaeiouy])\1\}/&$2uml;/gs;
Packit 1c1d7e
	s/\\\"([AEIOUaeiouy])/&$1uml;/g;
Packit 1c1d7e
	s/\\\~(\001\d+)\{([ANOano])\1\}/&$2tilde;/gs;
Packit 1c1d7e
	s/\\\~([ANOano])/&$1tilde;/g;
Packit 1c1d7e
	s/\\\^(\001\d+)\{([AEIOUaeiou])\1\}/&$2circ;/gs;
Packit 1c1d7e
	s/\\\^([AEIOUaeiou])/&$1circ;/g;
Packit 1c1d7e
	s/\\c(\001\d+)\{([Cc])\1\}/&$2cedil;/gs;
Packit 1c1d7e
	s/\\u(\001\d+)\{(.)\1\}/$2/gs;
Packit 1c1d7e
	s/\\v(\001\d+)\{(.)\1\}/$2/gs;
Packit 1c1d7e
	s/\\([lL])\b/$1/g;
Packit 1c1d7e
	s/\\\=(\001\d+)\{(.)\1\}/$2/gs;
Packit 1c1d7e
	s/\\\=(.)/$1/g;
Packit 1c1d7e
	s/\\\.(\001\d+)\{(.)\1\}/$2/gs;
Packit 1c1d7e
	s/\\\.(.)/$1/g;
Packit 1c1d7e
	s/\\([Oo])\b\s*/&$1slash;/g;
Packit 1c1d7e
	s/\\AA\b\s*/Å/g;
Packit 1c1d7e
	s/\\aa\b\s*/å/g;
Packit 1c1d7e
	s/\\AE\b\s*/Æ/g;
Packit 1c1d7e
	s/\\ae\b\s*/æ/g;
Packit 1c1d7e
	s/\\ss\b\s*/ß/g;
Packit 1c1d7e
	s/\\S\b\s*/§/g;
Packit 1c1d7e
	s/\\P\b\s*/¶/g;
Packit 1c1d7e
	s/\\pounds\b\s*/£/g;
Packit 1c1d7e
	s/\?\`/¿/g;
Packit 1c1d7e
	s/\!\`/¡/g;
Packit 1c1d7e
	s/\-\-\-/—/g;
Packit 1c1d7e
	s/([^\!])\-\-([^\>])/$1–$2/g;
Packit 1c1d7e
	s/\\([aA]lpha)\b/&$;;/g;
Packit 1c1d7e
	s/\\([bB]eta)\b/&$;;/g;
Packit 1c1d7e
	s/\\([gG]amma)\b/&$;;/g;
Packit 1c1d7e
	s/\\([dD]elta)\b/&$;;/g;
Packit 1c1d7e
	s/\\varepsilon\b/ε/g;
Packit 1c1d7e
	s/\\([eE]psilon)\b/&$;;/g;
Packit 1c1d7e
	s/\\([zZ]eta)\b/&$;;/g;
Packit 1c1d7e
	s/\\([eE]ta)\b/&$;;/g;
Packit 1c1d7e
	s/\\([tT]heta)\b/&$;;/g;
Packit 1c1d7e
	s/\\vartheta\b/θ/g;
Packit 1c1d7e
	s/\\([iI]ota)\b/&$;;/g;
Packit 1c1d7e
	s/\\([kK]appa)\b/&$;;/g;
Packit 1c1d7e
	s/\\([lL]ambda)\b/&$;;/g;
Packit 1c1d7e
	s/\\([mM]u)\b/&$;;/g;
Packit 1c1d7e
	s/\\([nN]u)\b/&$;;/g;
Packit 1c1d7e
	s/\\([xX]i)\b/&$;;/g;
Packit 1c1d7e
	s/\\([oO]micron)\b/&$;;/g;
Packit 1c1d7e
	s/\\([pP]i)\b/&$;;/g;
Packit 1c1d7e
	s/\\varpi\b/π/g;
Packit 1c1d7e
	s/\\([rR]ho)\b/&$;;/g;
Packit 1c1d7e
	s/\\varrho\b/ρ/g;
Packit 1c1d7e
	s/\\([sS]igma)\b/&$;;/g;
Packit 1c1d7e
	s/\\varsigma\b/ς/g;
Packit 1c1d7e
	s/\\([tT]au)\b/&$;;/g;
Packit 1c1d7e
	s/\\([uU]psilon)\b/&$;;/g;
Packit 1c1d7e
	s/\\([pP]hi)\b/&$;;/g;
Packit 1c1d7e
	s/\\varphi\b/φ/g;
Packit 1c1d7e
	s/\\([cC]hi)\b/&$;;/g;
Packit 1c1d7e
	s/\\([pP]si)\b/&$;;/g;
Packit 1c1d7e
	s/\\([oO]mega)\b/&$;;/g;
Packit 1c1d7e
	s/\\S\b/§/g;
Packit 1c1d7e
	s/^\\circ\b/°/g;
Packit 1c1d7e
	s/\\infty\b/∞/g;
Packit 1c1d7e
	s/\\emptyset\b/∅/g;
Packit 1c1d7e
	s/\\pm\b/±/g;
Packit 1c1d7e
	s/\\times\b/×/g;
Packit 1c1d7e
	s/\\cdot\b/⋅/g;
Packit 1c1d7e
	s/\\partial\b/∂/g;
Packit 1c1d7e
	s/\\nabla\b/∇/g;
Packit 1c1d7e
	s/\\surd\b/√/g;
Packit 1c1d7e
	s/\\perp\b/⊥/g;
Packit 1c1d7e
	s/\\sum\b/∑/g;
Packit 1c1d7e
	s/\\int\b/∫/g;
Packit 1c1d7e
	s/\\prod\b/∏/g;
Packit 1c1d7e
	s/\\sim\b/∼/g;
Packit 1c1d7e
	s/\\approx\b/≈/g;
Packit 1c1d7e
	s/\\ne\b/≠/g;
Packit 1c1d7e
	s/\\equiv\b/≡/g;
Packit 1c1d7e
	s/\\propto\b/∝/g;
Packit 1c1d7e
	s/\\le\b/≤/g;
Packit 1c1d7e
	s/\\ge\b/≥/g;
Packit 1c1d7e
	s/\\leftarrow\b/←/g;
Packit 1c1d7e
	s/\\rightarrow\b/→/g;
Packit 1c1d7e
	s/\\in\b/∈/g;
Packit 1c1d7e
	s/\\notin\b/∉/g;
Packit 1c1d7e
	s/\\lceil\b/⌈/g;
Packit 1c1d7e
	s/\\rceil\b/⌉/g;
Packit 1c1d7e
	s/\\lfloor\b/⌊/g;
Packit 1c1d7e
	s/\\rfloor\b/⌋/g;
Packit 1c1d7e
}
Packit 1c1d7e
foreach (@ARGV) {
Packit 1c1d7e
  if (/\.bib$/) {
Packit 1c1d7e
    $bibfile = $_;
Packit 1c1d7e
    $bibfile =~ s/\.bib$//;
Packit 1c1d7e
    push(@bibfiles,$bibfile);
Packit 1c1d7e
  } else {
Packit 1c1d7e
    $htmlfile = $_;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
exit(1) unless defined($htmlfile);
Packit 1c1d7e
$bibdatacmd="\\bibdata{".join(',',@bibfiles)."}";
Packit 1c1d7e
$label_style = $LABEL_NUMBERED;
Packit 1c1d7e
$bstfile = "doxygen";
Packit 1c1d7e
umask(077);
Packit 1c1d7e
open(HTMLFILE,">$htmlfile$$");
Packit 1c1d7e
if (open(OHTMLFILE, "$htmlfile")) {
Packit 1c1d7e
    $mode = (stat OHTMLFILE)[2] & 0xfff;
Packit 1c1d7e
} else {
Packit 1c1d7e
  print "Error opening $htmlfile\n";
Packit 1c1d7e
  exit(1);
Packit 1c1d7e
}
Packit 1c1d7e
$beginstring = "";
Packit 1c1d7e
$endstring = "";
Packit 1c1d7e
@citations = ();
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<OHTMLFILE>) {
Packit 1c1d7e
  print HTMLFILE;
Packit 1c1d7e
  last loop if m/^$beginstring$/;
Packit 1c1d7e
}
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<OHTMLFILE>) {
Packit 1c1d7e
  print HTMLFILE;
Packit 1c1d7e
  last loop if m/^$endstring$/;
Packit 1c1d7e
  push(@citations, $2) if m/^([^\\]*)?(.+\})(.*)?$/;
Packit 1c1d7e
}
Packit 1c1d7e
push(@citations, $bibdatacmd);
Packit 1c1d7e
$auxfile = "bib$$";
Packit 1c1d7e
push(@tmpfiles, "$auxfile.aux");
Packit 1c1d7e
open(AUXFILE, ">$auxfile" . ".aux");
Packit 1c1d7e
print AUXFILE "\\relax\n\\bibstyle{$bstfile}\n";
Packit 1c1d7e
foreach $citation (@citations) {
Packit 1c1d7e
  print AUXFILE "$citation\n";
Packit 1c1d7e
}
Packit 1c1d7e
close(AUXFILE);
Packit 1c1d7e
push(@tmpfiles, "$auxfile.blg");
Packit 1c1d7e
push(@tmpfiles, "$auxfile.bbl");
Packit 1c1d7e
`bibtex $auxfile 2>&1;;
Packit 1c1d7e
if ($?==-1)
Packit 1c1d7e
{
Packit 1c1d7e
  print "bibtex command failed: $!\n";
Packit 1c1d7e
}
Packit 1c1d7e
$beginstring = "";
Packit 1c1d7e
$endstring = "";
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<OHTMLFILE>) {
Packit 1c1d7e
  last loop if m/^$beginstring$/;
Packit 1c1d7e
  print HTMLFILE;
Packit 1c1d7e
}
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<OHTMLFILE>) {
Packit 1c1d7e
  last loop if m/^$endstring$/;
Packit 1c1d7e
}
Packit 1c1d7e
print HTMLFILE "$beginstring\n";
Packit 1c1d7e
$t = $auxfile . ".bbl";
Packit 1c1d7e
$/ = "";
Packit 1c1d7e
open(BBLFILE, "<$t") || die "error opening $t: $!\n";
Packit 1c1d7e
$nentry = 0;
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<BBLFILE>) {
Packit 1c1d7e
    if (($nentry == 0) && (m/^#/)) {
Packit 1c1d7e
	if ((m/#\s*label-style:\s*(\S+)/) && (! defined $label_style)) {
Packit 1c1d7e
	    $label_style = $label_styles{$1};
Packit 1c1d7e
	    if (! defined $label_style) {
Packit 1c1d7e
		print STDERR "label style unknown: \n";
Packit 1c1d7e
		next loop;
Packit 1c1d7e
	    }
Packit 1c1d7e
	}
Packit 1c1d7e
	next loop;
Packit 1c1d7e
    }
Packit 1c1d7e
    $nentry++;
Packit 1c1d7e
    ($bcite, $blabel) = m+
\[([^\]]*)\]
+;
Packit 1c1d7e
    $blabel = "$nentry";
Packit 1c1d7e
    $bibcite{$bcite} = $blabel;
Packit 1c1d7e
}
Packit 1c1d7e
close(BBLFILE);
Packit 1c1d7e
$label_style = $LABEL_DEFAULT if (! defined $label_style);
Packit 1c1d7e
$list_start = $list_start[$label_style];
Packit 1c1d7e
$list_end = $list_end[$label_style];
Packit 1c1d7e
print HTMLFILE "<$list_start>\n\n";
Packit 1c1d7e
open(BBLFILE, "<$t") || die "error opening $t: $!\n";
Packit 1c1d7e
$nentry = 0;
Packit 1c1d7e
loop:
Packit 1c1d7e
while (<BBLFILE>) {
Packit 1c1d7e
    next loop if (($nentry == 0) && (m/^#/));
Packit 1c1d7e
    $nentry++;
Packit 1c1d7e
    s/\\\{/\002/g;
Packit 1c1d7e
    s/\\\}/\003/g;
Packit 1c1d7e
    s/\\\$/\004/g;
Packit 1c1d7e
    {
Packit 1c1d7e
	local ($c, $l, $z) = (0, 0, ());
Packit 1c1d7e
	s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;
Packit 1c1d7e
    }
Packit 1c1d7e
    s/\%\n//g;
Packit 1c1d7e
    s/(\.(<\/cite>|<\/a>|\')+)\./$1/g;
Packit 1c1d7e
    s:(
\[)[^\]]*(\]
):$1$nentry$2:;
Packit 1c1d7e
    while (m/(\\(cite(label)?)(\001\d+)\{([^\001]+)\4\})/) {
Packit 1c1d7e
	$old = $1;
Packit 1c1d7e
	$cmd = $2;
Packit 1c1d7e
	$doxref = defined($3);
Packit 1c1d7e
	$bcite = $5;
Packit 1c1d7e
	if (! defined $bibcite{$bcite}) {
Packit 1c1d7e
	    $blabel = " [" . $bcite . "]";
Packit 1c1d7e
	} elsif ($doxref) {
Packit 1c1d7e
	    $blabel = " [" . $bibcite{$bcite} . "]<\/a>";
Packit 1c1d7e
	} else {
Packit 1c1d7e
	    $blabel = " [" . $bibcite{$bcite} . "]";
Packit 1c1d7e
	}
Packit 1c1d7e
	$old =~ s/(\W)/\\$1/g;
Packit 1c1d7e
	s/\s*$old/$blabel/g;
Packit 1c1d7e
    }
Packit 1c1d7e
    s/In ()([^\[]+) \[(\2)/In $1\[$2/;
Packit 1c1d7e
    s/\\htmladdnormallink(foot)?(\001\d+)\{([^\001]+)\2\}(\001\d+)\{([^\001]+)\4\}/$3<\/a>/gs;
Packit 1c1d7e
    s/\&/\005/g;
Packit 1c1d7e
    s/\\?&/&/g;
Packit 1c1d7e
    s/\005/&/g;
Packit 1c1d7e
    html_ent();
Packit 1c1d7e
    while (m/\\char([\'\"]?[0-9a-fA-F]+)/) {
Packit 1c1d7e
	$o = $r = $1;
Packit 1c1d7e
	if ($r =~ s/^\'//) {
Packit 1c1d7e
	    $r = oct($r);
Packit 1c1d7e
	} elsif ($r =~ s/^\"//) {
Packit 1c1d7e
	    $r = hex($r);
Packit 1c1d7e
	}
Packit 1c1d7e
	s/\\char$o\s*/&#$r;/g;
Packit 1c1d7e
    }
Packit 1c1d7e
    s/{\\etalchar\001(\d+)\{(.)}\001\1\}/$2/g;
Packit 1c1d7e
    s/\\par\b/

/g;

Packit 1c1d7e
    s/\\url(\001\d+)\{(.*)\1\}/$2<\/a>/gs;
Packit 1c1d7e
    s/\\href(\001\d+)\{(.*)\1\}(\001\d+)\{([^\001]*)\3\}/$4<\/a>/gs;
Packit 1c1d7e
    s/\\href(\001\d+)\{(.*)\1\}/$2<\/a>/gs;
Packit 1c1d7e
    s/(\001\d+)\{\\rm\s+(.*)\1\}/$2/gs;
Packit 1c1d7e
    s/\\textrm(\001\d+)\{(.*)\1\}/$2/gs;
Packit 1c1d7e
    s/(\001\d+)\{\\em\s+(.*)\1\}/$2<\/em>/gs;
Packit 1c1d7e
    s/(\001\d+)\{\\it\s+(.*)\1\}/$2<\/i>/gs;
Packit 1c1d7e
    s/(\001\d+)\{\\bf\s+(.*)\1\}/$2<\/b>/gs;
Packit 1c1d7e
    s/(\001\d+)\{\\tt\s+(.*)\1\}/<tt>$2<\/tt>/gs;
Packit 1c1d7e
    s/\\emph(\001\d+)\{(.*)\1\}/$2<\/em>/gs;
Packit 1c1d7e
    s/\\textit(\001\d+)\{(.*)\1\}/$2<\/i>/gs;
Packit 1c1d7e
    s/\\textbf(\001\d+)\{(.*)\1\}/$2<\/b>/gs;
Packit 1c1d7e
    s/\\texttt(\001\d+)\{(.*)\1\}/<tt>$2<\/tt>/gs;
Packit 1c1d7e
    s/\\mathrm(\001\d+)\{(.*)\1\}/$2/gs;
Packit 1c1d7e
    s/\\mathnormal(\001\d+)\{(.*)\1\}/$2/gs;
Packit 1c1d7e
    s/\\mathsf(\001\d+)\{(.*)\1\}/$2/gs;
Packit 1c1d7e
    s/\\mathbf(\001\d+)\{(.*)\1\}/$2<\/b>/gs;
Packit 1c1d7e
    s/\\mathcal(\001\d+)\{(.*)\1\}/$2<\/i>/gs;
Packit 1c1d7e
    s/\\mathit(\001\d+)\{(.*)\1\}/$2<\/i>/gs;
Packit 1c1d7e
    s/\\mathtt(\001\d+)\{(.*)\1\}/<tt>$2<\/tt>/gs;
Packit 1c1d7e
    s/\\bibxhtmlname(\001\d+)\{(.*)\1\}/$2/ges;
Packit 1c1d7e
    sub domath {
Packit 1c1d7e
      local($t) = @_;
Packit 1c1d7e
      $t =~ s/\^(\001\d+)\{\\circ\1\}/\&\#176;/gs;
Packit 1c1d7e
      $t =~ s/\^\\circ/\&\#176;/g;
Packit 1c1d7e
      $t =~ s/\^(\001\d+)\{(.*)\1\}/<sup>$2<\/sup>/gs;
Packit 1c1d7e
      $t =~ s/\^(\w)/<sup>$1<\/sup>/g;
Packit 1c1d7e
      $t =~ s/\_(\001\d+)\{(.*)\1\}/<sub>$2<\/sub>/gs;
Packit 1c1d7e
      $t =~ s/\_(\w)/<sub>$1<\/sub>/g;
Packit 1c1d7e
      $t;
Packit 1c1d7e
    }
Packit 1c1d7e
    s/(\$([^\$]+)\$)/&domath($2)/ge;
Packit 1c1d7e
    s/(\\\((([^\\]|\\[^\(\)])+)\\\))/&domath($2)/ge;
Packit 1c1d7e
    s/\\mbox(\001\d+)\{(.*)\1\}/$2/gs;
Packit 1c1d7e
    while (s/(\
Packit 1c1d7e
    s/([^\\])~/$1 /g;
Packit 1c1d7e
    s/\\\,/ /g;
Packit 1c1d7e
    s/\\ldots\b/…/g;
Packit 1c1d7e
    s/\\dots\b/…/g;
Packit 1c1d7e
    s/\005/\~/g;
Packit 1c1d7e
    s/\\ / /g;
Packit 1c1d7e
    s/\\textasciitilde\b\s*/~/g;
Packit 1c1d7e
    s/\\([\#\&\%\~\_\^\|])/$1/g;
Packit 1c1d7e
    s/\\\W//g;
Packit 1c1d7e
    s/\001(\d+)\{\\[A-Za-z]+\001(\d+)\{([^\001]*)\001\2\}\001\1\}/$3/g;
Packit 1c1d7e
    s/\\([A-Za-z]+)/ $1 /g;
Packit 1c1d7e
    s+In ++;
Packit 1c1d7e
    s/\001\d+[\{\}]//gs;
Packit 1c1d7e
    tr/\002\003\004/{}$/;
Packit 1c1d7e
    print HTMLFILE $_;
Packit 1c1d7e
}
Packit 1c1d7e
close(BBLFILE);
Packit 1c1d7e
print HTMLFILE "<$list_end>\n\n$endstring\n";
Packit 1c1d7e
while (<OHTMLFILE>) {
Packit 1c1d7e
  print HTMLFILE;
Packit 1c1d7e
}
Packit 1c1d7e
close (OHTMLFILE);
Packit 1c1d7e
close(HTMLFILE);
Packit 1c1d7e
chmod($mode, "$htmlfile$$");
Packit 1c1d7e
rename("$htmlfile$$", $htmlfile);
Packit 1c1d7e
unlink(@tmpfiles);
Packit 1c1d7e
exit(0);