" Script: isi2bib.vim " Author: Ajit J. Thakkar (ajit AT unb DOT ca) " Last Change: 2003 July 15 " Version: 1.0 " URL: http://www.unb.ca/chem/ajit/vim.htm " " Function: " Convert a bibliographic database from ISI (Institute of Scientific " Information, Web of Science) export format to BIBTeX format. " " Installation: " Place somewhere in your runtimepath (typically ~/.vim or $HOME/vimfiles) " " Noninteractive Usage: " From the command line, cd to the directory of the ISI database, " and issue the command " vim -u NONE -c ":ru isi2bib.vim" fname " where fname is the name of the ISI database file. " The BIBTeX database will be saved in base(fname).bib " where base(fname) is the ISI file name without an extension. " " Description: " BIBTeX keys are constructed as follows: (last name of first author).(last " two digits of year).(disambiguation mark) where the disambiguation mark is a " lower case letter that is used only when needed. For example, a key could be " Smith03 if it is unique but may be Smith03f if it is the 7th key starting " with Smith03. " " Only records of type(PT) article are converted. Other record types are " ignored. Only the author(AU), title(TI), pages(BP,EP), year(PY), volume(VL) " and journal(JI) fields are converted. " " Recent ISI records (1996 and later) use both lower- and upper-case. The case " is respected and protected by braces when necessary. " " Older (pre-1996) ISI records use only upper case. A crude conversion to " mixed case is made. " " Some manual cleanup of the bib file will be required; for example, to use " math mode for symbols, etc. " " Limitations: " Vim version 6.0 or later required. " " License: " This material is subject to the LaTeX Project Public License. See " http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html for the " details of that license. fun! s:Clean(Name) let GoodName=a:Name " Format all-caps names if GoodName !~# '\l' let GoodName=substitute(GoodName,'\(\u\)\(\u\+\),','\1\L\2,',"g") endif " Format initials let GoodName=substitute(GoodName,'\(\u\)\(\u\)','\1\. \2',"g") let GoodName=substitute(GoodName,'\(\u\)$','\1\.',"g") return GoodName endfun set nocp viminfo= lazyredraw nohidden noswapfile updatecount=0 undolevels=0 set report=9999 if has('autocmd') filetype plugin indent off endif if exists('syntax_on') syntax off endif new wincmd w 1 while search('^PT ',"W") > 0 if strpart(getline('.'),3) !=? "journal" continue endif " Author(s) .+ let author=s:Clean(strpart(getline('.'),3)) while getline(line('.')+1) =~ '^ ' .+ let coworker=s:Clean(strpart(getline('.'),3)) let author=author.' and '.coworker endwhile " Title call search('^TI ',"W") let title=strpart(getline('.'),3) while getline(line('.')+1) =~ '^ ' .+ let title=title.strpart(getline('.'),2) endwhile if title !~# '\l' " Format all-caps title let title=substitute(title,'\(\u\)\(\u\+\)','\1\L\2',"g") else " Format mixed-case title let title=substitute(title,'\<\u\w*\>','{&}',"g") let title=substitute(title,'^{\(\w\+\)}','\1',"g") endif let title=substitute(title,"center dot center dot center dot",'$\\cdots$',"g") " Pages call search('^BP ',"W") let pages=strpart(getline('.'),3) if getline(line('.')+1) =~# '^EP ' && strpart(getline(line('.')+2),3) !~ '^1$' let pages=pages.'--'.strpart(getline(line('.')+1),3) endif " Journal call search('^JI ',"W") let journal=strpart(getline('.'),3) " Year call search('^PY ',"W") let year=strpart(getline('.'),3) " Volume call search('^VL ',"W") let volume=strpart(getline('.'),3) " Write entry in bib file wincmd w " Create key let key=substitute(author,',.*$',"","") let key=key.strpart(year,2) " Disambiguation mark let repeat=0 if search(key,"w") > 0 exe 'sil! g/'.key.'/let repeat=repeat+1' endif if repeat > 0 let key=key.nr2char(repeat+96) endif sil! $put='' sil! $put='@article{'.key.',' sil! $put='author={'.author.'},' sil! $put='title={'.title.'},' sil! $put='journal={'.journal.'},' sil! $put='year={'.year.'},' sil! $put='volume={'.volume.'},' sil! $put='pages={'.pages.'},' sil! $put='}' wincmd w endwhile wincmd w sil! w! #:r.bib qa