package org.jabref.logic.exporter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.jabref.logic.bibtex.comparator.FieldComparator; import org.jabref.logic.bibtex.comparator.FieldComparatorStack; import org.jabref.logic.layout.format.GetOpenOfficeType; import org.jabref.logic.layout.format.RemoveBrackets; import org.jabref.logic.layout.format.RemoveWhitespace; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.FieldName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; /** * @author Morten O. Alver. * Based on net.sf.jabref.MODSDatabase by Michael Wrighton * */ class OpenDocumentRepresentation { private static final Log LOGGER = LogFactory.getLog(OpenDocumentRepresentation.class); private final List<BibEntry> entries; private final BibDatabase database; public OpenDocumentRepresentation(BibDatabase database, List<BibEntry> entries) { this.database = database; // Make a list of comparators for sorting the entries: List<FieldComparator> comparators = new ArrayList<>(); comparators.add(new FieldComparator(FieldName.AUTHOR)); comparators.add(new FieldComparator(FieldName.YEAR)); comparators.add(new FieldComparator(BibEntry.KEY_FIELD)); // Use glazed lists to get a sorted view of the entries: List<BibEntry> entryList = new ArrayList<>(); // Set up a list of all entries, if entries==null, or the entries in the given list if (entries == null) { entryList.addAll(database.getEntries()); } else { entryList.addAll(entries); } Collections.sort(entryList, new FieldComparatorStack<>(comparators)); this.entries = entryList; } public Document getDOMrepresentation() { Document result = null; try { DocumentBuilder dbuild = DocumentBuilderFactory.newInstance().newDocumentBuilder(); result = dbuild.newDocument(); Element collection = result.createElement("office:document-content"); //collection.setAttribute("xmlns", "http://openoffice.org/2000/office"); collection.setAttribute("xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0"); collection.setAttribute("xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0"); collection.setAttribute("xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0"); collection.setAttribute("xmlns:table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0"); collection.setAttribute("xmlns:meta", "urn:oasis:names:tc:opendocument:xmlns:meta:1.0"); collection.setAttribute("office:version", "1.0"); collection.setAttribute("xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"); collection.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); Element el = result.createElement("office:scripts"); collection.appendChild(el); el = result.createElement("office:automatic-styles"); Element el2 = result.createElement("style:style"); el2.setAttribute("style:name", "ro1"); el2.setAttribute("style:family", "table-row"); Element el3 = result.createElement("style.table-row-properties"); el3.setAttribute("style:row-height", "0.1681inch"); el3.setAttribute("fo:break-before", "auto"); el3.setAttribute("style:use-optimal-row-height", "true"); el2.appendChild(el3); el.appendChild(el2); el2 = result.createElement("style:style"); el2.setAttribute("style:name", "ta1"); el2.setAttribute("style:family", "table"); el2.setAttribute("style:master-page-name", "Default"); el3 = result.createElement("style:properties"); el3.setAttribute("table:display", "true"); el2.appendChild(el3); el.appendChild(el2); collection.appendChild(el); Element body = result.createElement("office:body"); Element spreadsheet = result.createElement("office:spreadsheet"); Element table = result.createElement("table:table"); table.setAttribute("table:name", "biblio"); table.setAttribute("table.style-name", "ta1"); Element row = result.createElement("table:table-row"); row.setAttribute("table.style-name", "ro1"); addTableCell(result, row, "Identifier"); addTableCell(result, row, "Type"); addTableCell(result, row, "Address"); addTableCell(result, row, "Assignee"); addTableCell(result, row, "Annote"); addTableCell(result, row, "Author"); addTableCell(result, row, "Booktitle"); addTableCell(result, row, "Chapter"); addTableCell(result, row, "Day"); addTableCell(result, row, "Dayfiled"); addTableCell(result, row, "Edition"); addTableCell(result, row, "Editor"); addTableCell(result, row, "Howpublish"); addTableCell(result, row, "Institution"); addTableCell(result, row, "Journal"); addTableCell(result, row, "Language"); addTableCell(result, row, "Month"); addTableCell(result, row, "Monthfiled"); addTableCell(result, row, "Nationality"); addTableCell(result, row, "Note"); addTableCell(result, row, "Number"); addTableCell(result, row, "Organization"); addTableCell(result, row, "Pages"); addTableCell(result, row, "Publisher"); addTableCell(result, row, "Revision"); addTableCell(result, row, "School"); addTableCell(result, row, "Series"); addTableCell(result, row, "Title"); addTableCell(result, row, "RepType"); addTableCell(result, row, "Volume"); addTableCell(result, row, "Year"); addTableCell(result, row, "Yearfiled"); addTableCell(result, row, "URL"); addTableCell(result, row, "Custom1"); addTableCell(result, row, "Custom2"); addTableCell(result, row, "Custom3"); addTableCell(result, row, "Custom4"); addTableCell(result, row, "Custom5"); addTableCell(result, row, "ISBN"); table.appendChild(row); for (BibEntry e : entries) { row = result.createElement("table:table-row"); addTableCell(result, row, getField(e, BibEntry.KEY_FIELD)); addTableCell(result, row, new GetOpenOfficeType().format(e.getType())); addTableCell(result, row, getField(e, FieldName.ADDRESS)); addTableCell(result, row, getField(e, FieldName.ASSIGNEE)); addTableCell(result, row, getField(e, FieldName.ANNOTE)); addTableCell(result, row, getField(e, FieldName.AUTHOR));//new AuthorLastFirst().format(getField(e, FieldName.AUTHOR_FIELD))); addTableCell(result, row, getField(e, FieldName.BOOKTITLE)); addTableCell(result, row, getField(e, FieldName.CHAPTER)); addTableCell(result, row, getField(e, FieldName.DAY)); addTableCell(result, row, getField(e, FieldName.DAYFILED)); addTableCell(result, row, getField(e, FieldName.EDITION)); addTableCell(result, row, getField(e, FieldName.EDITOR));//new AuthorLastFirst().format(getField(e, FieldName.EDITOR_FIELD))); addTableCell(result, row, getField(e, FieldName.HOWPUBLISHED)); addTableCell(result, row, getField(e, FieldName.INSTITUTION)); addTableCell(result, row, getField(e, FieldName.JOURNAL)); addTableCell(result, row, getField(e, FieldName.LANGUAGE)); addTableCell(result, row, getField(e, FieldName.MONTH)); addTableCell(result, row, getField(e, FieldName.MONTHFILED)); addTableCell(result, row, getField(e, FieldName.NATIONALITY)); addTableCell(result, row, getField(e, FieldName.NOTE)); addTableCell(result, row, getField(e, FieldName.NUMBER)); addTableCell(result, row, getField(e, FieldName.ORGANIZATION)); addTableCell(result, row, getField(e, FieldName.PAGES)); addTableCell(result, row, getField(e, FieldName.PUBLISHER)); addTableCell(result, row, getField(e, FieldName.REVISION)); addTableCell(result, row, getField(e, FieldName.SCHOOL)); addTableCell(result, row, getField(e, FieldName.SERIES)); addTableCell(result, row, new RemoveWhitespace().format(new RemoveBrackets().format(getField(e, FieldName.TITLE)))); addTableCell(result, row, getField(e, "reporttype")); addTableCell(result, row, getField(e, FieldName.VOLUME)); addTableCell(result, row, getField(e, FieldName.YEAR)); addTableCell(result, row, getField(e, FieldName.YEARFILED)); addTableCell(result, row, getField(e, FieldName.URL)); addTableCell(result, row, ""); addTableCell(result, row, ""); addTableCell(result, row, ""); addTableCell(result, row, ""); addTableCell(result, row, ""); addTableCell(result, row, getField(e, FieldName.ISBN)); table.appendChild(row); } spreadsheet.appendChild(table); body.appendChild(spreadsheet); collection.appendChild(body); result.appendChild(collection); } catch (Exception e) { LOGGER.warn("Exception caught...", e); } return result; } private String getField(BibEntry e, String field) { return e.getResolvedFieldOrAlias(field, database).orElse(""); } private void addTableCell(Document doc, Element parent, String content) { Element cell = doc.createElement("table:table-cell"); Element text = doc.createElement("text:p"); Text textNode = doc.createTextNode(content); text.appendChild(textNode); //text.setTextContent(content); cell.appendChild(text); parent.appendChild(cell); } }