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.Locale; import java.util.Map; import java.util.Objects; import org.jabref.logic.importer.Importer; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.util.FileExtensions; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; /** * Imports a Biblioscape Tag File. The format is described on * http://www.biblioscape.com/download/Biblioscape8.pdf Several * Biblioscape field types are ignored. Others are only included in the BibTeX * field "comment". */ public class BiblioscapeImporter extends Importer { @Override public String getName() { return "Biblioscape"; } @Override public FileExtensions getExtensions() { return FileExtensions.BILBIOSCAPE; } @Override public String getDescription() { return "Imports a Biblioscape Tag File.\n" + "Several Biblioscape field types are ignored. Others are only included in the BibTeX field \"comment\"."; } @Override public boolean isRecognizedFormat(BufferedReader reader) { Objects.requireNonNull(reader); return true; } @Override public ParserResult importDatabase(BufferedReader reader) throws IOException { List<BibEntry> bibItems = new ArrayList<>(); String line; Map<String, String> hm = new HashMap<>(); Map<String, StringBuilder> lines = new HashMap<>(); StringBuilder previousLine = null; while ((line = reader.readLine()) != null) { if (line.isEmpty()) { continue; // ignore empty lines, e.g. at file } // end // entry delimiter -> item complete if ("------".equals(line)) { String[] type = new String[2]; String[] pages = new String[2]; String country = null; String address = null; String titleST = null; String titleTI = null; List<String> comments = new ArrayList<>(); // add item for (Map.Entry<String, StringBuilder> entry : lines.entrySet()) { if ("AU".equals(entry.getKey())) { hm.put(FieldName.AUTHOR, entry.getValue() .toString()); } else if ("TI".equals(entry.getKey())) { titleTI = entry.getValue() .toString(); } else if ("ST".equals(entry.getKey())) { titleST = entry.getValue() .toString(); } else if ("YP".equals(entry.getKey())) { hm.put(FieldName.YEAR, entry .getValue().toString()); } else if ("VL".equals(entry.getKey())) { hm.put(FieldName.VOLUME, entry .getValue().toString()); } else if ("NB".equals(entry.getKey())) { hm.put(FieldName.NUMBER, entry .getValue().toString()); } else if ("PS".equals(entry.getKey())) { pages[0] = entry.getValue() .toString(); } else if ("PE".equals(entry.getKey())) { pages[1] = entry.getValue() .toString(); } else if ("KW".equals(entry.getKey())) { hm.put(FieldName.KEYWORDS, entry .getValue().toString()); } else if ("RT".equals(entry.getKey())) { type[0] = entry.getValue() .toString(); } else if ("SB".equals(entry.getKey())) { comments.add("Subject: " + entry.getValue()); } else if ("SA".equals(entry.getKey())) { comments .add("Secondary Authors: " + entry.getValue()); } else if ("NT".equals(entry.getKey())) { hm.put(FieldName.NOTE, entry .getValue().toString()); } else if ("PB".equals(entry.getKey())) { hm.put(FieldName.PUBLISHER, entry .getValue().toString()); } else if ("TA".equals(entry.getKey())) { comments .add("Tertiary Authors: " + entry.getValue()); } else if ("TT".equals(entry.getKey())) { comments .add("Tertiary Title: " + entry.getValue()); } else if ("ED".equals(entry.getKey())) { hm.put(FieldName.EDITION, entry .getValue().toString()); } else if ("TW".equals(entry.getKey())) { type[1] = entry.getValue() .toString(); } else if ("QA".equals(entry.getKey())) { comments .add("Quaternary Authors: " + entry.getValue()); } else if ("QT".equals(entry.getKey())) { comments .add("Quaternary Title: " + entry.getValue()); } else if ("IS".equals(entry.getKey())) { hm.put(FieldName.ISBN, entry .getValue().toString()); } else if ("AB".equals(entry.getKey())) { hm.put(FieldName.ABSTRACT, entry .getValue().toString()); } else if ("AD".equals(entry.getKey())) { address = entry.getValue() .toString(); } else if ("LG".equals(entry.getKey())) { hm.put(FieldName.LANGUAGE, entry .getValue().toString()); } else if ("CO".equals(entry.getKey())) { country = entry.getValue() .toString(); } else if ("UR".equals(entry.getKey()) || "AT".equals(entry.getKey())) { String s = entry.getValue().toString().trim(); hm.put(s.startsWith("http://") || s.startsWith("ftp://") ? FieldName.URL : FieldName.PDF, entry.getValue().toString()); } else if ("C1".equals(entry.getKey())) { comments.add("Custom1: " + entry.getValue()); } else if ("C2".equals(entry.getKey())) { comments.add("Custom2: " + entry.getValue()); } else if ("C3".equals(entry.getKey())) { comments.add("Custom3: " + entry.getValue()); } else if ("C4".equals(entry.getKey())) { comments.add("Custom4: " + entry.getValue()); } else if ("C5".equals(entry.getKey())) { comments.add("Custom5: " + entry.getValue()); } else if ("C6".equals(entry.getKey())) { comments.add("Custom6: " + entry.getValue()); } else if ("DE".equals(entry.getKey())) { hm.put(FieldName.ANNOTE, entry .getValue().toString()); } else if ("CA".equals(entry.getKey())) { comments.add("Categories: " + entry.getValue()); } else if ("TH".equals(entry.getKey())) { comments.add("Short Title: " + entry.getValue()); } else if ("SE".equals(entry.getKey())) { hm.put(FieldName.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 = BibEntry.DEFAULT_TYPE; // to find type, first check TW, then RT for (int i = 1; (i >= 0) && BibEntry.DEFAULT_TYPE.equals(bibtexType); --i) { if (type[i] == null) { continue; } type[i] = type[i].toLowerCase(Locale.ROOT); if (type[i].contains("article")) { bibtexType = "article"; } else if (type[i].contains("journal")) { bibtexType = "article"; } else if (type[i].contains("book section")) { bibtexType = "inbook"; } else if (type[i].contains("book")) { bibtexType = "book"; } else if (type[i].contains("conference")) { bibtexType = "inproceedings"; } else if (type[i].contains("proceedings")) { bibtexType = "inproceedings"; } else if (type[i].contains("report")) { bibtexType = "techreport"; } else if (type[i].contains("thesis") && type[i].contains("master")) { bibtexType = "mastersthesis"; } else if (type[i].contains("thesis")) { bibtexType = "phdthesis"; } } // depending on bibtexType, decide where to place the titleRT and // titleTI if ("article".equals(bibtexType)) { if (titleST != null) { hm.put(FieldName.JOURNAL, titleST); } if (titleTI != null) { hm.put(FieldName.TITLE, titleTI); } } else if ("inbook".equals(bibtexType)) { if (titleST != null) { hm.put(FieldName.BOOKTITLE, titleST); } if (titleTI != null) { hm.put(FieldName.TITLE, titleTI); } } else { if (titleST != null) { hm.put(FieldName.BOOKTITLE, titleST); // should not } // happen, I // think if (titleTI != null) { hm.put(FieldName.TITLE, titleTI); } } // concatenate pages if ((pages[0] != null) || (pages[1] != null)) { hm.put(FieldName.PAGES, (pages[0] == null ? "" : pages[0]) + (pages[1] == null ? "" : "--" + pages[1])); } // concatenate address and country if (address != null) { hm.put(FieldName.ADDRESS, address + (country == null ? "" : ", " + country)); } if (!comments.isEmpty()) { // set comment if present hm.put(FieldName.COMMENT, String.join(";", comments)); } BibEntry b = new BibEntry(bibtexType); b.setField(hm); bibItems.add(b); hm.clear(); lines.clear(); previousLine = null; continue; } // new key if (line.startsWith("--") && (line.length() >= 7) && "-- ".equals(line.substring(4, 7))) { previousLine = new StringBuilder(line.substring(7)); lines.put(line.substring(2, 4), previousLine); continue; } // continuation (folding) of previous line if (previousLine == null) { return new ParserResult(); } previousLine.append(line.trim()); } return new ParserResult(bibItems); } }