/* Copyright (C) 2003-2011 JabRef contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.oo; import net.sf.jabref.BibtexDatabase; import net.sf.jabref.BibtexEntry; import net.sf.jabref.export.layout.LayoutFormatter; import net.sf.jabref.export.layout.format.FormatChars; import net.sf.jabref.bst.VM; import org.antlr.runtime.RecognitionException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * Wrapper for using JabRef's bst engine for formatting OO bibliography. */ public class BstWrapper { LayoutFormatter formatter = new FormatChars(); VM vm = null; public BstWrapper() { } /** * Set the bst file to be used for processing. This method will initiate parsing * of the bst file. * @param f The bst file to load. * @throws IOException On IO errors. * @throws RecognitionException On parsing errors. */ public void loadBstFile(File f) throws IOException, RecognitionException { vm = new VM(f); } /** * Use the instructions of the loaded bst file for processing a collection of entries. * @param entries The entries to process. * @param database The database the entries belong to. * @return A Map of the entries' bibtex keys linking to their processed strings. */ public Map<String,String> processEntries(Collection<BibtexEntry> entries, BibtexDatabase database) { // TODO: how to handle uniquefiers? // TODO: need handling of crossrefs? String result = vm.run(entries); return parseResult(result); } static Pattern bibitemTag = Pattern.compile("\\\\[a-zA-Z]*item\\{.*\\}"); private Map<String,String> parseResult(String result) { Map<String,String> map = new HashMap<String,String>(); // Look through for instances of \bibitem : Matcher m = bibitemTag.matcher(result); ArrayList<Integer> indices = new ArrayList<Integer>(); ArrayList<Integer> endIndices = new ArrayList<Integer>(); ArrayList<String> keys = new ArrayList<String>(); while (m.find()) { if (indices.size() > 0) endIndices.add(m.start()); System.out.println(m.start()+" "+m.end()); String tag = m.group(); String key = tag.substring(9, tag.length()-1); indices.add(m.end()); keys.add(key); } int lastI = result.lastIndexOf("\\end{thebibliography}"); if ((lastI > 0) && (lastI > indices.get(indices.size()-1))) endIndices.add(lastI); for (int i=0; i<keys.size(); i++) { String key = keys.get(i); int index = indices.get(i); int endIndex = endIndices.get(i); String part = result.substring(index, endIndex); map.put(key, formatter.format(part.trim().replaceAll("\\\\newblock ", " "))); } return map; } }