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.Globals;
import net.sf.jabref.AuthorList;
import java.util.regex.Pattern;
import net.sf.jabref.BibtexFields;
/**
* Imports a SilverPlatter exported file. This is a poor format to parse,
* so it currently doesn't handle everything correctly.
*/
public class SilverPlatterImporter extends ImportFormat {
/**
* Return the name of this import format.
*/
public String getFormatName() {
return "SilverPlatter";
}
/*
* (non-Javadoc)
* @see net.sf.jabref.imports.ImportFormat#getCLIId()
*/
public String getCLIId() {
return "silverplatter";
}
/**
* 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));
// This format is very similar to Inspec, so we have a two-fold strategy:
// If we see the flag signalling that it is an inspec file, return false.
// This flag should appear above the first entry and prevent us from
// accepting the Inspec format. Then we look for the title entry.
Pattern pat1 = Pattern.compile("Record.*INSPEC.*");
String str;
while ((str = in.readLine()) != null){
if (pat1.matcher(str).find())
return false; // This is an inspec file, so return false.
if ((str.length()>=5) && (str.substring(0, 5).equals("TI: ")))
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>();
BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
boolean isChapter = false;
String str;
StringBuffer sb = new StringBuffer();
while ((str = in.readLine()) != null){
if (str.length() < 2) sb.append("__::__").append(str);
else
sb.append("__NEWFIELD__").append(str);
}
in.close();
String[] entries = sb.toString().split("__::__");
String Type = "";
HashMap<String, String> h = new HashMap<String, String>();
entryLoop: for (int i = 0; i < entries.length; i++){
if (entries[i].trim().length() < 6) continue entryLoop;
//System.out.println("'"+entries[i]+"'");
h.clear();
String[] fields = entries[i].split("__NEWFIELD__");
fieldLoop: for (int j = 0; j < fields.length; j++){
if (fields[j].length() < 6) continue fieldLoop;
//System.out.println(">"+fields[j]+"<");
String s = fields[j];
String f3 = s.substring(0, 2);
String frest = s.substring(5);
if (f3.equals("TI")) h.put("title", frest);
//else if(f3.equals("PY")) h.put("year", frest);
else if (f3.equals("AU")){
if (frest.trim().endsWith("(ed)")){
String ed = frest.trim();
ed = ed.substring(0, ed.length() - 4);
h.put("editor", AuthorList.fixAuthor_lastNameFirst(ed.replaceAll(",-", ", ")
.replaceAll(";", " and ")));
}else h.put("author", AuthorList.fixAuthor_lastNameFirst(frest.replaceAll(
",-", ", ").replaceAll(";", " and ")));
}else if (f3.equals("AB")) h.put("abstract", frest);
else if (f3.equals("DE")){
String kw = frest.replaceAll("-;", ",").toLowerCase();
h.put("keywords", kw.substring(0, kw.length() - 1));
}else if (f3.equals("SO")){
int m = frest.indexOf(".");
if (m >= 0){
String jr = frest.substring(0, m);
h.put("journal", jr.replaceAll("-", " "));
frest = frest.substring(m);
m = frest.indexOf(";");
if (m >= 5){
String yr = frest.substring(m - 5, m).trim();
h.put("year", yr);
frest = frest.substring(m);
m = frest.indexOf(":");
if (m >= 0){
String pg = frest.substring(m + 1).trim();
h.put("pages", pg);
h.put("volume", frest.substring(1, m));
}
}
}
}else if (f3.equals("PB")){
int m = frest.indexOf(":");
if (m >= 0){
String jr = frest.substring(0, m);
h.put("publisher", jr.replaceAll("-", " ").trim());
frest = frest.substring(m);
m = frest.indexOf(", ");
if (m + 2 < frest.length()){
String yr = frest.substring(m + 2).trim();
try {
Integer.parseInt(yr);
h.put("year", yr);
} catch (NumberFormatException ex) {
// Let's assume that this wasn't a number, since it
// couldn't be parsed as an integer.
}
}
}
} else if (f3.equals("AF")) {
h.put("school", frest.trim());
}else if (f3.equals("DT")){
frest = frest.trim();
if (frest.equals("Monograph")) Type = "book";
else if (frest.startsWith("Dissertation")) Type = "phdthesis";
else if (frest.toLowerCase().indexOf("journal") >= 0) Type = "article";
else if (frest.equals("Contribution") || frest.equals("Chapter")){
Type = "incollection";
// This entry type contains page numbers and booktitle in the
// title field.
isChapter = true;
}
else Type = frest.replaceAll(" ", "");
}
}
if (isChapter) {
Object titleO = h.get("title");
if (titleO != null) {
String title = ((String)titleO).trim();
int inPos = title.indexOf("\" in ");
int pgPos = title.lastIndexOf(" ");
if (inPos > 1) h.put("title", title.substring(1, inPos));
if (pgPos > inPos) h.put("pages", title.substring(pgPos)
.replaceAll("-", "--"));
}
}
BibtexEntry b = new BibtexEntry(BibtexFields.DEFAULT_BIBTEXENTRY_ID, Globals
.getEntryType(Type)); // id assumes an existing database so don't
// create one here
b.setField(h);
bibitems.add(b);
}
return bibitems;
}
}