package net.sf.jabref.imports; import java.util.regex.Pattern; import java.io.InputStream; import java.io.BufferedReader; import java.io.IOException; import java.util.List; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import net.sf.jabref.BibtexEntry; import net.sf.jabref.Globals; import net.sf.jabref.AuthorList; import net.sf.jabref.BibtexFields; /** * Imports a Biblioscape Tag File. The format is described on * http://www.biblioscape.com/manual_bsp/Biblioscape_Tag_File.htm Several * Biblioscape field types are ignored. Others are only included in the BibTeX * field "comment". */ public class RisImporter extends ImportFormat { /** * Return the name of this import format. */ public String getFormatName() { return "RIS"; } /* * (non-Javadoc) * @see net.sf.jabref.imports.ImportFormat#getCLIId() */ public String getCLIId() { return "ris"; } /** * Check whether the source is in the correct format for this importer. */ public boolean isRecognizedFormat(InputStream stream) throws IOException { // Our strategy is to look for the "AU - *" line. BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream)); Pattern pat1 = Pattern.compile("AU - .*"), pat2 = Pattern.compile("A1 - .*"), pat3 = Pattern.compile("A2 - .*"); String str; while ((str = in.readLine()) != null){ if (pat1.matcher(str).find() || pat2.matcher(str).find() || pat3.matcher(str).find()) return true; } return false; } /** * Parse the entries in the source, and return a List of BibtexEntry * objects. */ public List<BibtexEntry> importEntries(InputStream stream) throws IOException { ArrayList<BibtexEntry> bibitems = new ArrayList<BibtexEntry>(); StringBuffer sb = new StringBuffer(); BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream)); String str; while ((str = in.readLine()) != null){ sb.append(str); sb.append("\n"); } String[] entries = sb.toString().split("ER -"); for (int i = 0; i < entries.length; i++){ if (entries[i].trim().length() == 0) continue; String type = "", author = "", editor = "", startPage = "", endPage = "", comment = ""; HashMap<String, String> hm = new HashMap<String, String>(); String[] fields = entries[i].split("\n"); for (int j = 0; j < fields.length; j++){ StringBuffer current = new StringBuffer(fields[j]); boolean done = false; while (!done && (j < fields.length-1)) { if ((fields[j+1].length() >= 6) && !fields[j+1].substring(2, 6).equals(" - ")) { if ((current.length() > 0) && !Character.isWhitespace(current.charAt(current.length()-1)) && !Character.isWhitespace(fields[j+1].charAt(0))) current.append(' '); current.append(fields[j+1]); j++; } else done = true; } String entry = current.toString(); if (entry.length() < 6) continue; else{ String lab = entry.substring(0, 2); String val = entry.substring(6).trim(); if (lab.equals("TY")){ if (val.equals("BOOK")) type = "book"; else if (val.equals("JOUR") || val.equals("MGZN")) type = "article"; else if (val.equals("THES")) type = "phdthesis"; else if (val.equals("UNPB")) type = "unpublished"; else if (val.equals("RPRT")) type = "techreport"; else if (val.equals("CONF")) type = "inproceedings"; else if (val.equals("CHAP")) type = "incollection";//"inbook"; else type = "other"; }else if (lab.equals("T1") || lab.equals("TI")) { String oldVal = hm.get("title"); if (oldVal == null) hm.put("title", val); else { if (oldVal.endsWith(":") || oldVal.endsWith(".") || oldVal.endsWith("?")) hm.put("title", oldVal+" "+val); else hm.put("title", oldVal+": "+val); } } // = // val; else if (lab.equals("T2") || lab.equals("T3") || lab.equals("BT")) { hm.put("booktitle", val); } else if (lab.equals("AU") || lab.equals("A1")) { if (author.equals("")) // don't add " and " for the first author author = val; else author += " and " + val; } else if (lab.equals("A2")){ if (editor.equals("")) // don't add " and " for the first editor editor = val; else editor += " and " + val; } else if (lab.equals("JA") || lab.equals("JF") || lab.equals("JO")) { if (type.equals("inproceedings")) hm.put("booktitle", val); else hm.put("journal", val); } else if (lab.equals("SP")) startPage = val; else if (lab.equals("PB")) { if (type.equals("phdthesis")) hm.put("school", val); else hm.put("publisher", val); } else if (lab.equals("AD") || lab.equals("CY")) hm.put("address", val); else if (lab.equals("EP")) endPage = val; else if (lab.equals("SN")) hm.put("issn", val); else if (lab.equals("VL")) hm.put("volume", val); else if (lab.equals("IS")) hm.put("number", val); else if (lab.equals("N2") || lab.equals("AB")) { String oldAb = hm.get("abstract"); if (oldAb == null) hm.put("abstract", val); else hm.put("abstract", oldAb+"\n"+val); } else if (lab.equals("UR")) hm.put("url", val); else if ((lab.equals("Y1") || lab.equals("PY")) && val.length() >= 4) { String[] parts = val.split("/"); hm.put("year", parts[0]); if ((parts.length > 1) && (parts[1].length() > 0)) { try { int month = Integer.parseInt(parts[1]); if ((month > 0) && (month <= 12)) { //System.out.println(Globals.MONTHS[month-1]); hm.put("month", "#"+Globals.MONTHS[month-1]+"#"); } } catch (NumberFormatException ex) { // The month part is unparseable, so we ignore it. } } } else if (lab.equals("KW")){ if (!hm.containsKey("keywords")) hm.put("keywords", val); else{ String kw = hm.get("keywords"); hm.put("keywords", kw + ", " + val); } } else if (lab.equals("U1") || lab.equals("U2") || lab.equals("N1")) { if (comment.length() > 0) comment = comment+"\n"; comment = comment+val; } // Added ID import 2005.12.01, Morten Alver: else if (lab.equals("ID")) hm.put("refid", val); // Added doi import (sciencedirect.com) 2011.01.10, Alexander Hug <alexander@alexanderhug.info> else if (lab.equals("M3")){ String doi = val; if (doi.startsWith("doi:")){ doi = doi.replaceAll("(?i)doi:", "").trim(); hm.put("doi", doi); } } } // fix authors if (author.length() > 0) { author = AuthorList.fixAuthor_lastNameFirst(author); hm.put("author", author); } if (editor.length() > 0) { editor = AuthorList.fixAuthor_lastNameFirst(editor); hm.put("editor", editor); } if (comment.length() > 0) { hm.put("comment", comment); } hm.put("pages", startPage + "--" + endPage); } BibtexEntry b = new BibtexEntry(BibtexFields.DEFAULT_BIBTEXENTRY_ID, Globals .getEntryType(type)); // id assumes an existing database so don't // Remove empty fields: ArrayList<Object> toRemove = new ArrayList<Object>(); for (Iterator<String> it = hm.keySet().iterator(); it.hasNext();) { Object key = it.next(); String content = hm.get(key); if ((content == null) || (content.trim().length() == 0)) toRemove.add(key); } for (Iterator<Object> iterator = toRemove.iterator(); iterator.hasNext();) { hm.remove(iterator.next()); } // create one here b.setField(hm); bibitems.add(b); } return bibitems; } }