package org.jabref.logic.layout;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Main class for formatting DOCUMENT ME!
*/
public class Layout {
private static final Log LOGGER = LogFactory.getLog(Layout.class);
private final List<LayoutEntry> layoutEntries;
private final List<String> missingFormatters = new ArrayList<>();
public Layout(List<StringInt> parsedEntries, LayoutFormatterPreferences prefs) {
List<LayoutEntry> tmpEntries = new ArrayList<>(parsedEntries.size());
List<StringInt> blockEntries = null;
LayoutEntry le;
String blockStart = null;
for (StringInt parsedEntry : parsedEntries) {
switch (parsedEntry.i) {
case LayoutHelper.IS_LAYOUT_TEXT:
case LayoutHelper.IS_SIMPLE_FIELD:
case LayoutHelper.IS_OPTION_FIELD:
// Do nothing
break;
case LayoutHelper.IS_FIELD_START:
case LayoutHelper.IS_GROUP_START:
blockEntries = new ArrayList<>();
blockStart = parsedEntry.s;
break;
case LayoutHelper.IS_FIELD_END:
case LayoutHelper.IS_GROUP_END:
if ((blockStart != null) && (blockEntries != null)) {
if (blockStart.equals(parsedEntry.s)) {
blockEntries.add(parsedEntry);
le = new LayoutEntry(blockEntries,
parsedEntry.i == LayoutHelper.IS_FIELD_END ? LayoutHelper.IS_FIELD_START : LayoutHelper.IS_GROUP_START,
prefs);
tmpEntries.add(le);
blockEntries = null;
} else {
LOGGER.debug(blockStart + '\n' + parsedEntry.s);
LOGGER.warn("Nested field/group entries are not implemented!");
Thread.dumpStack();
}
}
break;
default:
break;
}
if (blockEntries == null) {
tmpEntries.add(new LayoutEntry(parsedEntry, prefs));
} else {
blockEntries.add(parsedEntry);
}
}
layoutEntries = new ArrayList<>(tmpEntries);
for (LayoutEntry layoutEntry : layoutEntries) {
missingFormatters.addAll(layoutEntry.getInvalidFormatters());
}
}
public void setPostFormatter(LayoutFormatter formatter) {
for (LayoutEntry layoutEntry : layoutEntries) {
layoutEntry.setPostFormatter(formatter);
}
}
/**
* Returns the processed bibtex entry. If the database argument is
* null, no string references will be resolved. Otherwise all valid
* string references will be replaced by the strings' contents. Even
* recursive string references are resolved.
*/
public String doLayout(BibEntry bibtex, BibDatabase database) {
StringBuilder sb = new StringBuilder(100);
for (LayoutEntry layoutEntry : layoutEntries) {
String fieldText = layoutEntry.doLayout(bibtex, database);
// 2005.05.05 M. Alver
// The following change means we treat null fields as "". This is to fix the
// problem of whitespace disappearing after missing fields. Hoping there are
// no side effects.
if (fieldText == null) {
fieldText = "";
}
sb.append(fieldText);
}
return sb.toString();
}
/**
* Returns the processed text. If the database argument is
* null, no string references will be resolved. Otherwise all valid
* string references will be replaced by the strings' contents. Even
* recursive string references are resolved.
*/
public String doLayout(BibDatabaseContext databaseContext, Charset encoding) {
StringBuilder sb = new StringBuilder(100);
String fieldText;
for (LayoutEntry layoutEntry : layoutEntries) {
fieldText = layoutEntry.doLayout(databaseContext, encoding);
if (fieldText == null) {
fieldText = "";
}
sb.append(fieldText);
}
return sb.toString();
}
// added section - end (arudert)
public List<String> getMissingFormatters() {
return new ArrayList<>(missingFormatters);
}
}