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

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