package org.jabref.logic.msbib; import java.util.ArrayList; import java.util.List; import org.jabref.model.entry.Author; import org.jabref.model.entry.AuthorList; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; import org.jabref.model.entry.Month; public class MSBibConverter { private static final String MSBIB_PREFIX = "msbib-"; private static final String BIBTEX_PREFIX = "BIBTEX_"; private MSBibConverter() { } public static MSBibEntry convert(BibEntry entry) { MSBibEntry result = new MSBibEntry(); // memorize original type result.fields.put(BIBTEX_PREFIX + "Entry", entry.getType()); // define new type String msbibType = result.fields.put("SourceType", MSBibMapping.getMSBibEntryType(entry.getType()).name()); for (String field : entry.getFieldNames()) { // clean field String unicodeField = entry.getLatexFreeField(field).orElse(""); if (MSBibMapping.getMSBibField(field) != null) { result.fields.put(MSBibMapping.getMSBibField(field), unicodeField); } } // Duplicate: also added as BookTitle entry.getField(FieldName.BOOKTITLE).ifPresent(booktitle -> result.conferenceName = booktitle); entry.getField(FieldName.PAGES).ifPresent(pages -> result.pages = new PageNumbers(pages)); entry.getField(MSBIB_PREFIX + "accessed").ifPresent(accesed -> result.dateAccessed = accesed); // TODO: currently this can never happen if ("SoundRecording".equals(msbibType)) { result.albumTitle = entry.getField(FieldName.TITLE).orElse(null); } // TODO: currently this can never happen if ("Interview".equals(msbibType)) { result.broadcastTitle = entry.getField(FieldName.TITLE).orElse(null); } result.number = entry.getField(FieldName.NUMBER).orElse(null); if ("Patent".equalsIgnoreCase(entry.getType())) { result.patentNumber = entry.getField(FieldName.NUMBER).orElse(null); result.number = null; } result.day = entry.getFieldOrAlias(FieldName.DAY).orElse(null); result.month = entry.getMonth().map(Month::getNumber).map(Object::toString).orElse(null); if (!entry.getField(FieldName.YEAR).isPresent()) { result.year = entry.getFieldOrAlias(FieldName.YEAR).orElse(null); } result.journalName = entry.getFieldOrAlias(FieldName.JOURNAL).orElse(null); // Value must be converted //Currently only english is supported entry.getField(FieldName.LANGUAGE) .ifPresent(lang -> result.fields.put("LCID", String.valueOf(MSBibMapping.getLCID(lang)))); StringBuilder sbNumber = new StringBuilder(); entry.getField(FieldName.ISBN).ifPresent(isbn -> sbNumber.append(" ISBN: " + isbn)); entry.getField(FieldName.ISSN).ifPresent(issn -> sbNumber.append(" ISSN: " + issn)); entry.getField("lccn").ifPresent(lccn -> sbNumber.append("LCCN: " + lccn)); entry.getField("mrnumber").ifPresent(mrnumber -> sbNumber.append(" MRN: " + mrnumber)); result.standardNumber = sbNumber.toString(); if (result.standardNumber.isEmpty()) { result.standardNumber = null; } result.address = entry.getFieldOrAlias(FieldName.ADDRESS).orElse(null); if (entry.getField(FieldName.TYPE).isPresent()) { result.thesisType = entry.getField(FieldName.TYPE).get(); } else { if ("techreport".equalsIgnoreCase(entry.getType())) { result.thesisType = "Tech. rep."; } else if ("mastersthesis".equalsIgnoreCase(entry.getType())) { result.thesisType = "Master's thesis"; } else if ("phdthesis".equalsIgnoreCase(entry.getType())) { result.thesisType = "Ph.D. dissertation"; } else if ("unpublished".equalsIgnoreCase(entry.getType())) { result.thesisType = "unpublished"; } } // TODO: currently this can never happen if (("InternetSite".equals(msbibType) || "DocumentFromInternetSite".equals(msbibType))) { result.internetSiteTitle = entry.getField(FieldName.TITLE).orElse(null); } // TODO: currently only Misc can happen if ("ElectronicSource".equals(msbibType) || "Art".equals(msbibType) || "Misc".equals(msbibType)) { result.publicationTitle = entry.getField(FieldName.TITLE).orElse(null); } entry.getField(FieldName.AUTHOR).ifPresent(authors -> result.authors = getAuthors(authors)); entry.getField(FieldName.EDITOR).ifPresent(editors -> result.editors = getAuthors(editors)); return result; } private static List<MsBibAuthor> getAuthors(String authors) { List<MsBibAuthor> result = new ArrayList<>(); boolean corporate = false; //Only one corporate authors is supported if (authors.startsWith("{") && authors.endsWith("}")) { corporate = true; } AuthorList authorList = AuthorList.parse(authors); for (Author author : authorList.getAuthors()) { result.add(new MsBibAuthor(author, corporate)); } return result; } }