# /u/sy/beebe/tex/bib/bibtex-to-lisp.awk, Fri May 22 09:04:19 1998 # Edit by Nelson H. F. Beebe # ======================================================================== # Convert one or more BibTeX files to (Emacs) Lisp format. This is a # prototype for investigating a Lisp representation of bibliographic # data and bibliographic styles. # # Usage: # # bibclean -max-width 0 BibTeX-file(s) | \ # gawk -f bibtex-to-lisp.awk >Lisp-file # # [22-May-1998] # ======================================================================== BEGIN { initialize() } (FILENAME != "") && (FILENAME != LAST_FILENAME) { new_file() } /^ *%/ { do_comment($0); next } /^ *@[Pp][Rr][Ee][Aa][Mm][Bb][Ll][Ee]/ { do_preamble($0); next } /^ *@[Ss][Tt][Rr][Ii][Nn][Gg]/ { do_string($0); next } /^ *@/ { do_entry($0); next } /^ *[A-Za-z][A-Za-z_0-9]* *= *[A-Za-z]/ { do_key_abbrev($0); next } /^ *[A-Za-z][A-Za-z_0-9]* *= *"/ { do_key_value($0); next } /^ *} *$/ { do_end_entry($0); next } /"} *$/ { do_end_string($0); next } { print } # ====================================================================== function do_comment(s, k,t,prefix) { if (match(s,/^ *%+/)) { prefix = ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" if (RLENGTH < 50) # NB: 50 == length(prefix) s = substr(prefix,1,RLENGTH) substr(s,RSTART+RLENGTH) else { t = prefix while (length(t) < RLENGTH) t = t prefix s = substr(t,1,RLENGTH) substr(s,RSTART+RLENGTH) } } print s } function do_concat(s, k,n,words) { n = split(s,words," ") if (n > 2) # expect: VAR = VAL # VAL # VAL ... { s = words[1] " (concat " for (k = 2; k <= n; ++k) { if (words[k] != "#") s = s " " ((words[k] ~ /^[A-Za-z]/) ? "'" : "") words[k] } s = s ")" } return (lispify(s)) } function do_end_entry(s) { print ")" } function do_end_string(s) { sub(/"} *$/,"\")",s) print s } function do_entry(s) { sub(/{/," \"",s) sub(/, *$/,"\"",s) print "(" s } function do_key_abbrev(s, k,n,words) { sub("= *"," '",s) sub(/, *$/,"",s) sub(/^ +/,"",s) print " '(" lispify(do_concat(s)) ")" } function do_key_value(s) { sub("="," ",s) sub(/\", *$/,"\"",s) sub(/^ +/,"",s) print " '(" lispify(s) ")" } function do_preamble(s, k,n,words) { sub(/{/,"",s) sub(/} *$/,"",s) print "(" do_concat(s) ")" } function do_string(s) { sub(/{ */," '",s) sub("="," ",s) sub(/\"} *$/,"\")",s) print "(" lispify(s) } function initialize() { # print ";;; -*-Lisp-*-" print ";;; -*-emacs-lisp-*-" print "" print "(require 'bibtex-to-lisp)" print "" "date" | getline Current_Date_and_Time close("date") LAST_FILENAME = "?" } function lispify(s) { gsub(/\\/,"\\\\",s) gsub(/\\"/,"\\\\\"",s) return (s) } function new_file() { print ";;;" print ";;;---------------------------------------------------------------------" print ";;; Converted from " FILENAME " on " Current_Date_and_Time print ";;; by bibtex-to-lisp.awk" print ";;;---------------------------------------------------------------------" print ";;;" LAST_FILENAME = FILENAME } .