package org.jabref.logic.importer.fileformat;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.jabref.logic.importer.Importer;
import org.jabref.logic.importer.ParserResult;
import org.jabref.logic.util.FileExtensions;
import org.jabref.model.entry.AuthorList;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldName;
/**
* INSPEC format importer.
*/
public class InspecImporter extends Importer {
private static final Pattern INSPEC_PATTERN = Pattern.compile("Record.*INSPEC.*");
@Override
public String getName() {
return "INSPEC";
}
@Override
public FileExtensions getExtensions() {
return FileExtensions.INSPEC;
}
@Override
public String getDescription() {
return "INSPEC format importer.";
}
@Override
public boolean isRecognizedFormat(BufferedReader reader) throws IOException {
// Our strategy is to look for the "PY <year>" line.
String str;
while ((str = reader.readLine()) != null) {
if (INSPEC_PATTERN.matcher(str).find()) {
return true;
}
}
return false;
}
@Override
public ParserResult importDatabase(BufferedReader reader) throws IOException {
List<BibEntry> bibitems = new ArrayList<>();
StringBuilder sb = new StringBuilder();
String str;
while ((str = reader.readLine()) != null) {
if (str.length() < 2) {
continue;
}
if (str.indexOf("Record") == 0) {
sb.append("__::__").append(str);
} else {
sb.append("__NEWFIELD__").append(str);
}
}
String[] entries = sb.toString().split("__::__");
String type = "";
Map<String, String> h = new HashMap<>();
for (String entry : entries) {
if (entry.indexOf("Record") != 0) {
continue;
}
h.clear();
String[] fields = entry.split("__NEWFIELD__");
for (String s : fields) {
String f3 = s.substring(0, 2);
String frest = s.substring(5);
if ("TI".equals(f3)) {
h.put(FieldName.TITLE, frest);
} else if ("PY".equals(f3)) {
h.put(FieldName.YEAR, frest);
} else if ("AU".equals(f3)) {
h.put(FieldName.AUTHOR,
AuthorList.fixAuthorLastNameFirst(frest.replace(",-", ", ").replace(";", " and ")));
} else if ("AB".equals(f3)) {
h.put(FieldName.ABSTRACT, frest);
} else if ("ID".equals(f3)) {
h.put(FieldName.KEYWORDS, frest);
} else if ("SO".equals(f3)) {
int m = frest.indexOf('.');
if (m >= 0) {
String jr = frest.substring(0, m);
h.put(FieldName.JOURNAL, jr.replace("-", " "));
frest = frest.substring(m);
m = frest.indexOf(';');
if (m >= 5) {
String yr = frest.substring(m - 5, m).trim();
h.put(FieldName.YEAR, yr);
frest = frest.substring(m);
m = frest.indexOf(':');
if (m >= 0) {
String pg = frest.substring(m + 1).trim();
h.put(FieldName.PAGES, pg);
String vol = frest.substring(1, m).trim();
h.put(FieldName.VOLUME, vol);
}
}
}
} else if ("RT".equals(f3)) {
frest = frest.trim();
if ("Journal-Paper".equals(frest)) {
type = "article";
} else if ("Conference-Paper".equals(frest) || "Conference-Paper; Journal-Paper".equals(frest)) {
type = "inproceedings";
} else {
type = frest.replace(" ", "");
}
}
}
BibEntry b = new BibEntry(type);
b.setField(h);
bibitems.add(b);
}
return new ParserResult(bibitems);
}
}