package net.sf.jabref.imports;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.BibtexFields;
import net.sf.jabref.Globals;
/**
* 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 BiblioscapeImporter extends ImportFormat {
/**
* Return the name of this import format.
*/
public String getFormatName() {
return "Biblioscape";
}
/*
* (non-Javadoc)
* @see net.sf.jabref.imports.ImportFormat#getCLIId()
*/
public String getCLIId() {
return "biblioscape";
}
/**
* Check whether the source is in the correct format for this importer.
*/
public boolean isRecognizedFormat(InputStream in) throws IOException {
return true;
}
/**
* 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));
String line;
HashMap<String, String> hm = new HashMap<String, String>();
HashMap<String, StringBuffer> lines = new HashMap<String, StringBuffer>();
StringBuffer previousLine = null;
while ((line = in.readLine()) != null){
if (line.length() == 0) continue; // ignore empty lines, e.g. at file
// end
// entry delimiter -> item complete
if (line.equals("------")){
String[] type = new String[2];
String[] pages = new String[2];
String country = null;
String address = null;
String titleST = null;
String titleTI = null;
Vector<String> comments = new Vector<String>();
// add item
for (Map.Entry<String, StringBuffer> entry : lines.entrySet()){
if (entry.getKey().equals("AU")) hm.put("author", entry.getValue()
.toString());
else if (entry.getKey().equals("TI")) titleTI = entry.getValue()
.toString();
else if (entry.getKey().equals("ST")) titleST = entry.getValue()
.toString();
else if (entry.getKey().equals("YP")) hm.put("year", entry
.getValue().toString());
else if (entry.getKey().equals("VL")) hm.put("volume", entry
.getValue().toString());
else if (entry.getKey().equals("NB")) hm.put("number", entry
.getValue().toString());
else if (entry.getKey().equals("PS")) pages[0] = entry.getValue()
.toString();
else if (entry.getKey().equals("PE")) pages[1] = entry.getValue()
.toString();
else if (entry.getKey().equals("KW")) hm.put("keywords", entry
.getValue().toString());
//else if (entry.getKey().equals("RM"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("RU"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("RT")) type[0] = entry.getValue()
.toString();
else if (entry.getKey().equals("SB")) comments.add("Subject: "
+ entry.getValue().toString());
else if (entry.getKey().equals("SA")) comments
.add("Secondary Authors: " + entry.getValue().toString());
else if (entry.getKey().equals("NT")) hm.put("note", entry
.getValue().toString());
//else if (entry.getKey().equals("PP"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("PB")) hm.put("publisher", entry
.getValue().toString());
else if (entry.getKey().equals("TA")) comments
.add("Tertiary Authors: " + entry.getValue().toString());
else if (entry.getKey().equals("TT")) comments
.add("Tertiary Title: " + entry.getValue().toString());
else if (entry.getKey().equals("ED")) hm.put("edition", entry
.getValue().toString());
//else if (entry.getKey().equals("DP"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("TW")) type[1] = entry.getValue()
.toString();
else if (entry.getKey().equals("QA")) comments
.add("Quaternary Authors: " + entry.getValue().toString());
else if (entry.getKey().equals("QT")) comments
.add("Quaternary Title: " + entry.getValue().toString());
else if (entry.getKey().equals("IS")) hm.put("isbn", entry
.getValue().toString());
//else if (entry.getKey().equals("LA"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("AB")) hm.put("abstract", entry
.getValue().toString());
//else if (entry.getKey().equals("DI"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("DM"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("AV"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("PR"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("LO"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("AD")) address = entry.getValue()
.toString();
else if (entry.getKey().equals("LG")) hm.put("language", entry
.getValue().toString());
else if (entry.getKey().equals("CO")) country = entry.getValue()
.toString();
else if (entry.getKey().equals("UR") || entry.getKey().equals("AT")){
String s = entry.getValue().toString().trim();
hm.put(s.startsWith("http://") || s.startsWith("ftp://") ? "url"
: "pdf", entry.getValue().toString());
}else if (entry.getKey().equals("C1")) comments.add("Custom1: "
+ entry.getValue().toString());
else if (entry.getKey().equals("C2")) comments.add("Custom2: "
+ entry.getValue().toString());
else if (entry.getKey().equals("C3")) comments.add("Custom3: "
+ entry.getValue().toString());
else if (entry.getKey().equals("C4")) comments.add("Custom4: "
+ entry.getValue().toString());
//else if (entry.getKey().equals("RD"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("MB"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("C5")) comments.add("Custom5: "
+ entry.getValue().toString());
else if (entry.getKey().equals("C6")) comments.add("Custom6: "
+ entry.getValue().toString());
//else if (entry.getKey().equals("FA"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("CN"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("DE")) hm.put("annote", entry
.getValue().toString());
//else if (entry.getKey().equals("RP"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("DF"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("RS"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("CA")) comments.add("Categories: "
+ entry.getValue().toString());
//else if (entry.getKey().equals("WP"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("TH")) comments.add("Short Title: "
+ entry.getValue().toString());
//else if (entry.getKey().equals("WR"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("EW"))
// hm.put("",entry.getValue().toString());
else if (entry.getKey().equals("SE")) hm.put("chapter", entry
.getValue().toString());
//else if (entry.getKey().equals("AC"))
// hm.put("",entry.getValue().toString());
//else if (entry.getKey().equals("LP"))
// hm.put("",entry.getValue().toString());
}
String bibtexType = "misc";
// to find type, first check TW, then RT
for (int i = 1; i >= 0 && bibtexType.equals("misc"); --i){
if (type[i] == null) continue;
type[i] = type[i].toLowerCase();
if (type[i].indexOf("article") >= 0) bibtexType = "article";
else if (type[i].indexOf("journal") >= 0) bibtexType = "article";
else if (type[i].indexOf("book section") >= 0) bibtexType = "inbook";
else if (type[i].indexOf("book") >= 0) bibtexType = "book";
else if (type[i].indexOf("conference") >= 0) bibtexType = "inproceedings";
else if (type[i].indexOf("proceedings") >= 0) bibtexType = "inproceedings";
else if (type[i].indexOf("report") >= 0) bibtexType = "techreport";
else if (type[i].indexOf("thesis") >= 0
&& type[i].indexOf("master") >= 0) bibtexType = "mastersthesis";
else if (type[i].indexOf("thesis") >= 0) bibtexType = "phdthesis";
}
// depending on bibtexType, decide where to place the titleRT and
// titleTI
if (bibtexType.equals("article")){
if (titleST != null) hm.put("journal", titleST);
if (titleTI != null) hm.put("title", titleTI);
}else if (bibtexType.equals("inbook")){
if (titleST != null) hm.put("booktitle", titleST);
if (titleTI != null) hm.put("title", titleTI);
}else{
if (titleST != null) hm.put("booktitle", titleST); // should not
// happen, I
// think
if (titleTI != null) hm.put("title", titleTI);
}
// concatenate pages
if (pages[0] != null || pages[1] != null) hm.put("pages",
(pages[0] != null ? pages[0] : "")
+ (pages[1] != null ? "--" + pages[1] : ""));
// concatenate address and country
if (address != null) hm.put("address", address
+ (country != null ? ", " + country : ""));
if (comments.size() > 0){ // set comment if present
StringBuffer s = new StringBuffer();
for (int i = 0; i < comments.size(); ++i)
s.append(i > 0 ? "; " : "").append(comments.elementAt(i).toString());
hm.put("comment", s.toString());
}
BibtexEntry b = new BibtexEntry(BibtexFields.DEFAULT_BIBTEXENTRY_ID,
Globals.getEntryType(bibtexType));
b.setField(hm);
bibItems.add(b);
hm.clear();
lines.clear();
previousLine = null;
continue;
}
// new key
if (line.startsWith("--") && line.length() >= 7
&& line.substring(4, 7).equals("-- ")){
lines.put(line.substring(2, 4), previousLine = new StringBuffer(line
.substring(7)));
continue;
}
// continuation (folding) of previous line
if (previousLine == null) // sanity check; should never happen
return null;
previousLine.append(line.trim());
}
return bibItems;
}
}