(* * bibtex2html - A BibTeX to HTML translator * Copyright (C) 1997-2000 Jean-Christophe Filliātre and Claude Marché * * This software is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU General Public License version 2 for more details * (enclosed in the file GPL). *) (*i $Id: biboutput.ml,v 1.20 2006-11-02 11:58:41 filliatr Exp $ i*) (*s Output a BibTeX bibliography. *) open Printf open Bibtex let link_fields = ref [] let add_link_field f = link_fields := f :: !link_fields let is_link_field f = List.mem f !link_fields let needs_output k = function | None -> true | Some s -> KeySet.mem k s let url_re = Str.regexp "\\(ftp\\|http\\)://.*" let is_url s = Str.string_match url_re s 0 let print_atom html ch = function | Id s -> if html & not (abbrev_is_implicit s) then begin Html.open_href ch ("#" ^ s); output_string ch s; Html.close_href ch end else output_string ch s | String s when html & is_url s -> output_string ch "{"; Html.open_href ch s; output_string ch s; Html.close_href ch; output_string ch "}" | String s -> output_string ch ("{"^s^"}") let print_atom_list html ch = function | [] -> () | a::l -> print_atom html ch a; List.iter (fun a -> output_string ch " # "; print_atom html ch a) l let print_crossref html ch = function | [String s] -> output_string ch "{"; if html then Html.open_href ch ("#" ^ s); output_string ch s; if html then Html.close_href ch; output_string ch "}" | l -> if not !Options.quiet then eprintf "Warning: cross-references must be constant strings\n"; if !Options.warn_error then exit 2; print_atom_list html ch l let print_link_field ch = function | [String s] -> output_string ch "{"; Html.open_href ch s; output_string ch s; Html.close_href ch; output_string ch "}" | l -> if not !Options.quiet then eprintf "Warning: web links must be constant strings\n"; if !Options.warn_error then exit 2; print_atom_list true ch l let print_command html html_file ch keys = function | Comment s -> if html then output_string ch "
\n";
output_string ch ("@COMMENT{{" ^ s ^ "}}\n");
if html then output_string ch "\n";
output_string ch "\n"
| Preamble l ->
if html then output_string ch "\n";
output_string ch "@PREAMBLE{";
print_atom_list html ch l;
output_string ch "}\n";
if html then output_string ch "\n";
output_string ch "\n"
| Abbrev(s,l) ->
if needs_output s keys then
begin
if html then begin Html.open_anchor ch s; Html.close_anchor ch end;
if html then output_string ch "\n";
output_string ch ("@STRING{" ^ s ^ " = ");
print_atom_list html ch l;
output_string ch "}\n";
if html then output_string ch "\n";
output_string ch "\n"
end
| Entry (entry_type,key,fields) ->
if needs_output key keys then
begin
(*if html then Html.open_balise ch "p";*)
if html then begin Html.open_anchor ch key; Html.close_anchor ch end;
if html then output_string ch "\n";
output_string ch ("@" ^ entry_type ^ "{");
begin match html_file with
| Some f ->
Html.open_href ch (f ^ "#" ^ key);
output_string ch key;
Html.close_href ch
| None ->
output_string ch key
end;
List.iter
(fun (field,l) ->
output_string ch (",\n " ^ String.lowercase field ^ " = ");
if html & field = "CROSSREF" then
print_crossref html ch l
else if html & is_link_field field then
print_link_field ch l
else
print_atom_list html ch l)
fields;
output_string ch "\n}\n";
if html then output_string ch "\n";
(*if html then Html.close_balise ch "p";*)
output_string ch "\n"
end
let output_bib ~html ?html_file ch bib keys =
Bibtex.fold
(fun entry () -> print_command html html_file ch keys entry)
bib
()