package net.sf.jabref.imports; 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 net.sf.jabref.BibtexEntry; import net.sf.jabref.BibtexEntryType; import net.sf.jabref.Globals; import net.sf.jabref.Util; /** * 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 SixpackImporter extends ImportFormat { final String SEPARATOR = new String(new char[] { 0, 48 }); /** * Return the name of this import format. */ public String getFormatName() { return "Sixpack"; } /* * (non-Javadoc) * @see net.sf.jabref.imports.ImportFormat#getCLIId() */ public String getCLIId() { return "sixpack"; } /** * Check whether the source is in the correct format for this importer. */ public boolean isRecognizedFormat(InputStream stream) throws IOException { BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream)); String str; int i=0; while (((str = in.readLine()) != null) && (i < 50)) { if (str.indexOf(SEPARATOR) >= 0) return true; i++; } return false; } /** * Parse the entries in the source, and return a List of BibtexEntry * objects. */ public List<BibtexEntry> importEntries(InputStream stream) throws IOException { HashMap<String, String> fI = new HashMap<String, String>(); fI.put("id", "bibtexkey"); fI.put("au", "author"); fI.put("ti", "title"); fI.put("jo", "journal"); fI.put("vo", "volume"); fI.put("nu", "number"); fI.put("pa", "pages"); fI.put("mo", "month"); fI.put("yr", "year"); fI.put("kw", "keywords"); fI.put("ab", "abstract"); fI.put("no", "note"); fI.put("ed", "editor"); fI.put("pu", "publisher"); fI.put("se", "series"); fI.put("ad", "address"); fI.put("en", "edition"); fI.put("ch", "chapter"); fI.put("hp", "howpublished"); fI.put("tb", "booktitle"); fI.put("or", "organization"); fI.put("sc", "school"); fI.put("in", "institution"); fI.put("ty", "type"); fI.put("url", "url"); fI.put("cr", "crossref"); fI.put("fi", "file"); ArrayList<BibtexEntry> bibitems = new ArrayList<BibtexEntry>(); BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream)); in.readLine(); String ln = in.readLine(); if (ln == null) return null; String[] fieldDef = ln.split(","); String s = null; BibtexEntry entry = null; lines: while ((s = in.readLine()) != null){ try{ s = s.replaceAll("<par>", ""); // What is <par> ???? String[] fields = s.split(SEPARATOR); // Check type and create entry: if (fields.length < 2) continue lines; // Avoid ArrayIndexOutOfBoundsException BibtexEntryType typ = BibtexEntryType .getType(fields[1].toLowerCase()); if (typ == null){ String type = ""; if (fields[1].equals("Masterthesis")) type = "mastersthesis"; if (fields[1].equals("PhD-Thesis")) type = "phdthesis"; if (fields[1].equals("miscellaneous")) type = "misc"; if (fields[1].equals("Conference")) type = "proceedings"; typ = BibtexEntryType.getType(type.toLowerCase()); } entry = new BibtexEntry(Util.createNeutralId(), typ); String fld; for (int i = 0; i < Math.min(fieldDef.length, fields.length); i++){ fld = fI.get(fieldDef[i]); if (fld != null){ if (fld.equals("author") || fld.equals("editor")) ImportFormatReader.setIfNecessary(entry, fld, fields[i].replaceAll(" and ", ", ").replaceAll(", ", " and ")); else if (fld.equals("pages")) ImportFormatReader.setIfNecessary(entry, fld, fields[i] .replaceAll("-", "--")); else if (fld.equals("file")) { String fieldName = "pdf"; // We set pdf as default. if (fields[i].endsWith("ps") || fields[i].endsWith("ps.gz")) fieldName = "ps"; else if (fields[i].endsWith("html")) fieldName = "url"; ImportFormatReader.setIfNecessary(entry, fieldName, fields[i]); } else ImportFormatReader.setIfNecessary(entry, fld, fields[i]); } } bibitems.add(entry); }catch (NullPointerException ex){ Globals.logger("Problem parsing Sixpack entry, ignoring entry."); } } return bibitems; } }