package org.jabref.logic.importer.fileformat; import java.io.BufferedReader; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.Objects; 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.BibEntry; import org.jabref.model.entry.FieldName; /** * Importer for COPAC format. * * Documentation can be found online at: * * http://copac.ac.uk/faq/#format */ public class CopacImporter extends Importer { private static final Pattern COPAC_PATTERN = Pattern.compile("^\\s*TI- "); @Override public String getName() { return "Copac"; } @Override public FileExtensions getExtensions() { return FileExtensions.COPAC; } @Override public String getId() { return "cpc"; } @Override public String getDescription() { return "Importer for COPAC format."; } @Override public boolean isRecognizedFormat(BufferedReader reader) throws IOException { String str; while ((str = reader.readLine()) != null) { if (CopacImporter.COPAC_PATTERN.matcher(str).find()) { return true; } } return false; } @Override public ParserResult importDatabase(BufferedReader reader) throws IOException { Objects.requireNonNull(reader); List<String> entries = new LinkedList<>(); StringBuilder sb = new StringBuilder(); // Preprocess entries String str; while ((str = reader.readLine()) != null) { if (str.length() < 4) { continue; } String code = str.substring(0, 4); if (" ".equals(code)) { sb.append(' ').append(str.trim()); } else { // begining of a new item if ("TI- ".equals(str.substring(0, 4))) { if (sb.length() > 0) { entries.add(sb.toString()); } sb = new StringBuilder(); } sb.append('\n').append(str); } } if (sb.length() > 0) { entries.add(sb.toString()); } List<BibEntry> results = new LinkedList<>(); for (String entry : entries) { // Copac does not contain enough information on the type of the // document. A book is assumed. BibEntry b = new BibEntry("book"); String[] lines = entry.split("\n"); for (String line1 : lines) { String line = line1.trim(); if (line.length() < 4) { continue; } String code = line.substring(0, 4); if ("TI- ".equals(code)) { setOrAppend(b, FieldName.TITLE, line.substring(4).trim(), ", "); } else if ("AU- ".equals(code)) { setOrAppend(b, FieldName.AUTHOR, line.substring(4).trim(), " and "); } else if ("PY- ".equals(code)) { setOrAppend(b, FieldName.YEAR, line.substring(4).trim(), ", "); } else if ("PU- ".equals(code)) { setOrAppend(b, FieldName.PUBLISHER, line.substring(4).trim(), ", "); } else if ("SE- ".equals(code)) { setOrAppend(b, FieldName.SERIES, line.substring(4).trim(), ", "); } else if ("IS- ".equals(code)) { setOrAppend(b, FieldName.ISBN, line.substring(4).trim(), ", "); } else if ("KW- ".equals(code)) { setOrAppend(b, FieldName.KEYWORDS, line.substring(4).trim(), ", "); } else if ("NT- ".equals(code)) { setOrAppend(b, FieldName.NOTE, line.substring(4).trim(), ", "); } else if ("PD- ".equals(code)) { setOrAppend(b, "physicaldimensions", line.substring(4).trim(), ", "); } else if ("DT- ".equals(code)) { setOrAppend(b, "documenttype", line.substring(4).trim(), ", "); } else { setOrAppend(b, code.substring(0, 2), line.substring(4).trim(), ", "); } } results.add(b); } return new ParserResult(results); } private static void setOrAppend(BibEntry b, String field, String value, String separator) { if (b.hasField(field)) { b.setField(field, b.getField(field).get() + separator + value); } else { b.setField(field, value); } } }